Execute temporary treatments with Helm
Tags: kubernetes, devops, sre
Published: 2023-02-27 15:12:00

When we deploy an helm chart, it's possible that we want to do some actions before and/or after. We think about using `Jobs`, but they are not the best because we can't configure easily when to execute them or about their auto deletion *(cf https://dev.to/mxglt/automatically-delete-a-job-in-kubernetes-21oc)*.

So, if you are using **Helm**, we will see how to do it with **Hooks**.

## What are hooks?
> Hooks are mecanism which allows to execute some treatments at particular moments of the helm life cycle.

To define these treatments, we will add some annotations to a Kubernetes `Job` to define 3 things: 
- **Moment where the job should be executed**
- **its priority** *(if multiple jobs are started with the same hook)*
- **How to delete it**

### Moment where the job should be executed
With the annotation `helm.sh/hook`, we can define moments where the job should be executed.

Currently, available values are : 
- `pre-install` :   Executes after templates are rendered, but before any resources are created in Kubernetes *(Not executed in an upgrade)*
- `post-install` : Executes after all resources are loaded into Kubernetes  *(Not executed in an upgrade)*
- `pre-delete` : Executes on a deletion request before any resources are deleted from Kubernetes
- `post-delete` : Executes on a deletion request after all of the release's resources have been deleted
- `pre-upgrade` :  Executes on an upgrade request after templates are rendered, but before any resources are updated *(Not executed in an install)*
- `post-upgrade` : Executes on an upgrade request after all resources have been upgraded *(Not executed in an install)*
- `pre-rollback` : Executes on a rollback request after templates are rendered, but before any resources are rolled back
- `post-rollback` :  Executes on a rollback request after all resources have been modified
- `test` : Executes when the Helm test subcommand is invoked

With all these possibilities, it becomes easier to :
- install CRDs before to install an operator
- execute script to clean something after a deletion
- have some script to move between two versions

*Example*
```yaml
annotations:
	"helm.sh/hook": post-install,post-upgrade
```

### Its priority
To define the priority of a job, we must use the annotation `helm.sh/hook-weight`. 

Its value must be a number declared as a string. This number can be positive or negative.

*Example*

```yaml
annotations:
	"helm.sh/hook-weight": "-5"
```

### How to delete it
After the end of a job, we want to be able to manage how it should be deleted. Helm gives us the possibility to configure it with the annotation `helm.sh/hook-ddelete-policy`.

3 values are available :
- `before-hook-creation` : Delete the previous instance of the job before anotherhook started *(default)*
- `hook-succeeded` : Delete the job if the hook was successful
- `hook-failed` : Delete the job if the hook fails

*Example*
```yaml
annotations:
	"helm.sh/hook-delete-policy": hook-succeeded
```

---

In conclusion, we saw that Helm gives us a little bit more dynamism which is really helpful to have a complete automated flow for an application.


---

## Links
- https://helm.sh/docs/topics/charts_hooks/

---

I hope it will help you! 🍺

---

<center><h3>You want to support me?</h3></center>
<a href="https://www.buymeacoffee.com/mxguilbert7" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/default-orange.png" alt="Buy Me A Coffee" height="41" width="174"></a>