Gogs Kubernetes Setup

Heute wollen wir mal in einer Testumgebung veranschaulichen wie man in Kubernetes einen Dockercontainer mit dem Git Service Gogs zum laufen bekommt. Unsere Git Repos, Gogs Dateien sowie die DB wollen wir dabei auf einem NFS Share ablegen.

Voraussetzungen

Vorausgesetzt wird ein lauffähiges Kubernetes Setup und ein NFS Server. Will man das ganze lokal testen bietet sich hierfür Minikube an.

NFS Server

Einen NFS Server bekommt man mit wenig Aufwand durch Vagrant ans laufen.

Ein entsprechendes Vagrantfile könnte z.b. so aussehen:

Vagrant.configure("2") do |config| 
   config.vm.define "nfs" 
     do |server| 
     server.vm.box = "centos/7" 
     server.vm.hostname = "nfs.test.local" 
     server.vm.network :private_network, ip: "192.168.99.10"
    end 
  end 
end

Nach einem vagrant up und anschließendem vagrant ssh erstellen wir die benötigten Verzeichnisse und die dazu passenden Einträge in der /etc/exports:

[root@nfs ~]# mkdir /srv/{gogs-data,gogs-mysql} 
[root@nfs ~]# cat /etc/exports 
/srv/gogs-data 192.168.99.0/24(rw,sync,no_root_squash) 
/srv/gogs-mysql 192.168.99.0/24(rw,sync,no_root_squash) 

Unser K8s Cluster befindet sich also im Netz 192.168.99.0/24. Nun muß nur noch der Dienst neu gestartet werden:

[root@nfs ~]# systemctl restart nfs-server

Die Ressourcen

Ein lauffähiges Gogs K8s Beispiel und etliche andere Beispiele sind hier zu finden:

https://github.com/afdata/kubernetes-examples.git

Für unser Beispiel benötigen wir die Datei 'gogs/gogs.yaml' aus dem Repo. In dieser Datei befindet sich die Konfiguration des Services, unter dem die Anwendung erreichbar sein wird, sowie der ReplicationController der für uns den Pod erstellen wird. Der Pod wird dabei zwei Container beinhalten, die Gogs Anwendung selbst und die erforderliche Datenbank. Wir werden hier MariaDB verwenden.

Desweiteren findet man hier auch die Konfiguration unserer beiden K8s Volumes in der wir die korrekte IP unseres NFS Servers eintragen müssen:

volumes: 
  - name: nfs-gogs-data 
     nfs: 
       server: 192.168.99.10 
       path: "/srv/gogs-data" 
  - name: nfs-gogs-mysql 
      nfs: 
        server: 192.168.99.10 
        path: "/srv/gogs-mysql" 

Jetzt können wir die beiden Ressourcen in K8s anlegen:

# kubectl create -f gogs.yaml service "gogs" created replicationcontroller "simple-git-gogs" created 

Die Anwendung sollte nun unter dem definierten NodePort '30001' zu erreichen sein. Wenn wir im Browser die K8s Node Adresse '192.168.99.102:30001' aufrufen, erscheint die Installationsseite von Gogs:

Bevor wir die Installation weiterführen können müssen wir allerdings noch eine passende Datenbank erzeugen.

Mit der Container ID die wir durch docker ps ausfindig machen können, verbinden wir uns mit dem CT:

# docker exec -it 0f79e0c1cb78 bash 

Eine andere Möglichkeit sich mit dem Container (-c) zu verbinden wäre:

# kubectl exec -it simple-git-gogs-cgtwz -c mysql bash 

Anschließend verbinden wir uns per mysql -u root -p mit der Datenbank und dem hinterlegten Passwort aus der 'gogs.yaml'.

Die Datenbank mit dem passenden User legen wir wie folgt an:

MariaDB [(none)]> CREATE DATABASE gogs;
Query OK, 1 row affected (0.02 sec)

MariaDB [(none)]> GRANT ALL ON gogs.* TO gogs@'%' IDENTIFIED BY 'ToTalSecureGogsPassword';
Query OK, 0 rows affected (0.01 sec)

Nun können wir die passenden Angaben bei der Installation machen und nach einem erneuten Aufruf der Adresse '192.168.99.102:30001' bekommen wir die Gogs Startseite.

Haben wir in unserem Kubernetes Setup einen Ingress Controller am laufen, können wir auch gleich noch eine passende Domain für unseren Service konfigurieren.

Die passende Ingress Resource wird mit Hilfe der Datei gogs-ingress.yaml aus dem Repository angelegt. Nach anpassen der Option -host: erfolgt wieder der bekannte 'create' Aufruf:

# kubectl create -f gogs-ingress.yaml 
ingress "gogs-ingress" created 

Letzten Endes erhalten wir nach Aufruf der angegebenen URL unsere Startseite.

Debug

Bevor wir die konfigurierten Ressourcen erstellen, wollen wir vielleicht noch die Erreichbarkeit des NFS Servers in Kubernetes testen:

# showmount -e 192.168.99.10 
Export list for 192.168.99.10: 
/srv/gogs-mysql 192.168.99.0/24 
/srv/gogs-data 192.168.99.0/24 
# mount 192.168.99.10:/srv/gogs-data /media; umount /media 

Sollte das erstellen der Ressourcen nicht wie erwartet funktionieren, hilft meist ein 'describe' weiter:

# kubectl describe pod simple-git-gogs-cgtwz 

Falls die Anwendung nicht erreicht werden kann, weil die Node IP oder der Port nicht bekannt ist, helfen evtl. folgende zwei Kommandos weiter:

# kubectl get service 
# kubectl get nodes -o yaml 

Ein docker ps sollte uns die beiden erstellten Container des Pods anzeigen:

CONTAINER ID        IMAGE                    COMMAND                  CREATED              STATUS
0f79e0c1cb78        mariadb                  "docker-entrypoint.sh"   4 seconds ago        Up 3 seconds
bf6329106580        gogs/gogs                "/app/gogs/docker/sta"   56 seconds ago       Up 55 seconds 

Neuen Kommentar schreiben