Helm upgrade --install isn't picking up new changes

11/23/2018

I'm using the command below in my build CI such that the deployments to helm happen on each build. However, I'm noticing that the changes aren't being deployed.

              helm upgrade --install --force \
              --namespace=default \
              --values=kubernetes/values.yaml \
              --set image.tag=latest \
              --set service.name=my-service \
              --set image.pullPolicy=Always \
              myService kubernetes/myservice

Do I need to tag the image each time? Does helm not do the install if the same version exists?

-- Anthony
kubernetes-helm

4 Answers

11/23/2018

Yes, you need to tag each build rather than use 'latest'. Helm does a diff between the template evaluated from your parameters and the currently deployed one. Since both are 'latest' it sees no change and doesn't apply any upgrade (unless something else changed). This is why the helm best practices guide advises that "container image should use a fixed tag or the SHA of the image". (See also https://docs.helm.sh/chart_best_practices/ and Helm upgrade doesn't pull new container )

-- Ryan Dawson
Source: StackOverflow

5/3/2019

You don't have to tag the image each time with a new tag. Just add date: "{{ .Release.Time.Seconds }}" under template/metadata/labels and set imagePullPolicy: Always. Helm will detect the changes in the deployment object and will pull the latest image each time:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: "{{ .Release.Name }}-{{ .Values.app.frontendName }}-deployment"
  labels:
    app.kubernetes.io/name: {{ .Values.app.frontendName }}
    app.kubernetes.io/instance: {{ .Release.Name }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app.kubernetes.io/name: {{ .Values.app.frontendName }}
      app.kubernetes.io/instance: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app.kubernetes.io/name: {{ .Values.app.frontendName }}
        app.kubernetes.io/instance: {{ .Release.Name }}
        date: "{{ .Release.Time.Seconds }}"
    spec:
      containers:
        - name: {{ .Values.app.frontendName }}
          image: "rajesh12/myimage:latest"
          imagePullPolicy: Always

Run helm upgrade releaseName ./my-chart to upgrade your release

-- Rajesh Gupta
Source: StackOverflow

1/22/2020

With helm 3, the --recreate-pods flag is deprecated. Instead you can use

kind: Deployment
spec:
  template:
    metadata:
      annotations:
        rollme: {{ randAlphaNum 5 | quote }}

This will create a random string annotation, that always changes and causes the deployment to roll. Helm - AUTOMATICALLY ROLL DEPLOYMENTS

-- pan
Source: StackOverflow

12/20/2019

Another label, perhaps more robust than the seconds you can add is simply the chart revision number:

...
metadata:
  ...
  labels:
    helm-revision: "{{ .Release.Revision }}"
...
-- QuantumLicht
Source: StackOverflow