Bessere Helm-Charts mit JSON Schema Validierung
Das Problem: falsche Datentypen, Felder oder Werte in der values.yaml
Helm ist das bevorzugte Paketmanagement-Tool für Kubernetes. Doch gerade bei der Arbeit mit der values.yaml
-Datei schleichen sich leicht Fehler ein. Beispiele dafür sind:
- Typ-Validierung: Der Wert
image.tag
ist ein String, daher “1.5” und nicht 1.5 - Bereichs-Validierung: Der Wert für
replicaCount
sollte z.B. zwischen 1 und 10 liegen. - Einschränkungs-Validierung: Die
image.pullPolicy
hat die gültigen WerteIfNotPresent
,Always
undNever
1
2
3
4
5
# values.yaml
replicaCount: 2
image:
tag: "1.5"
pullPolicy: IfNotPresent
Die Lösung: validieren – bevor deployed wird!
Hier kommt JSON Schema ins Spiel. Seit Helm 3.5 ist es möglich eine values.schema.json
im Chart-Verzeichnis zu hinterlegen. Diese beschreibt die Struktur. Jetzt kann Helm, die values.yaml
-Datei beim Rendern validieren und notfalls meckern – das passiert automatisch bei:
helm install
helm upgrade
helm template
helm lint
Ein Beispiel: image.repository
und image.pullpolicy
Beim image.repository
-Wert soll per RegEx geprüft werden, ob dieser ein Valides Docker-Image ist. Die image.pullpolicy
kennt nur drei Werte, damit wäre alles anderen falsch.
1
2
image.repository # Docker-Image Bspl.: "acmeorg/nginx"
image.pullPolicy # Werte: [IfNotPresent, Always, Never]
Mit einer einfachen values.schema.json
bekommt Helm das ganze mit und kann reagieren.
Beispiel der values.schema.json:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
"$schema": "http://json-schema.org/schema#",
"type": "object",
"required": [
"image"
],
"properties": {
"image": {
"type": "object",
"required": [
"repository",
"pullPolicy"
],
"properties": {
"repository": {
"type": "string",
"pattern": "^[a-z0-9-_./]+$"
},
"pullPolicy": {
"type": "string",
"pattern": "^(Always|Never|IfNotPresent)$"
}
}
}
}
}
Jetzt noch kurz Testen:
Test 1:
1
2
3
4
# values.yaml
image:
repository: true
pullPolicy: enforced
1
2
3
4
$ helm lint .
==> Linting .
[ERROR] values.yaml: - image.repository: Invalid type. Expected: string, given: boolean
- image.pullPolicy: Does not match pattern '^(Always|Never|IfNotPresent)$'
Test 2:
1
2
3
4
# values.yaml
image:
repository: "ghcr.io/zahlenhelfer/container-nginx-demo"
pullPolicy: IfNotPresent
1
2
3
4
5
$ helm lint .
==> Linting .
[INFO] Chart.yaml: icon is recommended
1 chart(s) linted, 0 chart(s) failed
Fazit
- Frühzeitige Fehlererkennung
- Bessere Dokumentation der erwarteten Werte
- Einfachere Nutzung für Dev-Teams
JSON Schema bringt Struktur und Sicherheit in die Welt der Helm-Charts. Wer produktionsreife Charts pflegt, sollte die Validierung unbedingt nutzen.