暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Kubernetes专题系列-更换证书

运维及时雨 2020-09-30
930

在上一篇Kubernetes专题系列-部署篇中忘记说个事,就是在部署之前一定要记得配置时间服务器,确保k8s中每个节点的时间要一致。
k8s版本:v1.16.8,部署方式是kubespray,以下无特殊说明均在master节点操作。


      查看集群信息:

    [root@node111 ~]# kubectl  get node -o wide 
    NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
    node111 Ready master 161d v1.16.8 192.168.0.111 <none> CentOS Linux 7 (Core) 3.10.0-1062.18.1.el7.x86_64 docker://19.3.8
    node112 Ready master 161d v1.16.8 192.168.0.112 <none> CentOS Linux 7 (Core) 3.10.0-1062.18.1.el7.x86_64 docker://19.3.8
    node113 Ready <none> 161d v1.16.8 192.168.0.113 <none> CentOS Linux 7 (Core) 3.10.0-1062.18.1.el7.x86_64 docker://19.3.8
    查看集群证书信息:
      [root@node111 ~]# kubeadm alpha  certs check-expiration --config=/etc/kubernetes/kubeadm-config.yaml 
      W0930 14:31:41.401845 11811 defaults.go:199] The recommended value for "clusterDNS" in "KubeletConfiguration" is: [10.233.0.10]; the provided value is: [169.254.25.10]
      CERTIFICATE EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
      admin.conf May 13, 2021 05:22 UTC 224d no
      apiserver Apr 21, 2021 14:23 UTC 203d no
      apiserver-kubelet-client Apr 21, 2021 14:23 UTC 203d no
      controller-manager.conf May 13, 2021 05:22 UTC 224d no
      front-proxy-client Apr 21, 2021 14:23 UTC 203d no
      scheduler.conf May 13, 2021 05:22 UTC 224d no
      为了模拟证书过期,我们人为的把集群内所有服务器的日期和时间调整过期:
        [root@node111 ~]# date -s  "2021-09-01"
        再次查看集群证书发现已过期,且命令不可以用,如果有业务跑在集群中则服务不可用:
          [root@node111 ~]# kubeadm alpha  certs check-expiration --config=/etc/kubernetes/kubeadm-config.yaml 
          W0901 00:00:13.441409 12881 defaults.go:199] The recommended value for "clusterDNS" in "KubeletConfiguration" is: [10.233.0.10]; the provided value is: [169.254.25.10]
          CERTIFICATE EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
          admin.conf May 13, 2021 05:22 UTC <invalid> no
          apiserver Apr 21, 2021 14:23 UTC <invalid> no
          apiserver-kubelet-client Apr 21, 2021 14:23 UTC <invalid> no
          controller-manager.conf May 13, 2021 05:22 UTC <invalid> no
          front-proxy-client Apr 21, 2021 14:23 UTC <invalid> no
          scheduler.conf May 13, 2021 05:22 UTC <invalid> no
          [root@node111 ~]# kubectl get node -o wide
          Unable to connect to the server: x509: certificate has expired or is not yet valid
          下面我们开始更新进群证书,首先备份原有证书:
            [root@node111 ~]# mkdir etc/kubernetes.bak
            [root@node111 ~]# cp -r etc/kubernetes/pki/ etc/kubernetes.bak
            [root@node111 ~]# cp etc/kubernetes/*.conf etc/kubernetes.ba
            然后备份 etcd 数据目录:
              [root@node111 ~]#cp -r var/lib/etcd var/lib/etcd.bak
              接下来执行更新证书:
                [root@node111 ~]# kubeadm alpha  certs renew all  --config etc/kubernetes/kubeadm-config.yaml

                上述命令执行后再check一下证书是否已更新:

                  [root@node111 ~]# kubeadm alpha  certs check-expiration --config=/etc/kubernetes/kubeadm-config.yaml 
                  CERTIFICATE EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
                  admin.conf Aug 31, 2022 16:08 UTC 364d no
                  apiserver Aug 31, 2022 16:08 UTC 364d no
                  apiserver-kubelet-client Apr 21, 2021 14:23 UTC <invalid> no
                  controller-manager.conf May 13, 2021 05:22 UTC <invalid> no
                  front-proxy-client Apr 21, 2021 14:23 UTC <invalid> no
                  scheduler.conf May 13, 2021 05:22 UTC <invalid> no

                  我的没有更新成功(问题待查),如果未更新可以分开更新:

                    [root@node111 ~]#kubeadm alpha certs renew admin.conf  --config=/etc/kubernetes/kubeadm-config.yaml
                    [root@node111 ~]#kubeadm alpha certs renew apiserver --config=/etc/kubernetes/kubeadm-config.yaml
                    [root@node111 ~]#kubeadm alpha certs renew apiserver-kubelet-client --config=/etc/kubernetes/kubeadm-config.yaml
                    [root@node111 ~]#kubeadm alpha certs renew controller-manager.conf --config=/etc/kubernetes/kubeadm-config.yaml
                    [root@node111 ~]#kubeadm alpha certs renew front-proxy-client --config=/etc/kubernetes/kubeadm-config.yaml
                    [root@node111 ~]#kubeadm alpha certs renew scheduler.conf --config=/etc/kubernetes/kubeadm-config.yaml
                    分开执行后再次check证书,可以看到已更新成功:
                      [root@node111 ~]# kubeadm alpha  certs check-expiration --config=/etc/kubernetes/kubeadm-config.yaml              
                      CERTIFICATE EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
                      admin.conf Aug 31, 2022 16:12 UTC 364d no
                      apiserver Aug 31, 2022 16:12 UTC 364d no
                      apiserver-kubelet-client Aug 31, 2022 16:12 UTC 364d no
                      controller-manager.conf Aug 31, 2022 16:12 UTC 364d no
                      front-proxy-client Aug 31, 2022 16:12 UTC 364d no
                      scheduler.conf Aug 31, 2022 16:12 UTC 364d no
                      更新kublet.conf 文件,把之前的备份:
                        [root@node111 ~]# mv etc/kubernetes/kubelet.conf  /etc/kubernetes/kubelet.conf.bak
                        [root@node111 ~]# kubeadm init phase kubeconfig kubelet --config /etc/kubernetes/kubeadm-config.yaml 
                        [kubeconfig] Using existing kubeconfig file: "/etc/kubernetes/kubelet.conf"
                        将新生成的 admin 配置文件覆盖掉原本的 admin 文件:
                          [root@node111 ~]# mv $HOME/.kube/config $HOME/.kube/config.old
                          [root@node111 ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
                          [root@node111 ~]# chown $(id -u):$(id -g) $HOME/.kube/config
                          完成后重启 kube-apiserver、kube-controller、kube-scheduler、etcd 这4个容器即可,重启kubelet后我们可以查看apiserver的证书的有效期或者执行一条k8s命令来验证是否更新成功:
                            [root@node111 ~]# docker ps |grep -E 'k8s_kube-apiserver|k8s_kube-controller-manager|k8s_kube-scheduler|k8s_etcd_etcd' | awk -F ' ' '{print $1}' |xargs docker restart
                            cf25631947c9
                            8c7ef641819c
                            b2635e60039a
                              [root@node111 ~]# echo | openssl s_client -showcerts -connect 127.0.0.1:6443 -servername api 2>/dev/null | openssl x509 -noout -enddate
                              notAfter=Aug 31 16:12:52 2022 GMT
                                [root@node111 ~]# kubectl  get node 
                                NAME STATUS ROLES AGE VERSION
                                node111 Ready master 568d v1.16.8
                                node112 NotReady master 568d v1.16.8
                                node113 NotReady <none> 568d v1.16.8

                                如果有多个master步骤按照上面的再来一次即可,当然,更新kubernetes证书方法有很多种,如果你是实打实的通过kubeadm部署的kubernetes集群,直接renew all 再调整一下config即可,如果是使用第三方部署工具部署的,需要具体看下部署工具这块证书生成的具体步骤和脚本,但万变不离其宗。

                                对于Node节点kubelet的证书更换,当kubelet配置了--feature-gates=RotateKubeletClientCertificate=true选项后,会在证书总有效期的 70%~90% 的时间内发起续期请求,请求被批准后会生成一个 kubelet-client-时间戳.pem;kubelet-client-current.pem 文件则始终软连接到最新的真实证书文件,除首次启动外,kubelet 一直会使用这个证书同 apiserver 通讯。

                                下一篇我们讲,如果遇到特殊情况,该配置在Node节点没有配置,需要手工签发该怎么操作?


                                参考文章:

                                https://www.qikqiak.com/post/update-k8s-10y-expire-certs/

                                https://www.jianshu.com/p/bb973ab1029b


                                文章转载自运维及时雨,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                评论