防止配置偏移
Config Sync 通过偏移检测来降低“影子操作”的风险。将未经检查的更改推送到活跃集群时,Config Sync 会检测并修复 Git 中可靠来源的任何偏移。此外,Config Sync 提供了准入网络钩子,用于拒绝将有冲突的更改推送到活跃集群。尝试手动更改时,此网络钩子可为您提供更好的反馈,而不是允许更改且以静默方式修复更改。此外,此准入网络钩子会防止 Config Sync 元数据和注解被手动修改,否则会导致准入网络钩子或协调器的配置出现错误。默认情况下,该网络钩子保护根代码库。但是,您可以在命名空间代码库中启用准入网络钩子。
当 Config Sync 准入网络钩子停用时,Config Sync 不会拒绝配置偏移和对 Config Sync 元数据的更改,但它仍会检测并修复这些偏移。
如需使用此功能,您必须启用 RootSync API 和 RepoSync API。
启用偏移防范
将配置文件中的
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
对象。等待 Config Management Operator 创建 Config Sync
ValidateWebhookConfiguration
对象:kubectl get validatingwebhookconfiguration admission-webhook.configsync.gke.io
您应该会看到类似于以下示例的输出:
NAME WEBHOOKS AGE admission-webhook.configsync.gke.io 0 2m15s
提交要同步的 Git 代码库的新更改,以便
root-reconciler
部署可以将网络钩子添加到 Config Sync ValidatingWebhookConfiguration 对象中。另一种方法是删除root-reconcilier
Deployment 以触发协调。新的root-reconciler
Deployment 将更新 Config Sync ValidatingWebhookConfiguration 对象。等待网络钩子服务器准备就绪。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 准入 webhook 资源。由于 Config Sync ValidatingWebhookConfiguration
对象已不存在,因此 Config Sync 协调器不再为代管式资源生成 webhook 配置。
在命名空间代码库中启用准入网络钩子
网络钩子不对命名空间代码库进行全面保护。每个命名空间代码库的 Config Sync 协调器无权读取或更新集群级级层的 ValidatingWebhookConfiguration
对象。
这种权限不足会导致命名空间协调器的日志中出现类似于以下示例的错误:
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
如果您不想对命名空间代码库使用网络钩子保护,则可以忽略此错误。但是,如果要使用 webhook,请在配置从命名空间代码库同步后向每个命名空间代码库的协调器授予权限。如果 ns-reconciler-NAMESPACE
的 RoleBinding 已存在且具有 ClusterRole cluster-admin
权限,则可能无需执行这些步骤。
在根代码库中,声明一个新的 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"]
对于需要授予准入网络钩子权限的每个命名空间代码库,请声明 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
替换为在其中创建了命名空间代码库的命名空间。将更改提交到根代码库:
git add . git commit -m 'Providing namespace repository the permission to update the admission webhook.' git push
如需进行验证,请使用
kubectl get
确保 ClusterRole 和 ClusterRoleBinding 已创建完毕:kubectl get clusterrole admission-webhook-role kubectl get clusterrolebindings syncs-webhook
后续步骤
- 了解如何排查与 webhook 相关的错误消息。
- 了解如何解决 webhook 的已知问题,即删除 RootSync 或 RepoSync 对象不清理 Config Sync 注解和标签。