Despliegue de una aplicación Python en Kubernetes

Índice

Para desplegar una aplicación escrita en Python en Kubernetes se usan los ficheros yaml que definen los diferentes recursos necesarios para el despliegue.

Despliegue de la aplicación

Estos ficheros pueden incluir: el volumen persistente, el despliegue de la aplicación y de la base de datos, el servicio de la aplicación y de la base de datos y el recurso de tipo ingress para acceder a la aplicación.

  • PVC
  • Deployment MariaDB
  • Deployment App
  • Service MariaDB
  • Service App
  • Ingress
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
    name: pvc-mariadb
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 4Gi
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mariadb
  labels:
    app: mariadb
    tier: backend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mariadb
      tier: backend
  template:
    metadata:
      labels:
        app: mariadb
        tier: backend
    spec:
      volumes:
        - name: volumen-mariadb
          persistentVolumeClaim:
            claimName: pvc-mariadb
      containers:
        - name: contenedor-mariadb
          image: mariadb:10.5
          ports:
            - name: mariadb-server
              containerPort: 3306
          env:
            - name: MARIADB_USER
              valueFrom:
                configMapKeyRef:
                  name: polls-datos
                  key: bd_user
            - name: MARIADB_DATABASE
              valueFrom:
                configMapKeyRef:
                  name: polls-datos
                  key: bd_dbname
            - name: MARIADB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: polls-passwords
                  key: bd_password
            - name: MARIADB_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: polls-passwords
                  key: bd_rootpassword
          volumeMounts:
              - mountPath: "/var/lib/mysql"
                name: volumen-mariadb
apiVersion: apps/v1
kind: Deployment
metadata:
  name: polls
  labels:
    app: polls
    tier: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      app: polls
      tier: frontend
  template:
    metadata:
      labels:
        app: polls
        tier: frontend
    spec:
      containers:
        - name: contenedor-polls
          image: fjhuete/django:v2
          ports:
            - name: polls-port
              containerPort: 3000
          env:
            - name: DB_USER
              valueFrom:
                configMapKeyRef:
                  name: polls-datos
                  key: bd_user
            - name: DB
              valueFrom:
                configMapKeyRef:
                  name: polls-datos
                  key: bd_dbname
            - name: DB_PASS
              valueFrom:
                secretKeyRef:
                  name: polls-passwords
                  key: bd_password
            - name: DB_HOST
              valueFrom:
                configMapKeyRef:
                  name: polls-datos
                  key: bd_host
            - name: DJANGO_MAIL
              valueFrom:
                configMapKeyRef:
                  name: polls-datos
                  key: django_mail
            - name: DJANGO_USER
              valueFrom:
                configMapKeyRef:
                  name: polls-datos
                  key: django_user
            - name: DJANGO_PASS
              valueFrom:
                secretKeyRef:
                  name: polls-passwords
                  key: django_password
apiVersion: v1
kind: Service
metadata:
  name: mariadb
  labels:
    app: mariadb
    tier: backend
spec:
  type: ClusterIP
  ports:
  - port: 3306
    targetPort: mariadb-server
  selector:
    app: mariadb
    tier: backend
apiVersion: v1
kind: Service
metadata:
  name: polls
  labels:
    app: polls
    tier: frontend
spec:
  type: NodePort
  ports:
  - port: 3000 
    targetPort: polls-port
  selector:
    app: polls
    tier: frontend
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: polls
spec:
  rules:
  - host: www.polls-javi.org
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service: 
            name: polls
            port:
              number: 3000

Además, como para el despliegue se usan varias imágenes Docker parametrizadas, es necesario definir en el cluster de Kubernetes los recursos de tipo configMap y Secret necesarios.

kubectl create cm polls-datos --from-literal=bd_user=user_django \
                              --from-literal=bd_dbname=django \
                              --from-literal=bd_host=mariadb \
                              --from-literal=django_mail=mail@mail.org \
                              --from-literal=django_user=admin

kubectl create secret generic polls-passwords --from-literal=bd_password=password1234 \
                                              --from-literal=bd_rootpassword=root1234 \
                                              --from-literal=django_password=admin

Después, se aplican todos estos ficheros para la creación de los recursos en el cluster.

kubectl apply -f .

Actualización de la aplicación

Antes de actualizar la aplicación conviene anotar cada versión desplegada para mantener el control de versiones.

kubectl annotate deployment/polls kubernetes.io/change-cause="Primer despliegue"
kubectl annotate deployment/mariadb kubernetes.io/change-cause="Primer despliegue"

Para actualizar la aplicación, se modifica el fichero de despliegue.

    containers:
        - name: contenedor-polls
          image: fjhuete/django:v2
          ports:

Y se aplican los cambios.

kubectl apply -f polls-deployment.yaml

Para mantener el control de versiones, se anota el cambio.

kubectl annotate deployment/polls kubernetes.io/change-cause="Segundo despliegue"

Así, en el historial de despliegue se guardan los cambios de versión.

❯ kubectl rollout history deployment/polls
deployment.apps/polls 
REVISION  CHANGE-CAUSE
1         Primer despliegue
2         Segundo despliegue
comments powered by Disqus

Relacionados

Instalación de Wireshark y GNS3 en Debian 12 y Windows 10

Wireshark y GNS3 son dos programas fundamentales para el trabajo de un administrador de redes pero instalarlos puede suponer algunos desafíos. Aquí se incluye una guía de instalación de Wireshark y GNS3 en Windows 10 y en Debian 12

Leer

Ejecutar un pipeline de Jenkins con cada actualización de un repositorio

Para que Jenkins ejecute un pipeline cada vez que se actualice un repositorio git se pueden establecer varias configuraciones diferentes. En este caso, se incluye el Jenkinsfile en el repositorio de GitHub.

Leer

Túneles IPv6: túneles 6to4

En este post se muestra, a través de un ejemplo práctico, el funcionamiento de los túneles IPv6. Estos túneles permiten que el tráfico que va de una a otra dirección IPv6 pase por redes que funcionan usando el portocolo IPv4.

Leer