kubernetes 如何使用kustomize添加init容器

yqlxgs2m  于 2023-04-20  发布在  Kubernetes
关注(0)|答案(1)|浏览(140)

我想在我的kustomize库中添加一个initContainer到我的所有pod(带有特定的注解)。新添加的init容器应该是第一个init容器。我的补丁看起来像这样。

patches:
  - target:
      kind: Pod
      annotationSelector: "database_init=True"
    patch: |-
      - op: add
        path: /spec/initContainers/0
        value:
          name: database-init
          ...

这适用于所有已经有init容器的pod。不幸的是,我有没有init容器的pod,补丁失败,错误为add operation does not apply: doc is missing path: \"/spec/initContainers/0\"。我如何编写适用于所有pod的补丁?
完整示例:

.
├── base
│   ├── kustomization.yaml
│   ├── pod-1.yaml
│   └── pod-2.yaml
└── overlay
    └── kustomization.yaml
# cat base/pod-1.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mypod-1
  annotations:
    database_init: True
spec:
  initContainers:
    - name: something
      image: alpine:latest
      command: ["sleep", "10" ]
  containers:
    - name: main
      image: alpine:latest
      command: [ "sleep", "60" ]
# cat base/pod-2.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mypod-2
  annotations:
    database_init: True
spec:
#   initContainers:
#     - name: something
#       image: alpine:latest
#       command: ["sleep", "10" ]
  containers:
    - name: main
      image: alpine:latest
      command: [ "sleep", "60" ]
# cat base/kustomization.yaml
resources:
  - pod-1.yaml
  - pod-2.yaml
# cat overlay/kustomization.yaml
resources:
  - ../base

patches:

  - target:
      kind: Pod
      annotationSelector: "database_init=True"
    patch: |-
      - op: add
        path: /spec/initContainers/0
        value:
          name: database-init
          image: alpine:latest
          command: [ "sleep", 10 ]

结果:

$ kubectl kustomize overlay
error: add operation does not apply: doc is missing path: "/spec/initContainers/0": missing value

取消pod-2的init容器的注解后,一切正常。
编辑:添加了annotationSelector。
编辑:添加了完整的示例代码。

nbysray5

nbysray51#

JSONPatch补丁通常根本无法处理“添加到现有列表或创建新列表”的情况。例如,参见this question
幸运的是,在Kustomize 5.0.1中,似乎可以使用战略合并补丁来实现您的目标。给定您的示例配置,如果我在overlay/kustomization.yaml中放置以下内容:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../base/

patches:
  - target:
      kind: Pod
      annotationSelector: database_init=True
    patch: |-
      apiVersion: v1
      kind: Pod
      metadata:
        name: __ignored__
      spec:
        initContainers:
          - name: database-init
            image: alpine:latest
            command:
              - init
              - the
              - database

然后运行kustomize build overlay会产生以下输出:

apiVersion: v1
kind: Pod
metadata:
  annotations:
    database_init: "True"
  name: mypod-1
spec:
  containers:
  - command:
    - sleep
    - "60"
    image: alpine:latest
    name: main
  initContainers:
  - command:
    - init
    - the
    - database
    image: alpine:latest
    name: database-init
  - command:
    - sleep
    - "10"
    image: alpine:latest
    name: something
---
apiVersion: v1
kind: Pod
metadata:
  annotations:
    database_init: "True"
  name: mypod-2
spec:
  containers:
  - command:
    - sleep
    - "60"
    image: alpine:latest
    name: main
  initContainers:
  - command:
    - init
    - the
    - database
    image: alpine:latest
    name: database-init

相关问题