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

Conceptos de gestión de paquetería en Debian

En este post se recoge un breve resumen sobre la información relativa a los gestores de paquetes apt y aptitude incluida en el manual de referencia de Debian.

Leer

Creación de Services en kubernetes

Los servicios en Kubernetes permiten a otros pods o al usuario acceder al servicio que ofrece otro pod.

Leer

Gestión de redes en Openstack

En este post se muestra un caso práctica de gestión de redes en un escenario de OpenStack formado por una instancia que funciona como router y otra máquina, conectada a una red interna, que cuenta con un servidor web.

Leer