我使用的是 Kubernetes 1.15.3 ,不同版本的处理方法可能会有不同。
1. 关于证书
- 根证书是自签的
根证书是由自己签发的。在浏览器中,内置了常见的证书服务商的 CA 证书。因此,浏览器才会信任这些证书服务商签发的下一级证书。我们也可以生成根证书,但是需要将根证书添加到系统信任证书列表中。这样,我们就可以给自己签发证书。
- 证书是有层级的
证书的签发是一条信任链。根 CA 签发子 CA ,子 CA 签发终端用户。通常为了减轻根 CA 证书的签发压力,会生成一定层级的中间 CA ,用于分层管理证书的签发。
- 证书是信任凭证
证书分为 DV、OV、EV。它们使用相同的加密算法,但提供不同的信任等级。这里的信任不是指技术,而是指签发对象。等级越高的证书,对签发对象验证越严格。因证书导致损失,赔偿额度越高。
2. Kubernetes 中的证书
证书认证分为单向和双向。单向认证只需要服务器端自证身份,比如浏览器访问服务器,而双向认证需要服务器和客户端互证身份,比如后台的点对点通信。Kubernetes 的核心组件采取的是双向认证机制,客户端和服务器同时持有证书。Kubernetes 中常见的证书信任链:
/etc/kubernetes/pki/ca
签发证书
/etc/kubernetes/pki/apiserver
/etc/kubernetes/pki/apiserver-kubelet-client
/etc/kubernetes/pki/front-proxy-ca
签发证书
/etc/kubernetes/pki/front-proxy-client
/etc/kubernetes/pki/etcd/ca
签发证书
/etc/kubernetes/pki/etcd/server
/etc/kubernetes/pki/etcd/peer
/etc/kubernetes/pki/etcd/healthcheck-client
/etc/kubernetes/pki/apiserver-etcd-client
/etc/kubernetes/pki/sa
用于 Serveice Account 的认证。
3. 续签 Kubernetes 证书
Kubeadm 创建的 Kubernetes 集群, apiserver、controller-manager、kubelete 等组件的证书默认有效期只有一年。官方推荐一年之内至少用 Kubeadm 更新一次 Kubernetes 版本,自动更新证书。
- 查看根 CA 证书的有效期,默认为 10 年:
|
|
- 查看当前证书有效期
|
|
- 重新签发证书
续签全部证书
|
|
也可以局部进行续签 apiserver-etcd-client 、apiserver-kubelet-client、apiserver、etcd-healthcheck-client、etcd-peer、etcd-server、front-proxy-client
|
|
4. 更新 apiserver 证书域名或 IP 来源
如果 Master 节点的 IP 发生了漂移或者希望通过指定域名访问集群,就需要对 apiserver 证书进行更新,分为如下几步:
- 生成 Kubeadm 的配置文件
|
|
- 在 kubeadm.yaml 文件中,apiServer 增加 certSANs 字段指定证书包含的 IP 和域名
|
|
- 备份证书
|
|
- 生成新的 apiserver 证书
|
|
- 重启 apiserver ,直接重启 Pod 并不会生效
首先拿到 apiserver 的 CONTAINER_ID ,然后 kill 掉,系统会自动拉起 apiserver。
|
|
5. 参考
- https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-alpha/
- https://blog.scottlowe.org/2019/07/30/adding-a-name-to-kubernetes-api-server-certificate/