PHP con MongoDB¶
Aplicación PHP con MongoDB en Kubernetes
Introducción¶
En este workshop vamos a ver cómo implementar una aplicación PHP tipo Libro de Visitas con varios niveles utilizando Kubernetes y Docker, con una instancia única de MongoDB para almacenar las entradas del libro de visitas y varias instancias de frontend web.
Requisitos¶
- Una cuenta gratuita de IBM Cloud. Te podes registrar acá si no tenes una aun.
- Un Cluster de Kubernetes gratuito en IBM Cloud. Obtener acá.
- Tener habilitados los comandos
ibmcloudykubectl. Configurar CLI.
Tiempo estimado¶
El tiempo estimado que puede llevar este workshop es de 30 minutos
Pasos¶
- Implementar MongoDB.
- Crear el Servicio de MongoDB
- Configurar y exponer la interfaz del libro de visitas
- Creando el Servicio Frontend
- EXTRA: Escalar el servicio Frontend
1. Iniciar la base de datos de MongoDB¶
Creación de la implementación de MongoDB. El archivo mongo-deployment.yaml especifica un controlador que ejecuta una única réplica de MongoDB.
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongo
labels:
name: mongo
component: backend
spec:
selector:
matchLabels:
name: mongo
component: backend
replicas: 1
template:
metadata:
labels:
name: mongo
component: backend
spec:
containers:
- name: mongo
image: mongo:4.2
args:
- --bind_ip
- 0.0.0.0
resources:
requests:
cpu: 100m
memory: 100Mi
ports:
- containerPort: 27017
Para aplicar la implementación contenida en el archivo mongo-deployment.yaml, usar el siguiente comando:
kubectl apply -f mongo-deployment.yaml
kubectl get pods
kubectl logs -f deployment/mongo
2. Crear el Servicio de MongoDB¶
La aplicación de Libro de Visitas debe comunicarse con MongoDB para escribir la información. Se debe aplicar un servicio que defina la política de acceso para el tráfico de la información. Esto se define con el contenido del archivo mongo-service.yaml que se detalla a continuación:
apiVersion: v1
kind: Service
metadata:
name: mongo
labels:
name: mongo
component: backend
spec:
ports:
- port: 27017
targetPort: 27017
selector:
name: mongo
component: backend
kubectl apply -f mongo-service.yaml
kubectl get service
3. Configurar y exponer la interfaz del libro de visitas¶
El Libro de Visitas tiene una interfaz web que atiende las solicitudes HTTP escritas en PHP. Está configurado para conectarse al Servicio de MongoDB para almacenar entradas del Libro de Visitas.
La implementación del Frontend del Libro de Visitas se detalla en el contenido del archivo frontend-deployment.yaml a continuación:
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
labels:
name: guestbook
component: frontend
spec:
selector:
matchLabels:
name: guestbook
component: frontend
replicas: 3
template:
metadata:
labels:
name: guestbook
component: frontend
spec:
containers:
- name: guestbook
image: marcelorum/gb-frontend:v5
resources:
requests:
cpu: 100m
memory: 100Mi
env:
- name: GET_HOSTS_FROM
value: dns
ports:
- containerPort: 80
Nota: Si la imágen da error, probar con esta otra gcr.io/google-samples/gb-frontend:v5
Aplicar la implementación de frontend con el archivo frontend-deployment.yaml:
kubectl apply -f frontend-deployment.yaml
kubectl get pods -l name=guestbook -l component=frontend
4. Creando el Servicio Frontend¶
Para que el Libro de Visitas sea accedido externamente, tenemos que crear un servicio y exponer el puerto externamente. Esto lo podemos hacer aplicando el contenido del archivo frontend-service.yaml que se detalla a continuación:
apiVersion: v1
kind: Service
metadata:
name: frontend
labels:
name: guestbook
component: frontend
spec:
type: LoadBalancer
ports:
- port: 80
selector:
name: guestbook
component: frontend
Nota: La ventaja de estar usando Kubernetes en IBM Cloud, es que admite el uso de balanceadores de carga externos. Por eso usamos el siguiente componente
type: LoadBalancer.
Aplicar el servicio con el archivo frontend-service.yaml:
kubectl apply -f frontend-service.yaml
kubectl get service frontend
kubectl get nodes -o wide
5. EXTRA: Escalar el servicio Frontend¶
Puede escalar hacia arriba o hacia abajo según sea necesario porque sus servidores están definidos como un Servicio que usa un controlador de implementación.
Para escalar el número de Pods de Frontend usar el siguiente comando:
kubectl scale deployment frontend --replicas=5
kubectl get pods
kubectl scale deployment frontend --replicas=2
kubectl get pods
Limpieza¶
Al eliminar las implementaciones y los servicios, también se eliminan los pods en ejecución. Se pueden utilizar etiquetas para eliminar varios recursos con un solo comando.
Para eliminar todos los Pods, Implementaciones y Servicios, usar los siguientes comandos:
kubectl delete deployment -l name=mongo
kubectl delete service -l name=mongo
kubectl delete deployment -l name=guestbook
kubectl delete service -l name=guestbook
Resumen / Conclusión¶
En este workshop vimos como implementar una aplicación web en PHP aplicada desde una imagen de Docker Hub, conectada a un servicio de base de datos MongoDB implementada en este mismo ejercicio y conectada a través de un Servicio creado para tal fin. Además vimos como escalar y reducir el número de Pods de la aplicación Frontend. Por último, limpiamos toda la implementación.