Nachdem ich hier in den letzten Artikel gezeigt habe, wie man ein lokales Single-Node Cluster mit Minikube oder ein drei Node Cluster mit unter CentOS aufsetzt, will ich heute einen ersten Docker Container im Kubernetes Cluster deployen.
Inhaltsverzeichnis
Als Container verwende ich den Docker Container meiner NLP Pipeline, welche ich in meiner Bachelor Thesis entwickelt habe. Falls du dazu auch mal einen Artikel hier lesen möchtest, dann hinterlasse mir doch eine kurze Nachricht als Kommentar =)
Generell müssen wir in unsere Konfigurationsdatei zwei Bereiche anlegen:
- Deployment: In diesem Bereich erstellen wir alles zum Deployen des Containers als sogenannter Pod auf Kubernetes
- Service: Eine Service ist eine abstrakte Möglichkeit eine Anwendung, die auf einer Reihe von Pods läuft, als Netzwerkdienst bereitzustellen.
Kubernetes Deployment für den Container erstellen
Der Inhalt des Deploymentbereiches sieht bei mir wie folgt aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | apiVersion: apps/v1 kind: Deployment metadata: name: nlp-pipeline spec: replicas: 1 selector: matchLabels: app: nlp-pipeline template: metadata: labels: app: nlp-pipeline spec: containers: - name: nlp-pipeline image: modius22/nlp-pipeline ports: - name: api containerPort: 5000 |
Am Anfang werden die Version und der Typ des Bereichs (hier Deployment) definiert.
Danach folgt der erste spec Bereich. Dieser teilt sich in 3 Bereiche (replicas, selector, template). Mit replicas gibt man an, wie viele Pods auf dem Cluster erstellt werden soll. Dies ist also wichtig für die Skalierung.
Im selector legt man ein Label an. Dies dient zur Identifikation des Pods. Im Bereich template werden dann die Containerinformationen wie Image und Port definiert.
Wenn der Pod im Kubernetes nur eine interne Funktion wahrnehmen soll, wären wir an dieser Stelle nun schon fertig. Da ich aber zum Testen den Pod von außen ansprechen will, müssen wir jetzt noch einen Service definieren.
Kubernetes Service erstellen
Der Code für den Service ist deutlich kürzer und sieht so aus:
1 2 3 4 5 6 7 8 9 10 11 | apiVersion: v1 kind: Service metadata: name: nlp-pipeline spec: type: LoadBalancer selector: app: nlp-pipeline ports: - port: 5000 name: api |
Auch hier wird am Anfang die API Version definiert und der Typ Service festgelegt. Im spec Bereich verwenden wir den type LoadBalancer. Dieser würde bei mehreren Repicas auch die Last zwischen den Pods verteilen.
Am Ende wird auch hier der Port wieder aufgeführt.
Deployment auf dem Kubernetes Cluster
Das Deployment könnt ihr generell von überall ausführen, wo kubectl installiert ist und eine Verbindung zum Cluster eingerichtet wurde. Auf diesem System legen wir eine .yaml Datei an (bei mir nlp-pipeline.yaml), wo wir die beiden Bereiche, getrennt mit — einfügen.
Die komplette Datei sieht dann wie folgt aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | apiVersion: apps/v1 kind: Deployment metadata: name: nlp-pipeline spec: replicas: 1 selector: matchLabels: app: nlp-pipeline template: metadata: labels: app: nlp-pipeline spec: containers: - name: nlp-pipeline image: modius22/nlp-pipeline ports: - name: api containerPort: 5000 --- apiVersion: v1 kind: Service metadata: name: nlp-pipeline spec: type: LoadBalancer selector: app: nlp-pipeline ports: - port: 5000 name: api |
Um das ganze auf den Cluster zu deployen, verwendet man den folgenden Befehl:
1 | kubectl apply -f nlp-pipeline.yaml |
Jetzt dauert es einige Minuten bis der Pod gestartet ist, da das Image erst noch von Dockerhub geladen werden muss.
Zum Prüfen ob der Pod läuft, kann der folgende Befehl verwendet werden.
1 2 3 4 | kubectl get pods NAME READY STATUS RESTARTS AGE nginx-f89759699-s6vxx 1/1 Running 1 13d nlp-pipeline-86c57b9d96-lw6kx 1/1 Running 0 53m |
Damit habe wir erfolgreich unseren ersten Docker Container als Pod in einem Kubernetes Cluster deployed.
Dieser ist aber zur Zeit noch nicht von extern aufrufbar. Wie dies funktioniert, schauen wir uns in einem der nächsten Artikel an.
Schreibe einen Kommentar