Microk8s mi primer prueba

Microk8s tiene soporte empresarial de Canonical lo que lo convierte en una buena opción para producción. Estuve probando cómo funciona y quedé impresionado tanto por estabilidad como por sencillez.

Instalación

Primero desplegué un Ubuntu Cloud Image y la configuré con mi usuario y una IP fija tal como explico en mi articulo sobre cómo Instalar Ubuntu Cloud Image y configurar con mi usuario y password y luego me conecté por SSH.

Instalé Microk8s simplemente con el siguiente comando
sudo snap install microk8s --classic
En mi VM Ubuntu no habilité el Firewall, pero si lo hubiera hecho, habría tenido que ejecutar:
sudo ufw allow in on cni0
sudo ufw allow out on cni0
sudo ufw default allow routed
Luego algunas configuraciones extra para el usuario:
sudo usermod -a -G microk8s $USER
sudo mkdir ~/.kube && sudo chown -R $USER ~/.kube
sudo newgrp microk8s
Y verifiqué si está todo bien:
microk8s status

Habilitando add-ons

Ahora pude habilitar dashboard y dns:
microk8s enable dns
microk8s enable dashboard

Para probar el dashboard, necesitamos iniciar el proxy:
microk8s dashboard-proxy

Para ingresar al Dashboard debemos utilizar la dirección que aparece en pantalla pero reemplazando "127.0.0.1" por la IP de la VM:


Probando el Ingress

Una de las maravillas de Microk8s es que el Ingress se configura para que utilice la IP de la Máquina Virtual, por lo tanto no hace falta usar un Load Balancer para que funcione y, técnicamente, tampoco un FQDN. Y eso hice siguiendo los pasos del artículo de Phenixnap para configurar el servicio. En resumen:
microk8s enable ingress
curl 127.0.0.1  # debemos ver Nginx
Editamos el config map:
microk8s kubectl -n ingress edit configmaps nginx-load-balancer-microk8s-conf
Y agregamos las siguientes líneas justo después de "kind: ConfigMap" para que quede así:
kind: ConfigMap
data:
  use-forwarded-headers: "true"
Desplegué una aplicación de demo:
microk8s kubectl create ns dotnet-demo
microk8s kubectl -n dotnet-demo create deploy dotnet-demo-app --image=bdamian/dotnet-demo-app
Luego creé un servicio del tipo ClusterIp para mi aplicación:
microk8s kubectl -n dotnet-demo expose deployment dotnet-demo-app --type=ClusterIP --port=80
Y creé el Ingress:
cat <<EOF | microk8s kubectl -n dotnet-demo apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: dotnet-demo-ingress
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: dotnet-demo-app
            port:
              number: 80
EOF
Ahora, navegando la IP de la VM ya puedo ver mi aplicación:

Ingress con HTTPS

Habilitamos cert-manager:
microk8s enable cert-manager
Creamos un Issuer en el namespace:
cat <<EOF | microk8s kubectl -n dotnet-demo apply -f -
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: demo-issuer
  namespace: dotnet-demo
spec:
  selfSigned: {}
EOF
Creamos el certificado autofirmado:
cat <<EOF | microk8s kubectl -n dotnet-demo apply -f -
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: dotnet-demo-tls
  namespace: dotnet-demo
spec:
  dnsNames:
  - '*.default.svc.cluster.local'
  - '*.default'
  issuerRef:
    name: demo-issuer
  secretName: dotnet-demo-tls-secret
EOF
Y ahora modificamos el Ingress para que tome el certificado:
cat <<EOF | microk8s kubectl -n dotnet-demo apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: dotnet-demo-ingress
  annotations:
     nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: dotnet-demo-app
            port:
              number: 80
  tls:
    - secretName: dotnet-demo-tls-secret
EOF

Probando Load Balancer

Si bien el servicio de Ingress no requiere de un Load Balancer, hay casos en los que necesitamos uno. Para habilitar el addon de Load Balancer, primero determiné algunas IPs libres en el mismo segmento donde está desplegado el Ubuntu. Luego ejecuté:
microk8s enable metallb:10.12.1.246-10.12.1.249
Creé un servicio del tipo Load Balancer para probar metallb:
microk8s kubectl -n dotnet-demo expose deployment dotnet-demo-app --name=dotnet-demo-app-lb --type=LoadBalancer --port=80
Revisé el servicio para ver la IP y luego navegué la aplicación:
microk8s kubectl -n dotnet-demo get svc dotnet-demo-app-lb

Y ya podemos navegar la aplicación con esta nueva IP.

Conclusión

Microk8s es una gran solución para varios escenarios, por ejemplo:
  • Tener Kubernetes en nuestra PC para desarrollo
  • Kubernetes para IoT
  • Kubernetes para ambiente de testing (ya que permite agregar nodos y tiene soporte oficial)
  • Para publicar pequeñas aplicaciones en una sola Máquina Virtual.

Comentarios

Entradas populares de este blog

vRA8 - Definir redes disponibles por Projecto

Aria Automation - crear lista ordenada de key-value en custom forms con Orchestrator

Demo simple de GSLB con AVI