排查准入 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 Deployment,以查看其 Pod 是否可以调度以及健康状况良好:

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

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

具有运行状况良好的 Pod 的 Deployment 的输出如下所示:

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 准入 Webhook 会将该规则用于防偏移。端口 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。

为避免再次遇到此错误,请先移除命名空间代码库,然后再移除命名空间。

后续步骤

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