GNU/Linux >> Linux Esercitazione >  >> Panels >> Docker

Da Docker Compose a Kubernetes con Podman

Lo strumento Docker Compose è stato prezioso per molte persone che hanno lavorato con i container. Secondo la documentazione, Docker Compose si descrive come:

... uno strumento per la definizione e l'esecuzione di applicazioni multi-container. Con Compose, utilizzi un file YAML per configurare i servizi della tua applicazione. Quindi, con un solo comando, crei e avvii tutti i servizi dalla tua configurazione.

Una sfida con Docker Compose è che il formato di file YAML funziona solo con il motore Docker. Sebbene tu possa fornirlo ad altri utenti Docker per la replica locale, non possono usarlo con altri runtime del contenitore. Cioè, fino ad ora.

[ Tutorial correlato:Utilizzo di Podman e Docker Compose ]

Con Podman 3.0, Docker Compose funziona con un backend Podman

Il vero potere di Podman traspare facilmente convertendo i contenitori basati su Docker Compose in un file YAML Kubernetes. Come Docker Compose, Podman può utilizzare il file YAML di Kubernetes per replicare i contenitori in locale. Ancora più importante, ciò consente a Podman di avere un pod e un servizio orchestrati che possono essere eseguiti su molte piattaforme, inclusi Kubernetes/OpenShift o minikube.

Questo articolo spiega il processo di avvio con un semplice file Compose che esegue WordPress utilizzando due contenitori. L'origine di questo file Compose è pubblicata su GitHub nel repository Awesome-Compose di Docker. L'uso corretto di questo file con Podman fa sì che la schermata di configurazione iniziale di WordPress venga visualizzata in un browser.

Nota :Al momento della stesura di questo documento, supportiamo solo docker-compose comando eseguito alla radice.

Avvia il servizio di sistema di Podman

Per utilizzare Compose, il primo passaggio è assicurarsi che tutti i pacchetti richiesti siano installati e quindi configurare il servizio di sistema Podman (3.0 o successivo) utilizzando systemd . Dopo aver installato i pacchetti, abilita e avvia Podman systemd servizio socket-activated utilizzando il seguente comando:

$ sudo systemctl enable --now podman.socket

Verifica che il servizio sia in esecuzione colpendo l'endpoint ping. Questo passaggio deve avere esito positivo prima di procedere ulteriormente.

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

Ora puoi eseguire Compose con sicurezza sapendo che l'API RESTful funziona.

Esegui Componi

Come accennato in precedenza, l'esempio eseguirà un file Compose composto da due contenitori per visualizzare una sessione di WordPress. Un container esegue un servizio Web Apache e l'altro archivia i dati in un database MySQL. I due contenitori comunicano tramite TCP/IP su una rete dedicata a questa istanza di Compose. Per visualizzare i contenitori, esegui docker-compose up .

$ 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

Usa il podman ps comando per verificare che due contenitori siano stati creati e siano ora in esecuzione. Non era necessario alcun demone Docker.

$ 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
$

Verifica che WordPress sia in esecuzione in locale

Le istruzioni per l'esecuzione di WordPress indicano che funziona correttamente ed è possibile accedervi utilizzando localhost e la porta 80.

Crea il Kubernetes YAML

Con un'istanza funzionante di WordPress sul computer locale, inizia il processo di replica di questi contenitori su una piattaforma Kubernetes. Podman può generare YAML basato su Kubernetes dai contenitori in esecuzione.

[ Potresti anche leggere: Inizia ad imparare Kubernetes dalla tua macchina locale ]

Un pod o più pod?

Esistono due approcci per la creazione di YAML che utilizzerai nell'ambiente Kubernetes:inserire due contenitori in un unico pod con un servizio o creare due pod, con un contenitore ciascuno, e un servizio per esporre il front-end Apache. La determinazione dell'approccio migliore potrebbe richiedere alcuni tentativi ed errori.

Una considerazione che può determinare quale approccio utilizzare è il modo in cui i contenitori o i pod comunicheranno. Quando Compose ha creato questi contenitori, ha eseguito una serie di passaggi per garantire che i due contenitori potessero comunicare tra loro utilizzando nomi DNS. In effetti, Compose imposta alias sui contenitori che vengono riconosciuti come nomi DNS durante la risoluzione dei contenitori in base al nome. Inserendo i contenitori all'interno dello stesso pod, non è necessaria la risoluzione dei nomi tra di loro perché condividono uno spazio dei nomi di rete. Pertanto, possono semplicemente utilizzare localhost per comunicare tra loro.

Posizionare i contenitori in diversi pod Kubernetes offre una maggiore flessibilità, ma i contenitori dovranno comunicare tra loro utilizzando un altro meccanismo.

Genera lo YAML

Devi conoscere i nomi o gli ID dei contenitori per iniziare a creare il Kubernetes YAML. Decidi se Podman deve generare una descrizione del servizio per Kubernetes. In questo caso, esponi il front-end di Apache in modo che possa interagire con WordPress utilizzando il browser. Usa il podman generate kube comando per creare file YAML.

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

Il -s nel comando precedente significa che Podman genererà il servizio per questo pod. Il -f l'opzione ci consente di salvare lo YAML generato in un file. In caso contrario, l'output viene inviato a stdout , dove può essere reindirizzato a un file.

$ 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: {}

Affinché il container Apache comunichi con il container MySQL, l'autore del file Compose ha scelto di utilizzare una variabile di ambiente denominata WORDPRESS_DB_HOST per indicare il nome host del contenitore MySQL. Prima di eseguirlo in un ambiente Kubernetes, modifica il valore di WORDPRESS_DB_HOST al nome del contenitore MySQL (kindhermann in questo esempio) o 127.0.0.1 (i contenitori all'interno dello stesso pod possono comunicare tra loro tramite localhost).

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

Barra laterale:

Quando Compose esegue una build

In molti esempi di Compose, l'autore sceglie di costruire la propria immagine contenitore. Questo di solito è perché richiedono pacchetti aggiuntivi o vogliono eseguire un certo livello di personalizzazione nell'immagine. Quando ciò si verifica, ci sarà una nuova immagine aggiuntiva nell'archivio immagini di Podman. La scelta di eseguire il Kubernetes YAML generato potrebbe non riuscire perché fa riferimento a un'immagine del contenitore che è presente solo nell'archivio locale.

Per rimediare, usa podman push per spostare queste nuove immagini in un registro globale come quay.io o in un registro specifico di Kubernetes in modo che Kubernetes possa estrarre queste immagini. Assicurati che il nome dell'immagine nel file YAML risultante sia lo stesso dell'immagine di cui è stato eseguito il push.

Kubernetes

Il passaggio successivo per portare avanti questo esempio e applicarlo a un ambiente Kubernetes mostrerà come eseguire questo esempio sia su minikube che su OpenShift. Non c'è nulla di specifico in YAML che impedisca ai pod di funzionare in un altro ambiente Kubernetes, quindi teoricamente dovrebbe funzionare con altre versioni di Kubernetes.

Questo articolo presuppone l'esistenza di un ambiente minikube e/o OpenShift. Non rientra nell'ambito di questo articolo documentare la configurazione di un ambiente minikube o OpenShift Kubernetes.

minikube

Il primo passaggio per l'implementazione su minikube è semplicemente creare il pod.

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

Dopo aver atteso qualche secondo, controlla lo stato del pod e dei container. A seconda della velocità e della larghezza di banda della rete, il pod potrebbe essere già disponibile. Controlla lo stato del pod usando kubectl get pods .

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

Ora che entrambi i container sono pronti, verifica la disponibilità della sessione di WordPress. Innanzitutto, ottieni l'indirizzo IP del pod in Kubernetes utilizzando kubectl .

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

Punta il tuo browser preferito all'indirizzo IP del pod e guarda la schermata di configurazione di WordPress.

OpenShift

Per questo articolo, un cluster OpenShift è in esecuzione su GCP.

Usa il wordpress.yaml generato per creare il pod e il servizio. Se utilizzi un ambiente Kubernetes vanilla, sostituisci oc con kubectl nei seguenti comandi.

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

Attendi qualche secondo per l'avvio del pod e del servizio. Il gentiluomo pod è in In esecuzione stato con entrambi i contenitori attivi e in esecuzione. Il gentiluomo il servizio è disponibile anche con un IP del cluster assegnato.

$ 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

Visualizza il pod e il servizio nella console.

Per accedere al servizio dall'esterno del cluster, esporlo, che creerà un percorso.

$ 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

L'esposizione del servizio ha creato la route host/porta mostrata sopra e l'accesso a tale endpoint. Visualizza la pagina di configurazione dell'applicazione WordPress in esecuzione nel cluster OpenShift o Kubernetes.

Esamina il percorso nella console e accedi direttamente all'endpoint anche da lì.

[ Ottieni questo ebook gratuito:Gestione dei cluster Kubernetes per i manichini. ]

Concludi

Come puoi vedere, lo spostamento delle configurazioni del carico di lavoro dagli ambienti Docker Compose a Kubernetes è semplice con Podman 3.0. Podman non solo offre la flessibilità di Docker Compose durante lo sviluppo di applicazioni, ma semplifica anche il passaggio a Kubernetes quando le applicazioni sono pronte per i grandi campionati. Fa tutto questo usando il podman generate kube comando. Provalo tu stesso in tre semplici passaggi.


Docker
  1. Come installare Jenkins con Docker

  2. Come usare Docker Compose

  3. Come proteggere i dati sensibili con Docker Compose Secrets

  4. Cosa c'è di nuovo in Docker Compose v2?

  5. Una guida rapida all'uso di Docker Compose

Alternative Kubernetes ai comandi Docker

Come distribuire Docker Compose Stack su Kubernetes con Kompose

Come eseguire Jenkins in Docker usando Docker Compose con volumi

Utilizzo delle immagini Docker dalla riga di comando

Utilizzo dei contenitori Docker dalla riga di comando

Installa e usa Docker Compose con Docker su Ubuntu 22.04