通过kubeadm搭建的集群默认的证书时间是1年(由于官方期望每年更新一次k8s的版本,在更新的时候会默认更新证书),当你执行命令出现以下报错,说明你的证书已经到期了,则需要手动更新证书。
1 | # kubectl get node |
以下说明手动更新证书的流程。
具体可以参考:使用 kubeadm 进行证书管理 | Kubernetes
1. 检查证书是否过期
1 | kubeadm certs check-expiration |
会输出以下的内容:
1 | CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED |
2. 手动更新过期的证书
分别在master节点
执行以下命令。
2.1. 备份/etc/kubernetes
目录
1 | cp -fr /etc/kubernetes /etc/kubernetes.bak |
2.2. 执行更新证书命令
1 | kubeadm certs renew all |
输出如下:
1 | # kubeadm certs renew all |
2.3. 重启k8s组件
先重启etcd
注意事项:需要将三个master节点的证书都重新更新后,然后三个master的etcd服务一起重启,使得etcd集群使用新的证书可以正常运行,否则会导致kube-apiserver也启动失败。
1 | crictl ps |grep "etcd"|awk '{print $1}'|xargs crictl stop |
再重启kube-apiserver、kube-controller、kube-scheduler容器。
1 | crictl ps |egrep "kube-apiserver|kube-scheduler|kube-controller"|awk '{print $1}'|xargs crictl stop |
2.4. 更新默认的kubeconfig文件
1 | cp -fr /etc/kubernetes/admin.conf $HOME/.kube/config |
由于kubelet默认支持证书轮转,当证书过期时,可以自动生成新的密钥,并从 Kubernetes API 申请新的证书。可以查看kubelet的配置检查是否已经开启。
1 | # cat /var/lib/kubelet/config.yaml |grep rotate |
3. 修改kubeadm源码证书时间
由于社区不允许用户配置超过1年的证书,因此自定义证书时间的参数不被允许开发。
相关issue如下:
如果要实现自定义参数设置证书时间,可参考一下pr:
如果需要修改kubeadm源码证书可以参考如下代码修改。
kubeadm中跟证书相关的代码有:
3.1. ca文件的有效期(默认为10年)
代码文件:./staging/src/k8s.io/client-go/util/cert/cert.go
中 NewSelfSignedCACert
函数的NotAfter字段
代码如下:
1 | // NewSelfSignedCACert creates a CA certificate |
3.2. 证书文件的有效期(默认为1年)
代码文件:cmd/kubeadm/app/util/pkiutil/pki_helpers.go
中 NewSignedCert
函数的 notAfter 字段
- 常量参数kubeadmconstants.
CertificateValidity
: /cmd/kubeadm/app/constants/constants.go
代码如下:
1 | // NewSignedCert creates a signed certificate using the given CA certificate and key |
其中常量文件为:
- /cmd/kubeadm/app/constants/constants.go
代码如下:
1 | # 常量默认证书为1年。 |
可以修改此处常量的值10年,例如:
1 | # 常量默认证书为1年。 |
修改源码后,就可以重新编译kubeadm二进制。生成10年的证书文件。
参考:
赞赏一下