kustomize (七) patches、patchesJson6902、patchesStrategicMerge详解

kustomize (七) patches、patchesJson6902、patchesStrategicMerge详解文章目录patches方法Target选择patches方法kustomization.yaml支持通过StrategicMergePatch和JSONpatch来自定义资源

在这里插入图片描述


1. patches介绍

kustomization.yaml 支持通过 Strategic Merge Patch 和 JSON patch来自定义资源。自 3.1.0 起,一个 patch 可以修改多个资源。

这可以通过指定 patch 和它所修改的 target 来完成,如下所示:

patches:
- path: <PatchFile>
  target:
    group: <Group>
    version: <Version>
    kind: <Kind>
    name: <Name>
    namespace: <Namespace>
    labelSelector: <LabelSelector>
    annotationSelector: <AnnotationSelector>

|
op: [add,replace]

替换 /新增的方式有三种

- op: replace
path: /metadata/name
value: beautiful-country-bigdata

labelSelectorannotationSelector 都应遵循 label selector 中的约定。Kustomize 选择匹配target中所有字段的目标来应用 patch 。

1.1 patches示例

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
patches:
- path: patch.yaml
  target:
    group: apps
    version: v1
    kind: Deployment
    name: deploy.*
    labelSelector: "env=dev"
    annotationSelector: "zone=west"
- patch: |-
    - op: replace
      path: /some/existing/path
      value: new value
  target:
    kind: MyKind
    labelSelector: "env=dev"

2. patches添加

下面的示例展示了如何为所有部署资源注入 sidecar 容器。

创建一个包含 Deployment 资源的 kustomization 。

DEMO_HOME=$(mktemp -d)

cat <<EOF >$DEMO_HOME/kustomization.yaml
resources:
- deployments.yaml
EOF

cat <<EOF >$DEMO_HOME/deployments.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy1
spec:
  template:
    metadata:
      labels:
        old-label: old-value
    spec:
      containers:
        - name: nginx
          image: nginx
          args:
          - one
          - two
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy2
spec:
  template:
    metadata:
      labels:
        key: value
    spec:
      containers:
        - name: busybox
          image: busybox
EOF

声明 Strategic Merge Patch 文件以注入 sidecar 容器:

cat <<EOF >$DEMO_HOME/patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: not-important
spec:
  template:
    spec:
      containers:
        - name: istio-proxy
          image: docker.io/istio/proxyv2
          args:
          - proxy
          - sidecar
EOF

在 kustomization.yaml 中添加 patches 字段

cat <<EOF >>$DEMO_HOME/kustomization.yaml
patches:
- path: patch.yaml
  target:
    kind: Deployment
EOF

运行 kustomize build $DEMO_HOME,可以在输出中确认两个 Deployment 资源都已正确应用。

test 2 ==  $(kustomize build $DEMO_HOME | grep "image: docker.io/istio/proxyv2" | wc -l);  echo $?

输出如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy1
spec:
  template:
    metadata:
      labels:
        old-label: old-value
    spec:
      containers:
      - args:
        - proxy
        - sidecar
        image: docker.io/istio/proxyv2
        name: istio-proxy
      - args:
        - one
        - two
        image: nginx
        name: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy2
spec:
  template:
    metadata:
      labels:
        key: value
    spec:
      containers:
      - args:
        - proxy
        - sidecar
        image: docker.io/istio/proxyv2
        name: istio-proxy
      - image: busybox
        name: busybox

3. patches替换

3.1 通过Kustomization 直接编写替换/新增资源清单属性

deployment.yamlservice.yaml

cat <<EOF > deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: java
  name: java
spec:
  selector:
    matchLabels:
      app: java
  template:
    metadata:
      labels:
        app: java
    spec:
      containers:
      - image: java
        name: java
        ports:
        - containerPort: 8080
          name: web
EOF
cat <<EOF > service.yaml
apiVersion: v1
kind: Service
metadata:
  name: java
spec:
  selector:
    app: java
  ports:
  - name: http
    port: 8001
    targetPort: 8001
EOF
cat <<EOF > kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ./deployment.yaml
- ./service.yaml
commonLabels:
  app: bigdata
images:
- name: java
  newName: registry.cn-qingdao.aliyuncs.com/nqkj-snapshot/sky-bigdata
  newTag: develop-be43cc32
patches:
- patch: |
    - op: replace
      path: /metadata/name
      value: bigdata
    - op: replace
      path: /spec/template/spec/containers/0/name
      value: bigdata
    - op: replace
      path: /spec/template/spec/containers/0/ports/0/containerPort
      value: 8001
  target:
    group: apps
    kind: Deployment
    version: v1
- patch: |
    - op: replace
      path: /metadata/name
      value: bigdata
  target:
    kind: Service
EOF

运行kubectl kustomize ./

apiVersion: v1
kind: Service
metadata:
  labels:
    app: bigdata
  name: bigdata
spec:
  ports:
  - name: http
    port: 8001
    targetPort: 8001
  selector:
    app: bigdata
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: bigdata
  name: bigdata
spec:
  selector:
    matchLabels:
      app: bigdata
  template:
    metadata:
      labels:
        app: bigdata
    spec:
      containers:
        image: registry.cn-qingdao.aliyuncs.com/nqkj-snapshot/sky-bigdata:develop-ad8ed411
        name: bigdata
        ports:
        - containerPort: 8001
          name: web

3.2 如果通过.yaml 文件进行修改/新增资源清单属性

准备patch.yaml,内容如下

cat <<EOF>patch.yaml
- op: replace
  path: /metadata/name
  value: oauth-server
- op: replace
  path: /spec/template/spec/containers/0/name
  value: oauth-server
EOF
cat <<EOF > kustomization.yaml
resources:
- ./deployment.yaml
- ./service.yaml
commonLabels:  # 标签
  app: oauth-server
images:
- name: java
  newName: my-registry/my-postgres
patches:
  - path: patch.yaml
    target:
      group: apps
      kind: Deployment
      version: v1
EOF

kustomize查看编排结果

$ kustomize build .
apiVersion: v1
kind: Service
metadata:
  labels:
    app: oauth-server
  name: java
spec:
  ports:
  - name: http
    port: 8001
    targetPort: 8001
  selector:
    app: oauth-server
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: oauth-server
  name: oauth-server
spec:
  selector:
    matchLabels:
      app: oauth-server
  template:
    metadata:
      labels:
        app: oauth-server
    spec:
      containers:
      - image: my-registry/my-postgres
        name: oauth-server
        ports:
        - containerPort: 8080
          name: web

4. patchesJson6902

通过json 文件的方式替换/新增资源清单的属性值
patchesJson6902 不光可以使用json文件也是可以使用yaml文件与上面的patches如出一辙

注意: 在通过target: 匹配资源清单的同时必须加入target>name: 属性,属性值为Deployment> 的name,这是与patches的区别

我们还是使用patches所使用的deployment.yaml和service.yaml 作为基础模版文件

准备 patch.jsonpatch-svc.json

cat <<EOF >patch.json
[
    { 
    "op": "replace", "path": "/metadata/name", "value": "oauth-server" },
    { 
    "op": "add", "path": "/spec/template/spec/containers/0/name", "value": "oauth-server"}
     
]
EOF
cat <<EOF >patch-svc.json
[
  { 
    "op": "replace", "path": "/metadata/name", "value": "oauth-server" }
]
EOF
cat <<EOF > kustomization.yaml
resources:
  - ../../../template
commonLabels:  # 标签
  app: oauth-server
images:
- name: java
  newName: my-registry/my-postgres
patchesJson6902:
  - path: patch.json
    target:
      group: apps
      kind: Deployment
      version: v1
      name: java
  - path: patch-svc.json # 指定json
    target:
      version: v1
      kind: Service
      name: java
EOF

kustomize查看编排结果

$ kustomize build .
apiVersion: v1
kind: Service
metadata:
  labels:
    app: oauth-server
  name: oauth-server
spec:
  ports:
  - name: http
    port: 8001
    targetPort: 8001
  selector:
    app: oauth-server
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: oauth-server
  name: oauth-server
spec:
  selector:
    matchLabels:
      app: oauth-server
  template:
    metadata:
      labels:
        app: oauth-server
    spec:
      containers:
      - image: my-registry/my-postgres
        name: oauth-server
        ports:
        - containerPort: 8080
          name: web

5. patchesStrategicMerge

通过.yaml 文件的方式为要生成的资源清单定义补丁

注意补丁的yaml 文件的name,要跟模版清单一致,下面是deployment.yaml模版清单,increase_replicas.yaml和set_memory.yaml为补丁。在kustomization声明引用补丁文件,最后合并成带补丁的资源清单。

cat <<EOF > deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  selector:
    matchLabels:
      run: my-nginx
  replicas: 2
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:
        - containerPort: 80
EOF
# Create a patch increase_replicas.yaml
cat <<EOF > increase_replicas.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 3
EOF

# Create another patch set_memory.yaml
cat <<EOF > set_memory.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  template:
    spec:
      containers:
      - name: my-nginx
        resources:
        limits:
          memory: 512Mi
EOF

cat <<EOF >./kustomization.yaml
resources:
- deployment.yaml
patchesStrategicMerge:
- increase_replicas.yaml
- set_memory.yaml
EOF

kustomize查看编排结果

$ kustomize build .
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      run: my-nginx
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - image: nginx
        limits:
          memory: 512Mi
        name: my-nginx
        ports:
        - containerPort: 80

6. Target 选择

选择名称与 name* 匹配的资源

target:
  name: name*

选择所有 Deployment 资源

target:
  kind: Deployment

选择 label 与 app=hello 匹配的资源

target:
  labelSelector: app=hello

选择 annotation 与 app=hello 匹配的资源

target:
  annotationSelector: app=hello

选择所有 label 与 app=hello 匹配的 Deployment 资源

target:
  kind: Deployment
  labelSelector: app=hello

更多细节:
https://github.com/kubernetes/community/blob/master/contributors/devel/sig-api-machinery/strategic-merge-patch.md

kustomize API 使用手册

扩展阅读:

  • kustomize (一) 管理yaml部署入门hello world
  • kustomize (二) ConfigMap的生成和滚动更新
  • kustomize (三) devops和开发配合管理配置数据behavior: merge、namePrefix、nameSuffix
  • kustomize (四) generatorOptions详解
  • kustomize (五) 使用vars将 k8s runtime数据注入容器
  • kustomize(六)命令行常用编排
  • kustomize (七)patches、patchesJson6902、patchesStrategicMerge详解
  • kustomize (八)生成secret
  • kustomize(九)使用终章

今天的文章kustomize (七) patches、patchesJson6902、patchesStrategicMerge详解分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/88413.html

(0)
编程小号编程小号

相关推荐

发表回复

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