部署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/
文章来源:https://www.toymoban.com/news/detail-684420.html
更多关于kubernetes的知识分享,请前往博客主页。编写过程中,难免出现差错,敬请指出文章来源地址https://www.toymoban.com/news/detail-684420.html
到了这里,关于【kubernetes系列】kubeadm证书调整的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!