TIPS之 Kubernetes Kubelet certs 滚动更新

Kubernetes Kubelet certs 滚动更新

Posted by 董江 on Tuesday, September 13, 2022

Kubernetes Kubelet certs 滚动更新

kubelet证书到期,kubelet将无法使用过期的证书连接apiserver,从而导致kubelet无法正常工作,日志会给出证书过期错误(x509: certificate has expired or is not yet valid)。

其中分为两部分:

Kubelet进程管理的 (client pem) APIServer进程管理的 (server pem)

证书由kube-controller-manager组件自动颁发。

默认证书位置和证书有效期

master节点证书

$  pwd
/etc/kubernetes/pki

$  ls | grep "crt"
apiserver-etcd-client.crt
apiserver-kubelet-client.crt
apiserver.crt
ca.crt
front-proxy-ca.crt
front-proxy-client.crt

$  ls | grep "crt" | xargs -I {} openssl x509 -noout -dates -in /etc/kubernetes/pki/{}
notBefore=Sep 12 11:27:45 2022 GMT   #apiserver-etcd-client.crt  apiserver访问etcd 1年
notAfter=Sep 13 11:33:28 2023 GMT
notBefore=Sep 12 11:27:43 2022 GMT  #apiserver-kubelet-client.crt  kubelet访问apiserver 1年
notAfter=Sep 13 11:33:28 2023 GMT
notBefore=Sep 12 11:27:43 2022 GMT #apiserver.crt  apiserver Server端证书 1年
notAfter=Sep 13 11:33:28 2023 GMT
notBefore=Sep 12 11:27:43 2022 GMT #ca.crt ca证书 100年 默认是10年
notAfter=Aug 20 11:27:43 2122 GMT
notBefore=Sep 12 11:27:45 2022 GMT #apiserver lb server证书 100年 非控制面标准组件
notAfter=Aug 20 11:27:45 2122 GMT
notBefore=Sep 12 11:27:45 2022 GMT #apiserver lb client证书 1年 非控制面标准组件
notAfter=Sep 13 11:33:28 2023 GMT

Node节点Kubelet证书:

$  openssl x509 -noout -dates -in /var/lib/kubelet/pki/kubelet.crt 
notBefore=Sep 13 10:35:20 2022 GMT  #kubelet.crt 证书 1年
notAfter=Sep 13 10:35:20 2023 GMT

$  openssl x509 -noout -dates -in /etc/kubernetes/pki/ca.crt
notBefore=Sep 12 11:27:43 2022 GMT
notAfter=Aug 20 11:27:43 2122 GMT

kube-controller-manager 配置

配置kube-controller-manager组件(master节点)

$   vim /etc/kubernetes/manifests/kube-controller-manager.yaml
...
spec:
  containers:
  - command:
    ...
    - --experimental-cluster-signing-duration=87600h0m0s  #10年
    - --feature-gates=RotateKubeletServerCertificate=true #高版本 默认开启了
...

kubelet 配置

配置kubelet组件(Node节点)

$ vim /var/lib/kubelet/config.yaml
...
rotateCertificates: true
serverTLSBootstrap: true
...

验证

修改服务器时间,模拟kubelet证书即将到期

[root@kcs-dj-test-s-nckbn /]#  cd /var/lib/kubelet/pki/
[root@kcs-dj-test-s-nckbn /var/lib/kubelet/pki]#  ls
kubelet-client-2022-09-13-19-35-20.pem  kubelet-client-current.pem  kubelet.crt  kubelet.key
[root@kcs-dj-test-s-nckbn /var/lib/kubelet/pki]#  openssl x509 -in kubelet-client-current.pem -noout -dates
notBefore=Sep 13 11:30:20 2022 GMT
notAfter=Sep 13 11:30:20 2023 GMT

[root@kcs-dj-test-s-nckbn /var/lib/kubelet/pki]#  date
Tue Sep 13 20:29:14 CST 2022
[root@kcs-dj-test-s-nckbn /var/lib/kubelet/pki]#  date -s "2023-09-10"
Sun Sep 10 00:00:00 CST 2023
[root@kcs-dj-test-s-nckbn /var/lib/kubelet/pki]#  date
Sun Sep 10 00:00:05 CST 2023

[root@kcs-dj-test-s-nckbn /var/lib/kubelet/pki]#  systemctl restart kubelet.service
# 模拟即将到期

[root@kcs-dj-test-s-nckbn /var/lib/kubelet/pki]#  openssl x509 -in kubelet-client-current.pem -noout -dates
notBefore=Sep 13 11:45:17 2022 GMT  #开始时间是controller-manager pod 内时间
notAfter=Sep 13 17:55:32 2032 GMT

更新kubectl certificate approve <CSR-名称>

[root@kcs-dj-test-m-4vdkh /]#  kubectl get csr| grep -v "Approved,Issued"
NAME        AGE    SIGNERNAME                                    REQUESTOR                         CONDITION
csr-9bspk   2m4s   kubernetes.io/kube-apiserver-client-kubelet   system:node:kcs-dj-test-s-nckbn   Pending
csr-tn2kf   101s   kubernetes.io/kube-apiserver-client-kubelet   system:node:kcs-dj-test-s-nckbn   Pending
csr-v779j   113s   kubernetes.io/kube-apiserver-client-kubelet   system:node:kcs-dj-test-s-nckbn   Pending

[root@kcs-dj-test-m-4vdkh /]#  kubectl certificate approve csr-9bspk csr-tn2kf csr-v779j
certificatesigningrequest.certificates.k8s.io/csr-9bspk approved
certificatesigningrequest.certificates.k8s.io/csr-tn2kf approved
certificatesigningrequest.certificates.k8s.io/csr-v779j approved
[root@kcs-dj-test-m-4vdkh /]#  kubectl get csr| grep -v "Approved,Issued"
NAME        AGE     SIGNERNAME                                    REQUESTOR                         CONDITION

清理之前授权csr kubectl certificate deny <CSR-名称>

避免通过使用过期的pem,更改系统时间,攻击apiserver

1.本身 kubelet 证书滚动更新都比较集中,如果遇到滚动更新节点失败,需要收到 更改 kubelet.conf 再重启实例 2.kubectl certificate approve 监听 csr是被授权使用,可定时授权

「如果这篇文章对你有用,请随意打赏」

Kubeservice博客

如果这篇文章对你有用,请随意打赏

使用微信扫描二维码完成支付