停止和恢复同步配置

在某些情况下,您可能需要 Config Sync 快速停止同步代码库中的配置。其中一种情况是,如果有人向代码库提交了在语法上有效但存在错误的配置,而您希望在移除或修复该配置时限制它对正在运行的集群的影响。

前提条件

运行本主题中讨论的命令的用户需要在所有要停止同步的集群上的 kube-system(只有 1.9.0 之前的版本需要)和 config-management-system 命名空间中拥有以下 Kubernetes RBAC 权限:

- apiGroups: ["extensions"]
  resources: ["deployments", "deployments/scale"]
  verbs: ["get", "update"]
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["list", "watch"]

配置 config-management-operator 命名空间变量

对于版本低于 1.9.0 的 Anthos Config Management,config-management-operator 位于 kube-system 命名空间中。在 Anthos Config Management 1.9.0 中,config-management-operator 已转移到 config-management-system 命名空间中。在运行以下任何命令之前,请设置环境变量以指示特定于版本的命名空间。

对于 Anthos Config Management 1.9.0 版或更高版本:

export OPERATOR_NAMESPACE=config-management-system

对于 1.9.0 之前的版本:

export OPERATOR_NAMESPACE=kube-system

停止和恢复单个代码库同步

本部分适用于单个代码库,其中介绍了如何快速停止同步,以及如何在问题得到解决后恢复同步。如需了解如何停止同步多个代码库,请参阅停止和恢复从多个代码库同步

停止同步

如需停止单个集群同步,请运行以下命令;为方便起见,我们将它们作为一条命令提供,但您也可以分开运行这些命令:

kubectl scale -n $OPERATOR_NAMESPACE deployment config-management-operator --replicas=0 \
&& kubectl wait -n $OPERATOR_NAMESPACE --for=delete pods -l k8s-app=config-management-operator \
&& kubectl scale -n config-management-system deployment --replicas=0 --all \
&& kubectl wait -n config-management-system --for=delete pods --all

这些命令按顺序执行以下操作。如果某个命令失败,则剩余命令将不运行。

  1. 将 Config Management Operator Deployment 中的 replicas 计数减少至 0。
  2. config-management-system 命名空间中运行的所有 Pod 的 replicas 计数减少至 0。受影响的 Pod 的确切集合因产品版本而异。

所有部署仍保留在集群中,但 Operator 或任何负责同步的进程的副本都不可用,因此配置不会从代码库同步。

如果您需要停止多个集群的同步,请对每个集群运行以上命令。

继续同步

要恢复单个集群的同步,请运行以下命令:

kubectl -n $OPERATOR_NAMESPACE scale deployment config-management-operator --replicas=1

此命令会将 Operator Deployment 扩展到 1 个副本。Operator 会注意到 config-management-system 命名空间中 Deployment 的 Pod 未正确扩缩,并将它们扩展到适当的副本数量。

如果您需要在多个集群上恢复同步,请对每个集群运行以上命令。

停止和恢复多个代码库同步

本部分适用于多个代码库,其中介绍了如何暂时停止和恢复多个代码库的同步。如需了解如何停止单个代码库的同步,请参阅停止和恢复单个代码库同步

只有中心管理员可以停止在根代码库中进行同步。

能否停止在命名空间代码库中进行同步取决于用于命名空间代码库的配置方法

  • 如果使用的是控制根代码库中的命名空间代码库方法,则只有中心管理员可以停止和恢复同步。

  • 如果使用的是通过 Kubernetes API 控制命名空间代码库方法,则应用运维人员可以停止和恢复从其处理的命名空间代码库同步。

停止同步

以下各部分介绍如何停止同步根代码库和命名空间代码库。 如需阻止 Reconciler Manager 还原更改,您需要先运行以下命令来停止 Reconciler Manager:

kubectl -n $OPERATOR_NAMESPACE scale deployment config-management-operator --replicas=0 \
&& kubectl wait -n $OPERATOR_NAMESPACE --for=delete pods -l k8s-app=config-management-operator --timeout=60s \
&& kubectl scale deployment -n config-management-system reconciler-manager --replicas=0 \
&& kubectl wait -n config-management-system --for=delete pods -l app=reconciler-manager

这些命令按顺序执行以下操作。如果某个命令失败,则剩余命令将不运行。

  1. 将 Config Management Operator Deployment 中的 replicas 计数减少至 0。
  2. 将 Reconciler Manager Deployment 中的 replicas 计数减少至 0。

停止从根代码库同步

如需停止从根代码库同步集群,中心管理员可以运行以下命令:

kubectl -n config-management-system scale deployment root-reconciler --replicas=0

此命令会将 root-reconciler Deployment 中的 replicas 计数减少至 0。

如果您需要停止多个集群的同步,请对每个集群运行以上命令。

停止从命名空间代码库同步

选择根代码库方法 (Root repository method) 或 Kubernetes API 方法 (Kubernetes API method) 标签页以查看相关说明。

根代码库方法

如果使用的是控制根代码库中的命名空间代码库方法,则中心管理员可以运行以下命令以停止从命名空间代码库同步集群:

kubectl -n config-management-system scale deployment ns-reconciler-NAMESPACE --replicas=0

该命令会将 ns-reconciler-NAMESPACE Deployment 中的副本计数减少至 0。

如果您需要停止多个集群的同步,请对每个集群运行以上命令。

Kubernetes API 方法

如果使用的是通过 Kubernetes API 控制命名空间代码库方法,则应用运维人员可以通过运行以下命令停止同步集群:

  1. 检索 RepoSync 配置并保存,以便稍后在需要恢复同步时使用:

    kubectl -n NAMESPACE get reposyncs repo-sync -oyaml > repo-sync.yaml
    

    NAMESPACE 替换为您的 RepoSync 对象的命名空间。

  2. 删除 RepoSync 配置:

    kubectl -n NAMESPACE delete reposyncs repo-sync
    

    此命令会触发 Reconciler Manager 以从 NAMESPACE 中移除命名空间协调器 (ns-reconciler-NAMESPACE),并停止同步。

    如果您需要停止多个集群的同步,请对每个集群运行以上命令。

阻止准入网络钩子阻塞偏移(可选)

在 Anthos Config Management 1.10.0 版之前,为了阻止 Config Sync 在停止协调器后执行偏移预防,您可以运行以下命令来停止准入网络钩子:

kubectl delete validatingwebhookconfigurations.admissionregistration.k8s.io admission-webhook.configsync.gke.io

此步骤是可选步骤,仅在您需要对集群中的代管资源进行有冲突的更改时才需要执行。这需要先停止根协调器;否则,根协调器会在删除后尝试生成网络钩子配置。

停止从所有代码库同步

要停止从所有代码库(包括根代码库和命名空间代码库)同步,请运行以下命令:

kubectl scale deployment -n config-management-system -l app=reconciler --replicas=0 \
&& kubectl wait -n config-management-system --for=delete pods -l app=reconciler

这些命令会将 config-management-system 命名空间中运行的所有 Reconciler Pod 的 replicas 计数减少至 0,并等待所有 Reconciler Pod 被删除。

所有 Reconciler Deployment 仍保留在集群中,但 Reconciler 或任何负责同步的进程的副本都不可用,因此配置不会从代码库同步。

继续同步

本部分介绍了如何恢复对根代码库和命名空间代码库进行同步。

恢复从根代码库同步

如需恢复从根代码库进行同步,中心管理员可以运行以下命令:

kubectl -n config-management-system scale deployment root-reconciler --replicas=1

此命令会将 root-reconciler Deployment 扩容到 1 个副本。

恢复从命名空间代码库同步

选择根代码库方法 (Root repository method) 或 Kubernetes API 方法 (Kubernetes API method) 标签页以查看相关说明。

根代码库方法

如果您使用的是控制根代码库中的命名空间代码库方法,则中心管理员可以运行以下命令:

kubectl -n config-management-system scale deployment ns-reconciler-NAMESPACE --replicas=1

此命令会将 ns-reconciler-NAMESPACE Deployment 扩容到 1 个副本。

Kubernetes API 方法

如果您使用的是通过 Kubernetes API 控制命名空间代码库方法,则应用运维人员可以通过重新应用包含 RepoSync 配置的 repo-sync.yaml 来恢复同步:

kubectl apply -f repo-sync.yaml

此命令会触发 Reconciler Manager 以创建命名空间协调器进程并创建 ns-reconciler-NAMESPACE Deployment。

恢复准入网络钩子

在 Anthos Config Management 1.10.0 版之前,根协调器恢复后,系统会自动生成网络钩子配置。要验证是否已成功生成,请运行以下命令:

kubectl get validatingwebhookconfigurations.admissionregistration.k8s.io admission-webhook.configsync.gke.io

继续从所有代码库同步

如需恢复从所有代码库同步,请运行以下命令:

kubectl -n $OPERATOR_NAMESPACE scale deployment config-management-operator --replicas=1

此命令会将 Operator Deployment 扩展到 1 个副本。Operator 随后会注意到 Repliler Manager Deployment 未正确扩缩,并将其扩缩到适当的副本数量。最后,Reconciler Manager 会将根协调器和命名空间协调器扩缩到相应的副本数。

  # scale the root-reconciler Deployment to 1 replica.
  kubectl -n config-management-system scale deployment root-reconciler --replicas=1

  # scale the ns-reconciler-NAMESPACE Deployment to 1 replica.
  kubectl -n config-management-system scale deployment ns-reconciler-NAMESPACE --replicas=1

后续步骤