Hannan Rhodes
Hannan Rhodes

Reputation: 143

Kubectl apply does not update pods or deployments

I'm using a CI to update my kubernetes cluster whenever there's an update to an image. Whenever the image is pushed and has the latest tag it kubectl apply's the existing deployment but nothing gets updated.

this is what runs $ kubectl apply --record --filename /tmp/deployment.yaml

My goal is when the apply is ran that a rolling deployment gets executed.

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
    name: api
spec:
    replicas: 1
    template:
    metadata:
        labels:
        app: api
    spec:
        containers:
        - name: api
        image: us.gcr.io/joule-eed41/api:latest
        imagePullPolicy: Always
        ports:
            - containerPort: 1337
        args:
            - /bin/sh
            - -c
            - echo running api;npm start
        env:        
        - name: NAMESPACE
            valueFrom:
            configMapKeyRef:
                name: config
                key: NAMESPACE

Upvotes: 5

Views: 14532

Answers (3)

Andrew
Andrew

Reputation: 1084

I've run into the same problem and none of the solutions posted so far will help. The solution is easy, but not easy to see or predict. The applied yaml will generate both a deployment and a replicaset the first time it's run. Unfortunately, applying changes to the manifest likely only replaces the replicaset, while the deployment will remain unchanged. This is a problem because some changes need to happen at the deployment level, but the old deployment hangs around. To have best results, delete the deployment and ensure all previous deployments and replicasets are deleted. Then apply the updated manifest.

Upvotes: 0

Rotem jackoby
Rotem jackoby

Reputation: 22198

As @ksholla20 mentionedm using kubectl set image is a good option for many (most?) cases.

But if you can't change the image tag consider using:

1 ) kubectl rollout restart deployment/<name> (reference).

2 ) kubectl patch deployment <name> -p "{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"version\":\"$CURRENT_BUILD_HASH_OR_DATE\"}}}}}}" (reference)

(*) Notice that the patch command allow you to change specific properties in the deployment (or any other object chosen) like the label selector and the pod label or other properties like the value of the NAMESPACE environment variable in your example.

Upvotes: 2

ksholla20
ksholla20

Reputation: 168

As others suggested, have a specific tag. Set new image using following command

kubectl set image deployment/deployment_name deployment_name=image_name:image_tag

In your case it would be

kubectl set image deployment/api api=us.gcr.io/joule-eed41/api:0.1

Upvotes: 1

Related Questions