如何通过Kustomize为带指定注解的Pod添加首个Init容器
问题描述
需要为所有带有database_init=True注解的Pod添加一个首个Init容器,但当前补丁仅能处理已有Init容器的Pod,在无Init容器的Pod上执行会报错:
add operation does not apply: doc is missing path: "/spec/initContainers/0": missing value
解决方案
通过拆分两个JSON Patch,分别覆盖「无Init容器」和「已有Init容器」的Pod场景,修改overlay/kustomization.yaml的patches部分如下:
resources: - ../base patches: # 处理无initContainers的Pod:直接创建数组并添加目标容器 - target: kind: Pod annotationSelector: "database_init=True" fieldSelector: "spec.initContainers notin *" patch: |- - op: add path: /spec/initContainers value: - name: database-init image: alpine:latest command: [ "sleep", "10" ] # 处理已有initContainers的Pod:插入到数组首位 - target: kind: Pod annotationSelector: "database_init=True" fieldSelector: "spec.initContainers in *" patch: |- - op: add path: /spec/initContainers/0 value: name: database-init image: alpine:latest command: [ "sleep", "10" ]
关键说明
- 第一个补丁通过
fieldSelector: "spec.initContainers notin *"筛选出未定义Init容器的Pod,直接创建包含目标容器的initContainers数组 - 第二个补丁通过
fieldSelector: "spec.initContainers in *"筛选出已有Init容器的Pod,将目标容器插入到数组的第0位(确保是首个执行的Init容器) - 两个补丁均通过
annotationSelector: "database_init=True"锁定需要处理的Pod
执行kubectl kustomize overlay即可验证:mypod-1会保留原有Init容器并新增首个目标容器,mypod-2会新增目标Init容器。
内容的提问来源于stack exchange,提问作者briconaut
相关产品推荐
相关产品推荐

