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

Guía básica de configuración de Nginx

En este post se recoge una guía básica del uso del servidor web Nginx a partir de un supuesto práctico.

Leer

Despliegue de Roundcube usando Docker

Para conectarse a un servidor de correo propio se puede usar un cliente de escritorio o, en este caso, un webmail. En este ejemplo se usa el cliente de correo web se puede desplegar usando Docker. En este caso, se usa la imagen de la aplicación web de correo roundcube.

Leer

Despliegue de una aplicación en Kubernetes usando Helm

Helm es una herramienta que permite instalar aplicaciones en un cluster de Kubernetes de forma sencilla en pocos pasos.

Leer