排查准入 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。
为避免再次遇到此错误,请先移除命名空间代码库,然后再移除命名空间。
后续步骤
- 如果您仍然遇到问题,请检查您的问题是否为已知问题。