En este vídeo hemos trabajado toda la parte de crear el Service Mesh, la infraestructura por software para gestionar la comunicación entre los microservicios(descubrimiento, encriptación, monitorización, etc.).
Para ejemplarizar, en el vídeo hemos hecho todo el proceso de instalación de minikube, el cliente de Kubernetes, Helm(Gestor de paquetes de Kubernetes) y Maesh(Herramienta para implementar Service Mesh). Además, hemos simulado una aplicación con dos pods, un primer pod con un servidor Nginx y un segundo pod con un Ubuntu que cada 5 segundos hacia una petición al Nginx.
Instalación de Minikube y el cliente kubectl
Para la instalación de Minikube(Para generar un cluster Kubernetes en local) y la instalación del cliente de Kubernetes ‘kubectl’ voy ha remitiros al siguiente post donde ya se explica “Despliegue de aplicaciones sobre Kubernetes“. Así veis también otros ejemplos.
Creación de la aplicación
Hemos configurado nuestra aplicación en un fichero llamado ‘app.yml’. Básicamente consta de tres objetos de kubernetes: Despliegue de un pod con Nginx, Servicio para acceso al Nginx y un pod con un contenedor con Ubuntu que al arrancar instala ‘curl’ y despues cada 5 segundos hace una petición al Nginx.
El fichero queda de la siguiente manera:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx1 spec: replicas: 1 selector: matchLabels: app: nginx1 template: metadata: labels: app: nginx1 spec: containers: - name: nginx1 image: nginx:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx1-service spec: type: LoadBalancer selector: app: nginx1 ports: - protocol: TCP port: 80 targetPort: 80 --- apiVersion: apps/v1 kind: Deployment metadata: name: ubuntu-deployment labels: app: ubuntu1 spec: replicas: 1 selector: matchLabels: app: ubuntu1 template: metadata: labels: app: ubuntu1 spec: containers: - name: ubuntu1 image: ubuntu:latest command: ["/bin/bash"] args: ["-c", "apt update && apt install -y curl; while true; do curl nginx1-service.default.svc.cluster.local; sleep 5;done"]
No hemos creado imágenes para que cualquiera pudiera hacer el ejercicio en su casa. Para arrancar y para la aplicación simplemente:
# Arrancar kubectl apply -f app.yml # Parar kubectl delete -f app.yml
Instalar Helm
Helm es el gestor de paquetes de Kubernetes y resulta muy útil a la hora de instalar aplicaciones y servicios puesto funciona como cualquier gestor de paquetes, si alguien ha creado un paquete para instalar un servicio será super fácil de instalar.
En este caso, lo hemos instalado de la siguiente manera:
# Descargar wget https://get.helm.sh/helm-v3.2.4-linux-amd64.tar.gz # Descomprimir tar -zxvf helm-v3.2.4-linux-amd64.tar.gz # Copiar en la carpeta bin para tenerlo disponible desde cualquier lugar(Opcional pero recomendable, nosotros no lo hemos hecho en el vídeo) sudo mv ./linux-amd64/helm /usr/local/bin/
Ahora ya podemos instalar aplicaciones y servicios con el gestor de paquetes.
Instalar Maesh
Para instalar Maesh a través del gestor de paquetes deberemos añadir el repositorio, actualizar la lista de paquetes disponibles y finalmente instalar(Como en cualquier gestor de paquestes).
./helm repo add maesh https://containous.github.io/maesh/charts ./helm repo update ./helm install maesh maesh/maesh
Modificar la app para que funcione con Maesh
Ahora ya podemos modificar la app para que funcione con Maesh:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx1 spec: replicas: 1 selector: matchLabels: app: nginx1 template: metadata: labels: app: nginx1 spec: containers: - name: nginx1 image: nginx:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx1-service annotations: maesh.containo.us/ratelimit-average: "100" maesh.containo.us/ratelimit-burst: "200" spec: type: LoadBalancer selector: app: nginx1 ports: - protocol: TCP port: 80 targetPort: 80 --- apiVersion: apps/v1 kind: Deployment metadata: name: ubuntu-deployment labels: app: ubuntu1 spec: replicas: 1 selector: matchLabels: app: ubuntu1 template: metadata: labels: app: ubuntu1 spec: containers: - name: ubuntu1 image: ubuntu:latest command: ["/bin/bash"] args: ["-c", "apt update && apt install -y curl; while true; do curl nginx1-service.default.maesh; sleep 5;done"]
De hecho, solo hemos añadido las dos anotaciones en el servicio para configurar el ‘rate limit'(Línea 27) y cambiado el dominio al que debe acceder(Línea 59).
Espero que hayáis disfrutado del vídeo y hasta la próxima.
Gracias Albert! tengo la siguiente duda, he seguido tus pasos y funciona todo de maravilla hasta que llega el momento de acceder a la plataforma de Prometheus. Ejecuto “minikube service prometheus” y me informa:
|———–|————|————-|————–|
| NAMESPACE | NAME | TARGET PORT | URL |
|———–|————|————-|————–|
| default | prometheus | | No node port |
|———–|————|————-|————–|
* service default/prometheus has no node port
Reviendo el video noto que en tu caso Prometheus figura como nodeport, y en mi caso como ClusterIP. ¿Sabes cómo puedo resolverlo?
Desde ya gracias!!
Tengo una duda, cual es la diferencia entre:
maesh (https://doc.traefik.io/traefik-mesh/v1.0/install) vs “Traefik Mesh” (https://doc.traefik.io/traefik-mesh/install/)
No será que son lo mismo, y una es la acrtualización de la otra ?
Gracias.