【kubernetes系列】kubeadm证书调整

部署k8s集群之前调整

默认情况下,使用kubeadm部署的k8s集群的证书有效期为1年。我们可以在初始k8s集群之前就调整好时间,避免后期经常更新。可以使用以下脚本对kubeadm的时间调整后重新编译生成kubeadm。此脚本针对k8s1.19.16版本,不同版本可能有所区别,请自行测试。
[root@k8s-m1 ~]# cat kubeadm_update.sh

yum install -y gcc make rsync jq git
wget  https://dl.google.com/go/go1.15.15.linux-amd64.tar.gz -O go1.15.15.linux-amd64.tar.gz
tar zxvf go1.15.15.linux-amd64.tar.gz  -C /usr/local
echo  -e 'export GOROOT=/usr/local/go\nexport GOPATH=/usr/local/gopath\nexport PATH=$PATH:$GOROOT/bin\n' >> /etc/profile
source /etc/profile 2>/dev/nul

#git clone https://github.com/kubernetes/kubernetes -b v1.19.16
sed -i 's/24 * 365/24 * 365 * 100/g' ./kubernetes/cmd/kubeadm/app/constants/constants.go
sed -i 's/duration365d * 10/duration365d * 100/g' ./kubernetes/staging/src/k8s.io/client-go/util/cert/cert.go
sed -ri 's#KUBE_GIT_TREE_STATE="dirty"#KUBE_GIT_TREE_STATE="clean"#g' ./kubernetes/hack/lib/version.sh
cd kubernetes/
make all WHAT=cmd/kubeadm GOFLAGS=-v
cp -a  ../kubernetes/_output/local/bin/linux/amd64/kubeadm /usr/bin/
kubeadm version

部署k8s集群之后定期手动更新证书

使用自定义的证书

默认情况下,kubeadm 会生成运行一个集群所需的全部证书。 你可以通过提供你自己的证书来改变这个行为策略。

如果要这样做,你必须将证书文件放置在通过 --cert-dir 命令行参数或者 kubeadm 配置中的 certificatesDir 配置项指明的目录中。默认的值是 /etc/kubernetes/pki。

如果在运行 kubeadm init 之前存在给定的证书和私钥对,kubeadm 将不会重写它们。 例如,这意味着你可以将现有的 CA 复制到 /etc/kubernetes/pki/ca.crt 和 /etc/kubernetes/pki/ca.key 中,而 kubeadm 将使用此 CA 对其余证书进行签名。

外部 CA 模式

只提供了 ca.crt 文件但是不提供 ca.key 文件也是可以的 (这只对 CA 根证书可用,其它证书不可用)。 如果所有的其它证书和 kubeconfig 文件已就绪,kubeadm 检测到满足以上条件就会激活 “外部 CA” 模式。kubeadm 将会在没有 CA 密钥文件的情况下继续执行。

否则,kubeadm 将独立运行 controller-manager,附加一个 --controllers=csrsigner 的参数,并且指明 CA 证书和密钥。

包括集群使用外部 CA 的设置指南参考https://kubernetes.io/zh-cn/docs/setup/best-practices/certificates/

检查证书是否过期check-expiration 能被用来检查证书是否过期

[root@k8s-m1 ~]# 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                 May 21, 2024 02:54 UTC   264d                                    no      
apiserver                  May 21, 2024 02:54 UTC   264d            ca                      no      
apiserver-kubelet-client   May 21, 2024 02:54 UTC   264d            ca                      no      
controller-manager.conf    May 21, 2024 02:54 UTC   264d                                    no      
front-proxy-client         May 21, 2024 02:54 UTC   264d            front-proxy-ca          no      
scheduler.conf             May 21, 2024 02:54 UTC   264d                                    no      

CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      Mar 05, 2049 06:42 UTC   25y             no      
front-proxy-ca          Oct 16, 2031 06:59 UTC   8y              no 

该命令显示 /etc/kubernetes/pki 文件夹中的客户端证书以及 kubeadm 使用的 KUBECONFIG 文件中嵌入的客户端证书的到期时间/剩余时间。
另外, kubeadm 会通知用户证书是否由外部管理; 在这种情况下,用户应该小心的手动/使用其他工具来管理证书更新。

警告: kubeadm 不能管理由外部 CA 签名的证书
注意: 上面的列表中没有包含 kubelet.conf 因为 kubeadm 将 kubelet 配置为自动更新证书。

手动更新证书

我们可以随时通过 kubeadm alpha certs renew 命令手动更新证书。下面我们来具体测试一下

#查看时间的目的是确认执行下面的命令具体更新了哪些文件
[root@k8s-m1 kubernetes]# date
Thu Jan 25 14:18:03 CST 2024
#更新
[root@k8s-m1 kubernetes]# kubeadm alpha certs renew all
[renew] Reading configuration from the cluster...
[renew] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'

certificate embedded in the kubeconfig file for the admin to use and for kubeadm itself renewed
certificate for serving the Kubernetes API renewed
certificate for the API server to connect to kubelet renewed
certificate embedded in the kubeconfig file for the controller manager to use renewed
certificate for the front proxy client renewed
certificate embedded in the kubeconfig file for the scheduler manager to use renewed
# 检查
[root@k8s-m1 kubernetes]# 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                 Jan 24, 2025 06:18 UTC   364d                                    no      
apiserver                  Jan 24, 2025 06:18 UTC   364d            ca                      no      
apiserver-kubelet-client   Jan 24, 2025 06:18 UTC   364d            ca                      no      
controller-manager.conf    Jan 24, 2025 06:18 UTC   364d                                    no      
front-proxy-client         Jan 24, 2025 06:18 UTC   364d            front-proxy-ca          no      
scheduler.conf             Jan 24, 2025 06:18 UTC   364d                                    no      

CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      Mar 05, 2049 06:42 UTC   25y             no      
front-proxy-ca          Oct 16, 2031 06:59 UTC   7y              no      
[root@k8s-m1 kubernetes]# 

通过上面可以发现其实只更新了admin.conf、apiserver、apiserver-kubelet-client、controller-manager.conf、front-proxy-client、scheduler.conf 这几个文件证书。通过时间也可以发现对应的文件如下:

[root@k8s-m1 kubernetes]# ll -rt /etc/kubernetes/pki/ 
......
-rw-------  1 root root 1679 Jan 25 14:18 apiserver.key
-rw-r--r--  1 root root 1285 Jan 25 14:18 apiserver.crt
-rw-------  1 root root 1679 Jan 25 14:18 apiserver-kubelet-client.key
-rw-r--r--  1 root root 1094 Jan 25 14:18 apiserver-kubelet-client.crt
-rw-------  1 root root 1679 Jan 25 14:18 front-proxy-client.key
-rw-r--r--  1 root root 1103 Jan 25 14:18 front-proxy-client.crt
[root@k8s-m1 kubernetes]# ll -rt /etc/kubernetes/*.conf
-rw------- 1 root root 1858 Mar  6  2023 /etc/kubernetes/kubelet.conf
-rw------- 1 root root 5453 Jan 25 14:18 /etc/kubernetes/admin.conf
-rw------- 1 root root 5481 Jan 25 14:18 /etc/kubernetes/controller-manager.conf
-rw------- 1 root root 5429 Jan 25 14:18 /etc/kubernetes/scheduler.conf

通过openssl命令也可以查看到更新后的证书有效期,注意这只能查看以crt文件结尾的有效期,如果是上面的conf文件,还需要进行手动转换查看。如下:

#能直接查看的
[root@k8s-m1 kubernetes]# openssl x509 -in pki/apiserver.crt -text -noout

#需转换的,以schduler.conf为例,其他两个conf文件类似
[root@k8s-m1 kubernetes]# BASE64_ENCODED_STRING=`cat /etc/kubernetes/scheduler.conf |grep client-certificate-data|awk -F": " '{print $2}'`
[root@k8s-m1 kubernetes]# echo $BASE64_ENCODED_STRING|base64 -d> /etc/kubernetes/pki/scheduler.crt
[root@k8s-m1 kubernetes]# openssl x509 -in /etc/kubernetes/pki/scheduler.crt -text -noout

此命令用 CA(或者 front-proxy-CA )证书和存储在 /etc/kubernetes/pki 中的密钥执行更新。

执行完此命令之后你需要重启控制面 Pod。因为动态证书重载目前还不被所有组件和证书支持,所有这项操作是必须的。 静态 Pod 是被本地 kubelet 而不是 API 服务器管理,所以 kubectl 不能用来删除或重启他们。 要重启静态 Pod 你可以临时将清单文件从 /etc/kubernetes/manifests/ 移除并等待 20 秒 (参考 KubeletConfiguration 结构中的 fileCheckFrequency 值)。如果 Pod 不在清单目录里,kubelet 将会终止它。 在另一个 fileCheckFrequency 周期之后你可以将文件移回去,kubelet 可以完成 Pod 的重建,而组件的证书更新操作也得以完成。

或者完成后重启etcd,kube-apiserver,kube-controller,kube-scheduler这四个容器

[root@k8s-m1 ~]# for i in etcd kube-apiserver kube-controller kube-scheduler;do echo ….restart container $i….; docker ps |grep $i | grep -v pause | cut -d " " -f1 | xargs docker restart; done 

# 注意下面这步很重要
[root@k8s-m1 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

然后sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config重新拷贝证书。

最后注意重点:如果运行了一个 HA 的集群,以上操作需要在所有控制面板节点上执行。
其他方法如自动更新证书和用 Kubernetes 证书 API 更新证书 请参考以下官方文档。
https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/

更多关于kubernetes的知识分享,请前往博客主页。编写过程中,难免出现差错,敬请指出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

margu_168

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值