繁体   English   中英

使用目标命名空间自定义补丁

[英]Kustomize patch with target namespace

我正在尝试根据 target:namespace 有选择地应用补丁,但它不起作用。

# base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - deployment.yaml
patches:
  - path: deployment-imagepullpolicy-prod.json
    target:
      kind: Deployment
      namespace: prod
# base/kustomization.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
spec:
  template:
    spec:
      containers:
        - name: app
          imagePullPolicy: Always
# base/deployment-imagepullpolicy-prod.json
[
  { 
    "op": "replace", 
    "path": "/spec/template/spec/containers/0/imagePullPolicy", 
    "value": "IfNotPresent"
  }
]
# app/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
  - ../base
namespace: prod

当我生成资源( kubectl kustomize app )时,补丁不存在。 如果删除了 target:namespace 限制,那么它就可以工作。


根据@larks 的回答,我做了一些测试。

首先,我的用例:我有一堆应用程序覆盖,里面有环境覆盖,我们默认使用Always图像拉取策略,但我们需要该产品环境使用ifNotPresent策略。 今天我们使用patchesStrategicMerge做到这一点,但是这种方法会受到人为失败的影响,因此将选择性补丁应用于创建的任何新应用程序,无需人工交互,会很棒。

现在,测试:

  1. 将补丁移动到定义命名空间(应用程序)的覆盖层。
    它不起作用,而且它没有用,因为命名空间是在我需要补丁的地方定义的。
    因此,只需无限制地应用补丁,使命名空间限制无用。
  2. 将命名空间移动到基础覆盖。
    它不起作用,同一覆盖中定义的补丁和命名空间不应用补丁。
    因此,只需无限制地应用补丁,使命名空间限制无用。
  3. 将命名空间移动到基础覆盖层并将补丁移动到应用程序覆盖层。
    它可以工作,但它的“无用”补丁将应用于继承它的所有叠加层。 尝试在应用程序覆盖上重新定义命名空间不起作用。
    因此,只需无限制地应用补丁,使命名空间限制无用。

当您在base中运行kustomize时,您的base目录中的任何补丁都需要正确运行。 因为您没有在base中设置namespace: prod ,所以该补丁将永远无法工作。

即使您将补丁移动到您的app覆盖中,它也不会像您当前使用的那样工作,因为补丁是在您的kustomization.yaml中的namespace指令之前应用的,因此namespace: prod条件永远不会匹配。

但是,我认为这种安排没有意义:只需为不同的命名空间使用不同的覆盖。

在这种情况下,我认为解决方案是将补丁移动到app覆盖并删除namespace: prod条件,以便您拥有这样的布局:

.
├── app
│   ├── deployment-imagepullpolicy-prod.json
│   └── kustomization.yaml
└── base
    ├── deployment.yaml
    └── kustomization.yaml

app/kustomization.yaml看起来像:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
  - ../base
namespace: prod

patches:
  - path: deployment-imagepullpolicy-prod.json
    target:
      kind: Deployment
      namespace: prod

更新

Kustomize 创建一个管道。 当你写这样的东西时:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
  - ../base
namespace: prod

这意味着,有效地:

  1. 首先,在../base中运行kustomize
  2. 应用当前叠加层中定义的任何转换

因此,当您在base目录中运行kustomize时,需要应用base目录中的任何补丁。 正如您当前编写的那样,您的补丁不适用于base中的任何资源,因此它实际上是无操作的。

应用该补丁的唯一方法是将其移动到app覆盖中并删除namespace条件。 因为您要在app/kustomization.yaml中设置namespace: prod ,所以在补丁上使用namespace条件没有任何意义:您的所有资源都将具有namespace: prod ,因此该条件没有意义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM