k8s证书使用kubeadm部署有效期为一年,有一种很方便的续期方式能无脑直接续期10年时间

非etcd外设纯容器化证书续期方法

git clone https://github.com/yuyicai/update-kube-cert.git
cd update-kube-cert
chmod 755 update-kubeadm-cert.sh
./update-kubeadm-cert.sh all

但显然这并不能满足大多数场景,etcd外设此方法就解决不了。官网给出的kubeadm方式也是一年一续期。本人研究各种方式想要续期长一点发现危险指数都很高,例如替换证书。替换证书导致了集群无法访问,之前还没做备份集群直接瘫痪了,而且要替换很多。于是采用了官网1年的续期方案做实验。虽然续期是1年很短但是kubeadm毕竟稳妥,保命要紧。

本文采用centos8 k8s1.19.1 docker19.03.14版本,etcd外设 

配置证书轮转,kubelet自动续期

1.查看kubelet证书有效期
cd /var/lib/kubelet/pki/
openssl x509 -in kubelet-client-current.pem -noout -dates
 2.配置kube-controller-manager 组件
vim /etc/kubernetes/manifests/kube-controller-manager.yaml 
  - command:
    - kube-controller-manager
    - --experimental-cluster-signing-duration=87600h0m0s
    - --feature-gates=RotateKubeletServerCertificate=true
3.更新pod
kubectl delete pod kube-controller-manager-k8s-master -n kube-system
 4.开启kubelet 证书轮转
vi /var/lib/kubelet/config.yaml 

rotateCertificates: true    #默认是开启的
5.重启kubelet
 systemctl restart kubelet

证书验证以及细节参看以下文章: 

Kubernetes Kubeadm Kubelet 证书自动续签_kubelet-client-2023-01-18-22-31-02.pem-CSDN博客文章浏览阅读4.3k次,点赞2次,收藏16次。Kubelet 证书自动续签K8s证书一般分为两套:K8s组件(apiserver)和Etcd假如按角色来分,证书分为管理节点和工作节点。• 管理节点:如果是kubeadm部署则自动生成,如果是二进制部署一般由cfssl或者openssl生成。• 工作节点:工作节点主要是指kubelet连接apiserver所需的客户端证书,这个证书由controller-manager组件自动颁发,默认是一年,如果到期,kubelet将无法使用过期的证书连接apiserver,从而导致无法正常工作,日志会_kubelet-client-2023-01-18-22-31-02.pemhttps://blog.csdn.net/qq_34556414/article/details/114057422

ETCD外设集群证书续期

1.查看证书有效期
cd /etc/kubernetes/pki/ && for i in $(ls *.crt); do echo "===== $i ====="; openssl x509 -in $i -text -noout | grep -A 3 'Validity' ; done
===== apiserver.crt =====
        Validity
            Not Before: Jun 12 08:30:08 2024 GMT
            Not After : Jun 12 08:30:08 2025 GMT
        Subject: CN = kube-apiserver
===== apiserver-kubelet-client.crt =====
        Validity
            Not Before: Jun 12 08:30:08 2024 GMT
            Not After : Jun 12 08:30:08 2025 GMT
        Subject: O = system:masters, CN = kube-apiserver-kubelet-client
===== ca.crt =====
        Validity
            Not Before: Jun 12 08:30:08 2024 GMT
            Not After : Jun 10 08:30:08 2034 GMT
        Subject: CN = kubernetes
===== front-proxy-ca.crt =====
        Validity
            Not Before: Jun 12 08:30:08 2024 GMT
            Not After : Jun 10 08:30:08 2034 GMT
        Subject: CN = front-proxy-ca
===== front-proxy-client.crt =====
        Validity
            Not Before: Jun 12 08:30:08 2024 GMT
            Not After : Jun 12 08:30:08 2025 GMT
        Subject: CN = front-proxy-client

[root@k8s-1 /etc/kubernetes/pki]# ls
apiserver.crt                  apiserver.key                 ca.crt  front-proxy-ca.crt      front-proxy-client.key
apiserver-etcd-client-key.pem  apiserver-kubelet-client.crt  ca.key  front-proxy-ca.key      sa.key
apiserver-etcd-client.pem      apiserver-kubelet-client.key  etcd    front-proxy-client.crt  sa.pub
另一种kubeadm方式查看证书有效期
kubeadm alpha 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 -oyaml'

CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
admin.conf                 Jun 12, 2025 08:37 UTC   15h                                     no
apiserver                  Jun 12, 2025 08:37 UTC   15h             ca                      no
apiserver-kubelet-client   Jun 12, 2025 08:37 UTC   15h             ca                      no
controller-manager.conf    Jun 12, 2025 08:37 UTC   15h                                     no
front-proxy-client         Jun 12, 2025 08:37 UTC   15h             front-proxy-ca          no
scheduler.conf             Jun 12, 2025 08:37 UTC   15h                                     no

CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      Jun 10, 2034 08:30 UTC   9y              no
front-proxy-ca          Jun 10, 2034 08:30 UTC   9y              no
2.备份证书(必须执行)
cp -r /etc/kubernetes /etc/kubernetes.old

注意:必须备份,之前集群瘫痪就是没有备份
3.使用kubeadm更新证书
#上面证书可以看到时间跟需要升级的证书
#续期 API 服务器证书:
kubeadm alpha certs renew apiserver

#续期 API 服务器到 kubelet 的客户端证书:
kubeadm alpha certs renew apiserver-kubelet-client

#续期控制器管理器的 kubeconfig 证书:
kubeadm alpha certs renew controller-manager.conf

#续期调度器的 kubeconfig 证书:
kubeadm alpha certs renew scheduler.conf

#续期前端代理客户端证书:
kubeadm alpha certs renew front-proxy-client

#续期集群客户端admin证书
kubeadm alpha certs renew admin.conf

#重启kubelet
systemctl restart kubelet

#注意:master都执行一遍,切记一个一个来切勿同时更新重启!
 5.验证证书有效期
cd  /etc/kubernetes/pki
-rw-r--r-- 1 root root 1269 6月  12 00:30 apiserver.crt
-rw------- 1 root root  227 6月  12 2024 apiserver-etcd-client-key.pem
-rw-r--r-- 1 root root  875 6月  12 2024 apiserver-etcd-client.pem
-rw------- 1 root root 1679 6月  12 00:30 apiserver.key
-rw-r--r-- 1 root root 1143 6月  12 00:30 apiserver-kubelet-client.crt
-rw------- 1 root root 1679 6月  12 00:30 apiserver-kubelet-client.key
-rw-r--r-- 1 root root 1066 6月  12 2024 ca.crt
-rw------- 1 root root 1675 6月  12 2024 ca.key
drwxr-xr-x 2 root root   20 6月  12 2024 etcd
-rw-r--r-- 1 root root 1078 6月  12 2024 front-proxy-ca.crt
-rw------- 1 root root 1679 6月  12 2024 front-proxy-ca.key
-rw-r--r-- 1 root root 1103 6月  12 00:31 front-proxy-client.crt
-rw------- 1 root root 1679 6月  12 00:31 front-proxy-client.key
-rw------- 1 root root 1679 6月  12 2024 sa.key
-rw------- 1 root root  451 6月  12 2024 sa.pub

#可以看到更新了哪些证书,etcd没动没有更新,因为我们是etcd外设早就配置好了有效期。如果你不小心更新了etcd或者kubeadm alpha certs renew all了,要是刚部署集群可以铲掉重来。有备份的话还原备份(备份重要性)

#查看有效期
kubeadm alpha certs check-expiration

#查看有效期
cd /etc/kubernetes/pki/ && for i in $(ls *.crt); do echo "===== $i ====="; openssl x509 -in $i -text -noout | grep -A 3 'Validity' ; done

注意:kubeadm alpha certs renew all因集群而议。二进制k8s可自定义证书,证书可控。kubeadm源代码是1年,网上一些野生方法改kubeadm源码我也试了,但是没编译成功。而且k8s版本太多用到就得重新编译一次,网上虽然有1.19.0的但跟小版本不一致我也没敢用没验证感兴趣可以自己研究。最后我采用的是1年1续虽然有些麻烦但毕竟丝滑操作简单风险小。网上替换证书的方案大佬可以无视本文

更新证书脚本

#!/bin/bash
commands=("kubeadm alpha certs renew apiserver"
"kubeadm alpha certs renew apiserver-kubelet-client"
"kubeadm alpha certs renew controller-manager.conf"
"kubeadm alpha certs renew scheduler.conf"
"kubeadm alpha certs renew front-proxy-client"
"kubeadm alpha certs renew admin.conf")

# 获取命令数组长度
length=${#commands[@]}
# 循环执行命令数组中的每个命令
for ((i=0; i<$length; i++)); do
    # 获取当前索引对应的命令
    cmd=${commands[$i]}

    # 执行命令
    echo "Executing command: $cmd"
    eval "$cmd" > /dev/null

    # 暂停3秒
    sleep 3

    # 检查命令是否执行成功,可根据实际需求调整这里的检查逻辑
    if [ $? -eq 0 ]; then
        echo "Command executed successfully."
    else
        echo "Command failed with exit code $?."
        # 可以在这里决定是否继续执行后续命令或退出脚本
    fi
done
        read -p "Do you want to restart kubelet yes/no: " KUBELETE
        case $KUBELETE in
                yes)
                        systemctl restart kubelet
                        if  [ $? -eq 0 ]; then
                                echo "Restart successful"
                        fi
                ;;

                no)
                        exit
                ;;
                *)
                echo "Please enter yes or no"
                ;;
        esac

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐