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
    1
    例如,<release_image>的值可以是quay.io/openshift-release-dev/ocp-release:4.2.0
    # KAO_IMAGE=$( oc adm release info --registry-config='/var/lib/kubelet/config.json' "${RELEASE_IMAGE}" --image-for=cluster-kube-apiserver-operator )
  3. 抓取(pull)cluster-kube-apiserver-operator 镜像。

    # podman pull --authfile=/var/lib/kubelet/config.json "${KAO_IMAGE}"
  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
  5. 在以上命令的输出中运行export KUBECONFIG命令,此过程后面的oc命令需要它。

    # export KUBECONFIG=/<path_to_recovery_kubeconfig>/admin.kubeconfig
  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
  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
  8. 在 API 中修复证书之后,运行以下命令为 control plane 强制执行新的 rollout。由于 kubelet 使用内部负载平衡器连接到 API 服务器,因此它将在其他节点上重新安装。

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

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

      # recover-kubeconfig.sh > kubeconfig
    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
    4. /etc/kubernetes/kubelet-ca.crt文件复制到所有其他 master 主机和节点上。
    5. machine-config-daemon-force文件添加到所有 master 主机和节点上,以强制 Machine Config 守护程序接受此证书更新。

      # touch /run/machine-config-daemon-force
  10. 在所有 master 上恢复 kubelet。

    1. 在 master 主机上停止 kubelet。

      # systemctl stop kubelet
    2. 删除旧的 kubelet 数据。

      # rm -rf /var/lib/kubelet/pki /var/lib/kubelet/kubeconfig
    3. 重新启动 kubelet。

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

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

    1. 停止 kubelet。

      # systemctl stop kubelet
    2. 删除旧的 kubelet 数据。

      # rm -rf /var/lib/kubelet/pki /var/lib/kubelet/kubeconfig
    3. 重新启动 kubelet。

      # systemctl start kubelet
  12. 批准待批准的 node-bootstrapper 证书签名请求 (CSR)。

    1. 获取当前CSR列表。

      # oc get csr
    2. 查看CSR的详细信息以验证其是否有效。

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

      # oc adm certificate approve <csr_name>

      确保批准所有待批准的 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

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

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.