K8s 证书认知
在谈起 Kubernetes 证书时,总感觉其涵盖的内容繁多,仿佛千头万绪,让人不知该从何处着手阐述。为了更好地理清思路,本文将对相关内容进行系统的梳理和记录。
1、证书及链路关系
Kubeadm部署的集群,K8s CA证书是10年,其他组件的证书日期是1年,etcd证书日期可以通过配置设置为10年。
-
服务端证书: 服务端证书是安装在服务器端的证书,主要用于服务器向客户端证明自己的合法身份,确保客户端连接到正确的服务器,有效时间一般设置比较长。
-
客户端证书: 客户端证书是安装在客户端的证书,主要用于向服务器证明客户端的身份,确保服务器只接受合法的客户端请求,有效时间相对可以设置短些。
-
CA证书: 服务端或客户端证书都通过CA生成的,Kubeadm安装的集群一般有三套CA证书,一套给etcd、一套给K8s内部使用、一套给聚合层使用,他们都是10年。
-
证书配置一般有三个文件,含CA,证书和私钥(key字样): 证书是验证对方证书有效性,私钥是解密和签名操作。
1.1、etcd证书
通过ps -ef| grep etcd或systemctl status etcd查看etcd配置从而知道证书目录。
链路关系:服务本身、etcd集群节点间和客户端(etcdctl指令和kube-apiserver访问etcd的客户端证书)。
1.2、kubeadm token令牌
当kubeadm init或一个新节点或组件启动时,它可以使用Token向kube-apiserver进行身份认证,一般是24h。可通过kubeadm token create命令生成,kubeadm token list查看。
1.3、kube-apiserver证书
最复杂,需要和多个组件链接认证,通过查看apiserver配置文件,一般在/etc/kubernetes/manifests目录下kube-apiserver.yaml
链路关系:服务本身、客户端证书(kube-apiserver访问etcd、kubelet和front-proxy)。
1.4、kubelet证书
kubelet有客户端证书和服务端证书,客户端证书可以通过设置自动续签。
链路关系:客户端(kubelet访问kube-apiserver,是通过kubeconfig,其中客户端证书和私钥为:kubelet-client-current.pem)、服务端(可以在kube-apiserver和metric-server访问时使用,但一般不会设置)。
1.5、ServiceAccount认证
在K8s集群内部访问kube-apiserver使用的是SA,如pod和kube-proxy访问kube-apiserver。/etc/kubernetes/pki目录下,还有sa.pub和sa.key这两个就是用于sa认证的。这点容易遗漏。
1.6、其他组件证书
像kube-controller-manager、kube-scheduler和kubectl都是通过kubeconfig访问kube-apiserver, 配置文件中包括client-certificate-data 和 client-key-data的客户端证书和密钥。
2、查看证书日期方法(可参考,可不看)
K8s原生方法和openssl方法查看 原生方法:kubeadm certs check-expiration 说明如下:scheduler.conf也显示过期日期,因为文件里面包括证书和密钥,所以也有过期日期。
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
kubeadm certs check-expiration
[check-expiration] Reading configuration from the cluster...
[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
W0117 15:36:09.319227 21835 utils.go:69] The recommended value for "clusterDNS" in "KubeletConfiguration" is: [10.233.0.10]; the provided value is: [169.254.25.10]
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Dec 25, 2025 05:12 UTC 341d no
apiserver Dec 25, 2025 05:12 UTC 341d ca no
apiserver-kubelet-client Dec 25, 2025 05:12 UTC 341d ca no
controller-manager.conf Dec 25, 2025 05:12 UTC 341d no
front-proxy-client Dec 25, 2025 05:12 UTC 341d front-proxy-ca no
scheduler.conf Dec 25, 2025 05:12 UTC 341d no
CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
ca Dec 23, 2034 05:12 UTC 9y no
front-proxy-ca Dec 23, 2034 05:12 UTC 9y no
openssl方法:到证书目录下,要看那个组件选择对应的crt或者pem文件, openssl x509 -in *.crt -noout -text | grep 'Not':
ounter(lineounter(lineounter(lineounter(line
cd /etc/kubernetes/pki
openssl x509 -in apiserver-kubelet-client.crt -noout -text | grep 'Not'
Not Before: Dec 25 05:12:35 2024 GMT
Not After : Dec 25 05:12:36 2025 GMT
3、证书更新(参考,可不看)
目前大概有三种方法,一种升级、命令更新和编译Kubeadm源码修改。主要分四大类,一个是etcd,一个是kube-apiserver服务端,一个是kubelet客户端,一个是K8s其他组件证书
-
etcd修复,参考之前写过一篇etcd证书过期解决方法。
3,1、kube-apiserver相关证书
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
1、在k8s-master节点执行renew all
kubeadm certs renew all --config=/root/kubeadm-config.yaml
2、查看更新日期,kubeadm certs check-expiration
3、更新kubeconfig文件
rm -fr /etc/kubernetes/*.conf
kubeadm init phase kubeconfig all --config /root/kubeadm-config.yaml
4、重启相关pod,包括kube-apiserver、kube-controller-manager和kube-scheduler
5、拷贝admin.conf到$HOME/.kube/下
3.2、kubelet证书
若 kubelet 已经配置了证书自动更新,则可略过该步骤,可查看节点 /etc/kubernetes/kubelet.conf 中 client-certificate 和 client-key: 如果为证书路径,则说明当前节点开启了 kubelet 证书自动更新,可略过该步骤; 如果为证书内容,则需要参考该步骤对 kubelet.conf 进行更新。
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
# 1. 查看 token 是否为空或者过期
kubeadm token list
# 2. 生成新token
kubeadm token create
# 3. 记录token值
替换node节点 /etc/kubernetes/bootstrap-kubelet.conf 中 token
# 4. 替换node节点 /etc/kubernetes/bootstrap-kubelet.conf 中 user.token 字段
# 5. 删除 /etc/kubernetes/kubelet.conf
rm -rf /etc/kubernetes/kubelet.conf
# 6. 重启kubelet
systemctl restart kubelet
# 7. 查看节点状态
kubectl get node
3.2.1、配置kubelet证书自动更新
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
1、为 kube-controller-manager和kube-apiserver和kube-schedule 添加 --experimental-cluster-signing-duration 参数(v1.19及以上版本为 --cluster-signing-duration),然后重启
2、kubelet配置文件添加参数 rotateCertificates: true(每个node操作)
3、获取 kubeadm join 命令,该命令须在 master 节点上执行
kubeadm token create --print-join-command
4、 利用 kubeadm 重新 bootstrap kubelet(每个node操作)
# 移除 /etc/kubernetes/kubelet.conf
mv /etc/kubernetes/kubelet.conf /etc/kubernetes/kubelet.conf.bak
# 注意: 1. 复制自己生成的命令; 2. kubeadm join 后添加 phase kubelet-start
kubeadm join phase kubelet-start lb.kubesphere.local:6443 --token lx8w73.nmt255scsz0krakz --discovery-token-ca-cert-hash sha256:55a4ffbf1271bd46d3b2dda2bb716de2a1cc23fb70aa57f241db2ee08f48b715
4、总结
针对证书过期问题,第一要明确那个证书过期再对症下药。通过进入不同证书目录执行openssl指令或K8s原生指令kubeadm certs check-expiration查看哪个组件过期。
-
etcd证书一般10年,不容易过期。
-
kube-apiserver证书一般1年,有问题先排查。
-
kubelet证书一般1年,会自动更新,没有配置自动需要配置自动更新。