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 hinzufügen