本文介绍了有人能解释一下战略合并的补丁吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在kustomization.yaml文件中看到了patchesStrategicMerge,但没有弄清楚,比如它需要什么或者我们为什么需要它?

kustomization.yaml

resources:
- a.yaml

patchesStrategicMerge:
- b.yaml
- c.yaml
我经历了这个:https://kubernetes.io/docs/tasks/manage-kubernetes-objects/kustomization/#customizinghttps://github.com/kubernetes/community/blob/master/contributors/devel/sig-api-machinery/strategic-merge-patch.md

推荐答案

这对您从某个基址继承并希望对该基址应用部分更改非常有用。这样,您就可以拥有一个源YAML文件并基于它执行不同的定制,而不必重新创建整个资源。这是kustomize的一个关键卖点。

Strategic Merge Patch的目的是能够部分修补丰富对象,而不是完全替换它们。

假设您有一个对象列表。

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定义。而在层中,我可以为不同的环境创建多个层,在这种情况下,我只为dev创建了一个层。

如果我使用模拟运行来执行基本本身,则会得到此结果。

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

补丁是这样的。我想为侧车启用调试日志记录。因此,我使用合并指令来更改其参数,而不更改图像。我还想保留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

注意:命令和args没有多大意义,它只是为了说明战略合并修补程序。

这篇关于有人能解释一下战略合并的补丁吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-28 02:37