Open Policy Agent Gatekeeper 突变功能深度解析
什么是突变功能
Open Policy Agent Gatekeeper 的突变功能(Mutation)是 Kubernetes 准入控制器的一项重要特性,它允许在资源请求时根据自定义的突变策略修改 Kubernetes 资源。该功能自 Gatekeeper v3.10 版本起已稳定可用。
突变 CRD 类型
Gatekeeper 提供了四种专门的 CRD 类型来定义突变策略:
- AssignMetadata - 专门修改资源的元数据部分(仅限于标签和注解)
- Assign - 修改元数据之外的任何部分
- ModifySet - 在列表中添加或删除条目(如容器参数)
- AssignImage - 修改镜像字符串的组成部分
突变策略结构解析
每个突变 CRD 都包含三个核心部分:
1. 变更范围(Extent of changes)
这部分定义了哪些资源会被修改,使用与约束相同的匹配条件:
applyTo:
- groups: [""]
kinds: ["Pod"]
versions: ["v1"]
match:
scope: Namespaced
kinds:
- apiGroups: ["*"]
kinds: ["Pod"]
labelSelector: []
namespaces: ["default"]
excludedNamespaces: ["kube-system"]
关键点说明:
applyTo
字段(AssignMetadata 除外)帮助 Gatekeeper 理解被修改对象的模式match
部分支持多种匹配条件,包括作用域、资源类型、标签选择器等- 空/未定义的匹配条件默认匹配所有对象
2. 变更意图(Intent)
这部分指定要修改的内容和值:
location: "spec.containers[name: nginx].imagePullPolicy"
parameters:
assign:
value: "Always"
关键特性:
location
使用路径表达式定位要修改的字段- 支持通配符匹配列表元素(如
[name: *]
) - 值可以是简单字符串或复合结构
- 支持从元数据中提取值(通过
fromMetadata
字段)
3. 条件判断(Conditionals)
定义突变应用的条件:
parameters:
pathTests:
- subPath: "spec.containers[name: foo]"
condition: MustExist
- subPath: "spec.containers[name: foo].securityContext"
condition: MustNotExist
条件类型:
MustExist
- 路径必须存在才应用突变MustNotExist
- 路径必须不存在才应用突变
各突变类型详解
AssignMetadata 详解
专门用于修改资源元数据(仅限于标签和注解):
apiVersion: mutations.gatekeeper.sh/v1
kind: AssignMetadata
metadata:
name: add-owner-label
spec:
location: "metadata.labels.owner"
parameters:
assign:
value: "team-a"
限制:
- 只能添加新的标签/注解,不能修改已存在的
- 不能修改名称、命名空间等核心元数据
ModifySet 详解
专门处理列表类型的修改:
apiVersion: mutations.gatekeeper.sh/v1
kind: ModifySet
metadata:
name: remove-log-arg
spec:
location: "spec.containers[name: *].args"
parameters:
operation: prune
values:
fromList: ["--verbose"]
操作类型:
merge
- 添加列表中不存在的值(默认)prune
- 从列表中移除指定的值
AssignImage 详解
专门处理容器镜像的修改:
apiVersion: mutations.gatekeeper.sh/v1alpha1
kind: AssignImage
metadata:
name: set-image-digest
spec:
location: "spec.containers[name: *].image"
parameters:
assignTag: "@sha256:abcde..."
特性:
- 可以单独修改镜像的域名、路径或标签
- 标签必须以
:
或@
开头 - 当路径可能被误认为域名时,必须同时指定域名
实用示例集锦
示例1:为所有命名空间中的Pod添加注解
apiVersion: mutations.gatekeeper.sh/v1
kind: AssignMetadata
metadata:
name: annotate-pods
spec:
location: "metadata.annotations.owner"
parameters:
assign:
value: "platform-team"
示例2:设置特定容器的安全上下文
apiVersion: mutations.gatekeeper.sh/v1
kind: Assign
metadata:
name: set-security-context
spec:
location: "spec.containers[name: app].securityContext.privileged"
parameters:
assign:
value: false
示例3:为Pod添加sidecar容器
apiVersion: mutations.gatekeeper.sh/v1
kind: Assign
metadata:
name: add-sidecar
spec:
location: "spec.containers[name: log-collector]"
parameters:
assign:
value:
name: log-collector
image: fluentd:latest
command: ["/bin/sh", "-c", "fluentd"]
示例4:修改镜像使用特定摘要
apiVersion: mutations.gatekeeper.sh/v1alpha1
kind: AssignImage
metadata:
name: secure-image
spec:
location: "spec.containers[name: *].image"
parameters:
assignTag: "@sha256:abc123..."
最佳实践
- 精确匹配:尽量使用具体的匹配条件,避免过于宽泛的范围
- 条件测试:使用
pathTests
确保突变只在预期条件下应用 - 变更隔离:将不同的突变逻辑分开到不同的 CRD 中
- 测试验证:在生产环境应用前,先在测试环境验证突变效果
- 变更记录:启用突变注解功能记录突变操作
通过合理使用 Gatekeeper 的突变功能,可以实现 Kubernetes 资源的自动化配置管理,确保集群中的资源始终符合组织的标准和策略。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考