简体   繁体   中英

How to leverage kubectl patch deployment to update an environment variable?

I'm trying to patch a deployment, but I keep hitting deployment.extensions/velero not patched.

I've tried a few different variations of the following:

kubectl patch deployment velero -n velero -p '{"spec":{"containers":[{"env":[{"name":"AWS_CLUSTER_NAME","value":"test-cluster"}]}]}}'

My initial deployment.yaml file

apiVersion: apps/v1
kind: Deployment
metadata:
  name: velero
  labels:
    app.kubernetes.io/name: velero
    app.kubernetes.io/instance: velero
    app.kubernetes.io/managed-by: Tiller
    helm.sh/chart: velero-2.1.1
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/instance: velero
      app.kubernetes.io/name: velero
  template:
    metadata:
      labels:
        app.kubernetes.io/name: velero
        app.kubernetes.io/instance: velero
        app.kubernetes.io/managed-by: Tiller
        helm.sh/chart: velero-2.1.1
    spec:
      restartPolicy: Always
      serviceAccountName: velero-server
      containers:
        - name: velero
          image: "gcr.io/heptio-images/velero:v1.0.0"
          imagePullPolicy: IfNotPresent
          command:
            - /velero
          args:
            - server
          volumeMounts:
            - name: plugins
              mountPath: /plugins
            - name: cloud-credentials
              mountPath: /credentials
            - name: scratch
              mountPath: /scratch
          env:
            - name: AWS_SHARED_CREDENTIALS_FILE
              value: /credentials/cloud
            - name: VELERO_SCRATCH_DIR
              value: /scratch
      volumes:
        - name: cloud-credentials
          secret:
            secretName: cloud-credentials
        - name: plugins
          emptyDir: {}
        - name: scratch
          emptyDir: {}

I'm a bit stuck right now and fear I may be going about this the wrong way. Any suggestions would be much appreciated.

Apart from kubectl patch command, you can also make use of kubectl set env to update environment variable of k8s deployment.

kubectl set env deployment/velero AWS_CLUSTER_NAME=test-cluster

Hope this helps.

As you are patching the deployment, the JSON for patch in your command is not accurate. You may want to try the following:

kubectl patch deployment velero -p '{"spec":{"template":{"spec":{"containers":[{"env":[{"name":"AWS_CLUSTER_NAME","value":"test-cluster"}]}]}}}}'

You have deployed your velera deployment in default namespace and you are trying to patch in velera namespace.

Moreover, your patch string is not valid. Try the following one:

$ kubectl patch deployment velero -p '{"spec":{"template":{"spec":{"containers":[{"env":[{"name":"AWS_CLUSTER_NAME","value":"test-cluster"}],"name":"velero"}]}}}}'
deployment.extensions/velero patched

Note: My client and server versions are:

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.3", GitCommit:"2d3c76f9091b6bec110a5e63777c332469e0cba2", GitTreeState:"clean", BuildDate:"2019-08-19T11:13:54Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.2", GitCommit:"f6278300bebbb750328ac16ee6dd3aa7d3549568", GitTreeState:"clean", BuildDate:"2019-08-05T09:15:22Z", GoVersion:"go1.12.5", Compiler:"gc", Platform:"linux/amd64"}

There is also another option to change value in existing deployment except patch .

You can also execute edit command and add/edit value in YAML format. Then you have to save it.

$ kubectl edit deployment velero -o yaml

Or if you don't like vi you can do it in nano

$ KUBE_EDITOR="nano" kubectl edit deployment/velero

Select your container based on its name and update its one of the environment varaible

kubectl patch deployment deployment-name -p '{"spec":{"template":{"spec":{"containers":[{"name":"container_name","env":[{"name":"KEY","value":"NEW_VAL"}]}]}}}}'

With bash variable

export NEW_VAL=XXX
kubectl patch deployment deployment-name -p '{"spec":{"template":{"spec":{"containers":[{"name":"container_name","env":[{"name":"KEY","value":"'${NEW_VAL}'"}]}]}}}}'

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM