Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@DzeryCZ
Last active April 22, 2024 16:09
Show Gist options
  • Star 75 You must be signed in to star a gist
  • Fork 7 You must be signed in to fork a gist
  • Save DzeryCZ/c4adf39d4a1a99ae6e594a183628eaee to your computer and use it in GitHub Desktop.
Save DzeryCZ/c4adf39d4a1a99ae6e594a183628eaee to your computer and use it in GitHub Desktop.
Decoding Helm3 resources in secrets

Helm 3 is storing description of it's releases in secrets. You can simply find them via

$ kubectl get secrets
NAME                                                TYPE                                  DATA   AGE
sh.helm.release.v1.wordpress.v1                     helm.sh/release.v1                    1      1h

If you want to get more info about the secret, you can try to describe the secret

$ kubectl describe secret sh.helm.release.v1.wordpress.v1
Name:         sh.helm.release.v1.wordpress.v1
Namespace:    default
Labels:       createdAt=1578561400
              name=wordpress
              owner=helm
              status=superseded
              version=1
Annotations:  <none>

Type:  helm.sh/release.v1

Data
====
release:  34976 bytes

Now you can see, that the secret is holding one file release which has ~35kB. In order to read that, you need to know, that kubernetes secrets are base64 encoded by default. But after decoding, you still don't get the data because Helm3 is encoding those data further.

So in order to decode the data, you have to:

  • base64 decode - Kubernetes secrets encoding
  • base64 decode (again) - Helm encoding
  • gzip decompress - Helm zipping

The final command to get the Helm's release data can look like this:

kubectl get secrets sh.helm.release.v1.wordpress.v1 -o json | jq .data.release | tr -d '"' | base64 -d | base64 -d | gzip -d 

Voilà, now you have JSON data of Helm resources. It stores every Chart's file and further encode it via base64.

@smilelikeshit
Copy link

thx

@wind57
Copy link

wind57 commented Oct 26, 2021

marvelous! I come to this page like once a month for that command. kudos

@AlessioCasco
Copy link

Just wanted to also add the command needed in case a secret requires to be edited like in situations where the deployment is stuck with status pending-upgrade and can't be rolled back.

Considering that myapp.v1.edited.json has the decoded and edited content of .data.release from the commands above:

gzip -c myapp.v1.edited.json | base64 | base64 -w 0

goes here

    "data": {
        "release": " <<output goes here>> "

@gonzofish
Copy link

Thanks, this was really helpful!

@4c74356b41
Copy link

okay, but how is this different to helm get all %release_name%?

@kappa8219
Copy link

From secrets you can get previous releases stuff. "get all" shows only current installed.

Anyway there are more user friendly ways to get it. I can advise helm dashboard plugin.

@pc-tzimmerman
Copy link

Awesome!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment