blob: 610a521fcccd4d248214171b4f64f33ad2d9f329 [file] [log] [blame] [view]
Giorgi Lekveishvili4ec4c022024-08-17 15:09:24 +04001# pihole
2
3Installs pihole in kubernetes
4
5![Version: 2.9.3](https://img.shields.io/badge/Version-2.9.3-informational?style=flat-square) ![AppVersion: 2022.09.1](https://img.shields.io/badge/AppVersion-2022.09.1-informational?style=flat-square) <!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
6[![All Contributors](https://img.shields.io/badge/all_contributors-27-blue.svg?style=flat-square)](#contributors-)
7<!-- ALL-CONTRIBUTORS-BADGE:END -->
8
9## Source Code
10
11* <https://github.com/MoJo2600/pihole-kubernetes/tree/master/charts/pihole>
12* <https://pi-hole.net/>
13* <https://github.com/pi-hole>
14* <https://github.com/pi-hole/docker-pi-hole>
15
16## Installation
17
18Jeff Geerling on YouTube made a video about the installation of this chart:
19
20[![Jeff Geerling on YouTube](https://img.youtube.com/vi/IafVCHkJbtI/0.jpg)](https://youtu.be/IafVCHkJbtI?t=2655)
21
22### Add Helm repository
23
24```shell
25helm repo add mojo2600 https://mojo2600.github.io/pihole-kubernetes/
26helm repo update
27```
28
29### Configure the chart
30
31The following items can be set via `--set` flag during installation or configured by editing the `values.yaml` directly.
32
33#### Configure the way how to expose pihole service:
34
35- **Ingress**: The ingress controller must be installed in the Kubernetes cluster.
36- **ClusterIP**: Exposes the service on a cluster-internal IP. Choosing this value makes the service only reachable from within the cluster.
37- **LoadBalancer**: Exposes the service externally using a cloud provider’s load balancer.
38
39## My settings in values.yaml
40
41```console
42dnsmasq:
43 customDnsEntries:
44 - address=/nas/192.168.178.10
45
46 customCnameEntries:
47 - cname=foo.nas,nas
48
49persistentVolumeClaim:
50 enabled: true
51
52serviceWeb:
53 loadBalancerIP: 192.168.178.252
54 annotations:
55 metallb.universe.tf/allow-shared-ip: pihole-svc
56 type: LoadBalancer
57
58serviceDns:
59 loadBalancerIP: 192.168.178.252
60 annotations:
61 metallb.universe.tf/allow-shared-ip: pihole-svc
62 type: LoadBalancer
63```
64
65## Configuring Upstream DNS Resolvers
66
67By default, `pihole-kubernetes` will configure pod DNS automatically to use Google's `8.8.8.8` nameserver for upstream
68DNS resolution. You can configure this, or opt-out of pod DNS configuration completely.
69
70### Changing The Upstream DNS Resolver
71
72For example, to use Cloudflare's resolver:
73
74```yaml
75podDnsConfig:
76 enabled: true
77 policy: "None"
78 nameservers:
79 - 127.0.0.1
80 - 1.1.1.1
81```
82
83### Disabling Pod DNS Configuration
84
85If you have other DNS policy at play (for example, when running a service mesh), you may not want to have
86`pihole-kubernetes` control this behavior. In that case, you can disable DNS configuration on `pihole` pods:
87
88```yaml
89podDnsConfig:
90 enabled: false
91```
92
93## Upgrading
94
95### To 2.0.0
96
97This version splits the DHCP service into its own resource and puts the configuration to `serviceDhcp`.
98
99**If you have not changed any configuration for `serviceDns`, you don’t need to do anything.**
100
101If you have changed your `serviceDns` configuration, **copy** your `serviceDns` section into a new `serviceDhcp` section.
102
103### To 1.8.22
104
105To enhance compatibility for Traefik, we split the TCP and UDP service into Web and DNS. This means, if you have a dedicated configuration for the service, you have to
106update your `values.yaml` and add a new configuration for this new service.
107
108Before (In my case, with metallb):
109```
110serviceTCP:
111 loadBalancerIP: 192.168.178.252
112 annotations:
113 metallb.universe.tf/allow-shared-ip: pihole-svc
114
115serviceUDP:
116 loadBalancerIP: 192.168.178.252
117 annotations:
118 metallb.universe.tf/allow-shared-ip: pihole-svc
119```
120
121After:
122```
123serviceWeb:
124 loadBalancerIP: 192.168.178.252
125 annotations:
126 metallb.universe.tf/allow-shared-ip: pihole-svc
127
128serviceDns:
129 loadBalancerIP: 192.168.178.252
130 annotations:
131 metallb.universe.tf/allow-shared-ip: pihole-svc
132```
133
134Version 1.8.22 has switched from the deprecated ingress api `extensions/v1beta1` to the go forward version `networking.k8s.io/v1`. This means that your cluster must be running 1.19.x as this api is not available on older versions. If necessary to run on an older Kubernetes Version, it can be done by modifying the ingress.yaml and changing the api definition back. The backend definition would also change from:
135
136```
137 backend:
138 service:
139 name: \{\{ $serviceName \}\}
140 port:
141 name: http
142```
143to:
144```
145 backend:
146 serviceName: \{\{ $serviceName \}\}
147 servicePort: http
148```
149
150## Uninstallation
151
152To uninstall/delete the `my-release` deployment (NOTE: `--purge` is default behaviour in Helm 3+ and will error):
153
154```bash
155helm delete --purge my-release
156```
157
158## Configuration
159
160The following table lists the configurable parameters of the pihole chart and the default values.
161
162## Values
163
164| Key | Type | Default | Description |
165|-----|------|---------|-------------|
166| DNS1 | string | `"8.8.8.8"` | default upstream DNS 1 server to use |
167| DNS2 | string | `"8.8.4.4"` | default upstream DNS 2 server to use |
168| adlists | object | `{}` | list of adlists to import during initial start of the container |
169| admin | object | `{"existingSecret":"","passwordKey":"password"}` | Use an existing secret for the admin password. |
170| admin.enabled | bool | `true` | If set to false admin password will be disabled, adminPassword specified above and the pre-existing secret (if specified) will be ignored. |
171| admin.existingSecret | string | `""` | Specify an existing secret to use as admin password |
172| admin.passwordKey | string | `"password"` | Specify the key inside the secret to use |
173| adminPassword | string | `"admin"` | Administrator password when not using an existing secret (see below) |
174| affinity | object | `{}` | |
175| antiaff.avoidRelease | string | `"pihole1"` | Here you can set the pihole release (you set in `helm install <releasename> ...`) you want to avoid |
176| antiaff.enabled | bool | `false` | set to true to enable antiaffinity (example: 2 pihole DNS in the same cluster) |
177| antiaff.strict | bool | `true` | Here you can choose between preferred or required |
178| antiaff.namespaces | '[]' | list of namespaces to include in anti-affinity settings
179| blacklist | object | `{}` | list of blacklisted domains to import during initial start of the container |
180| customVolumes.config | object | `{}` | any volume type can be used here |
181| customVolumes.enabled | bool | `false` | set this to true to enable custom volumes |
182| dnsHostPort.enabled | bool | `false` | set this to true to enable dnsHostPort |
183| dnsHostPort.port | int | `53` | default port for this pod |
184| dnsmasq.additionalHostsEntries | list | `[]` | Dnsmasq reads the /etc/hosts file to resolve ips. You can add additional entries if you like |
185| dnsmasq.customCnameEntries | list | `[]` | Here we specify custom cname entries that should point to `A` records or elements in customDnsEntries array. The format should be: - cname=cname.foo.bar,foo.bar - cname=cname.bar.foo,bar.foo - cname=cname record,dns record |
186| dnsmasq.customDnsEntries | list | `[]` | Add custom dns entries to override the dns resolution. All lines will be added to the pihole dnsmasq configuration. |
187| dnsmasq.customSettings | string | `nil` | Other options |
188| dnsmasq.staticDhcpEntries | list | `[]` | Static DHCP config |
189| dnsmasq.upstreamServers | list | `[]` | Add upstream dns servers. All lines will be added to the pihole dnsmasq configuration |
190| doh.enabled | bool | `false` | set to true to enabled DNS over HTTPs via cloudflared |
191| doh.envVars | object | `{}` | Here you can pass environment variables to the DoH container, for example: |
192| doh.name | string | `"cloudflared"` | |
193| doh.probes | object | `{"liveness":{"enabled":true,"failureThreshold":10,"initialDelaySeconds":60,"probe":{"exec":{"command":["nslookup","-po=5053","cloudflare.com","127.0.0.1"]}},"timeoutSeconds":5}}` | Probes configuration |
194| doh.probes.liveness | object | `{"enabled":true,"failureThreshold":10,"initialDelaySeconds":60,"probe":{"exec":{"command":["nslookup","-po=5053","cloudflare.com","127.0.0.1"]}},"timeoutSeconds":5}` | Configure the healthcheck for the doh container |
195| doh.probes.liveness.enabled | bool | `true` | set to true to enable liveness probe |
196| doh.probes.liveness.failureThreshold | int | `10` | defines the failure threshold for the liveness probe |
197| doh.probes.liveness.initialDelaySeconds | int | `60` | defines the initial delay for the liveness probe |
198| doh.probes.liveness.probe | object | `{"exec":{"command":["nslookup","-po=5053","cloudflare.com","127.0.0.1"]}}` | customize the liveness probe |
199| doh.probes.liveness.timeoutSeconds | int | `5` | defines the timeout in secondes for the liveness probe |
200| doh.pullPolicy | string | `"IfNotPresent"` | |
201| doh.repository | string | `"crazymax/cloudflared"` | |
202| doh.tag | string | `"latest"` | |
203| dualStack.enabled | bool | `false` | set this to true to enable creation of DualStack services or creation of separate IPv6 services if `serviceDns.type` is set to `"LoadBalancer"` |
204| extraEnvVars | object | `{}` | extraEnvironmentVars is a list of extra enviroment variables to set for pihole to use |
205| extraEnvVarsSecret | object | `{}` | extraEnvVarsSecret is a list of secrets to load in as environment variables. |
206| extraInitContainers | list | `[]` | any initContainers you might want to run before starting pihole |
207| extraObjects | list | `[]` | any extra kubernetes manifests you might want |
208| extraVolumeMounts | object | `{}` | any extra volume mounts you might want |
209| extraVolumes | object | `{}` | any extra volumes you might want |
210| ftl | object | `{}` | values that should be added to pihole-FTL.conf |
211| hostNetwork | string | `"false"` | should the container use host network |
212| hostname | string | `""` | hostname of pod |
213| image.pullPolicy | string | `"IfNotPresent"` | the pull policy |
214| image.repository | string | `"pihole/pihole"` | the repostory to pull the image from |
215| image.tag | string | `""` | the docker tag, if left empty it will get it from the chart's appVersion |
216| ingress | object | `{"annotations":{},"enabled":false,"hosts":["chart-example.local"],"path":"/","tls":[]}` | Configuration for the Ingress |
217| ingress.annotations | object | `{}` | Annotations for the ingress |
218| ingress.enabled | bool | `false` | Generate a Ingress resource |
219| maxSurge | int | `1` | The maximum number of Pods that can be created over the desired number of `ReplicaSet` during updating. |
220| maxUnavailable | int | `1` | The maximum number of Pods that can be unavailable during updating |
221| monitoring.podMonitor | object | `{"enabled":false}` | Preferably adding prometheus scrape annotations rather than enabling podMonitor. |
222| monitoring.podMonitor.enabled | bool | `false` | set this to true to enable podMonitor |
223| monitoring.sidecar | object | `{"enabled":false,"image":{"pullPolicy":"IfNotPresent","repository":"ekofr/pihole-exporter","tag":"v0.3.0"},"port":9617,"resources":{"limits":{"memory":"128Mi"}}}` | Sidecar configuration |
224| monitoring.sidecar.enabled | bool | `false` | set this to true to enable podMonitor as sidecar |
225| nodeSelector | object | `{}` | |
226| persistentVolumeClaim | object | `{"accessModes":["ReadWriteOnce"],"annotations":{},"enabled":false,"size":"500Mi"}` | `spec.PersitentVolumeClaim` configuration |
227| persistentVolumeClaim.annotations | object | `{}` | Annotations for the `PersitentVolumeClaim` |
228| persistentVolumeClaim.enabled | bool | `false` | set to true to use pvc |
229| podAnnotations | object | `{}` | Additional annotations for pods |
230| podDnsConfig.enabled | bool | `true` | |
231| podDnsConfig.nameservers[0] | string | `"127.0.0.1"` | |
232| podDnsConfig.nameservers[1] | string | `"8.8.8.8"` | |
233| podDnsConfig.policy | string | `"None"` | |
234| privileged | string | `"false"` | should container run in privileged mode |
235| capabilities | object | `{}` | Linux capabilities that container should run with |
236| probes | object | `{"liveness":{"type": "httpGet","enabled":true,"failureThreshold":10,"initialDelaySeconds":60,"port":"http","scheme":"HTTP","timeoutSeconds":5},"readiness":{"enabled":true,"failureThreshold":3,"initialDelaySeconds":60,"port":"http","scheme":"HTTP","timeoutSeconds":5}}` | Probes configuration |
237| probes.liveness.enabled | bool | `true` | Generate a liveness probe |
238| probes.liveness.type | string | `httpGet` | Defines the type of liveness probe. (httpGet, command) |
239| probes.liveness.command | list | [] | A list of commands to execute as a liveness probe (Requires `type` to be set to `command`) |
240| probes.readiness.enabled | bool | `true` | Generate a readiness probe |
241| regex | object | `{}` | list of blacklisted regex expressions to import during initial start of the container |
242| replicaCount | int | `1` | The number of replicas |
243| resources | object | `{}` | lines, adjust them as necessary, and remove the curly braces after 'resources:'. |
244| serviceDhcp | object | `{"annotations":{},"enabled":true,"externalTrafficPolicy":"Local","loadBalancerIP":"","loadBalancerIPv6":"","nodePort":"","port":67,"type":"NodePort"}` | Configuration for the DHCP service on port 67 |
245| serviceDhcp.annotations | object | `{}` | Annotations for the DHCP service |
246| serviceDhcp.enabled | bool | `true` | Generate a Service resource for DHCP traffic |
247| serviceDhcp.externalTrafficPolicy | string | `"Local"` | `spec.externalTrafficPolicy` for the DHCP Service |
248| serviceDhcp.loadBalancerIP | string | `""` | A fixed `spec.loadBalancerIP` for the DHCP Service |
249| serviceDhcp.loadBalancerIPv6 | string | `""` | A fixed `spec.loadBalancerIP` for the IPv6 DHCP Service |
250| serviceDhcp.nodePort | string | `""` | Optional node port for the DHCP service |
251| serviceDhcp.port | int | `67` | The port of the DHCP service |
252| serviceDhcp.type | string | `"NodePort"` | `spec.type` for the DHCP Service |
253| serviceDns | object | `{"annotations":{},"externalTrafficPolicy":"Local","loadBalancerIP":"","loadBalancerIPv6":"","mixedService":false,"nodePort":"","port":53,"type":"NodePort"}` | Configuration for the DNS service on port 53 |
254| serviceDns.annotations | object | `{}` | Annotations for the DNS service |
255| serviceDns.externalTrafficPolicy | string | `"Local"` | `spec.externalTrafficPolicy` for the DHCP Service |
256| serviceDns.loadBalancerIP | string | `""` | A fixed `spec.loadBalancerIP` for the DNS Service |
257| serviceDns.loadBalancerIPv6 | string | `""` | A fixed `spec.loadBalancerIP` for the IPv6 DNS Service |
258| serviceDns.mixedService | bool | `false` | deploys a mixed (TCP + UDP) Service instead of separate ones |
259| serviceDns.nodePort | string | `""` | Optional node port for the DNS service |
260| serviceDns.port | int | `53` | The port of the DNS service |
261| serviceDns.type | string | `"NodePort"` | `spec.type` for the DNS Service |
262| serviceWeb | object | `{"annotations":{},"externalTrafficPolicy":"Local","http":{"enabled":true,"nodePort":"","port":80},"https":{"enabled":true,"nodePort":"","port":443},"loadBalancerIP":"","loadBalancerIPv6":"","type":"ClusterIP"}` | Configuration for the web interface service |
263| serviceWeb.annotations | object | `{}` | Annotations for the DHCP service |
264| serviceWeb.externalTrafficPolicy | string | `"Local"` | `spec.externalTrafficPolicy` for the web interface Service |
265| serviceWeb.http | object | `{"enabled":true,"nodePort":"","port":80}` | Configuration for the HTTP web interface listener |
266| serviceWeb.http.enabled | bool | `true` | Generate a service for HTTP traffic |
267| serviceWeb.http.nodePort | string | `""` | Optional node port for the web HTTP service |
268| serviceWeb.http.port | int | `80` | The port of the web HTTP service |
269| serviceWeb.https | object | `{"enabled":true,"nodePort":"","port":443}` | Configuration for the HTTPS web interface listener |
270| serviceWeb.https.enabled | bool | `true` | Generate a service for HTTPS traffic |
271| serviceWeb.https.nodePort | string | `""` | Optional node port for the web HTTPS service |
272| serviceWeb.https.port | int | `443` | The port of the web HTTPS service |
273| serviceWeb.loadBalancerIP | string | `""` | A fixed `spec.loadBalancerIP` for the web interface Service |
274| serviceWeb.loadBalancerIPv6 | string | `""` | A fixed `spec.loadBalancerIP` for the IPv6 web interface Service |
275| serviceWeb.type | string | `"ClusterIP"` | `spec.type` for the web interface Service |
276| strategyType | string | `"RollingUpdate"` | The `spec.strategyTpye` for updates |
277| tolerations | list | `[]` | |
278| topologySpreadConstraints | list | `[]` | Specify a priorityClassName priorityClassName: "" Reference: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/ |
279| virtualHost | string | `"pi.hole"` | |
280| webHttp | string | `"80"` | port the container should use to expose HTTP traffic |
281| webHttps | string | `"443"` | port the container should use to expose HTTPS traffic |
282| whitelist | object | `{}` | list of whitelisted domains to import during initial start of the container |
283
284## Maintainers
285
286| Name | Email | Url |
287| ---- | ------ | --- |
288| MoJo2600 | <christian.erhardt@mojo2k.de> | |
289
290## Remarks
291
292### MetalLB 0.8.1+
293
294pihole seems to work without issue in MetalLB 0.8.1+
295
296### MetalLB 0.7.3
297
298MetalLB 0.7.3 has a bug, where the service is not announced anymore, when the pod changes (e.g. update of a deployment). My workaround is to restart the `metallb-speaker-*` pods.
299
300## Credits
301
302[Pi-hole®](https://pi-hole.net/)
303
304## Contributing
305
306Feel free to contribute by making a [pull request](https://github.com/MoJo2600/pihole-kubernetes/pull/new/master).
307
308Please read [Contribution Guide](../../CONTRIBUTING.md) for more information on how you can contribute to this Chart.
309
310## Contributors ✨
311
312Thanks goes to these wonderful people:
313
314<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
315<!-- prettier-ignore-start -->
316<!-- markdownlint-disable -->
317<table>
318 <tr>
319 <td align="center"><a href="http://www.mojo2k.de"><img src="https://avatars1.githubusercontent.com/u/2462817?v=4" width="100px;" alt=""/><br /><sub><b>Christian Erhardt</b></sub></a></td>
320 <td align="center"><a href="https://billimek.com/"><img src="https://avatars0.githubusercontent.com/u/6393612?v=4" width="100px;" alt=""/><br /><sub><b>Jeff Billimek</b></sub></a></td>
321 <td align="center"><a href="https://github.com/imle"><img src="https://avatars3.githubusercontent.com/u/4809109?v=4" width="100px;" alt=""/><br /><sub><b>Steven Imle</b></sub></a></td>
322 <td align="center"><a href="https://github.com/jetersen"><img src="https://avatars2.githubusercontent.com/u/1661688?v=4" width="100px;" alt=""/><br /><sub><b>Joseph Petersen</b></sub></a></td>
323 <td align="center"><a href="https://github.com/SiM22"><img src="https://avatars2.githubusercontent.com/u/5759618?v=4" width="100px;" alt=""/><br /><sub><b>Simon Garcia</b></sub></a></td>
324 <td align="center"><a href="https://github.com/AndyG-0"><img src="https://avatars1.githubusercontent.com/u/29743443?v=4" width="100px;" alt=""/><br /><sub><b>Andy Gilbreath</b></sub></a></td>
325 <td align="center"><a href="https://github.com/northerngit"><img src="https://avatars0.githubusercontent.com/u/4513272?v=4" width="100px;" alt=""/><br /><sub><b>James Wilson</b></sub></a></td>
326 </tr>
327 <tr>
328 <td align="center"><a href="https://github.com/jskswamy"><img src="https://avatars2.githubusercontent.com/u/232449?v=4" width="100px;" alt=""/><br /><sub><b>Krishnaswamy Subramanian</b></sub></a></td>
329 <td align="center"><a href="https://github.com/luqasn"><img src="https://avatars2.githubusercontent.com/u/274902?v=4" width="100px;" alt=""/><br /><sub><b>Lucas Romero</b></sub></a></td>
330 <td align="center"><a href="https://github.com/konturn"><img src="https://avatars0.githubusercontent.com/u/35545508?v=4" width="100px;" alt=""/><br /><sub><b>konturn</b></sub></a></td>
331 <td align="center"><a href="https://github.com/tdorsey"><img src="https://avatars3.githubusercontent.com/u/1218404?v=4" width="100px;" alt=""/><br /><sub><b>tdorsey</b></sub></a></td>
332 <td align="center"><a href="https://github.com/alesz"><img src="https://avatars0.githubusercontent.com/u/12436980?v=4" width="100px;" alt=""/><br /><sub><b>Ales Zelenik</b></sub></a></td>
333 <td align="center"><a href="https://github.com/dtourde"><img src="https://avatars1.githubusercontent.com/u/49169262?v=4" width="100px;" alt=""/><br /><sub><b>Damien TOURDE</b></sub></a></td>
334 <td align="center"><a href="https://github.com/putz612"><img src="https://avatars3.githubusercontent.com/u/952758?v=4" width="100px;" alt=""/><br /><sub><b>Jason Sievert</b></sub></a></td>
335 </tr>
336 <tr>
337 <td align="center"><a href="https://github.com/joshua-nord"><img src="https://avatars2.githubusercontent.com/u/1181300?v=4" width="100px;" alt=""/><br /><sub><b>joshua-nord</b></sub></a></td>
338 <td align="center"><a href="https://maximilianbo.de/"><img src="https://avatars3.githubusercontent.com/u/9051309?v=4" width="100px;" alt=""/><br /><sub><b>Maximilian Bode</b></sub></a></td>
339 <td align="center"><a href="https://github.com/raackley"><img src="https://avatars0.githubusercontent.com/u/1700688?v=4" width="100px;" alt=""/><br /><sub><b>raackley</b></sub></a></td>
340 <td align="center"><a href="https://github.com/StoicPerlman"><img src="https://avatars1.githubusercontent.com/u/3152359?v=4" width="100px;" alt=""/><br /><sub><b>Sam Kleiner</b></sub></a></td>
341 <td align="center"><a href="https://arpankapoor.com/"><img src="https://avatars3.githubusercontent.com/u/3677810?v=4" width="100px;" alt=""/><br /><sub><b>Arpan Kapoor</b></sub></a></td>
342 <td align="center"><a href="https://github.com/chrodriguez"><img src="https://avatars1.githubusercontent.com/u/1460882?v=4" width="100px;" alt=""/><br /><sub><b>Christian Rodriguez</b></sub></a></td>
343 <td align="center"><a href="http://dave-cahill.com/"><img src="https://avatars0.githubusercontent.com/u/361096?v=4" width="100px;" alt=""/><br /><sub><b>Dave Cahill</b></sub></a></td>
344 </tr>
345 <tr>
346 <td align="center"><a href="https://github.com/golgoth31"><img src="https://avatars2.githubusercontent.com/u/5741421?v=4" width="100px;" alt=""/><br /><sub><b>golgoth31</b></sub></a></td>
347 <td align="center"><a href="https://greg.jeanmart.me/"><img src="https://avatars3.githubusercontent.com/u/506784?v=4" width="100px;" alt=""/><br /><sub><b>Greg Jeanmart</b></sub></a></td>
348 <td align="center"><a href="https://github.com/ballj"><img src="https://avatars1.githubusercontent.com/u/38097813?v=4" width="100px;" alt=""/><br /><sub><b>Joseph Ball</b></sub></a></td>
349 <td align="center"><a href="http://www.oneko.org/"><img src="https://avatars2.githubusercontent.com/u/4233214?v=4" width="100px;" alt=""/><br /><sub><b>Karlos</b></sub></a></td>
350 <td align="center"><a href="https://github.com/dza89"><img src="https://avatars0.githubusercontent.com/u/20373984?v=4" width="100px;" alt=""/><br /><sub><b>dza89</b></sub></a></td>
351 <td align="center"><a href="https://github.com/mikewhitley"><img src="https://avatars0.githubusercontent.com/u/52802633?v=4" width="100px;" alt=""/><br /><sub><b>mikewhitley</b></sub></a></td>
352 <td align="center"><a href="https://github.com/Vashiru"><img src="https://avatars2.githubusercontent.com/u/11370057?v=4" width="100px;" alt=""/><br /><sub><b>Vashiru</b></sub></a></td>
353 </tr>
354 <tr>
355 <td align="center"><a href="https://github.com/sam-kleiner"><img src="https://avatars.githubusercontent.com/u/63059772?v=4" width="100px;" alt=""/><br /><sub><b>sam-kleiner</b></sub></a></td>
356 <td align="center"><a href="https://www.linkedin.com/in/alexgorbatchev/"><img src="https://avatars.githubusercontent.com/u/65633?v=4" width="100px;" alt=""/><br /><sub><b>Alex Gorbatchev</b></sub></a></td>
357 <td align="center"><a href="https://github.com/c-yco"><img src="https://avatars.githubusercontent.com/u/355591?v=4" width="100px;" alt=""/><br /><sub><b>Alexander Rabenstein</b></sub></a></td>
358 <td align="center"><a href="http://tibbon.com/"><img src="https://avatars.githubusercontent.com/u/82880?v=4" width="100px;" alt=""/><br /><sub><b>David Fisher</b></sub></a></td>
359 <td align="center"><a href="https://github.com/utkuozdemir"><img src="https://avatars.githubusercontent.com/u/1465819?v=4" width="100px;" alt=""/><br /><sub><b>Utku Özdemir</b></sub></a></td>
360 <td align="center"><a href="https://mor.re/"><img src="https://avatars.githubusercontent.com/u/7683567?v=4" width="100px;" alt=""/><br /><sub><b>Morre Meyer</b></sub></a></td>
361 <td align="center"><a href="https://github.com/johnsondnz"><img src="https://avatars.githubusercontent.com/u/7608966?v=4" width="100px;" alt=""/><br /><sub><b>Donald Johnson</b></sub></a></td>
362 </tr>
363 <tr>
364 <td align="center"><a href="https://winston.milli.ng/"><img src="https://avatars.githubusercontent.com/u/6162814?v=4" width="100px;" alt=""/><br /><sub><b>Winston R. Milling</b></sub></a></td>
365 <td align="center"><a href="https://github.com/larivierec"><img src="https://avatars.githubusercontent.com/u/3633214?v=4" width="100px;" alt=""/><br /><sub><b>Christopher Larivière</b></sub></a></td>
366 <td align="center"><a href="https://sievenpiper.co/"><img src="https://avatars.githubusercontent.com/u/1131882?v=4" width="100px;" alt=""/><br /><sub><b>Justin Sievenpiper</b></sub></a></td>
367 <td align="center"><a href="https://github.com/beastob"><img src="https://avatars.githubusercontent.com/u/76816315?v=4" width="100px;" alt=""/><br /><sub><b>beastob</b></sub></a></td>
368 <td align="center"><a href="https://niftyside.io/"><img src="https://avatars.githubusercontent.com/u/653739?v=4" width="100px;" alt=""/><br /><sub><b>Daniel Mühlbachler-Pietrzykowski</b></sub></a></td>
369 <td align="center"><a href="https://github.com/consideRatio"><img src="https://avatars.githubusercontent.com/u/3837114?v=4" width="100px;" alt=""/><br /><sub><b>Erik Sundell</b></sub></a></td>
370 <td align="center"><a href="https://github.com/Ornias1993"><img src="https://avatars.githubusercontent.com/u/7613738?v=4" width="100px;" alt=""/><br /><sub><b>Kjeld Schouten-Lebbing</b></sub></a></td>
371 </tr>
372 <tr>
373 <td align="center"><a href="https://github.com/mrwulf"><img src="https://avatars.githubusercontent.com/u/2494769?v=4" width="100px;" alt=""/><br /><sub><b>Brandon Wulf</b></sub></a></td>
374 <td align="center"><a href="https://github.com/DerRockWolf"><img src="https://avatars.githubusercontent.com/u/50499906?v=4" width="100px;" alt=""/><br /><sub><b>DerRockWolf</b></sub></a></td>
375 <td align="center"><a href="https://github.com/brnl"><img src="https://avatars.githubusercontent.com/u/3243133?v=4" width="100px;" alt=""/><br /><sub><b>brnl</b></sub></a></td>
376 <td align="center"><a href="https://rafaelgaspar.xyz/"><img src="https://avatars.githubusercontent.com/u/5567?v=4" width="100px;" alt=""/><br /><sub><b>Rafael Gaspar</b></sub></a></td>
377 <td align="center"><a href="https://chadimasri.com/"><img src="https://avatars.githubusercontent.com/u/1502811?v=4" width="100px;" alt=""/><br /><sub><b>Chadi El Masri</b></sub></a></td>
378 <td align="center"><a href="https://github.com/dfoulkes"><img src="https://avatars.githubusercontent.com/u/8113674?v=4" width="100px;" alt=""/><br /><sub><b>Dan Foulkes</b></sub></a></td>
379 <td align="center"><a href="https://github.com/george124816"><img src="https://avatars.githubusercontent.com/u/26443736?v=4" width="100px;" alt=""/><br /><sub><b>George Rodrigues</b></sub></a></td>
380 </tr>
381 <tr>
382 <td align="center"><a href="https://pascaliske.dev/"><img src="https://avatars.githubusercontent.com/u/7473880?v=4" width="100px;" alt=""/><br /><sub><b>Pascal Iske</b></sub></a></td>
383 <td align="center"><a href="https://www.reyth.dev/"><img src="https://avatars.githubusercontent.com/u/23526880?v=4" width="100px;" alt=""/><br /><sub><b>Theo REY</b></sub></a></td>
384 <td align="center"><a href="https://github.com/piwi3910"><img src="https://avatars.githubusercontent.com/u/12539757?v=4" width="100px;" alt=""/><br /><sub><b>Watteel Pascal</b></sub></a></td>
385 <td align="center"><a href="https://github.com/frittenlab"><img src="https://avatars.githubusercontent.com/u/29921946?v=4" width="100px;" alt=""/><br /><sub><b>simon</b></sub></a></td>
386 <td align="center"><a href="https://github.com/FernFerret"><img src="https://avatars.githubusercontent.com/u/72811?v=4" width="100px;" alt=""/><br /><sub><b>Eric</b></sub></a></td>
387 <td align="center"><a href="https://github.com/vince-vibin"><img src="https://avatars.githubusercontent.com/u/99386370?v=4" width="100px;" alt=""/><br /><sub><b>Vincent</b></sub></a></td>
388 <td align="center"><a href="https://github.com/Keydrain"><img src="https://avatars.githubusercontent.com/u/5723055?v=4" width="100px;" alt=""/><br /><sub><b>Clint</b></sub></a></td>
389 </tr>
390 <tr>
391 <td align="center"><a href="https://github.com/tamcore"><img src="https://avatars.githubusercontent.com/u/319917?v=4" width="100px;" alt=""/><br /><sub><b>Philipp B.</b></sub></a></td>
392 </tr>
393</table>
394
395<!-- markdownlint-restore -->
396<!-- prettier-ignore-end -->
397
398<!-- ALL-CONTRIBUTORS-LIST:END -->
399
400This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
401
402----------------------------------------------
403Autogenerated from chart metadata using [helm-docs v1.10.0](https://github.com/norwoodj/helm-docs/releases/v1.10.0)