使用 patch_namespaced_deployment 从部署中删除卷不工作

Remove volume from deployment using patch_namespaced_deployment not working

我正在尝试使用带有以下参数的 patch_namespaced_deployment (https://github.com/kubernetes-client/python) 修补部署并删除其卷,但它不起作用。

patch_namespaced_deployment(
            name=deployment_name,
            namespace='default',
            body={"spec": {"template": {
                "spec": {"volumes": None,
                "containers": [{'name': container_name, 'volumeMounts': None}]
                }
            }
            }
            },
            pretty='true'
        )

如何复制:

创建此文件app.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myclaim
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  annotations:
    pv.kubernetes.io/bound-by-controller: "yes"
  finalizers:
  - kubernetes.io/pv-protection
  labels:
    volume: pv0001
  name: pv0001
  resourceVersion: "227035"
  selfLink: /api/v1/persistentvolumes/pv0001
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 5Gi
  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: myclaim
    namespace: default
    resourceVersion: "227033"
  hostPath:
    path: /mnt/pv-data/pv0001
    type: ""
  persistentVolumeReclaimPolicy: Recycle
  volumeMode: Filesystem
status:
  phase: Bound
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pv-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mypv
  template:
    metadata:
      labels:
        app: mypv
    spec:
      containers:
      - name: shell
        image: centos:7
        command:
        - "bin/bash"
        - "-c"
        - "sleep 10000"
        volumeMounts:
        - name: mypd
          mountPath: "/tmp/persistent"
      volumes:
      - name: mypd
        persistentVolumeClaim:
          claimName: myclaim
- kubectl apply -f app.yaml

- kubectl describe deployment.apps/pv-deploy (to check the volumeMounts and Volumes)

- kubectl patch deployment.apps/pv-deploy --patch '{"spec": {"template": {"spec": {"volumes": null, "containers": [{"name": "shell", "volumeMounts": null}]}}}}'

- kubectl describe deployment.apps/pv-deploy (to check the volumeMounts and Volumes)

- Delete the application now: kubectl delete -f app.yaml

- kubectl create -f app.yaml

- Patch the deployment using the python library function as stated above. The *VolumeMounts* section is removed but the Volumes still exist.

** 编辑 ** 运行 kubectl patch 命令按预期工作。但 在执行 Python 脚本和 运行 一个 describe deployment 命令后,persistentVolumeClaim 被替换为像这样的 emptyDir

  Volumes:
   mypd:
    Type:       EmptyDir (a temporary directory that shares a pod's lifetime)
    Medium:     
    SizeLimit:  <unset>

您正在尝试做的是所谓的战略合并补丁 (https://kubernetes.io/docs/tasks/manage-kubernetes-objects/update-api-object-kubectl-patch/)。正如您在文档中看到的那样,使用战略性合并补丁,列表会根据其补丁策略被替换或合并,所以这可能就是您看到此行为的原因。

我认为您应该使用 replace https://jamesdefabia.github.io/docs/user-guide/kubectl/kubectl_replace/ 而不是尝试管理部署对象的一部分,而是用新的替换它。