Kyverno 大师班:烹饪 YAML 的两种方法、补丁方式的差异与实践 🧩

大家好!这里是 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. 运维人员的实战技巧 (最佳实践)

  1. 尽可能使用 Strategic Merge: 维护起来容易得多。JSONPatch 仅在绝对必要时使用(例如:需要在特定列表的中间插入值时)。
  2. mutate 后 validate 的连锁反应: Kyverno 在变异资源后,还会再次检查其结果是否通过其他安全策略(validate)。因此,变异策略的设计不应损害安全性。
  3. 保护现有值: 您可以决定是否覆盖资源中已有的值。在 Strategic Merge 中使用 `+(field)` 语法可以保留现有值。
  4. 幂等性 (Idempotency): 策略即使多次应用,结果也应该相同。特别是在向列表中添加项目时,需要测试以确保不会重复添加。

🌟 总结

今天,我们学习了能够自动纠正用户错误并使集群标准化的mutate 规则

  • 您学会了如何使用 Strategic Merge 轻松快速地填充默认值,以及
  • 如何使用 JSONPatch 精确处理资源。🛠️

这个 mutate 功能是一个非常强大的工具,特别是对于 Platform Engineering 团队来说,可以改善开发者的体验(DevX)。不要只做一个只会说“不行”的管理员,而要成为一个会说“我会帮你补齐缺失的部分”的智能管理员!💪

下一次,我们将以“Sidecar 容器自动注入和通用标签分配”为主题,探讨如何将今天学到的 mutate 在实际工作中发挥到极致。如有疑问,请在评论中留言!😊



Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注