【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 ~]# kubeadm alpha certs renew all

此命令用 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这四个容器

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 

然后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的知识分享,请前往博客主页。编写过程中,难免出现差错,敬请指出

你可能感兴趣的:(Kubernetes,kubernetes)