Dynamische Web content via GIT

In Kubernetes kon een volume aangemaakt worden met een GIT-Repo als bron. Dit type volume is echter ‘deprecated‘ en een betere manier voor dynamische web-content in een Kubernetes deployment is om een ‘init-container‘ te gebruiken die een git-repo in een ‘emptyDir‘ volume plaatst dat gebruikt wordt door de webserver.

HTML-content

De web-content in een simple-html repo kan bestaan uit een index.html pagina met een aantal images in een images-directory. Bijvoorbeeld: https://gitlab.com/nokkie/simple-html

init-container

Een init-container om een git-repo in de html-directory voor nginx te plaatsen, kan er alsvolgt uitzien:

initContainers:
- name: git-clone
    image: nokkie/alpinegit:arm64
    args:
    - git 
    - clone
    - https://gitlab.com/nokkie/simple-html.git
    - /var/www/html
    securityContext:
      runAsUser: 1000
      allowPrivilegeEscalation: false
      readOnlyRootFilesystem: true
    volumeMounts:
      - name: html
        mountPath: /var/www/html

Hierbij wordt een alpinegit image gebruikt om het git-clone commando uit te kunnen voeren op een Raspberry Pi. Voor andere architecture zoals AMD64, zijn er beschikbare images te vinden op docker hub.

volume

In de nginx container (in dezelfde pod) kan nu een emptyDir volume gebruikt worden naar hetzelfde mountPath:

  containers:
  - name: nginx
    ...
    volumeMounts:
    - mountPath: /var/www/html
      name: html
      readOnly: true
  volumes:
  - name: html
    emptyDir: {}

Deze wordt aangeduid met ‘readOnly: true’ zodat alleen een wijziging kan worden gedaan door de git-repo met html-content aan te passen en de Kubernetes pod te vervangen via een re-deployment. (al dan niet met fleet)

deployment

Een complete deployment manifest ziet er dan zo uit:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: simple-nginx
  namespace: simple-nginx
spec:
  template:
    spec:
      containers:
      - name: simple-nginx
        image: nginx
        volumeMounts:
        - name: html
          mountPath: /var/www/html
      initContainers:
      - name: git-clone
        image: nokkie/alpinegit:arm64
        args:
        - git 
        - clone
        - https://gitlab.com/nokkie/simple-html.git
        - /var/www/html
        volumeMounts:
        - name: html
          mountPath: /var/www/html

Wellicht is het noodzakelijk om de juiste git-image te vinden voor de gebruikte architecture op jouw Kubernetes worker nodes. In bovenstaand manifest wordt een ARM64-image gebruikt voor een Raspberry Pi.