GIT repo als shared storage

Als een standaard POD aangemaakt wordt in een Kubernetes omgeving, is de data die gebruikt wordt binnen de container en geïsoleerd van andere nodes/pods. Voor een website met dynamische content zou je dat dan moeten kopiëren of synchroniseren naar de overige replicas. Tenminste, als je op tijd bent… Een pod kan herstart worden door bv. de ‘liveness probe’ signaleert dat er geen response is en de data in de vorige container is dan niet bewaard gebleven!

Uiteraard is er een oplossing middels ‘shared volumes‘ en daar zijn meerdere soorten storage voor beschikbaar zoals bv. NFS-Storage.

Een andere oplossing is om een GIT repository te gebruiken als shared storage en de bedoeling is dat een pod aangemaakt wordt, die mount dan de GIT repository aan een directory en ‘cloned‘ daarin de GIT repo. Dit is dus uitermate geschikt voor een website met dynamische html-content dat door middel van GIT-commits onderhouden wordt.

De definitie van het volume in de manifest ziet er alsvolgt uit:

 volumes:
 - name: html
   gitRepo:
     repository: https://github.com/NicoOosterwijk/html-example.git
     revision: master
     directory: . 

Waarbij de ‘directory‘ verwijst naar de huidige directory omdat een clone-commando standaard een directory aanmaakt met de naam van de repo en we willen de inhoud niet in een sub-directory hebben. De ‘revision‘ is master om deze branch te gebruiken nadat deze is ge-merged. De ‘repository‘ verwijzing is naar een voorbeeld repo in mijn GitHub.

Binnen een container-definitie in de manifest, wordt het volume gemount in de html-directory van een nginx container met:

 volumeMounts:
 - name: html 
   mountPath: /usr/share/nginx/html
   readOnly: true 

readOnly‘ wordt gebruikt om te voorkomen dat de content anders is dan de inhoud van de repository. Bij een wijziging dient de repository opnieuw ge-pulled (of ge-cloned) te worden. Dit kan door vanuit een ReplicaSet of Deployment de pod te verwijderen zodat er een nieuwe pod gemaakt wordt maar handiger zou zijn om met behulp van een ‘sidecar‘ container een synchronisatie te doen.