k8s证书管理

1.K8s集群内置的证书在一年后会到期,导致集群不能正常使用

证书到期后会提示:Unable to connect to the server: x509: certificate has expired or is not yet valid

2. master 节点

在默认情况下,可以使用如下命令查看证书过期时间:

1
openssl x509 -noout -dates -in /etc/kubernetes/pki/apiserver.crt

证书主要存放在/etc/kubernetes/pki 目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@node1 ssl]# ll
total 52
-rw-r--r-- 1 root root 1407 Mar 24 10:07 apiserver.crt
-rw------- 1 root root 1675 Mar 24 10:07 apiserver.key
-rw-r--r-- 1 root root 1099 Mar 24 10:07 apiserver-kubelet-client.crt
-rw------- 1 root root 1679 Mar 24 10:07 apiserver-kubelet-client.key
-rw-r--r-- 1 root root 1025 Jan 18 21:00 ca.crt
-rw------- 1 root root 1679 Jan 18 21:00 ca.key
-rw-r--r-- 1 root root 2401 Mar 24 09:53 cluster.yaml
-rw-r--r-- 1 root root 1038 Jan 18 21:00 front-proxy-ca.crt
-rw------- 1 root root 1679 Jan 18 21:00 front-proxy-ca.key
-rw-r--r-- 1 root root 1058 Mar 24 10:07 front-proxy-client.crt
-rw------- 1 root root 1675 Mar 24 10:07 front-proxy-client.key
-rw------- 1 root root 1679 Jan 18 21:00 sa.key
-rw------- 1 root root 451 Jan 18 21:00 sa.pub

3. 集群在有效期内是进行证书续期

3.1 在某个master节点证书续期

  1. 如果使用已经修改后的kubeadm,可以先将/usr/local/bin 目录下的kubeadm进行备份和替换

  2. 备份配置文件和etcd

1
2
cp -rp /etc/kubernetes /etc/kubernetes.bak
cp -r /var/lib/etcd /var/lib/etcd.bak
  1. 生成集群配置文件,如果证书已经超期了,执行此命令会失败,可以尝试修改节点时间或者使用8080 端口连接api-server获取这些信息
1
2
cd /etc/kubernetes
kubeadm config view > ./cluster.yaml
  1. 使用kubeadm命令进行 证书续期
1
2
3
kubeadm alpha certs renew  apiserver --config=./cluster.yaml
kubeadm alpha certs renew apiserver-kubelet-client --config=./cluster.yaml
kubeadm alpha certs renew front-proxy-client --config=./cluster.yaml

执行完毕后,会在目录/etc/kubernetes/pki 生成新的证书,此时再查看证书有效期,会发现证书的有效期已经延长

  1. 重新生成配置文件
1
2
rm -f /etc/kubernetes/*.conf
kubeadm init phase kubeconfig all --config=./cluster.yaml

5.重启kubelet、apiserver、controller-manager、scheduler、etcd

1
docker ps |grep -E 'k8s_kube-apiserver|k8s_kube-controller-manager|k8s_kube-scheduler|k8s_etcd_etcd' | awk -F ' ' '{print $1}' |xargs docker restart
  1. 复制新的认证文件 用于命令行使用kubectl
1
2
3
rm -fr ~/.kube/
mkdir -p /root/.kube
cp /etc/kubernetes/admin.conf ~/.kube/config

3.3 高可用环境其他master节点证书续期

  1. 备份配置文件和etcd
1
2
cp -rp /etc/kubernetes /etc/kubernetes.bak
cp -r /var/lib/etcd /var/lib/etcd.bak
  1. 删除无用的文件
    1
    2
    rm /etc/kubernetes/*.conf -rf
    rm /etc/kubernetes/ssl -rf
  2. 将master节点的以下信息复制到到计算节点 node53
    1
    2
    3
    4
    5
    6
    7
    8
    scp -r /etc/kubernetes/ssl/ node53:/etc/kubernetes
    scp /etc/kubernetes/cluster.yaml node53:/etc/kubernetes
    ````
    4. 执行命令生成各组件启动需要的配置文件
    ````
    kubeadm init phase kubeconfig all --config=./cluster.yaml
    ````
    5.重启kubelet、apiserver、controller-manager、scheduler、etcd
    docker ps |grep -E ‘k8s_kube-apiserver|k8s_kube-controller-manager|k8s_kube-scheduler|k8s_etcd_etcd’ | awk -F ‘ ‘ ‘{print $1}’ |xargs docker restart
    1
    2

    6. 复制新的认证文件 用于命令行使用kubectl
    rm -fr ~/.kube/
    mkdir -p /root/.kube
    cp /etc/kubernetes/admin.conf ~/.kube/config
    1
    2
    3
    4
    5



    ### 3.2 计算节点证书续期
    1. 备份配置文件
    cp -rp /etc/kubernetes /etc/kubernetes.bak
    1
    2
    3
    4
    2. 删除无用的文件
    ````
    rm /etc/kubernetes/*.conf -rf
    rm /etc/kubernetes/ssl -rf
  3. 将master节点的以下信息复制到到计算节点 node53
    scp -r /etc/kubernetes/ssl/ node53:/etc/kubernetes
    scp  /etc/kubernetes/cluster.yaml node53:/etc/kubernetes
    
4. 执行命令生成kubelet启动需要的配置文件

kubeadm init phase kubeconfig all –config=./cluster.yaml

````
可以在/etc/kubernetes 目录看到新的配置文件
5. 删除 /var/lib/kubelet/pki/kubelet-client-current.pem 文件或者自定义的kubelet存放目录

  1. 此时执行命令systemctl restart kubelet 重启kubelet就可以

4. 修改kubeadm源码支持更长的证书有效期

主要修改两块代码,如下所示

  1. 修改一
    vi staging/src/k8s.io/client-go/util/cert/cert.go,将时间修改为20年,具体的修改位置如下所示:

    avatar

  1. 修改二
    vim ./cmd/kubeadm/app/util/pkiutil/pki_helpers.go,将时间修改为20年,具体的修改位置如下所示:

    avatar

执行命令make WHAT=cmd/kubeadm 重新编译生成kubeadm 可执行文件

5. kubelet 自动续期与controller-manager的证书签发时间

这里主要有两个参数
kubelet 进程接收 –rotate-certificates 参数,该参数决定 kubelet 在当前使用的 证书即将到期时,是否会自动申请新的证书。

kube-controller-manager 进程接收 –cluster-signing-duration 参数 (在 1.19 版本之前为 –experimental-cluster-signing-duration),用来 控制签发证书的有效期限。