目录

    我使用的是 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 年:
    cd /etc/kubernetes/pki
    ls | grep ca.crt | xargs -I {} openssl x509 -text -in {} | grep "Not After"
    
    • 查看当前证书有效期
    kubeadm alpha certs check-expiration
    
    • 重新签发证书

    续签全部证书

    kubeadm alpha certs renew all
    

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

    kubeadm alpha certs renew apiserver-etcd-client
    

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

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

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

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

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

    5. 参考