使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

防止配置偏移

Config Sync 通过偏移检测来降低“影子操作”的风险。将未经检查的更改推送到活跃集群时,Config Sync 会检测并修复 Git 中可靠来源的任何偏移。此外,Config Sync 提供了准入网络钩子,用于拒绝将有冲突的更改推送到活跃集群。尝试手动更改时,此网络钩子可为您提供更好的反馈,而不是允许更改且以静默方式修复更改。此外,此准入网络钩子会防止 Config Sync 元数据和注解被手动修改,否则会导致准入网络钩子或协调器的配置出现错误。默认情况下,该网络钩子保护根代码库。但是,您可以在命名空间代码库中启用准入网络钩子。

当 Config Sync 准入网络钩子停用时,Config Sync 不会拒绝配置偏移和对 Config Sync 元数据的更改,但它仍会检测并修复这些偏移。

如需使用此功能,您必须启用 RootSync API 和 RepoSync API

启用偏移防范

完成以下步骤以启用偏移预防:

  1. 将配置文件中的 preventDrift 字段设置为 true,并应用配置文件:

    gcloud

    如果您使用 Google Cloud Console 或 gcloud CLI 安装了 Config Sync,请使用 gcloud CLI 启用偏移预防。请务必将 gcloud CLI 更新到最新版本。将 gcloud 配置文件的 spec.configSync.preventDrift 字段设置为 true,然后应用 gcloud 配置文件。

    kubectl

    如果您使用 kubectl 手动安装 Config Sync,请使用 kubectl 启用偏移防范。将 ConfigManagement 对象的 spec.preventDrift 字段设置为 true,然后应用 ConfigManagement 对象。

  2. 等待 Config Management Operator 创建 Config Sync ValidateWebhookConfiguration 对象。

    kubectl get validatingwebhookconfiguration admission-webhook.configsync.gke.io
    

    您应该会看到类似于以下示例的输出:

    NAME                                  WEBHOOKS   AGE
    admission-webhook.configsync.gke.io   0          2m15s
    
  3. 提交要同步的 Git 代码库的新更改,以便 root-reconciler 部署可以将网络钩子添加到 Config Sync ValidatingWebhookConfiguration 对象中。另一种方法是删除 root-reconcilier Deployment 以触发协调。新的 root-reconciler Deployment 将更新 Config Sync ValidatingWebhookConfiguration 对象。

  4. 等待网络钩子服务器准备就绪。Config Sync 准入网络钩子 Deployment 日志应包含 serving webhook server。此过程可能耗时几分钟。

    kubectl logs -n config-management-system -l app=admission-webhook --tail=-1 | grep "serving webhook server"
    

    您应该会看到类似于以下示例的输出:

    I1201 18:05:41.805531       1 deleg.go:130] controller-runtime/webhook "level"=0 "msg"="serving webhook server"  "host"="" "port"=10250
    I1201 18:07:04.626199       1 deleg.go:130] controller-runtime/webhook "level"=0 "msg"="serving webhook server"  "host"="" "port"=10250
    

停用偏移防范

gcloud

如果您使用 Google Cloud Console 或 gcloud CLI 安装了 Config Sync,请使用 gcloud CLI 停用偏移预防。请务必将 gcloud CLI 更新到最新版本。将 gcloud 配置文件的 spec.configSync.preventDrift 字段设置为 false 或移除该字段,然后应用 gcloud 配置文件。

kubectl

如果您使用 kubectl 手动安装 Config Sync,请使用 kubectl 停用偏移防范。将 ConfigManagement 对象的 spec.preventDrift 字段设置为 false,或移除该字段,然后应用 ConfigManagement 对象。

这将删除所有 Config Sync 准入网络钩子资源。由于 Config Sync ValidatingWebhookConfiguration 对象已不存在,因此 Config Sync 协调器不再为代管式资源生成网络钩子配置。

在命名空间代码库中启用准入网络钩子

网络钩子不对命名空间代码库进行全面保护。每个命名空间代码库的 Config Sync 协调器无权读取或更新集群级级层的 ValidationtingWebhookConfiguration 对象。

这种权限不足会导致命名空间协调器的日志中出现类似于以下示例的错误:

Failed to update admission webhook: KNV2013: applying changes to
admission webhook: Insufficient permission. To fix, make sure the reconciler has
sufficient permissions.:
validatingwebhookconfigurations.admissionregistration.k8s.io "admission-
webhook.configsync.gke.io" is forbidden: User "system:serviceaccount:config-
management-system:ns-reconciler-NAMESPACE" cannot update resource
"validatingwebhookconfigurations" in API group "admissionregistration.k8s.io" at
the cluster scope

如果您不想对命名空间代码库使用网络钩子保护,则可以忽略此错误。但是,如果要使用网络钩子,请在配置从命名空间代码库同步后向每个命名空间代码库的协调器授予以下权限:

  1. 在根代码库中,声明一个新的 ClusterRole 配置,用于向 Config Sync 准入网络钩子授予权限。此 ClusterRole 只需要每个集群定义一次:

    # ROOT_REPO/cluster-roles/webhook-role.yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: admission-webhook-role
    rules:
    - apiGroups: ["admissionregistration.k8s.io"]
      resources: ["validatingwebhookconfigurations"]
      resourceNames: ["admission-webhook.configsync.gke.io"]
      verbs: ["get", "update"]
    
  2. 对于需要授予准入网络钩子权限的每个命名空间代码库,请声明 ClusterRoleBinding 配置以授予对准入网络钩子的访问权限:

    # ROOT_REPO/NAMESPACE/sync-webhook-rolebinding.yaml
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: syncs-webhook
    subjects:
    - kind: ServiceAccount
      name: ns-reconciler-NAMESPACE
      namespace: config-management-system
    roleRef:
      kind: ClusterRole
      name: admission-webhook-role
      apiGroup: rbac.authorization.k8s.io
    

    NAMESPACE 替换为在其中创建了命名空间代码库的命名空间。

  3. 将更改提交到根代码库:

    git add .
    git commit -m 'Providing namespace repository the permission to update the admission webhook.'
    git push
    
    
  4. 如需进行验证,请使用 kubectl get 确保 ClusterRole 和 ClusterRoleBinding 已创建完毕:

    kubectl get clusterrole admission-webhook-role
    kubectl get clusterrolebindings syncs-webhook