This documentation is for a release that is no longer maintained
See documentation for the latest supported version 3 or the latest supported version 4.3.4. 从 control plane 证书已过期的情况下恢复
3.4.1. 从 control plane 证书已过期的情况下恢复 复制链接链接已复制到粘贴板!
在 control plane 证书已过期时,按照以下过程进行恢复。
先决条件
- 具有对 master 主机的 SSH 访问权限。
流程
- 以 root 用户身份访问具有过期证书的 master 主机。
获取相应的
cluster-kube-apiserver-operator镜像。RELEASE_IMAGE=<release_image>
# RELEASE_IMAGE=<release_image>1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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 )# KAO_IMAGE=$( oc adm release info --registry-config='/var/lib/kubelet/config.json' "${RELEASE_IMAGE}" --image-for=cluster-kube-apiserver-operator )Copy to Clipboard Copied! Toggle word wrap Toggle overflow 抓取(pull)
cluster-kube-apiserver-operator镜像。podman pull --authfile=/var/lib/kubelet/config.json "${KAO_IMAGE}"# podman pull --authfile=/var/lib/kubelet/config.json "${KAO_IMAGE}"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建一个恢复 API 服务器。
podman run -it --network=host -v /etc/kubernetes/:/etc/kubernetes/:Z --entrypoint=/usr/bin/cluster-kube-apiserver-operator "${KAO_IMAGE}" recovery-apiserver create# podman run -it --network=host -v /etc/kubernetes/:/etc/kubernetes/:Z --entrypoint=/usr/bin/cluster-kube-apiserver-operator "${KAO_IMAGE}" recovery-apiserver createCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在以上命令的输出中运行
export KUBECONFIG命令,此过程后面的oc命令需要它。export KUBECONFIG=/<path_to_recovery_kubeconfig>/admin.kubeconfig
# export KUBECONFIG=/<path_to_recovery_kubeconfig>/admin.kubeconfigCopy to Clipboard Copied! Toggle word wrap Toggle overflow 等待恢复 API 服务器启动。
until oc get namespace kube-system 2>/dev/null 1>&2; do echo 'Waiting for recovery apiserver to come up.'; sleep 1; done
# until oc get namespace kube-system 2>/dev/null 1>&2; do echo 'Waiting for recovery apiserver to come up.'; sleep 1; doneCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行
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# podman run -it --network=host -v /etc/kubernetes/:/etc/kubernetes/:Z --entrypoint=/usr/bin/cluster-kube-apiserver-operator "${KAO_IMAGE}" regenerate-certificatesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在 API 中修复证书之后,运行以下命令为 control plane 强制执行新的 rollout。由于 kubelet 使用内部负载平衡器连接到 API 服务器,因此它将在其他节点上重新安装。
oc patch kubeapiserver cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$( date --rfc-3339=ns )"'"}}' --type=merge# oc patch kubeapiserver cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$( date --rfc-3339=ns )"'"}}' --type=mergeCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc patch kubecontrollermanager cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$( date --rfc-3339=ns )"'"}}' --type=merge# oc patch kubecontrollermanager cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$( date --rfc-3339=ns )"'"}}' --type=mergeCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc patch kubescheduler cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$( date --rfc-3339=ns )"'"}}' --type=merge# oc patch kubescheduler cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$( date --rfc-3339=ns )"'"}}' --type=mergeCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用一个有效用户创建引导 kubeconfig。
运行
recover-kubeconfig.sh脚本,然后将输出保存到名为kubeconfig的文件中。recover-kubeconfig.sh > kubeconfig
# recover-kubeconfig.sh > kubeconfigCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
将
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# oc get configmap kube-apiserver-to-kubelet-client-ca -n openshift-kube-apiserver-operator --template='{{ index .data "ca-bundle.crt" }}' > /etc/kubernetes/kubelet-ca.crtCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
将
/etc/kubernetes/kubelet-ca.crt文件复制到所有其他 master 主机和节点上。 将
machine-config-daemon-force文件添加到所有 master 主机和节点上,以强制 Machine Config 守护程序接受此证书更新。touch /run/machine-config-daemon-force
# touch /run/machine-config-daemon-forceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
在所有 master 上恢复 kubelet。
在 master 主机上停止 kubelet。
systemctl stop kubelet
# systemctl stop kubeletCopy to Clipboard Copied! Toggle word wrap Toggle overflow 删除旧的 kubelet 数据。
rm -rf /var/lib/kubelet/pki /var/lib/kubelet/kubeconfig
# rm -rf /var/lib/kubelet/pki /var/lib/kubelet/kubeconfigCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重新启动 kubelet。
systemctl start kubelet
# systemctl start kubeletCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 在所有其他 master 主机上重复这些步骤。
如有必要,在 worker 节点上恢复 kubelet。
在还原 master 节点后,worker 节点可能会自行恢复。您可以通过运行
oc get nodes命令进行验证。如果 worker 节点没有被列出,请在每个 worker 节点上执行以下步骤。停止 kubelet。
systemctl stop kubelet
# systemctl stop kubeletCopy to Clipboard Copied! Toggle word wrap Toggle overflow 删除旧的 kubelet 数据。
rm -rf /var/lib/kubelet/pki /var/lib/kubelet/kubeconfig
# rm -rf /var/lib/kubelet/pki /var/lib/kubelet/kubeconfigCopy to Clipboard Copied! Toggle word wrap Toggle overflow 重新启动 kubelet。
systemctl start kubelet
# systemctl start kubeletCopy to Clipboard Copied! Toggle word wrap Toggle overflow
批准待批准的
node-bootstrapper证书签名请求 (CSR)。获取当前CSR列表。
oc get csr
# oc get csrCopy to Clipboard Copied! Toggle word wrap Toggle overflow 查看CSR的详细信息以验证其是否有效。
oc describe csr <csr_name>
# oc describe csr <csr_name>1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
<csr_name>是当前CSR列表中CSR的名称。
批准每个有效的CSR。
oc adm certificate approve <csr_name>
# oc adm certificate approve <csr_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确保批准所有待批准的
node-bootstrapperCSR。
因为已不再需要,请销毁恢复 API 服务器。
podman run -it --network=host -v /etc/kubernetes/:/etc/kubernetes/:Z --entrypoint=/usr/bin/cluster-kube-apiserver-operator "${KAO_IMAGE}" recovery-apiserver destroy# podman run -it --network=host -v /etc/kubernetes/:/etc/kubernetes/:Z --entrypoint=/usr/bin/cluster-kube-apiserver-operator "${KAO_IMAGE}" recovery-apiserver destroyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 等待 control plane 重新启动并获取新证书。这可能最多需要 10 分钟。