AKS环境中Kyverno Admission Controller Pod卡在初始化状态
尝试安装Kyverno,完成Helm Chart部署后,Admission Controller Pod始终卡在Init:0/1状态,当前Pod状态如下:
kyverno-admission-controller-6cc87c69c7-d5fgm 0/1 Init:0/1 0 115s kyverno-admission-controller-6cc87c69c7-mkdx2 0/1 Init:0/1 0 115s kyverno-admission-controller-6cc87c69c7-zjlqr 0/1 Init:0/1 0 115s kyverno-background-controller-bc589cf8c-kqw94 1/1 Running 0 115s kyverno-background-controller-bc589cf8c-mxwrc 1/1 Running 0 115s kyverno-cleanup-controller-5c9fdbbc5c-4gwxb 0/1 Running 0 115s kyverno-cleanup-controller-5c9fdbbc5c-nmnr6 0/1 Running 0 115s kyverno-reports-controller-6cc9fd6979-6s5qv 1/1 Running 0 115s kyverno-reports-controller-6cc9fd6979-tbvx2 1/1 Running 0 115s
根据官方文档提示,AKS自带的Admission Enforcer会与Kyverno冲突并删除Webhooks,需为工作负载添加注解规避。于是清理环境后重新安装,使用包含指定注解的values.yaml:
config: webhookAnnotations: admissions.enforcer/disabled: "true" admissionController: rbac: serviceAccount: annotations: azure.workload.identity/client-id: **** podLabels: azure.workload.identity/use: "true"
执行的安装命令:
helm install kyverno kyverno/kyverno \ --namespace kyverno \ --set admissionController.replicas=3 \ --set backgroundController.replicas=2 \ --set cleanupController.replicas=2 \ --set reportsController.replicas=2 \ -f values.yaml
问题依旧存在。查看初始化容器日志,发现其无法与Kubernetes API通信,也无法访问自身命名空间内的ConfigMap:
W1017 01:35:47.048643 1 reflector.go:533] k8s.io/client-go@v0.27.1/tools/cache/reflector.go:231: failed to list *v1.ConfigMap: Get "https://10.0.0.1:443/api/v1/namespaces/kyverno/configmaps?fieldSelector=metadata.name%3Dkyverno-metrics&limit=500&resourceVersion=0": EOF
请问我遗漏了什么配置?或者可以从哪些方向深入排查以恢复这些Pod的功能?
1. 修复values.yaml的缩进错误
你的values.yaml中admissions.enforcer/disabled: "true"的缩进不正确,它应该属于webhookAnnotations的子项,否则Helm不会正确识别这个注解配置,导致Admission Enforcer仍在干扰Kyverno。修正后的values.yaml应该是:
config: webhookAnnotations: admissions.enforcer/disabled: "true" admissionController: rbac: serviceAccount: annotations: azure.workload.identity/client-id: **** podLabels: azure.workload.identity/use: "true"
2. 检查Azure工作负载身份配置是否完整
Admission Controller的ServiceAccount配置了Azure工作负载身份注解,但需确保以下步骤已完成:
- 已在Azure AD中创建对应的应用注册,并授予其访问Kubernetes API的权限
- 已在AKS集群中启用工作负载身份
- 已创建ServiceAccount与Azure AD应用的绑定关系
- 验证Pod的服务账户是否正确关联,集群的OIDC issuer配置是否正常
3. 排查Kubernetes API通信问题
日志中的EOF错误通常表示API请求被中断或拒绝,可从以下方向排查:
- 网络策略:检查
kyverno命名空间是否有网络策略限制Pod访问API Server,或集群层面的网络策略是否拦截了流量 - API Server状态:通过
kubectl get nodes查看节点状态,确认AKS集群的API Server运行正常 - ServiceAccount权限:执行
kubectl auth can-i get configmaps -n kyverno --as=system:serviceaccount:kyverno:kyverno-admission-controller,验证ServiceAccount是否拥有访问ConfigMap的权限 - SSL证书问题:检查Pod挂载的API Server SSL证书是否正常,是否存在证书信任问题
4. 查看初始化容器完整日志
Kyverno Admission Controller的初始化容器负责Webhook配置等前置操作,可通过以下命令获取完整日志:
kubectl logs <admission-controller-pod-name> -c init -n kyverno
(替换<admission-controller-pod-name>为实际Pod名称,可通过kubectl get pods -n kyverno获取)
5. 验证Webhook配置是否存在
如果Admission Enforcer未被正确禁用,Webhook可能被删除,可通过以下命令检查:
kubectl validatingwebhookconfigurations | grep kyverno kubectl mutatingwebhookconfigurations | grep kyverno
内容的提问来源于stack exchange,提问作者Vetements

