apiVersion: apps/v1kind: Deploymentmetadata:name: patch-demospec:replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: patch-demo-ctrimage: nginxtolerations:- effect: NoSchedulekey: dedicatedvalue: test-team
创建一个名为 patch-file-containers.yaml 的文件。内容如下:
spec:template:spec:containers:- name: patch-demo-ctr-2image: redis
修补你的 Deployment:
kubectl patch deployment patch-demo --patch "$(cat patch-file-containers.yaml)"
查看修补后的 Deployment:
kubectl get deployment patch-demo --output yaml
输出显示 Deployment 中的 PodSpec 有两个容器:
containers:- image: redisimagePullPolicy: Alwaysname: patch-demo-ctr-2...- image: nginximagePullPolicy: Alwaysname: patch-demo-ctr...
请注意,patch 没有替换containers 列表。相反,它向列表中添加了一个新 Container。换句话说, patch 中的列表与现有列表合并。当你在列表中使用策略性合并 patch 时,并不总是这样。 在某些情况下,列表是替换的,而不是合并的。
对于策略性合并 patch,列表可以根据其 patch 策略进行替换或合并。 patch 策略由 Kubernetes 源代码中字段标记中的 **patchStrategy** 键的值指定。 例如,PodSpec 结构体的 Containers 字段的 patchStrategy 为 merge:
type PodSpec struct {...Containers []Container `json:"containers" patchStrategy:"merge" patchMergeKey:"name" ...`
你还可以在 OpenApi spec 规范中看到 patch 策略:
"io.k8s.api.core.v1.PodSpec": {..."containers": {"description": "List of containers belonging to the pod. ...},"x-kubernetes-patch-merge-key": "name","x-kubernetes-patch-strategy": "merge"},
你可以在 Kubernetes API 文档 中看到 patch 策略。
