一、问题现象和原因
Kubernetes 日志错误
当 Kubernetes 集群日志中出现certificate has expired or is not yet valid
错误信息时,表明证书过期
证书过期原因
- 服务器时间不对,导致证书过期
- 确实证书过期了
证书过期,很多同学会很疑惑,我证书明明签署10年
有效期或者更久
,怎么刚1年就过期了
,下面就来解惑。
Kubernetes 集群证书
集群分为两种证书:一、用于集群Master、Etcd
等通信的证书。 二、用于集群Kubelet
组件证书
Kubernetes 集群中 Kubelet 组件坑
我们在搭建 Kubernetes 集群时,一般只声明用于集群Master、Etcd
等通信的证书 为10年
或者更久
,但未声明集群Kubelet 组件证书
,Kubelet 组件证书
默认有效期为1年
。集群运行1年以后就会导致报certificate has expired or is not yet valid
错误,导致集群 Node
不能于集群 Master
正常通信。
二、 解决方法
添加参数
修改
kubelet 组件配置
,具体添加下面参数1 --feature-gates=RotateKubeletServerCertificate=true 2 --feature-gates=RotateKubeletClientCertificate=true 3 # 1.8版本以上包含1.8都支持证书更换自动重载,以下版本只能手动重启服务 4 --rotate-certificates
修改
controller-manager 组件配置
,具体添加下面参数1 # 证书有效期为10年 2 3 --experimental-cluster-signing-duration=87600h0m0s 4 5 --feature-gates=RotateKubeletServerCertificate=true
创建自动批准相关 CSR 请求的 ClusterRole
vim tls-instructs-csr.yaml && kubectl apply -f tls-instructs-csr.yaml
1 kind: ClusterRole 2 apiVersion: rbac.authorization.k8s.io/v1 3 metadata: 4 name: system:certificates.k8s.io:certificatesigningrequests:selfnodeserver 5 rules: 6 - apiGroups: ["certificates.k8s.io"] 7 resources: ["certificatesigningrequests/selfnodeserver"] 8 verbs: ["create"]
#自动批准 kubelet-bootstrap 用户 TLS bootstrapping 首次申请证书的 CSR 请求
kubectl create clusterrolebinding node-client-auto-approve-csr --clusterrole=system:certificates.k8s.io:certificatesigningrequests:nodeclient --user=kubelet-bootstrap
#自动批准 system:nodes 组用户更新 kubelet 自身与 apiserver 通讯证书的 CSR 请求
kubectl create clusterrolebinding node-client-auto-renew-crt --clusterrole=system:certificates.k8s.io:certificatesigningrequests:selfnodeclient --group=system:nodes
#自动批准 system:nodes 组用户更新 kubelet 10250 api 端口证书的 CSR 请求
kubectl create clusterrolebinding node-server-auto-renew-crt --clusterrole=system:certificates.k8s.io:certificatesigningrequests:selfnodeserver --group=system:nodes
重启kube-controller-manager 和 kubelet 服务
1 $ systemctl daemon-reload
2 $ systemctl restart kube-controller-manager.service 3 # 进入到ssl配置目录,删除 kubelet 证书 4 $ rm -f kubelet-client-current.pem kubelet-client-*.pem kubelet.key kubelet.crt 5 6 # 重启启动,启动正常后会颁发有效期10年的ssl证书 7 $ systemctl restart kubelet 8 9 10 # 进入到ssl配置目录,查看证书有效期 11 $ openssl x509 -in kubelet-client-current.pem -noout -text | grep "Not" 12 Not Before: Nov 22 08:46:00 2019 GMT
13 Not After : Nov 19 08:46:00 2029 GMT