Kubernetes 中的证书

2023年 1月 4日 54.3k 0

我使用的是 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 年:
    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. 参考

    • 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/

    相关文章

    KubeSphere 部署向量数据库 Milvus 实战指南
    探索 Kubernetes 持久化存储之 Longhorn 初窥门径
    征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
    那些年在 Terraform 上吃到的糖和踩过的坑
    无需 Kubernetes 测试 Kubernetes 网络实现
    Kubernetes v1.31 中的移除和主要变更

    发布评论