[英]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
做到这一点,但是这种方法会受到人为失败的影响,因此将选择性补丁应用于创建的任何新应用程序,无需人工交互,会很棒。
现在,测试:
当您在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
这意味着,有效地:
../base
中运行kustomize
因此,当您在base
目录中运行kustomize
时,需要应用base
目录中的任何补丁。 正如您当前编写的那样,您的补丁不适用于base
中的任何资源,因此它实际上是无操作的。
应用该补丁的唯一方法是将其移动到app
覆盖中并删除namespace
条件。 因为您要在app/kustomization.yaml
中设置namespace: prod
,所以在补丁上使用namespace
条件没有任何意义:您的所有资源都将具有namespace: prod
,因此该条件没有意义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.