Despliegue de una aplicación Python en Kubernetes
- Francisco Javier Huete
- Servicios
- March 9, 2025
Í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