Kubernetes dashboard deployment models

Kubernetes es con seguridad el orquestador de contenedores por excelencia de la actualidad pero a diferencia de otras soluciones como OpenShift (también basado en Kubernetes), no presenta una interfaz gráfica “out of the box”.

Fiel a su filosofía Open Source, el proyecto de Google dispone de un addon denominado Kubernetes Dashboard que viene a suplir esa carencia, facilitando una UI Web para gestionar tanto el cluster como las aplicaciones que corren en él.

En el presente artículo se pretende detallar los pasos a seguir para instalar dicho dashboard y como exponerlo al exterior para su consumo.

Caso de uso

Se dispone de una cluster de Kubernetes “vanilla” compuesto por un único nodo en el que se quiere instalar Kubernetes DashBoard y exponerlo al exterior.

¿Que es Kubernetes DashBoard?

Kubernetes Dashboard es una interfaz gráfica web para gestionar tanto el cluster como las aplicaciones que corren en él. Es decir, permite crear, consultar o modificar recursos de Kubernetes (Deployment, Service, Route, Config Map, Secret…), sin necesidad de hacer uso de la consola de comandos.

Instalación

Para desplegar el dashboard basta con ejecutar el siguiente comando:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta1/aio/deploy/recommended.yaml

Acceso

Existen multitud de formas de acceder al Dashhoard si bien no todas son adecuadas para según el caso de uso, especialmente si va a ser expuesto al público.

Importante: Comentar que a partir de la version 1.7.X el acceso está limitado únicamente a HTTPS, por lo que, en caso de tratar de acceder vía HTTP, nada sucederá tras hacer click en el boton “Sign in” de la página de Login.

Kubectl Proxy

Este comando permite crear un servidor proxy entre la API de Kubernetes y tu máquina para proporcionar el acceso al dashboard, si bien únicamente será accesible desde el equipo en el que se ejecutó dicho comando.

Para iniciar el servidor proxy basta con ejecutar el siguiente comando:

kubectl proxy
Starting to serve on 127.0.0.1:8001

Una vez iniciado el servidor proxy, basta con acceder a la siguiente URL en el navegador para disfrutar del dashboard:
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

NodePort

Un NodePort permite exponer al exterior un service de Kubernetes en un puerto determinado (entre el 30000 y 32767) de todos los nodos del cluster. En este caso, una imagen vale más que mil palabras.

Por desgracia este método presenta varias desventajas como el hecho de que no permite exponer más de un service en el mismo puerto, su limitado rango o el tener que lidiar con los cambios de IP de los nodos.

Para exponer el dashboard vía NodePort basta con editar el service y definirlo como “type: NodePort” en lugar de “type: ClusterIP”.

kubectl -n kubernetes-dashboard edit service kubernetes-dashboard

Antes:

apiVersion: v1
...
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  clusterIP: 10.100.124.90
  externalTrafficPolicy: Cluster
  ports:
  - port: 443
    protocol: TCP
    targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}

Después:

apiVersion: v1
...
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  clusterIP: 10.100.124.90
  externalTrafficPolicy: Cluster
  ports:
  - port: 443
    protocol: TCP
    targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer: {}

Para conocer el puerto en el que se ha desplegado será necesario ejecutar el siguiente comando:

kubectl -n kubernetes-dashboard get service kubernetes-dashboard

NAME                   CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes-dashboard   10.100.124.90    nodes         443:31707/TCP  21h

Finalmente basta con acceder a la siguiente URL en el navegador para disfrutar del dashboard: https://node-ip:31707

Comentar que para conocer la dirección del nodo maestro es posible ejecutar el siguiente comando:

kubectl cluster-info

Ingress

Ingress es un recurso permite acceder vía HTTP o HTTPS a los services de Kubernetes desde fuera del cluster.

A diferencia del NodePort, no se trata de un tipo de service, sino de un recurso adicional que actúa como punto de entrada al cluster y redirige al service correspondiente en función del hostname.

Se podría decir que es el equivalente al Router de OpenShift pero más avanzado ya que permite realizar un enrutado inteligente o Two-Way SSL Authentication entre otros.

Comentar que existen diversas implementaciones de ingress pero en el presente artículo se hará uso del ingress-nginx, uno de los sabores más utilizados en la actualidad.

Instalación ingress-nginx

En primer lugar se debe instalar el nginx-ingress-controller:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml

Posteriormente se crea un ingress controller service para redirigir el tráfico al nginx. Para ello se debe crear el fichero ingress-nginx-load-balancer.yml con el siguiente contenido.

kind: Service
apiVersion: v1
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  type: LoadBalancer
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  ports:
    - name: http
      port: 80
      targetPort: http
    - name: https
      port: 443
      targetPort: https

Y ejecutar el siguiente comando.

kubectl apply -f nginx-ingress-load-balancer.yml

Para comprobar su correcta instalación se puede ejecutar el siguiente comandando:

kubectl get svc -n ingress-nginx

NAME            TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)                       
ingress-nginx   LoadBalancer   10.96.229.38   pending        80:30756/TCP,443:30118/TCP

Kubernetes Dashboard sobre ingress

Una vez instalado el nginx-ingress, no queda más que crear un recurso de tipo ingress para exponer la aplicación al exterior.

En el presente ejemplo se creará un ingress en el que, cada vez que se acceda al dominio mydomain.com/kubernetes-dashboard, este le redirigirá al service kubernetes-dashboard para acabar mostrando el dashboard.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  tls:
  - hosts:
    - mydomain.com
    secretName: kubernetes-dashboard-certs
  rules:
  - host: mydomain.com
    http:
      paths:
      - path: /kubernetes-dashboard/?(.*)
        backend:
          serviceName: kubernetes-dashboard
          servicePort: 443 

Conclusiones

En conclusión, a pesar de existir multitud de maneras de exponer el dashboard de Kubernetes no todas las requieren opciones requieren el mismo esfuerzo o son válidas para determinados casos de uso, pero desde aquí recomendamos encarecidamente el ingress, especialmente si va a ser accesible desde el exterior.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s