Get it on Google Play
Tu partner Freelance para tus proyectos IT

Service Mesh con Kubernetes y Maesh | Formación Microservicios

03-07-2020

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.

Service Mesh con Maesh

Service Mesh con Maesh

Si te ha servido, por favor comparte
 

Comments

One Response to “Service Mesh con Kubernetes y Maesh | Formación Microservicios”
  1. Nico says:

    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!!

Leave a Reply