GNU/Linux >> LINUX-Kenntnisse >  >> Panels >> Docker

Von Docker Compose zu Kubernetes mit Podman

Das Docker Compose-Tool war für viele Menschen, die mit Containern gearbeitet haben, wertvoll. Laut Dokumentation beschreibt sich Docker Compose selbst als:

... ein Tool zum Definieren und Ausführen von Multi-Container-Anwendungen. Mit Compose verwenden Sie eine YAML-Datei, um die Dienste Ihrer Anwendung zu konfigurieren. Dann erstellen und starten Sie mit einem einzigen Befehl alle Dienste aus Ihrer Konfiguration.

Eine Herausforderung bei Docker Compose besteht darin, dass das YAML-Dateiformat nur mit der Docker-Engine funktioniert. Während Sie es anderen Docker-Benutzern für die lokale Replikation geben können, können sie es nicht mit anderen Container-Laufzeiten verwenden. Das heißt, bis jetzt.

[ Zugehöriges Tutorial:Podman und Docker Compose verwenden ]

Bei Podman 3.0 arbeitet Docker Compose mit einem Podman-Backend

Die wahre Stärke von Podman zeigt sich durch die einfache Konvertierung der Container auf Basis von Docker Compose in eine Kubernetes-YAML-Datei. Wie Docker Compose kann Podman die Kubernetes-YAML-Datei verwenden, um die Container lokal zu replizieren. Noch wichtiger ist, dass Podman dadurch einen orchestrierten Pod und Dienst hat, der auf vielen Plattformen ausgeführt werden kann, einschließlich Kubernetes/OpenShift oder Minikube.

Dieser Artikel erklärt, wie man mit einer einfachen Compose-Datei beginnt, die WordPress mit zwei Containern ausführt. Die Quelle für diese Compose-Datei wird auf GitHub im awesome-compose-Repository von Docker veröffentlicht. Die erfolgreiche Verwendung dieser Datei mit Podman führt dazu, dass der WordPress-Ersteinrichtungsbildschirm in einem Browser erscheint.

Hinweis :Zum Zeitpunkt der Erstellung dieses Artikels unterstützen wir nur docker-compose Befehl wird als Root ausgeführt.

Systemdienst von Podman starten

Um Compose zu verwenden, müssen Sie zunächst sicherstellen, dass alle erforderlichen Pakete installiert sind, und dann den Systemdienst Podman (3.0 oder höher) mit systemd einrichten . Aktivieren und starten Sie nach der Installation der Pakete den Podman systemd Socket-aktivierter Dienst mit dem folgenden Befehl:

$ sudo systemctl enable --now podman.socket

Überprüfen Sie, ob der Dienst ausgeführt wird, indem Sie auf den Ping-Endpunkt klicken. Dieser Schritt muss erfolgreich sein, bevor Sie fortfahren.

$ sudo curl -H "Content-Type: application/json" --unix-socket /var/run/docker.sock http://localhost/_ping
OK

Sie können Compose jetzt sicher ausführen, da Sie wissen, dass die RESTful-API funktioniert.

Verfassen ausführen

Wie bereits erwähnt, führt das Beispiel eine Compose-Datei aus, die aus zwei Containern besteht, um eine WordPress-Sitzung aufzurufen. Ein Container führt einen Apache-Webdienst aus, der andere speichert die Daten in einer MySQL-Datenbank. Die beiden Container kommunizieren über TCP/IP über ein Netzwerk, das dieser Compose-Instanz zugeordnet ist. Führen Sie zum Aufrufen der Container docker-compose up aus .

$ sudo docker-compose up -d
Creating network "wordpress-mysql_default" with the default driver
Creating volume "wordpress-mysql_db_data" with default driver
Pulling db (mysql:8.0.19)...
0c27e8e5fcfab7805cfed996b55e5e98f43fd7ee76e1516f20cba139c6a299c5: pulling image () from docker.io/library/mysql:8.0.19  
Pulling wordpress (wordpress:latest)...
0d35c2300ec845fda141ba012f7c6dccde8f0ae106b8f4bb0fcfced69380f851: pulling image () from docker.io/library/wordpress:latest  
Creating wordpress-mysql_db_1        ... done
Creating wordpress-mysql_wordpress_1 ... done

Verwenden Sie das podman ps Befehl, um zu überprüfen, ob zwei Container erstellt wurden und jetzt ausgeführt werden. Es war kein Docker-Daemon erforderlich.

$ sudo podman ps
CONTAINER ID  IMAGE                               COMMAND               CREATED         STATUS             PORTS               NAMES
a089a40bb9ae  docker.io/library/mysql:8.0.19      --default-authent...  15 seconds ago  Up 15 seconds ago                      kind_hermann
510c028c273f  docker.io/library/wordpress:latest  apache2-foregroun...  15 seconds ago  Up 15 seconds ago  0.0.0.0:80->80/tcp  competent_kilby
$

Stellen Sie sicher, dass WordPress lokal ausgeführt wird

Die Anweisungen zum Ausführen von WordPress weisen darauf hin, dass es ordnungsgemäß funktioniert und über localhost und Port 80 darauf zugegriffen werden kann.

Erstellen Sie die Kubernetes-YAML

Beginnen Sie mit einer funktionierenden WordPress-Instanz auf dem lokalen Computer mit dem Replizieren dieser Container auf einer Kubernetes-Plattform. Podman kann Kubernetes-basiertes YAML aus laufenden Containern generieren.

[Vielleicht möchten Sie auch lesen: Lernen Sie Kubernetes von Ihrem lokalen Computer aus]

Ein Pod oder mehrere Pods?

Es gibt zwei Ansätze zum Erstellen der YAML, die Sie in der Kubernetes-Umgebung verwenden werden:Entweder zwei Container in einem einzelnen Pod mit einem Dienst platzieren oder zwei Pods mit jeweils einem Container und einem Dienst erstellen, um das Apache-Front-End verfügbar zu machen. Um festzustellen, welcher Ansatz der beste ist, kann einiges an Versuch und Irrtum erforderlich sein.

Eine Überlegung, die den zu verwendenden Ansatz bestimmen kann, ist die Art und Weise, wie die Container oder Pods kommunizieren. Als Compose diese Container erstellte, durchlief es eine Reihe von Schritten, um sicherzustellen, dass die beiden Container über DNS-Namen miteinander kommunizieren konnten. Tatsächlich richtet Compose Aliase für die Container ein, die beim Auflösen von Containern nach Namen als DNS-Namen erkannt werden. Indem die Container in denselben Pod gestellt werden, ist keine Namensauflösung zwischen ihnen erforderlich, da sie sich einen Netzwerk-Namespace teilen. Daher können sie einfach localhost verwenden miteinander zu kommunizieren.

Das Platzieren der Container in verschiedenen Kubernetes-Pods bietet mehr Flexibilität, aber die Container müssen über einen anderen Mechanismus miteinander kommunizieren.

Generieren Sie die YAML-Datei

Sie müssen die Containernamen oder -IDs kennen, um mit der Erstellung der Kubernetes-YAML zu beginnen. Entscheiden Sie, ob Podman eine Dienstbeschreibung für Kubernetes generieren soll. Stellen Sie in diesem Fall das Apache-Frontend bereit, damit es über den Browser mit WordPress interagieren kann. Verwenden Sie den podman generate kube Befehl zum Erstellen von YAML-Dateien.

$ sudo podman generate kube -s -f wordpress.yaml a089a40bb9ae 510c028c273f

Das -s im vorherigen Befehl bedeutet, dass Podman einen Dienst für diesen Pod generiert. Das -f Option ermöglicht es uns, die generierte YAML in einer Datei zu speichern. Andernfalls wird die Ausgabe an stdout gesendet , wo es in eine Datei umgeleitet werden kann.

$ cat wordpress.yaml
# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-3.0.0-dev
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2020-12-03T22:30:07Z"
  labels:
    app: kindhermann
  name: kindhermann
spec:
  containers:
  - command:
    - docker-entrypoint.sh
    - --default-authentication-plugin=mysql_native_password
    env:
    - name: PATH
      value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
   ...
    workingDir: /
  - command:
    - docker-entrypoint.sh
    - apache2-foreground
    env:
    - name: PATH
      value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  ...
    - name: WORDPRESS_DB_HOST
      value: kindhermann
    - name: WORDPRESS_DB_PASSWORD
      value: db
    - name: APACHE_ENVVARS
      value: /etc/apache2/envvars
 ...
    image: docker.io/library/wordpress:latest
    name: competentkilby
    ports:
    - containerPort: 80
      hostPort: 80
      protocol: TCP
    resources: {}
    securityContext:
      allowPrivilegeEscalation: true
      capabilities:
        drop:
        - CAP_MKNOD
        - CAP_NET_RAW
      privileged: false
      readOnlyRootFilesystem: false
      seLinuxOptions: {}
    workingDir: /var/www/html
status: {}
---
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: "2020-12-03T22:30:07Z"
  labels:
    app: kindhermann
  name: kindhermann
spec:
  ports:
  - name: "80"
    nodePort: 30579
    port: 80
    protocol: TCP
    targetPort: 0
  selector:
    app: kindhermann
  type: NodePort
status:
  loadBalancer: {}

Damit der Apache-Container mit dem MySQL-Container kommunizieren kann, hat sich der Autor der Compose-Datei dafür entschieden, eine Umgebungsvariable namens WORDPRESS_DB_HOST zu verwenden um den Hostnamen des MySQL-Containers anzugeben. Bevor Sie dies in einer Kubernetes-Umgebung ausführen, ändern Sie den Wert von WORDPRESS_DB_HOST zum MySQL-Containernamen (kindhermann in diesem Beispiel) oder 127.0.0.1 (Container innerhalb desselben Pods können über localhost miteinander kommunizieren).

...
    - name: WORDPRESS_DB_HOST
      value: kindhermann OR 127.0.0.1
---

Seitenleiste:

Wenn Compose einen Build durchführt

In vielen Compose-Beispielen entscheidet sich der Autor dafür, sein Container-Image zu erstellen. Dies liegt normalerweise daran, dass sie zusätzliche Pakete benötigen oder ein gewisses Maß an Anpassungen im Image vornehmen möchten. In diesem Fall wird ein zusätzliches neues Bild im Bildspeicher von Podman vorhanden sein. Die Entscheidung, die ausgegebene Kubernetes-YAML auszuführen, schlägt möglicherweise fehl, da sie auf ein Container-Image verweist, das nur im lokalen Speicher vorhanden ist.

Um dies zu beheben, verwenden Sie podman push um diese neuen Images entweder in eine globale Registry wie quay.io oder eine Kubernetes-spezifische Registry zu verschieben, damit Kubernetes diese Images abrufen kann. Stellen Sie sicher, dass der Bildname in der resultierenden YAML-Datei mit dem übertragenen Bild übereinstimmt.

Kubernetes

Der nächste Schritt bei der Weiterführung dieses Beispiels und seiner Anwendung auf eine Kubernetes-Umgebung zeigt, wie dieses Beispiel sowohl auf Minikube als auch auf OpenShift ausgeführt wird. Es gibt nichts Spezifisches in YAML, das verhindert, dass die Pods in einer anderen Kubernetes-Umgebung ausgeführt werden, daher sollte es theoretisch mit anderen Kubernetes-Varianten funktionieren.

Dieser Artikel geht davon aus, dass eine Minikube- und/oder OpenShift-Umgebung vorhanden ist. In diesem Artikel wird die Einrichtung einer Minikube- oder OpenShift-Kubernetes-Umgebung nicht dokumentiert.

Minikube

Der erste Schritt zur Bereitstellung auf Minikube besteht einfach darin, den Pod zu erstellen.

$ minikube kubectl -- create -f wordpress.yaml
pod/kindhermann created
service/kindhermann created

Nachdem Sie einige Sekunden gewartet haben, überprüfen Sie den Status des Pods und der Container. Je nach Geschwindigkeit und Netzwerkbandbreite ist der Pod möglicherweise bereits verfügbar. Überprüfen Sie den Status des Pods mit kubectl get pods .

$ minikube kubectl -- get pods
NAME          READY   STATUS    RESTARTS   AGE
kindhermann   2/2     Running   0          28

Nachdem beide Container bereit sind, testen Sie die Verfügbarkeit der WordPress-Sitzung. Rufen Sie zuerst die IP-Adresse des Pods in Kubernetes mit kubectl ab .

$ minikube kubectl -- describe  pods | grep Node:
Node:         minikube/192.168.39.7

Richten Sie Ihren bevorzugten Browser auf die IP-Adresse des Pods und sehen Sie sich den WordPress-Einrichtungsbildschirm an.

OpenShift

Für diesen Artikel wird ein OpenShift-Cluster auf der GCP ausgeführt.

Verwenden Sie die generierte wordpress.yaml um den Pod und den Dienst zu erstellen. Wenn Sie eine Vanilla-Kubernetes-Umgebung verwenden, ersetzen Sie oc mit kubectl in den folgenden Befehlen.

$ oc create -f wordpress.yaml  
pod/kindhermann created
service/kindhermann created

Warten Sie einige Sekunden, bis der Pod und der Dienst angezeigt werden. Der kindhermann Pod befindet sich in Running Status mit beiden Containern und läuft. Der kindhermann Der Dienst ist auch mit einer ihm zugewiesenen Cluster-IP verfügbar.

$ oc get pods
NAME          READY   STATUS    RESTARTS   AGE
kindhermann   2/2     Running   0          39s
$ oc get services
NAME          TYPE           CLUSTER-IP       EXTERNAL-IP                            PORT(S)        AGE
kindhermann   NodePort       172.30.103.100   <none>                                 80:30579/TCP   45s
Kubernetes    ClusterIP      172.30.0.1       <none>                                 443/TCP        44m
openshift     ExternalName   <none>           Kubernetes.default.svc.cluster.local   <none>         36m

Zeigen Sie den Pod und den Dienst in der Konsole an.

Um von außerhalb des Clusters auf den Dienst zuzugreifen, stellen Sie ihn bereit, wodurch eine Route erstellt wird.

$ oc expose svc/kindhermann
route.route.openshift.io/kindhermann exposed
$ oc/kubectl get routes
NAME          HOST/PORT                                                                          PATH   SERVICES      PORT   TERMINATION   WILDCARD
kindhermann   kindhermann-default.apps.ci-ln-d3gw292-f76d1.origin-ci-int-gce.dev.openshift.com          kindhermann   80                   None

Durch das Verfügbarmachen des Dienstes wurde die oben gezeigte Host-/Port-Route erstellt und auf diesen Endpunkt zugegriffen. Zeigen Sie die Einrichtungsseite der WordPress-Anwendung an, die im OpenShift- oder Kubernetes-Cluster ausgeführt wird.

Untersuchen Sie die Route in der Konsole und greifen Sie von dort auch direkt auf den Endpunkt zu.

[ Holen Sie sich dieses kostenlose E-Book:Verwalten Ihrer Kubernetes-Cluster für Dummies. ]

Abschluss

Wie Sie sehen können, ist das Verschieben von Workload-Konfigurationen von Docker Compose-Umgebungen nach Kubernetes mit Podman 3.0 unkompliziert. Podman bietet nicht nur die Flexibilität von Docker Compose bei der Entwicklung von Anwendungen, sondern erleichtert auch den Wechsel zu Kubernetes, wenn Anwendungen für die großen Ligen bereit sind. All dies geschieht mithilfe des podman generate kube Befehl. Probieren Sie es in drei einfachen Schritten selbst aus.


Docker
  1. So installieren Sie Jenkins mit Docker

  2. So verwenden Sie Docker Compose

  3. Was ist neu in Docker Compose v2?

  4. Was ist Podman und wie unterscheidet es sich von Docker?

  5. Eine Kurzanleitung zur Verwendung von Docker Compose

Kubernetes-Alternativen zu Docker-Befehlen

So stellen Sie Docker Compose Stacks mit Kompose in Kubernetes bereit

So führen Sie Jenkins in Docker mit Docker Compose with Volumes aus

Arbeiten mit Docker-Images über die Befehlszeile

Arbeiten mit Docker-Containern über die Befehlszeile

Installieren und verwenden Sie Docker Compose mit Docker unter Ubuntu 22.04