kubeadm
为 Kubernetes 控制平面创建有效期为一年的证书。它们将在每次 Kubernetes 升级时更新。由于每年至少更新一次 Kubernetes 集群绝对是一个好主意,因此这应该会导致证书永不过期。
但是,我们有一些 Kubernetes 集群在隔离环境中运行(完全没有互联网连接),无法保证它们会收到更新。在这种环境中,一年内过期的证书是不可接受的。延长证书有效期是补救此设置的一个想法,但自动更新证书似乎是更好的解决方案。这可以通过kubeadm alpha certs renew all
在每个主节点上运行 cron 或 systemd 计时器(Kubernetes 1.15)轻松完成。
我注意到 API 服务器、控制器管理器和调度程序不会获取新证书。有什么方法可以通知这些组件新证书吗?甚至销毁 Pod 也不是那么简单,因为控制平面 Pod 是静态的,kubectl delete pod
只是删除镜像 Pod但不会终止容器。一些容易出错的方法docker |grep …
可以完成这项工作,但我想知道是否有 API 调用或更智能的方法来完成它。我还没有找到有关此主题的更多文档。
答案1
我以为已经有一个针对该行为的票据,但我只能找到kubelet 和 kube-proxy 的一个
简而言之,只要该行为“有待解决”,我预计它近期不会得到修复。如果您的集群是多主 HA 配置,我预计以滚动方式重新启动控制平面 pod 是安全的。运行的进程可以重新启动kubeadm alpha certs renew all
机器,以摆脱选择性弹跳单个 docker 容器的任务。
话虽如此,我并不认为识别控制平面 docker 容器是“容易出错”的,因为 kubelet标记 docker 容器和与 Pod 名称和命名空间匹配的标签,使人们能够轻松地筛选组成控制平面的容器并只杀死它们:
for comp_name in kube-apiserver kube-controller-manager etcetc; do
for c_id in $(docker ps -q \
--filter "label=io.kubernetes.pod.namespace=kube-system" \
--filter "label=io.kubernetes.pod.name=${comp_name}"); do
docker kill $c_id
docker rm $c_id
done
done