3.4. 从 control plane 证书已过期的情况下恢复
3.4.1. 从 control plane 证书已过期的情况下恢复
在 control plane 证书已过期时,按照以下过程进行恢复。
先决条件
- 具有对 master 主机的 SSH 访问权限。
流程
- 以 root 用户身份访问具有过期证书的 master 主机。
获取相应的
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 )
抓取(pull)
cluster-kube-apiserver-operator
镜像。# podman pull --authfile=/var/lib/kubelet/config.json "${KAO_IMAGE}"
创建一个恢复 API 服务器。
# podman run -it --network=host -v /etc/kubernetes/:/etc/kubernetes/:Z --entrypoint=/usr/bin/cluster-kube-apiserver-operator "${KAO_IMAGE}" recovery-apiserver create
在以上命令的输出中运行
export KUBECONFIG
命令,此过程后面的oc
命令需要它。# export KUBECONFIG=/<path_to_recovery_kubeconfig>/admin.kubeconfig
等待恢复 API 服务器启动。
# until oc get namespace kube-system 2>/dev/null 1>&2; do echo 'Waiting for recovery apiserver to come up.'; sleep 1; done
运行
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
在 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
使用一个有效用户创建引导 kubeconfig。
运行
recover-kubeconfig.sh
脚本,然后将输出保存到名为kubeconfig
的文件中。# recover-kubeconfig.sh > kubeconfig
-
将
kubeconfig
文件复制到所有 master 主机并把它移到/etc/kubernetes/ kubeconfig
。 获取用于验证连接 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
-
将
/etc/kubernetes/kubelet-ca.crt
文件复制到所有其他 master 主机和节点上。 将
machine-config-daemon-force
文件添加到所有 master 主机和节点上,以强制 Machine Config 守护程序接受此证书更新。# touch /run/machine-config-daemon-force
在所有 master 上恢复 kubelet。
在 master 主机上停止 kubelet。
# systemctl stop kubelet
删除旧的 kubelet 数据。
# rm -rf /var/lib/kubelet/pki /var/lib/kubelet/kubeconfig
重新启动 kubelet。
# systemctl start kubelet
- 在所有其他 master 主机上重复这些步骤。
如有必要,在 worker 节点上恢复 kubelet。
在还原 master 节点后,worker 节点可能会自行恢复。您可以通过运行
oc get nodes
命令进行验证。如果 worker 节点没有被列出,请在每个 worker 节点上执行以下步骤。停止 kubelet。
# systemctl stop kubelet
删除旧的 kubelet 数据。
# rm -rf /var/lib/kubelet/pki /var/lib/kubelet/kubeconfig
重新启动 kubelet。
# systemctl start kubelet
批准待批准的
node-bootstrapper
证书签名请求 (CSR)。获取当前CSR列表。
# oc get csr
查看CSR的详细信息以验证其是否有效。
# oc describe csr <csr_name> 1
- 1
<csr_name>
是当前CSR列表中CSR的名称。
批准每个有效的CSR。
# oc adm certificate approve <csr_name>
确保批准所有待批准的
node-bootstrapper
CSR。
因为已不再需要,请销毁恢复 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 分钟。