Gustavo Wilgenhoff Cuento cosas de programación

Administrar Kubernetes con Python y Pulumi

La infraestructura como código es una poderosa técnica para automatizar el despliegue de una plataforma en la nube. Como todo proceso de escritura de código se puede aplicar las buenas prácticas de modularización, mantenibilidad y el uso de pruebas automáticas. También nos debería permitir escribir toda la configuración de la infraestructura en nuestro lenguaje de programación favorito.

En este caso haremos una prueba con Pulumi que es un framework de IoC para crear un despliegue en Kubernetes utilizando Python. Lo primero que necesitamos hacer es instalar Pulumi. Seguimos los pasos que nos indica la documentación.

Para esta prueba además necesitaremos registrar un usuario en su portal.

Para iniciar un proyecto, creamos un directorio donde pondremos los fuentes.

mkdir ngx-python
cd ngx-python

Luego utilizamos una plantilla para crear el proyecto con Python.

pulumi new kubernetes-python

Pulsamos ENTER en todas las opciones del asistente para confirmar los valores por defecto.

Creando un proyecto de Pulumi

Editamos el archivo _main_.py

import pulumi
from pulumi_kubernetes import meta
from pulumi_kubernetes.apps.v1 import Deployment, DeploymentSpecArgs
from pulumi_kubernetes.meta.v1 import LabelSelectorArgs, ObjectMetaArgs
from pulumi_kubernetes.core.v1 import ContainerArgs, Namespace 
from pulumi_kubernetes.core.v1 import PodSpecArgs, PodTemplateSpecArgs

app_labels = { "app": "nginx" }

namespace = Namespace(
    "nginx", 
    metadata=ObjectMetaArgs(name="nginx")
    )   

deployment = Deployment(
    "nginx",
    metadata=ObjectMetaArgs(
        name="nginx",
        namespace=namespace.metadata.name
    ),
    spec=DeploymentSpecArgs(
        selector=LabelSelectorArgs(match_labels=app_labels),
        replicas=1,
        template=PodTemplateSpecArgs(
            metadata=ObjectMetaArgs(labels=app_labels),
            spec=PodSpecArgs(
                  containers=
                    [ContainerArgs(name="nginx", image="nginx")]
                 )
        ),
    ))

pulumi.export("name", deployment.metadata["name"])

Creamos un namespace y desplegamos allí un pod con una imagen de Nginx

Para ejecutar el script, simplemente ejecutar en línea de comando

pulumi up

A continuación se muestra un resumen del despliegue y espera confirmación. Si aceptamos se aplica el despliegue y crea el namespace y el pod.

Despliegue creado

A partir de ahora Pulumi lleva el registro del estado del cluster. Si realizamos algún cambio en el código, el estado cambia. Por ejemplo, probamos cambiar el nombre del namespace.

namespace = Namespace(
    "nginx", 
    metadata=ObjectMetaArgs(name="pulumi")
    )   

Luego aplicamos los cambios

pulumi up

Actualizar estado

Si tuviéramos que modificarlo a mano necesitaríamos borrar el namespaces y el pod. En cambio todas estas tareas las ejecuta Pulumi automáticamente para que el estado del cluster coincida con lo que escribimos en código.

Referencias