trahloff
trahloff

Reputation: 657

Helm upgrade doesn't pull new container

I Build a simple NodeJS API, pushed the Docker Image to a repo and deployed it to my k8s with Helm install (works perfectly fine).

The pullPolicy is Always.

Now I want to update the source code and deploy the updated version of my app. I bumped the version in all files, built and pushed the new Docker image und tried helm upgrade but it seems like nothing happened. With helm list I can see that revision was deployed but the changes to source code were not deployed. watch kubectl get pods also shows that no new pods were created the way you expect it with kubectl --apply...

What did I do wrong?

Upvotes: 32

Views: 25529

Answers (4)

Sean Lynch
Sean Lynch

Reputation: 2983

It's worth noting that there's nothing special about the 'latest' tag. In other words it doesn't mean what we would normally think, i.e. "the most recent version".

It's just string of characters from a container standpoint. It could be anything, like "blahblah".

The runtime (docker or kubernetes) will just look to see if it has an image with that tag and only get the new image if that tag doesn't exist.

Given that "latest" doesn't actually mean anything, best practice if you want to be updating images constantly, is to use the actual version of the code itself as an image tag. And then when deploying, have your infrastructure specifically deploy the newest version using the correct tag.

Upvotes: 5

Mohammad Ravanbakhsh
Mohammad Ravanbakhsh

Reputation: 3046

Possible workaround:

 spec:
  template:
    metadata:
      labels:
        date: "{{ now | unixEpoch }}"

Add it to your Deployment or StatefulSet yaml

Upvotes: 17

Amol Ghotankar
Amol Ghotankar

Reputation: 2094

The way I solved this in the deployment script in .gitlab.yaml, you can do similar in any of your deployment scripts.

export SAME_SHA=$(helm get values service-name | grep SHA | wc -l)

if [ SAME_SHA -eq 1] then helm uninstall service-name; fi

helm upgrade --install service-name -f service-values.yml .

This may not be the best approach for production as you may end up uninstall a live service, but for me, production sha are never the same so this works.

Upvotes: 1

Helm will roll out changes to kubernetes objects only if there are changes to roll out. If you use :latest there is no change to be applied to the deployment file, ergo no pods will rolling update. To keep using latest, you need to add something (ie. label with sha / version) that will change and cause deployment to get updated by helm. Also keep in mind that you will usualy need ImagePullPolicy: Always as well.

Upvotes: 50

Related Questions