树叶云kubernetes教程:Kubernetes 手动轮换CA证书

手动轮换 CA 证书

本页展示如何手动轮换证书机构(CA)证书。

在开始之前

你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 建议在至少有两个节点的集群上运行本教程,且这些节点不作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:

  • Katacoda
  • 玩转 Kubernetes

您的 Kubernetes 服务器版本必须不低于版本 v1.13. 要获知版本信息,请输入 ​kubectl version​。

手动轮换 CA 证书 

注意:

确保备份你的证书目录、配置文件以及其他必要文件。

这里的方法假定 Kubernetes 的控制面通过运行多个 API 服务器以高可用配置模式运行。 另一假定是 API 服务器可体面地终止,因而客户端可以彻底地与一个 API 服务器断开 连接并连接到另一个 API 服务器。

如果集群中只有一个 API 服务器,则在 API 服务器重启期间会经历服务中断期。

  1. 将新的 CA 证书和私钥(例如:​ca.crt​、​ca.key​、​front-proxy-ca.crt​ 和 ​front-proxy-client.key​)分发到所有控制面节点,放在其 Kubernetes 证书目录下。
  2. 更新 kube-controller-manager 的 ​--root-ca-file​ 标志,使之同时包含老的和新的 CA,之后重启组件。
  3. 自此刻起,所创建的所有服务账号都会获得同时包含老的 CA 和新的 CA 的 Secret。

    说明: kube-controller-manager 标志 ​--client-ca-file​ 和 ​--cluster-signing-cert-file​ 所引用的文件 不能是 CA 证书包。如果这些标志和 ​--root-ca-file​ 指向同一个 ​ca.crt​ 包文件(包含老的和新的 CA 证书), 你将会收到出错信息。 要解决这个问题,可以将新的 CA 证书复制到单独的文件中,并将 ​--client-ca-file​ 和 ​--cluster-signing-cert-file​ 标志指向该副本。一旦 ​ca.crt​ 不再是证书包文件,就可以恢复有问题的标志指向 ​ca.crt​ 并删除该副本。

  4. 更新所有服务账号令牌,使之同时包含老的和新的 CA 证书。
  5. 如果在 API 服务器使用新的 CA 之前启动了新的 Pod,这些 Pod 也会获得此更新并且同时信任老的和新的 CA 证书。

    base64_encoded_ca="$(base64 -w0 <path to file containing both old and new CAs>)"
    
    for namespace in $(kubectl get ns --no-headers | awk '{print $1}'); do
        for token in $(kubectl get secrets --namespace "$namespace" --field-selector type=kubernetes.io/service-account-token -o name); do
            kubectl get $token --namespace "$namespace" -o yaml | \
              /bin/sed "s/\(ca.crt:\).*/\1 ${base64_encoded_ca}/" | \
              kubectl apply -f -
        done
    done
  6. 重启所有使用集群内配置的 Pods(例如:​kube-proxy​、​coredns ​等),以便这些 Pod 能够使用 来自 ServiceAccount Secret 中的、已更新的证书机构数据。
    • 确保 ​coredns​、​kube-proxy​ 和其他使用集群内配置的 Pod 都正按预期方式工作。
  7. 将老的和新的 CA 都追加到 ​kube-apiserver​ 配置的 ​--client-ca-file​ 和 ​--kubelet-certificate-authority​ 标志所指的文件。
  8. 将老的和新的 CA 都追加到 ​kube-scheduler​ 配置的 ​--client-ca-file​ 标志所指的文件。
  9. 通过替换 ​client-certificate-data​ 和 ​client-key-data​ 中的内容,更新用户账号的证书。
  10. 另外,还要更新 kubeconfig 文件中的 ​certificate-authority-data​ 节,使之包含 Base64 编码的老的和新的证书机构数据。

  11. 遵循下列步骤执行滚动更新
    1. 重新启动所有其他 被聚合的 API 服务器 或者 Webhook 处理程序,使之信任新的 CA 证书。
    2. 在所有节点上更新 kubelet 配置中的 clientCAFile 所指文件以及 kubelet.conf 中的 certificate-authority-data 并重启 kubelet 以同时使用老的和新的 CA 证书。
    3. 如果你的 kubelet 并未使用客户端证书轮换,则在所有节点上更新 kubelet.conf 中 client-certificate-data 和 client-key-data 以及 kubelet 客户端证书文件(通常位于 /var/lib/kubelet/pki 目录下)

    4. 使用用新的 CA 签名的证书 (apiserver.crt、apiserver-kubelet-client.crt 和 front-proxy-client.crt) 来重启 API 服务器。 你可以使用现有的私钥,也可以使用新的私钥。 如果你改变了私钥,则要将更新的私钥也放到 Kubernetes 证书目录下。
    5. 由于 Pod 既信任老的 CA 也信任新的 CA,Pod 中的客户端会经历短暂的连接断开状态, 之后再连接到使用新的 CA 所签名的证书的新的 API 服务器。

      • 重启调度器以使用新的 CA 证书。
      • 确保控制面组件的日志中没有 TLS 相关的错误信息。

      说明: 要使用 openssl 命令行为集群生成新的证书和私钥,可参阅 证书(openssl)。 你也可以使用cfssl.

    6. 为 Daemonset 和 Deployment 添加注解,从而触发较安全的滚动更新,替换 Pod。
    7. 示例:

      for namespace in $(kubectl get namespace -o jsonpath='{.items[*].metadata.name}'); do
          for name in $(kubectl get deployments -n $namespace -o jsonpath='{.items[*].metadata.name}'); do
              kubectl patch deployment -n ${namespace} ${name} -p '{"spec":{"template":{"metadata":{"annotations":{"ca-rotation": "1"}}}}}';
          done
          for name in $(kubectl get daemonset -n $namespace -o jsonpath='{.items[*].metadata.name}'); do
              kubectl patch daemonset -n ${namespace} ${name} -p '{"spec":{"template":{"metadata":{"annotations":{"ca-rotation": "1"}}}}}';
          done
      done
  12. 如果你的集群使用启动引导令牌来添加节点,则需要更新 ​kube-public​ 名字空间下的 ConfigMap ​cluster-info​,使之包含新的 CA 证书。
  13. base64_encoded_ca="$(base64 -w0 /etc/kubernetes/pki/ca.crt)"
    
    kubectl get cm/cluster-info --namespace kube-public -o yaml | \
        /bin/sed "s/\(certificate-authority-data:\).*/\1 ${base64_encoded_ca}/" | \
        kubectl apply -f -
  14. 验证集群的功能正常
    • 验证控制面组件的日志,以及 kubelet 和 kube-proxy 的日志,确保其中没有 抛出 TLS 错误。
    • 验证被聚合的 API 服务器的日志,以及所有使用集群内配置的 Pod 的日志。
  15. 完成集群功能的检查之后:
    1. 更新所有的服务账号令牌,使之仅包含新的 CA 证书。
      • 使用集群内 kubeconfig 的 Pod 最终也需要被重启,以获得新的服务账号 Secret 数据,进而不再信任老的 CA 证书。
    2. 从 kubeconfig 文件和 –client-ca-file 以及 –root-ca-file 标志所指向的文件 中去除老的 CA 数据,之后重启控制面组件。
    3. 重启 kubelet,移除 clientCAFile 标志所指向的文件以及 kubelet kubeconfig 文件中 的老的 CA 数据。

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/158537.html<

(0)
管理的头像管理
上一篇2025-03-16 21:27
下一篇 2025-03-16 21:29

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注