大家好!这里是 Kubernetes 运维的魔法师,Kyverno 大师系列课程的第八讲。🧙♂️
如果说上次我们学习了“阻止”错误请求的盾牌(Validation),那么今天我们将深入探讨能够更完美地“修饰”用户请求的魔杖——mutate 规则。
如果您曾有过这样的烦恼:“给每个 Pod 手动添加安全标签太麻烦了,希望能自动添加”,“开发者忘记的 Sidecar 容器能不能自动注入呢?”,那么今天的文章就是答案。让我们在15分钟内品味资源变异(Mutation)的精髓吧!🚀

🏗️ 1. mutate 规则是什么?
mutate 规则能够在 Kubernetes 资源存储到 API 服务器之前,自动修改或添加数据。
- 设置默认值: 当缺少必要设置时,自动填充。
- 增强安全性: 强制注入推荐的安全设置。
- 自动化: 自动化 Sidecar 注入、标签添加等重复性工作。
🛠️ 2. 修改资源的两种技术:Strategic Merge vs JSONPatch
Kyverno 中变异资源的方法主要有两种。选择适合情况的工具是高手的秘诀。
① patchStrategicMerge (直观方式) 🧩
这种方式遵循 Kubernetes 资源的结构,覆盖或添加值。它是最常用的方式,并且非常易读。
- 特点: 直接复制 YAML 结构即可。对于列表(List),会根据特定键(例如:name)进行合并。
- 比喻: 就像在乐高积木上叠加新的积木。
② patchesJson6902 (精确方式) 📍
通常称为 JSONPatch,这种方式通过指定特定路径(Path)来执行修改、删除、添加命令。
- 特点: 可以进行非常精细的操作,例如在数组的特定索引处插入值,或删除字段。
- 比喻: 就像外科医生拿着手术刀,精确地对特定部位进行手术。
💻 3. 实践 1: 使用 patchStrategicMerge 注入默认标签
让我们让所有 Pod 在创建时自动附加 `managed-by: kyverno` 标签。
YAML
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: add-default-labels
spec:
rules:
- name: add-labels
match:
any:
- resources:
kinds:
- Pod
mutate:
patchStrategicMerge:
metadata:
labels:
managed-by: kyverno
env: "{{request.namespace}}" # 变量也可以使用!
分析:此策略即使在用户未添加标签的情况下,Kyverno 也会拦截并将其值注入到 `metadata.labels` 中。
📍 4. 实践 2: 使用 JSONPatch 精确修改容器设置
这次我们来做一些更难的,强制将第一个容器的镜像拉取策略(imagePullPolicy)始终更改为 `Always`。
YAML
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: force-image-pull-policy
spec:
rules:
- name: set-always
match:
any:
- resources:
kinds:
- Pod
mutate:
patchesJson6902: |-
- op: replace
path: "/spec/containers/0/imagePullPolicy"
value: "Always"
分析:通过 `op: replace` 命令强制更改 `/spec/containers/0/` 路径下的值。如果该路径下没有值,可能会报错,需要注意。
📊 5. 差异一览
| 分类 | patchStrategicMerge | patchesJson6902 (JSONPatch) |
| — | — | — |
| 可读性 | 非常高 (与 YAML 结构相同) | 低 (基于路径的表示法) |
| 复杂性 | 适用于简单的添加/修改 | 适用于删除、特定索引修改等精确操作 |
| 工作原理 | 基于 Map 的合并 | 执行 RFC 6902 标准命令 |
| 主要用途 | 添加标签、注入注解 | 修改容器列表中的特定元素 |
—
🚀 6. 运维人员的实战技巧 (最佳实践)
- 尽可能使用 Strategic Merge: 维护起来容易得多。JSONPatch 仅在绝对必要时使用(例如:需要在特定列表的中间插入值时)。
- mutate 后 validate 的连锁反应: Kyverno 在变异资源后,还会再次检查其结果是否通过其他安全策略(validate)。因此,变异策略的设计不应损害安全性。
- 保护现有值: 您可以决定是否覆盖资源中已有的值。在 Strategic Merge 中使用 `+(field)` 语法可以保留现有值。
- 幂等性 (Idempotency): 策略即使多次应用,结果也应该相同。特别是在向列表中添加项目时,需要测试以确保不会重复添加。
🌟 总结
今天,我们学习了能够自动纠正用户错误并使集群标准化的mutate 规则。
- 您学会了如何使用 Strategic Merge 轻松快速地填充默认值,以及
- 如何使用 JSONPatch 精确处理资源。🛠️
这个 mutate 功能是一个非常强大的工具,特别是对于 Platform Engineering 团队来说,可以改善开发者的体验(DevX)。不要只做一个只会说“不行”的管理员,而要成为一个会说“我会帮你补齐缺失的部分”的智能管理员!💪
下一次,我们将以“Sidecar 容器自动注入和通用标签分配”为主题,探讨如何将今天学到的 mutate 在实际工作中发挥到极致。如有疑问,请在评论中留言!😊
发表回复