Tengo una implementación como esta:
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 Quiero cambiar la Deloyment con el comando de kubectl patch , por lo que tiene los siguientes montajes de volumen en el volumeMounts en PodTemplate lugar:
objetivo.yaml:
apiVersion: apps/v1 kind: Deployment spec: template: volumeMounts: - mountPath: /home name: john-webos-vol subPath: homeUsé el siguiente comando, pero no funcionó.
kubectl patch deployment sample --patch "$(cat target.yaml)"¿Alguien puede darme algún consejo?
no puedes hacer esto con kubectl patch . El parche que hiciste en tu problema se llama strategic merge patch . el parche no puede reemplazar cosas, en cambio con este parche solo puedes agregar cosas.
como si inicialmente tiene un container en su podspec pero necesita agregar otro container . puede usar el patch aquí para agregar otro container . pero si tiene dos container y necesita eliminar uno, no puede hacerlo con este tipo de parche.
si desea esto con el patch , debe usar retainKeys . Árbitro
déjame explicarte cómo puedes hacer esto de otra manera simple. supongamos que ha aplicado a continuación test.yaml con kubectl apply -f test.yaml
prueba.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: {}ahora necesitas actualizar este. y el target.yaml actualizado eliminará uno de volumen.
objetivo.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: {}solo puedes usar:
kubectl apply -f target.yamleste actualizará su implementación con una nueva configuración
Puede usar el parche JSON http://jsonpatch.com/
kubectl patch deployment <NAME> --type json -p='[{"op": "remove", "path": "/spec/template/spec/containers/0/volumeMounts/0"}]' kubectl patch deployment <NAME> --type json -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/volumeMounts", "value": [{"mountPath": "/home", "name": "john-webos-vol", "subPath": "home"}]}]'Hoja de referencia de Kubectl para obtener más información: https://kubernetes.io/docs/reference/kubectl/cheatsheet/#patching-resources
Puede aprovechar el comando de aplicación , obteniendo la definición de implementación en formato JSON, modificando (en su caso eliminando) esta sección
- mountPath: /pkg name: john-vol readOnly: true subPath: schoolcon sed o una utilidad similar y luego volver a aplicarla:
kubectl get deployment <myDeployment> -n <myNamespace> | sed -z -s -E -b -e 's/REGEX_TO_MATCH_PART_OF_DEPLOYMENT_TO_REMOVE//g' | kubectl apply -f -