/ Kubernetes

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.