
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.