Skip to main content

Kubernetes: Despliegues parametrizados

Ejercicio 1: Configurando nuestra aplicación Temperaturas

En un ejemplo anterior: Ejemplo completo: Desplegando y accediendo a la aplicación Temperaturas habíamos desplegado una aplicación formada por dos microservicios que nos permitía visualizar las temperaturas de municipios.

Recordamos que el componente frontend hace peticiones al componente backend utilizando el nombre temperaturas-backend, que es el nombre que asignamos al Service ClusterIP para el acceso al backend.

Vamos a cambiar la configuración de la aplicación para indicar otro nombre.

Podemos configurar el nombre del servidor backend al que vamos a acceder desde el frontend modificando la variable de entorno TEMP_SERVER a la hora de crear el despliegue del frontend.

Por defecto el valor de esa variable es:

TEMP_SERVER temperaturas-backend:5000

Ficheros:

  • frontend-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: temperaturas-frontend
labels:
app: temperaturas
tier: frontend
spec:
replicas: 3
selector:
matchLabels:
app: temperaturas
tier: frontend
template:
metadata:
labels:
app: temperaturas
tier: frontend
spec:
containers:
- name: contenedor-temperaturas
image: iesgn/temperaturas_frontend
ports:
- name: http-server
containerPort: 3000
  • frontend-srv.yaml
apiVersion: v1
kind: Service
metadata:
name: temperaturas-frontend
labels:
app: temperaturas
tier: frontend
spec:
type: NodePort
ports:
- port: 3000
targetPort: http-server
selector:
app: temperaturas
tier: frontend
  • backend-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: temperaturas-backend
labels:
app: temperaturas
tier: backend
spec:
replicas: 1
selector:
matchLabels:
app: temperaturas
tier: backend
template:
metadata:
labels:
app: temperaturas
tier: backend
spec:
containers:
- name: contendor-servidor-temperaturas
image: iesgn/temperaturas_backend
ports:
- name: api-server
containerPort: 5000
  • backend-srv.yaml
apiVersion: v1
kind: Service
metadata:
name: temperaturas-backend
labels:
app: temperaturas
tier: backend
spec:
type: ClusterIP
ports:
- port: 5000
targetPort: api-server
selector:
app: temperaturas
tier: backend
  • ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: temperaturas-ingress
spec:
rules:
- host: www.temperaturas.org
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: temperaturas
port:
number: 3000

Vamos a modificar esta variable en el despliegue del frontend y cambiaremos el nombre del Service del backend para que coincidan, para ello realiza los siguientes pasos:

  1. Crea un recurso ConfigMap con un dato que tenga como clave SERVIDOR_TEMPERATURAS y como contenido servidor-temperaturas:5000.

    kubectl create configmap servidor-temperaturas --from-literal=SERVIDOR_TEMPERATURAS=servidor-temperaturas:5000 kubectl get configmap

  2. Modifica el fichero de despliegue del frontend: frontend-deployment.yaml para añadir la modificación de la variable TEMP_SERVER con el valor que hemos guardado en el ConfigMap.

        env:
- name: TEMP_SERVER
valueFrom:
configMapKeyRef:
name: servidor-temperaturas
key: SERVIDOR_TEMPERATURAS
  1. Realiza el despliegue y crea el Service para acceder al frontend.

    kubectl apply -f frontend-deployment.yaml kubectl apply -f frontend-srv.yaml

  2. Despliega el microservicio backend.

    kubectl apply -f backend-deployment.yaml

  3. Modifica el fichero backend-srv.yaml para cambiar el nombre del Service por servidor-temperaturas y crea el Service.

    metadata:
name: servidor-temperaturas
kubectl apply -f backend-srv.yaml
  1. Accede a la aplicación usando el puerto asignado al Service NodePort del frontend o creando el recurso Ingress.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: temperaturas
labels:
app: temperaturas
type: frontend
spec:
rules:
- host: www.temperaturas.org
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: temperaturas-frontend
port:
number: 3000
kubectl apply -f ingress.yaml

Entrega

1. Pantallazo donde se vea la definición del recurso ConfigMap.

K8S

2. Pantallazo donde se vea la modificación del fichero frontend-deployment.yaml.

K8S

3. Pantallazo donde se vea la modificación del fichero backend-srv.yaml.

K8S

4. Pantallazo donde se compruebe que la aplicación está funcionando.

K8S

Ejercicio 2: Despliegue y acceso de la aplicación Nextcloud

Basándonos en el Ejemplo completo: Despliegue y acceso a Wordpress + MariaDB vamos a realizar el despliegue de la aplicación NextCloud + MariaDB. Para ello ten en cuenta lo siguiente:

  • El despliegue de la base de datos se haría de la misma forma que encontramos en el ejemplo de Wordpress, pero para esta actividad vamos a usar la imagen mariadb:10.5.
  • Según la documentación de NextCloud en DockerHub las variables de entorno que tienes que modificar serían: MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD y MYSQL_HOST.
  • Al igual que en el ejemplo utiliza un recurso ConfigMap para guardar los valores de configuración no sensibles, y un recurso Secret para los datos sensibles.
  • Utiliza los ficheros yaml del ejemplo haciendo las modificaciones oportunas.
kubectl create configmap bd-datos --from-literal=bd_user=nazareth \
--from-literal=bd_dbname=nextcloud \
--from-literal=bd_host=mariadb-service \
-o yaml --dry-run=client > configmap-bd.yaml
kubectl create secret generic bd-secret --from-literal=bd_password=nazareth \
--from-literal=bd_root_password=nazareth \
-o yaml --dry-run=client > configmap-bd-secret.yaml
  • nextcloud-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nextcloud-deployment
labels:
app: nextcloud
type: frontend
spec:
replicas: 1
selector:
matchLabels:
app: nextcloud
type: frontend
template:
metadata:
labels:
app: nextcloud
type: frontend
spec:
containers:
- name: nextcloud
image: nextcloud:latest
ports:
- containerPort: 80
name: nextcloud-http
- containerPort: 443
name: nextcloud-https
env:
- name: MYSQL_DATABASE
valueFrom:
configMapKeyRef:
name: bd-datos
key: bd_dbname
- name: MYSQL_USER
valueFrom:
configMapKeyRef:
name: bd-datos
key: bd_user
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: bd-secret
key: bd_password
- name: MYSQL_HOST
valueFrom:
configMapKeyRef:
name: bd-datos
key: bd_host
  • nextcloud-srv.yaml
apiVersion: v1
kind: Service
metadata:
name: nextcloud-service
labels:
app: nextcloud
type: frontend
spec:
type: NodePort
ports:
- name: http-nextcloud-srv
port: 80
targetPort: nextcloud-http
selector:
app: nextcloud
type: frontend
  • mariadb-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mariadb-deployment
labels:
app: nextcloud
type: database
spec:
replicas: 1
selector:
matchLabels:
app: nextcloud
type: database
template:
metadata:
labels:
app: nextcloud
type: database
spec:
containers:
- name: mariadb
image: mariadb:10.5
ports:
- containerPort: 3306
name: mariadb-port
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: bd-secret
key: bd_root_password
- name: MYSQL_DATABASE
valueFrom:
configMapKeyRef:
name: bd-datos
key: bd_dbname
- name: MYSQL_USER
valueFrom:
configMapKeyRef:
name: bd-datos
key: bd_user
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: bd-secret
key: bd_password
  • mariadb-srv.yaml
apiVersion: v1
kind: Service
metadata:
name: mariadb-service
labels:
app: nextcloud
type: database
spec:
selector:
app: nextcloud
type: database
ports:
- port: 3306
targetPort: mariadb-port
type: ClusterIP

Para borrar un servicio:

kubectl delete service mariadb-service

Entrega

1. Pantallazo donde se vea el contenido del fichero de despliegue de NextCloud.

K8S

2. Pantallazo donde se vean los recursos que se han creado.

K8S

3. Pantallazo donde se compruebe que la aplicación está funcionando.

K8S