Helm diff using a plugin

3 min read

Just as with kubectl diff, there's a helm plugin that helm us to the the actual differences that it will apply to the kubernetes cluster without much of the clutter that we will find by combining kubectl diff with the yaml output of a helm dry-run

We can find this plugin on github: https://github.com/databus23/helm-diff

By using the Helm plugin manager (> 2.3.x), installation is as simple as this:

helm plugin install https://github.com/databus23/helm-diff

Once we have it, by just adding diff before the upgrade command we will get all the yaml files with it's differences, for example:

$ helm diff upgrade pet2cattle -f pet2cattle_values.yaml .
kube-system, pet2cattle, Deployment (apps) has changed:
  # Source: pet2cattle/templates/00-webapp.yaml
  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: pet2cattle
    labels:
      helm.sh/chart: pet2cattle-2
      app.kubernetes.io/name: pet2cattle
      app.kubernetes.io/instance: pet2cattle
-     app.kubernetes.io/version: "3.11"
+     app.kubernetes.io/version: "3.12"
      app.kubernetes.io/managed-by: Helm
  spec:
    replicas: 1
    selector:
      matchLabels:
        app.kubernetes.io/name: pet2cattle
        app.kubernetes.io/instance: pet2cattle
    template:
      metadata:
        labels:
          app.kubernetes.io/name: pet2cattle
          app.kubernetes.io/instance: pet2cattle
      spec:
        securityContext:
          {}
        containers:
          - name: pet2cattle
            securityContext:
              {}
-           image: "172.18.1.46:5000/p2c:3.11"
+           image: "172.18.1.46:5000/p2c:3.12"
            imagePullPolicy: IfNotPresent
            env:
              - name: MINIO_URL
                value: "http://pet2cattle-minio.kube-system.svc.cluster.local:9000"
              - name: MINIO_BUCKET
                value: "pet2cattle"
              - name: MINIO_ACCESS_KEY
                valueFrom:
                  secretKeyRef:
                    name: pet2cattle-minio
                    key: accesskey
              - name: MINIO_SECRET_KEY
                valueFrom:
                  secretKeyRef:
                    name: pet2cattle-minio
                    key: secretkey
            ports:
              - name: http
                containerPort: 8000
                protocol: TCP
            livenessProbe:
              httpGet:
                path: /
                port: http
            readinessProbe:
              httpGet:
                path: /
                port: http
            resources:
              {}
kube-system, pet2cattle, Service (v1) has changed:
  # Source: pet2cattle/templates/10-websvc.yaml
(...)

If you are already familiar with the yaml files it might be too many data so we can also limit the amount of context it provides by using the -C option:

$ helm diff -C 3 upgrade pet2cattle -f pet2cattle_values.yaml .
kube-system, pet2cattle, Deployment (apps) has changed:
...
      helm.sh/chart: pet2cattle-2
      app.kubernetes.io/name: pet2cattle
      app.kubernetes.io/instance: pet2cattle
-     app.kubernetes.io/version: "3.11"
+     app.kubernetes.io/version: "3.12"
      app.kubernetes.io/managed-by: Helm
  spec:
    replicas: 1
...
          - name: pet2cattle
            securityContext:
              {}
-           image: "172.18.1.46:5000/p2c:3.11"
+           image: "172.18.1.46:5000/p2c:3.12"
            imagePullPolicy: IfNotPresent
            env:
              - name: MINIO_URL
...
kube-system, pet2cattle, Service (v1) has changed:
...
      helm.sh/chart: pet2cattle-2
      app.kubernetes.io/name: pet2cattle
      app.kubernetes.io/instance: pet2cattle
-     app.kubernetes.io/version: "3.11"
+     app.kubernetes.io/version: "3.12"
      app.kubernetes.io/managed-by: Helm
  spec:
    type: ClusterIP
...
(...)

Posted on 15/01/2021

Categories