1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. name: patch-demo
    5. spec:
    6. replicas: 2
    7. selector:
    8. matchLabels:
    9. app: nginx
    10. template:
    11. metadata:
    12. labels:
    13. app: nginx
    14. spec:
    15. containers:
    16. - name: patch-demo-ctr
    17. image: nginx
    18. tolerations:
    19. - effect: NoSchedule
    20. key: dedicated
    21. value: test-team

    创建一个名为 patch-file-containers.yaml 的文件。内容如下:

    1. spec:
    2. template:
    3. spec:
    4. containers:
    5. - name: patch-demo-ctr-2
    6. image: redis

    修补你的 Deployment:

    1. kubectl patch deployment patch-demo --patch "$(cat patch-file-containers.yaml)"

    查看修补后的 Deployment:

    1. kubectl get deployment patch-demo --output yaml

    输出显示 Deployment 中的 PodSpec 有两个容器:

    1. containers:
    2. - image: redis
    3. imagePullPolicy: Always
    4. name: patch-demo-ctr-2
    5. ...
    6. - image: nginx
    7. imagePullPolicy: Always
    8. name: patch-demo-ctr
    9. ...

    请注意,patch 没有替换containers 列表。相反,它向列表中添加了一个新 Container。换句话说, patch 中的列表与现有列表合并。当你在列表中使用策略性合并 patch 时,并不总是这样。 在某些情况下,列表是替换的,而不是合并的。

    对于策略性合并 patch,列表可以根据其 patch 策略进行替换或合并。 patch 策略由 Kubernetes 源代码中字段标记中的 **patchStrategy** 键的值指定。 例如,PodSpec 结构体的 Containers 字段的 patchStrategymerge

    1. type PodSpec struct {
    2. ...
    3. Containers []Container `json:"containers" patchStrategy:"merge" patchMergeKey:"name" ...`

    你还可以在 OpenApi spec 规范中看到 patch 策略:

    1. "io.k8s.api.core.v1.PodSpec": {
    2. ...
    3. "containers": {
    4. "description": "List of containers belonging to the pod. ...
    5. },
    6. "x-kubernetes-patch-merge-key": "name",
    7. "x-kubernetes-patch-strategy": "merge"
    8. },

    你可以在 Kubernetes API 文档 中看到 patch 策略。