Kubernetes 官方提供了 kubeadm 工具安装 kubernetes 集群,使用这个工具安装集群非常便捷,使部署和升级 Kubernetes 变得简单起来。
不过该工具有点坑的就是,使用其安装的 kubernetes 集群的大部分证书有效期只有一年,需要在证书过期前,使用更新操作更新集群,使证书的有效期再续一年。如果忘记这个操作,那么在使用过程中证书到期将导致集群不可用,应用无法访问,急急忙忙解决也需要半天时间,这个问题是致命的。
不过实际情况下,在现网环境中大部分人追求稳定,一般不会大改 Kubernetes 版本,所以解决 kubeadm 集群证书有效期只有一年的最好办法就是重新编译 kubeadm 源码,将里面的 1 年有效期修改为 10 年或者 100 年,也不会影响使用 kubeadm 后续的升级,所以修改源码能很好的规避这个证书过期风险。
查看证书时间
kubeadm alpha certs check-expiration
-
- CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
- admin.conf Aug 14, 2022 03:15 UTC 364d no
- apiserver Aug 14, 2022 03:15 UTC 364d ca no
- apiserver-etcd-client Aug 14, 2022 03:15 UTC 364d etcd-ca no
- apiserver-kubelet-client Aug 14, 2022 03:15 UTC 364d ca no
- controller-manager.conf Aug 14, 2022 03:15 UTC 364d no
- etcd-healthcheck-client Aug 14, 2022 03:15 UTC 364d etcd-ca no
- etcd-peer Aug 14, 2022 03:15 UTC 364d etcd-ca no
- etcd-server Aug 14, 2022 03:15 UTC 364d etcd-ca no
- front-proxy-client Aug 14, 2022 03:15 UTC 364d front-proxy-ca no
- scheduler.conf Aug 14, 2022 03:15 UTC 364d no
-
- CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
- ca Aug 14, 2031 03:15 UTC 9y no
- etcd-ca Aug 14, 2031 03:15 UTC 9y no
- front-proxy-ca Aug 14, 2031 03:15 UTC 9y no
由于 Kubeadm 是 Go 语言编写的,所以我们提前安装好编译 Kubeadm 源码的工具,操作过程按下面执行即可:
(1) 安装编译工具
$ yum install -y gcc make rsync jq
(2) 下载并配置 Golang 环境
- ## 下载 golang 1.15.15
- $ wget https://dl.google.com/go/go1.15.15.linux-amd64.tar.gz
-
- ## 解压并放置在一个目录中
- $ tar zxvf go1.15.15.linux-amd64.tar.gz -C /usr/local
-
- ## 编辑 /etc/profile 文件,添加 Go 环境配置内容
- $ vi /etc/profile
-
- export GOROOT=/usr/local/go
- export GOPATH=/usr/local/gopath
- export PATH=$PATH:$GOROOT/bin
-
- ## 使配置生效
- $ source /etc/profile
-
- ## 测试 Go 命令是否配置成功,成功则显示如下
- $ go version
-
- go version go1.15.15 linux/amd64
下载 Kubernetes 源码,然后切换到指定版本,操作的命令如下:
- ## 下的 kubernetes 源码
- $ git clone https://github.com/kubernetes/kubernetes.git
-
- ## 进入 Kubernetes 目录
- $ cd kubernetes
-
- ## 切换 Kubernetes 版本
- $ git checkout v1.20.9
接下来我们修改 Kubernetes 代码中与 kubeadm 证书有效期相关的源码,操作的命令如下:
(1) 修改 constants.go
文件,操作如下:
- vim cmd/kubeadm/app/constants/constants.go
-
-
- ########### 后面追加个 * 100 (注掉部分为源代码,后面跟着的是修改后的代码)
- #const duration365d = time.Hour * 24 * 365
- const duration365d = time.Hour * 24 * 365 * 100
-
- // Config contains the basic fields required for creating a certificate
- type Config struct {
- CommonName string
- Organization []string
- AltNames AltNames
- Usages []x509.ExtKeyUsage
- }
修改 cert.go
文件,操作如下:
- vim staging/src/k8s.io/client-go/util/cert/cert.go
-
-
- ########### 修改10年为100年(注掉部分为源代码,后面跟着的是修改后的代码)
- #NotAfter: now.Add(duration365d * 10).UTC(),
- NotAfter: now.Add(duration365d * 100).UTC(),
- KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,
- BasicConstraintsValid: true,
- IsCA: true,
使用 make 命令编译 kubeadm, 执行的命令如下:
make all WHAT=cmd/kubeadm GOFLAGS=-v
编译成功后的 kubeadm 会放到当前目录中的 ./_output/local/bin/linux/amd64/
目录中,我们进入到该文件下,查看是否有对应的文件。
- ## 进入
- $ cd ./_output/local/bin/linux/amd64/
-
- ## 查看文件列表
- $ ls -l
-
- -rwxr-xr-x 10:03 conversion-gen
- -rwxr-xr-x 10:03 deepcopy-gen
- -rwxr-xr-x 10:03 defaulter-gen
- -rwxr-xr-x 10:03 go2make
- -rwxr-xr-x 10:04 go-bindata
- -rwxr-xr-x 10:04 kubeadm
- -rwxr-xr-x 10:47 kubectl
- -rwxr-xr-x 10:34 kubelet
- -rwxr-xr-x 10:04 openapi-gen
- -rwxr-xr-x 10:03 prerelease-lifecycle-gen
在使用我们自己编译的 kubeadm 之前,有一个需要注意的点,那就是我们一定要先提前安装好官方 kubeadm,并且版本和我们编译的 kubeadm 版本要一致,否则使用 kubeadm 初始化集群会报错,这里安装 kubeadm 执行的命令如下:
(1) 配置可用的 Kubernetes 国内 yum 源
- cat <<EOF > /etc/yum.repos.d/kubernetes.repo
-
- [kubernetes]
- name=Kubernetes
- baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
- enabled=1
- gpgcheck=0
- repo_gpgcheck=0
- gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
- EOF
使用 yum 命令安装 kubeadm 的 1.20.9
版本
yum install -y kubeadm-1.20.9
接下来我们使用自定义编译的 kubeadm 工具,将已经安装的 kubeadm 给替换掉,执行的操作命令如下:
- ## 备份已有的 kubeadm 工具
- $ mv /usr/bin/kubeadm /usr/bin/kubeadm_backup
-
- ## 使用自己编译的 kubeadm 替换现有的 kubeadm 工具
- $ cp ./_output/local/bin/linux/amd64/kubeadm /usr/bin/kubeadm
-
- ## 修改文件的执行权限
- $ chmod +x /usr/bin/kubeadm
当将我们自己编译的 kubeadm 替换原来的 kubeadm 工具后,我们就可以使用 kubeadm init
命令初始化 Kubernetes 集群进行测试,命令如下:
- kubeadm init \
- --image-repository registry.aliyuncs.com/google_containers \
- --apiserver-advertise-address=192.168.2.31 \
- --service-cidr=10.96.0.0/12 \
- --pod-network-cidr=10.96.0.0/12 \
- --kubernetes-version=1.20.9
$ kubeadm alpha certs check-expiration