Docker Image zu Kubernetes
Von nichts zum funktionierenden Service sind diese Schritte notwendig:
- NodeJS App + Dockerfile auf euren Branch in unser GitHub Repo pushen
- Die Schritte unten befolgen, um den Service einmalig in Kubernetes zu starten
Jetzt sollte der Service abrufbar sein. Falls nicht, checkt die Logs (Befehle stehen weiter unten). Wenn ihr wieder etwas pusht wird automatisch ein neues Image zu Docker Hub hochgeladen. Danach brauch es nur noch ein kubectl rollout restart deployment <name>
und der Service ist auf dem neuesten Stand.
Deployment & Service yaml
In dem Ordner "templates" liegt eine Datei "service-deployment-template.yaml". Jeder Microservice muss diese Datei einmal kopieren, den Namen und das Docker Image ändern (von "<name>
" zu den Namen, die unten in der Tabelle stehen) und in das Kubernetes Cluster laden. Dafür sind die untenstehenden Befehle:
Befehl | Erklärung |
---|---|
kubectl apply -f <name-der-deployment-datei>.yaml |
Registriert oder Aktualisiert eine Deployment/Service Definition in Kubernetes |
Für die Benennung eurer Services steht unten eine Tabelle. Die Namen müssen eingehalten werden, da der ingress.yaml
Eintrag für diese Services schon erstellt wurde. Der "targetPort" des Services muss der Port sein, auf dem der Express Server listened.
Wenn euer Service gestartet ist, kann auf den Microservice über die URL http://sgse2.ad.fh-bielefeld.de/api/<microservice>
zugegriffen werden, auch von extern. So könnt ihr überprüfen, ob der Service gestartet ist:
kubectl get service
- In der Auflistung muss euer Service alsClusterIP
aufgelistet sein, mit dem Port aus dem Feldport
der deploment.yaml (Also 3000)kubectl get pods
- In dieser Auflistung muss ein Pod von eurem Service angezeigt werden. Der Name ist der Name des Deployments (<microservice>-deployment
) mit einem zufälligen Hash dahinter, der Pod mussREADY 1/1
mit dem ZustandSTATUS Running
sein.
Bennenung für Kubernetes Deployment/Service in der deployment.yaml:
Microservice | Microservice Name |
---|---|
Suche | search |
Chat | chat |
Angebote | offers |
Bewertungen | ratings |
Benutzerverwaltung | user |
Frontend | frontend |
Test Service | express-test |
Diese Infos müsst ihr in eurer deployment.yaml angeben. Euer Deployment heißt dann <name>-deployment
, der Service <name>-service
und euer API Endpunkt ist erreichbar unter /api/<name>
. Der Frontend Service ist unter http://sgse2.ad.fh-bielefeld.de/
erreichbar.
Datenbanken
Microservice | Datenbank | IP:Port |
---|---|---|
MySQL | 172.17.0.7:3306 | |
Chat | MongoDB | 172.17.0.6:27017 |
Angebote | MongoDB | 172.17.0.9:27017 |
Bewertungen | MongoDB | 172.17.0.10:27017 |
Benutzerverwaltung | MongoDB | 172.17.0.11:27017 |
Test Datenbank | MySQL | 172.17.0.8:3306 |
Die IP Adressen sollten sich nicht mehr ändern, also können diese hardcoded werden. Anmeldedaten (für alle gleich):
- Benutzername:
root
- Passwort:
passwort123!
Nützliche Befehle für Kubernetes & Umgebung:
Befehl | Erklärung |
---|---|
kubectl rollout restart deployment <name> |
Starte Deployments neu. Nützlich, wenn ihr ein neues Docker Image gepusht habt und den Service nicht aktualisiert |
kubectl exec -it <pod> -- /bin/bash |
Öffnet eine bash in dem Pod. Der Podname muss aus kubectl get pods entnommen werden |
curl -L sgse2.ad.fh-bielefeld.de/api/<path> |
Eine schnelle Möglichkeit zum Abrufen eures Microservices wenn ihr auf dem Server seid. |
sudo kubectl port-forward service/ingress-nginx-controller -n ingress-nginx --address 0.0.0.0 80:80 |
Macht den Cluster Endpunkt für externe auf (Läuft derzeitig schon auf dem Server) |
kubectl get service |
Zum Abfragen, ob der Service hinzugefügt wurde |
kubectl get pods |
Zum Abfragen, ob das Docker Image für den Service in einem Pod ausgeführt werden konnte |
kubectl logs <pod-name> |
<pod-name> muss aus kubectl get pods kopiert werden. Gibt die logs aus, die z.B. über ein console.log im Express.js Server geloggt wurden |