Ejecución de ficheros YAML de Kubernetes con Systemd y Quadlet

En este ejemplo vamos a crear una unidad de Systemd que cree un Pod a partir de un YAML de Kubernetes ejecutando internamente podman kube play.

Puedes encontrar los ficheros que vamos a utilizar en el directorio modulo6/pod del Repositorio con el código de los ejemplos.

El contenido del fichero opt/web-pod.yaml es el siguiente:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2024-04-05T06:53:21Z"
  labels:
    app: webserver-pod
  name: webserver-pod
spec:
  containers:
  - args:
    - /usr/bin/run-httpd
    image: quay.io/fedora/httpd-24:2.4
    name: webserver
    ports:
    - containerPort: 8080
      hostPort: 8090
    securityContext:
      runAsNonRoot: true

A continuación, creamos una plantilla de unidad de Systemd, en el directorio $HOME/.config/containers/systemd, llamada web.kube y el fichero opt/web-pòd.yaml en el directorio /opt del sistema:

[Unit]
Description=Servidor web a partir de definición YAML de Kubernetes

[Kube]
Yaml=/opt/web-pod.yaml

[Install]
WantedBy=multi-user.target default.target

Podemos iniciar la unidad de Systemd y comprobar los recursos creados:

$ systemctl --user daemon-reload

$ systemctl --user start web

$ podman pod ps
POD ID        NAME           STATUS      CREATED        INFRA ID      # OF CONTAINERS
26d86d7df4ab  webserver-pod  Running     8 seconds ago  4511359a3f29  2

$ podman ps --pod
CONTAINER ID  IMAGE                                    COMMAND               CREATED         STATUS         PORTS                 NAMES                    POD ID        PODNAME
6dacfe911f42  quay.io/fedora/httpd-24:2.4              /usr/bin/run-http...  17 seconds ago  Up 15 seconds  0.0.0.0:8090->8080/tcp  webserver-pod-webserver  1f94f1bf3daf  webserver-pod

Ejecución de Pods con Systemd y Quadlet (Podman 5)

En este ejemplo, vamos a gestionar un Pod rootful con un contenedor ofreciendo un servidor web de prueba. Para ello vamos a usar la versión 5 de Podman:

$ podman --version
podman version 5.0.0

Para ello vamos a crear dos plantillas de unidad de Systemd, en el directorio /etc/containers/systemd.

En la plantilla pod_web.pod definimos el Pod indicando el nombre y el puerto que va a mapear:

[Pod]
PodName=pod-servidorweb
PublishPort=8889:80

Además podríamos indicar la red a la que está conectada el Pod usando el parámetro Network y el volumen compartido para los contenedores con el parámetro Volume.

A continuación definimos el contenedor en la plantilla webserver.container:

[Unit]
Description=Un contenedor webserver en un Pod

[Container]
Image=quay.io/libpod/banner
ContainerName=contenedor_webserver
Pod=pod_web.pod

[Service]
Restart=always
TimeoutStartSec=900

[Install]
WantedBy=multi-user.target default.target

Y podemos iniciar el servicio, ejecutando:

$ sudo systemctl start webserver

Comprobamos los recursos que hemos creado:

$ sudo podman pod ps --ctr-names
POD ID        NAME             STATUS      CREATED         INFRA ID      NAMES
a05c8648fb84  pod-servidorweb  Running     57 seconds ago  e4add95514e8  a05c8648fb84-infra,contenedor_webserver

Y finalmente, comprobamos que funciona:

$ curl http://localhost:8889
   ___          __              
  / _ \___  ___/ /_ _  ___ ____ 
 / ___/ _ \/ _  /  ' \/ _ `/ _ \
/_/   \___/\_,_/_/_/_/\_,_/_//_/

Actualizado: