排查准入 webhook 问题

本页面介绍如何解决 Config Sync 准入 webhook 的问题。如需详细了解 webhook,请参阅防止配置偏移

排查 KNV 2009 错误

以下部分将帮助您解决 KNV2009 错误。

准许网络钩子连接遭拒

如果启用了偏移保护,则在协调器尝试将配置应用于集群时,您可能会收到以下错误:

KNV2009: Internal error occurred: failed calling webhook "v1.admission-webhook.configsync.gke.io": Post "https://admission-webhook.config-management-system.svc:8676/admission-webhook?timeout=3s": dial tcp 10.92.2.14:8676: connect: connection refused

此错误意味着准入 webhook 尚未就绪或健康状况不佳。这通常是在您引导 Config Sync 时可能会遇到的一个暂时性错误。

如果问题仍然存在,请查看准入 webhook 部署,以检查其 Pod 是否可安排且健康状况良好:

kubectl describe deploy admission-webhook -n config-management-system

kubectl get pods -n config-management-system -l app=admission-webhook

如果部署的 Pod 健康状况良好,则输出类似如下内容:

Replicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable
...
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
...

准入 webhook 请求 I/O 超时

如果您在协调器尝试将配置应用于集群时收到类似于以下内容的错误,则控制平面网络的防火墙可能阻止了准入 webhook 端口 8676

KNV2009: Internal error occurred: failed calling webhook "v1.admission-webhook.configsync.gke.io": Post https://admission-webhook.config-management-system.svc:8676/admission-webhook?timeout=3s: dial tcp 10.1.1.186:8676: i/o timeout

要解决此问题,请添加防火墙规则以允许端口 8676,Config Sync 准入网络钩子使用此端口来防止出现偏差。 需要从控制平面打开节点上的端口 8676,因为控制平面需要能够访问集群节点上的 webhook 后端。

准入 webhook 拒绝请求

如果您在尝试对 Config Sync 管理的字段应用更改时收到以下错误,则表明您可能进行了有冲突的更改:

error: OBJECT could not be patched: admission webhook "v1.admission-webhook.configsync.gke.io"
denied the request: fields managed by Config Sync can not be modified

如果启用了偏移保护,则当您在配置中声明了字段并将代码库同步到集群后,Config Sync 将管理该字段。您尝试对该字段进行的任何更改都是有冲突的更改。

例如,如果带有 environment:prod 标签的代码库中有 Deployment 配置,并且尝试将该标签更改为集群中的 environment:dev,则会出现有冲突的更改,并且您将会收到之前的错误消息。但是,如果您向 Deployment 添加新标签(例如 tier:frontend),则不会发生冲突。

如果您希望 Config Sync 忽略对对象所做的任何更改,则可以添加忽略对象变更中所述的注释。

未能删除所有资源类型

卡在 Terminating 阶段的命名空间具有以下条件:

    message: 'Failed to delete all resource types, 1 remaining: admission webhook
      "v1.admission-webhook.configsync.gke.io" denied the request: system:serviceaccount:kube-system:namespace-controller
      is not authorized to delete managed resource "_configmap_bookstore_cm1"'
    reason: ContentDeletionFailed
    status: "True"
    type: NamespaceDeletionContentFailure

如果您尝试从根代码库中删除 Namespace 对象,但命名空间下的某些对象仍由命名空间协调器主动管理,就会发生此错误。删除命名空间时,服务账号为 system:serviceaccount:kube-system:namespace-controller命名空间控制器将尝试删除该命名空间中的所有对象。但是,Config Sync 准入 webhook 只允许根协调器或命名空间协调器删除这些对象,并且会拒绝命名空间控制器删除这些对象。

如需解决此问题,请删除 Config Sync 准入 webhook:

kubectl delete deployment.apps/admission-webhook -n config-management-system

ConfigManagement Operator 会重新创建 Config Sync 准入 webhook。

如果此解决方法无效,您可能需要重新安装 Config Sync。

为避免再次发生该错误,请在移除命名空间之前先移除命名空间代码库

后续步骤

  • 如果您仍然遇到问题,请检查您的问题是否为已知问题