Helm Repository selbst gemacht
Für ein eigenes Helm-Repository braucht man lediglich einen simplen HTTP-Server. Selbst den HTTP-Server muss man nicht extra bereitstellen, wenn man ein GitHub-Account besitzt.
Helm chart
Zuerst bauen wir ein Helm-Chart als "Futter" für das neue Repository. Dafür legen wir ein Projektverzeichnis "myapp-project" an und generieren darin ein neues Helm-Chart.
$ mkdir myapp-project
$ cd myapp-project
$ helm create myapp
Die erzeugten Dateien:
myapp-project
└── myapp
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
Die App wird "myapp" heißen. Ein minimales "Dockerfile" dafür würde so aussehen:
FROM nginx
COPY content /usr/share/nginx/html
Ein neues Verzeichnis "content", das vom nginx ausgeliefert werden soll, beinhaltet vorerst nur eine Datei "index.html" mit dem Inhalt:
<html>
<body>
<h1>MyApp</h1>
</body>
</html>
Das Projektverzeichnis hat jetzt folgende Struktur gewonnen:
myapp-project
├── content
│ └── index.html
├── Dockerfile
└── myapp
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
Ich pushe das Image unter meiner Docker-Id "inettech". Es erhält den Tag "1.0.0" Ich habe dafür auf Docker-Hub ein Repository "myapp" angelegt:
$ docker build -t inettech/myapp:1.0.0 .
$ docker push inettech/myapp
In "values.yaml" muss noch das neue App-Image hinterlegt werden, bevor das Chart-Package erzeugt wird:
...
image:
repository: inettech/myapp
...
Auch die App-Version muss auf 1.0.0 gesetzt werden in Chart.yaml. Sie wird von Helm für die Identifizierung des Image verwendet:
...
appVersion: 1.0.0
Im Projektverzeichnis kann jetzt das Helm-Package erstellt werden:
$ helm package my-app
Eine Archivdatei "myapp-0.1.0.tgz" wird angelegt. Der Chart ist bereit um ihn in einem Repository zu speichern.
Github Pages
Mit GitHub Pages können Dateien sehr einfach über HTTP im Internet bereitgestellt werden. Alles was man dafür braucht ist ein GitHub-Account und ein Projekt mit dem Namen "BENUTZERNAME.github.io". Wenn das Projekt auf github.com angelegt ist, kann es ausgecheckt werden. Zum Beispiel parallel zum Verzeichnis "myapp-project". Für das Helm-Chart-Repository reicht ein Unterverzeichnis im Webserver aus. Ich nenne es "helm-repo"
$ git clone git@github.com:mubn/mubn.github.io.git
$ mkdir helm-repo
Jetzt kann das Helm-Package aus dem Projektverzeichnis ins Repository verschoben und ein Repository-Index erstellt werden:
$ mv myapp-project/myapp-0.1.0.tgz mubn.github.io/helm-repo/
$ cd mubn.github.io/helm-repo/
$ helm repo index . --url https://mubn.github.io/helm-repo
Der letzte Befehl erzeugt eine Index-Datei mit folgendem Inhalt:
apiVersion: v1
entries:
myapp:
- apiVersion: v2
appVersion: 1.0.0
created: "2019-12-01T00:36:55.443457513+01:00"
description: A Helm chart for Kubernetes
digest: acc9bffbca9964ce9089166f83431f470b5f3affa27198c6ca8660dfa244d83d
name: myapp
type: application
urls:
- https://mubn.github.io/helm-repo/myapp-0.1.0.tgz
version: 0.1.0
generated: "2019-12-01T00:36:55.442605386+01:00"
Das Repository ist jetzt bereit ausgeliefert zu werden:
$ git add .
$ git commit -m "Add first helm repo package"
$ git push
Nach wenigen Sekunden ist die Index-Datei unter https://mubn.github.io/helm-repo/index.yaml und das Helm-Package unter https://mubn.github.io/helm-repo/myapp-0.1.0.tgz erreichbar.
Das wars. Das Repository steht und beinhaltet das erste Package. Die App kann nun im Kubernetes-Cluster installiert werden:
$ helm repo add helm-repo https://mubn.github.io/helm-repo
$ helm install myapp helm-repo/myapp
$ helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
myapp default 1 2019-12-01 00:56:01.465577304 +0100 CET deployed myapp-0.1.0 1.16.0
Fazit
Ein Helm-Repository für Test-Zwecke ist dank GitHub Pages mit wenigen Handgriffen gemacht. Für den Produktiven Einsatz müsste zumindest Authorisierung mit Passwort und automatische Generierung des Index ergänzt werden.