谁能解释一下 'patchesStrategicMerge'
Can someone explain 'patchesStrategicMerge'
我在我的 kustomization.yaml 文件中看到 patchesStrategicMerge
,但没有弄清楚,比如它需要什么或我们为什么需要它?
kustomization.yaml
resources:
- a.yaml
patchesStrategicMerge:
- b.yaml
- c.yaml
我经历了这个:https://kubernetes.io/docs/tasks/manage-kubernetes-objects/kustomization/#customizing 和
https://github.com/kubernetes/community/blob/master/contributors/devel/sig-api-machinery/strategic-merge-patch.md
这对您 继承 某些基础并希望对所述基础应用部分更改很有用。这样一来,您可以拥有一个源 YAML 文件并基于它执行不同的自定义,而无需重新创建整个资源。这是kustomize.
的一个关键卖点
Strategic Merge Patch
的目的是能够部分修补 rich objects,而不是完全替换它们。
假设您有一个对象列表。
mylist:
- name: foo
- name: bar
- name: baz
您如何更改列表中的其中一项?使用标准的合并补丁,您只能替换整个列表。但是通过战略性合并补丁,您可以根据一些 属性 来定位列表中的一个元素,在这种情况下,只有名称才有意义,因为它是唯一的 属性.
mylist:
- $patch: delete
name: foo
在上面的例子中,我使用策略合并补丁删除了列表中名为 foo 的项目。
再举个例子,假设我有以下项目结构。
sample
├── base
│ ├── kustomization.yaml
│ └── pod.yaml
└── layers
└── dev
├── kustomization.yaml
└── patch.yaml
在底部,是我的完整 pod 定义。在图层中,我可以为不同的环境创建多个图层,在这种情况下,我只有一个用于开发。
如果我用干 运行 执行基础本身,我明白了。
kubectl apply -k sample/base --dry-run=client -o yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp
namespace: default
spec:
containers:
- image: nginx
name: nginx
- command:
- sleep
- infinity
image: busybox
name: sidecar
dev 文件夹中的 kustomization.yaml 如下所示。
bases:
- ../../base
patchesStrategicMerge:
- patch.yaml
补丁看起来像这样。我想为 Sidecar 启用调试日志记录。因此,我使用合并指令来更改其参数而不更改图像。我也想保留nginx容器。
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
containers:
- $patch: merge
name: sidecar
args: [log-level, debug]
kubectl apply -k sample/layers/dev/ --dry-run=client -o yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp
namespace: default
spec:
containers:
- args:
- log-level
- debug
command:
- sleep
- infinity
image: busybox
name: sidecar
- image: nginx
name: nginx
注意:command和args没有太大意义,只是为了说明策略合并补丁。
我在我的 kustomization.yaml 文件中看到 patchesStrategicMerge
,但没有弄清楚,比如它需要什么或我们为什么需要它?
kustomization.yaml
resources:
- a.yaml
patchesStrategicMerge:
- b.yaml
- c.yaml
我经历了这个:https://kubernetes.io/docs/tasks/manage-kubernetes-objects/kustomization/#customizing 和 https://github.com/kubernetes/community/blob/master/contributors/devel/sig-api-machinery/strategic-merge-patch.md
这对您 继承 某些基础并希望对所述基础应用部分更改很有用。这样一来,您可以拥有一个源 YAML 文件并基于它执行不同的自定义,而无需重新创建整个资源。这是kustomize.
的一个关键卖点Strategic Merge Patch
的目的是能够部分修补 rich objects,而不是完全替换它们。
假设您有一个对象列表。
mylist:
- name: foo
- name: bar
- name: baz
您如何更改列表中的其中一项?使用标准的合并补丁,您只能替换整个列表。但是通过战略性合并补丁,您可以根据一些 属性 来定位列表中的一个元素,在这种情况下,只有名称才有意义,因为它是唯一的 属性.
mylist:
- $patch: delete
name: foo
在上面的例子中,我使用策略合并补丁删除了列表中名为 foo 的项目。
再举个例子,假设我有以下项目结构。
sample
├── base
│ ├── kustomization.yaml
│ └── pod.yaml
└── layers
└── dev
├── kustomization.yaml
└── patch.yaml
在底部,是我的完整 pod 定义。在图层中,我可以为不同的环境创建多个图层,在这种情况下,我只有一个用于开发。
如果我用干 运行 执行基础本身,我明白了。
kubectl apply -k sample/base --dry-run=client -o yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp
namespace: default
spec:
containers:
- image: nginx
name: nginx
- command:
- sleep
- infinity
image: busybox
name: sidecar
dev 文件夹中的 kustomization.yaml 如下所示。
bases:
- ../../base
patchesStrategicMerge:
- patch.yaml
补丁看起来像这样。我想为 Sidecar 启用调试日志记录。因此,我使用合并指令来更改其参数而不更改图像。我也想保留nginx容器。
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
containers:
- $patch: merge
name: sidecar
args: [log-level, debug]
kubectl apply -k sample/layers/dev/ --dry-run=client -o yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp
namespace: default
spec:
containers:
- args:
- log-level
- debug
command:
- sleep
- infinity
image: busybox
name: sidecar
- image: nginx
name: nginx
注意:command和args没有太大意义,只是为了说明策略合并补丁。