在EKS中通过Kyverno为Pod添加卷的问题及解决方法
在EKS环境中结合Helm和ArgoCD部署应用,尝试通过Kyverno Policy为指定命名空间内的Pod添加卷时,遇到以下系列配置问题,均已解决:
问题1(已解决)
尝试创建类似Kyverno官方卷注入示例的Policy资源时,出现解析错误:
api-versions wgpolicyk8s.io/v1alpha2/ClusterPolicyReport --api-versions wgpolicyk8s.io/v1alpha2/PolicyReport --include-crds` failed exit status 1: Error: parse error at (deployment/templates/kyverno2.yaml:30): function "request" not defined
尝试过Kyverno文档中提到的变量转义方法,也成功运行过未引用request对象的示例,但多种转义大括号的方式均无效。
解决方法:使用嵌套反引号的语法引用request对象,成功完成变量定义:
"{{`{{ request.object.metadata.annotations.inject }}`}}"
问题2(已解决)
解决第一个问题后,遇到Policy验证错误:
admission webhook "validate-policy.kyverno.svc" denied the request: policy contains invalid variables: variable substitution failed for rule add-volume: failed to resolve request.object.metadata.annotations.inject at path /preconditions/all/0/key: invalid JMESPath query request.object.metadata.annotations.inject-certs: SyntaxError: Unexpected token at the end of the expression: tNumber
解决方法:JMESPath查询中注解键名inject需用引号包裹,同时添加空字符串处理资源无该注解的场景,正确语法如下:
"{{`{{ request.object.metadata.annotations.\\"inject\\" || \\\"\\\" }}`}}"
问题3(已解决)
使用JSON6904补丁可正常运行,但使用foreach配置时执行失败,原配置片段:
mutate: foreach: - list: "{{`{{ request.object.spec.containers }}`}}" patchStrategicMerge:
错误信息:
admission webhook "mutate.kyverno.svc-fail" denied the request: mutation policy add-volume error: failed to apply policy add-volume rules [autogen-add-ssl-certs]
解决方法:list字段无需嵌套大括号转义,直接用引号包裹JMESPath表达式即可,正确配置:
- list: "request.object.spec.containers"
最终成功实现Kyverno Policy的正常运行。
内容的提问来源于stack exchange,提问作者Prem P.

