首页 > 解决方案 > 如何使用 kubectl Patch 命令删除 Deployment volumeMounts 中的元素?

问题描述

我有这样的部署:

apiVersion: apps/v1
kind: Deployment
spec:
  template:
    volumeMounts:
      - mountPath: /home
        name: john-webos-vol
        subPath: home
      - mountPath: /pkg
        name: john-vol
        readOnly: true
        subPath: school

我想用命令改变 Deloyment ,kubectl patch所以它有以下内容:volumeMountsPodTemplate

目标.yaml:

apiVersion: apps/v1
kind: Deployment
spec:
  template:
    volumeMounts:
      - mountPath: /home
        name: john-webos-vol
        subPath: home

我使用了下面的命令,但是没有用。

kubectl patch deployment sample --patch "$(cat target.yaml)"

谁能给我一些建议?

标签: kubernetes

解决方案


你不能用kubectl patch. 您在问题中所做的补丁称为strategic merge patch. 补丁不能替换东西,而这个补丁只能添加东西。

就像如果你最初有一个containerpodspec但你需要添加另一个container。您可以使用patch此处添加另一个container. 但是如果你有两个container并且需要删除一个,你不能用这种补丁来做到这一点。

如果你想这样做,patch你需要使用retainKeys. 参考

让我解释一下如何以另一种简单的方式做到这一点。假设您已在 test.yaml 下应用 kubectl apply -f test.yaml

测试.yaml

apiVersion: apps/v1
kind: Deployment
metadata: 
  name: test
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /home
          name: john-webos-vol
          subPath: home
        - mountPath: /pkg
          name: john-vol
          readOnly: true
          subPath: school
      volumes:
      - name: john-webos-vol
        emptyDir: {}
      - name: john-vol
        emptyDir: {}

现在你需要更新这个。并且更新的一个target.yaml将删除一个 volume 。

目标.yaml

apiVersion: apps/v1
kind: Deployment
metadata: 
  name: test
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /pkg
          name: john-vol
          readOnly: true
          subPath: school
      volumes:
      - name: john-vol
        emptyDir: {}

你可以使用:

 kubectl apply -f target.yaml

这将使用新配置更新您的部署


推荐阅读