3.4. 从 control plane 证书已过期的情况下恢复


3.4.1. 从 control plane 证书已过期的情况下恢复

在 control plane 证书已过期时,按照以下过程进行恢复。

先决条件

  • 具有对 master 主机的 SSH 访问权限。

流程

  1. 以 root 用户身份访问具有过期证书的 master 主机。
  2. 获取相应的cluster-kube-apiserver-operator镜像。

    # RELEASE_IMAGE=<release_image> 
    1
    Copy to Clipboard Toggle word wrap
    1
    例如,<release_image> 的值可以是 quay.io/openshift-release-dev/ocp-release:4.3.0-x86_64Repository Tags 页面包括了可用的标签列表 。
    # KAO_IMAGE=$( oc adm release info --registry-config='/var/lib/kubelet/config.json' "${RELEASE_IMAGE}" --image-for=cluster-kube-apiserver-operator )
    Copy to Clipboard Toggle word wrap
  3. 抓取(pull)cluster-kube-apiserver-operator 镜像。

    # podman pull --authfile=/var/lib/kubelet/config.json "${KAO_IMAGE}"
    Copy to Clipboard Toggle word wrap
  4. 创建一个恢复 API 服务器。

    # podman run -it --network=host -v /etc/kubernetes/:/etc/kubernetes/:Z --entrypoint=/usr/bin/cluster-kube-apiserver-operator "${KAO_IMAGE}" recovery-apiserver create
    Copy to Clipboard Toggle word wrap
  5. 在以上命令的输出中运行export KUBECONFIG命令,此过程后面的oc命令需要它。

    # export KUBECONFIG=/<path_to_recovery_kubeconfig>/admin.kubeconfig
    Copy to Clipboard Toggle word wrap
  6. 等待恢复 API 服务器启动。

    # until oc get namespace kube-system 2>/dev/null 1>&2; do echo 'Waiting for recovery apiserver to come up.'; sleep 1; done
    Copy to Clipboard Toggle word wrap
  7. 运行regenerate-certificates命令。它会修复 API 中的证书,覆盖本地驱动器上的旧证书,然后重新启动静态 Pod 来使用它们。

    # podman run -it --network=host -v /etc/kubernetes/:/etc/kubernetes/:Z --entrypoint=/usr/bin/cluster-kube-apiserver-operator "${KAO_IMAGE}" regenerate-certificates
    Copy to Clipboard Toggle word wrap
  8. 在 API 中修复证书之后,运行以下命令为 control plane 强制执行新的 rollout。由于 kubelet 使用内部负载平衡器连接到 API 服务器,因此它将在其他节点上重新安装。

    # oc patch kubeapiserver cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$( date --rfc-3339=ns )"'"}}' --type=merge
    Copy to Clipboard Toggle word wrap
    # oc patch kubecontrollermanager cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$( date --rfc-3339=ns )"'"}}' --type=merge
    Copy to Clipboard Toggle word wrap
    # oc patch kubescheduler cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$( date --rfc-3339=ns )"'"}}' --type=merge
    Copy to Clipboard Toggle word wrap
  9. 使用一个有效用户创建引导 kubeconfig。

    1. 运行recover-kubeconfig.sh脚本,然后将输出保存到名为kubeconfig的文件中。

      # recover-kubeconfig.sh > kubeconfig
      Copy to Clipboard Toggle word wrap
    2. kubeconfig文件复制到所有 master 主机并把它移到/etc/kubernetes/ kubeconfig
    3. 获取用于验证连接 API 服务器的 CA 证书。

      # oc get configmap kube-apiserver-to-kubelet-client-ca -n openshift-kube-apiserver-operator --template='{{ index .data "ca-bundle.crt" }}' > /etc/kubernetes/kubelet-ca.crt
      Copy to Clipboard Toggle word wrap
    4. /etc/kubernetes/kubelet-ca.crt文件复制到所有其他 master 主机和节点上。
    5. machine-config-daemon-force文件添加到所有 master 主机和节点上,以强制 Machine Config 守护程序接受此证书更新。

      # touch /run/machine-config-daemon-force
      Copy to Clipboard Toggle word wrap
  10. 在所有 master 上恢复 kubelet。

    1. 在 master 主机上停止 kubelet。

      # systemctl stop kubelet
      Copy to Clipboard Toggle word wrap
    2. 删除旧的 kubelet 数据。

      # rm -rf /var/lib/kubelet/pki /var/lib/kubelet/kubeconfig
      Copy to Clipboard Toggle word wrap
    3. 重新启动 kubelet。

      # systemctl start kubelet
      Copy to Clipboard Toggle word wrap
    4. 在所有其他 master 主机上重复这些步骤。
  11. 如有必要,在 worker 节点上恢复 kubelet。

    在还原 master 节点后,worker 节点可能会自行恢复。您可以通过运行oc get nodes命令进行验证。如果 worker 节点没有被列出,请在每个 worker 节点上执行以下步骤。

    1. 停止 kubelet。

      # systemctl stop kubelet
      Copy to Clipboard Toggle word wrap
    2. 删除旧的 kubelet 数据。

      # rm -rf /var/lib/kubelet/pki /var/lib/kubelet/kubeconfig
      Copy to Clipboard Toggle word wrap
    3. 重新启动 kubelet。

      # systemctl start kubelet
      Copy to Clipboard Toggle word wrap
  12. 批准待批准的 node-bootstrapper 证书签名请求 (CSR)。

    1. 获取当前CSR列表。

      # oc get csr
      Copy to Clipboard Toggle word wrap
    2. 查看CSR的详细信息以验证其是否有效。

      # oc describe csr <csr_name> 
      1
      Copy to Clipboard Toggle word wrap
      1
      <csr_name>是当前CSR列表中CSR的名称。
    3. 批准每个有效的CSR。

      # oc adm certificate approve <csr_name>
      Copy to Clipboard Toggle word wrap

      确保批准所有待批准的 node-bootstrapper CSR。

  13. 因为已不再需要,请销毁恢复 API 服务器。

    # podman run -it --network=host -v /etc/kubernetes/:/etc/kubernetes/:Z --entrypoint=/usr/bin/cluster-kube-apiserver-operator "${KAO_IMAGE}" recovery-apiserver destroy
    Copy to Clipboard Toggle word wrap

    等待 control plane 重新启动并获取新证书。这可能最多需要 10 分钟。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat