Please enable Javascript to view the contents

Kubernetes 中的证书

 ·  ☕ 2 分钟

我使用的是 Kubernetes 1.15.3 ,不同版本的处理方法可能会有不同。

1. 关于证书

  • 根证书是自签的

根证书是由自己签发的。在浏览器中,内置了常见的证书服务商的 CA 证书。因此,浏览器才会信任这些证书服务商签发的下一级证书。

我们也可以生成根证书,但是需要将根证书添加到系统信任证书列表中。这样,我们就可以给自己签发证书。

  • 证书是有层级的

证书的签发是一条信任链。根 CA 签发子 CA ,子 CA 签发终端用户。通常为了减轻根 CA 证书的签发压力,会生成一定层级的中间 CA ,用于分层管理证书的签发。

  • 证书是信任凭证

证书分为 DV、OV、EV。它们使用相同的加密算法,但提供不同的信任等级。这里的信任不是指技术,而是指签发对象。等级越高的证书,对签发对象验证越严格。因证书导致损失,赔偿额度越高。

2. Kubernetes 中的证书

证书认证分为单向和双向。

单向认证只需要服务器端自证身份,比如浏览器访问服务器,而双向认证需要服务器和客户端互证身份,比如后台的点对点通信。

Kubernetes 的核心组件采取的是双向认证机制,客户端和服务器同时持有证书。

Kubernetes 中常见的证书信任链:

  1. /etc/kubernetes/pki/ca

签发证书

  • /etc/kubernetes/pki/apiserver
  • /etc/kubernetes/pki/apiserver-kubelet-client
  1. /etc/kubernetes/pki/front-proxy-ca

签发证书

  • /etc/kubernetes/pki/front-proxy-client
  1. /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
  1. /etc/kubernetes/pki/sa

用于 Serveice Account 的认证。

3. 续签 Kubernetes 证书

Kubeadm 创建的 Kubernetes 集群, apiserver、controller-manager、kubelete 等组件的证书默认有效期只有一年。

官方推荐一年之内至少用 Kubeadm 更新一次 Kubernetes 版本,自动更新证书。

  • 查看根 CA 证书的有效期,默认为 10 年:
1
2
cd /etc/kubernetes/pki
ls | grep ca.crt | xargs -I {} openssl x509 -text -in {} | grep "Not After"
  • 查看当前证书有效期
1
kubeadm alpha certs check-expiration
  • 重新签发证书

续签全部证书

1
kubeadm alpha certs renew all

也可以局部进行续签 apiserver-etcd-client 、apiserver-kubelet-client、apiserver、etcd-healthcheck-client、etcd-peer、etcd-server、front-proxy-client

1
kubeadm alpha certs renew apiserver-etcd-client

4. 更新 apiserver 证书域名或 IP 来源

如果 Master 节点的 IP 发生了漂移或者希望通过指定域名访问集群,就需要对 apiserver 证书进行更新,分为如下几步:

  • 生成 Kubeadm 的配置文件
1
kubectl -n kube-system get configmap kubeadm-config -o jsonpath='{.data.ClusterConfiguration}' > kubeadm.yaml
  • 在 kubeadm.yaml 文件中,apiServer 增加 certSANs 字段指定证书包含的 IP 和域名
1
2
3
4
apiServer:
  certSANs:
  - "1.23.45.67"
  - "yourdomain.com"
  • 备份证书
1
mv /etc/kubernetes/pki/apiserver.{crt,key} ~
  • 生成新的 apiserver 证书
1
kubeadm init phase certs apiserver --config kubeadm.yaml
  • 重启 apiserver ,直接重启 Pod 并不会生效

首先拿到 apiserver 的 CONTAINER_ID ,然后 kill 掉,系统会自动拉起 apiserver。

1
2
docker ps | grep kube-apiserver | grep -v pause
docker kill {CONTAINER_ID}

5. 参考


微信公众号
作者
微信公众号