Conceptos Básicos de Kubernetes

Categoría
Descripción

Terminología

  • Kubernetes: se denomina Kubernetes (también llamado Kube, o K8s) al sistema entero de orquestación, compuesto por un conjunto de contenedores de utilidades.
  • Kubectl: (también llamado kube control) es la aplicación CLI que sirve para comunicar con Kubernetes y permite su configuración y gestión
  • Node: cualquier servidor dentro de un cluster de Kubernetes
  • Kubelet: es un contenedor que actúa como agente del sistema, y que se ejecuta en cada uno de los nodos.
  • Control Plane: (también llamado master o capa de control) es el conjunto de contenedores que sirven para la gestión del cluster. Incluye el servidor API, el programador (scheduler), el gestor de controladores, etc...

Abstracciones

  • Pod: conjunto de uno o más contenedores ejecutándose juntos en un nodo. Es la unidad básica de despliegue. Todos los contenedores siempre se encuentran en pods. Al ejecutar kubectl run de inicio se crea el pod, y además se crean los volúmenes y NIC necesarios para el pod.
  • Controller (controlador): es la parte encargada de la creación y actualización de pods y otros objetos. Algunos tipos de controlador pueden ser:
    • Deployment: es el controlador encargado de la creación y gestión de ReplicaSets. Al ejecutar kubectl run de inicio se crea un nuevo Deployment Controller, que administrará todos los ReplicaSets involucrados. Se encargará de los rolling updates, de los despliegues, etc...
    • ReplicaSet: se encarga de asegurar que todas las réplicas del pod estén activas y en ejecución. Es una de las múltiples capas intermedias entre el Deployment Controller y e Pod, que se encarga de la gestión de réplicas, creando nuevas copias del pod cuando se solicita un número mayor de réplicas.
    • StatefulSet, DaemonSet, Job, CronJob, etc...
  • Service (servicio): es un endpoint de la red que sirve para conectar a un pod. Independientemente de cómo estén estructurados los pods, de su nombre, etc... los servicios son estáticos y permanecen invariables cara al exterior. El contenedor CoreDNS del Control Plane nos permite gestionar los nombres de los servicios. Existen 4 tipos de servicios:
    • ClusterIp: es el servicio por defecto, y siempre está disponible en Kubernetes. Configura una dirección IP interna virtual, únicamente alcanzable desde el interior del cluster (nodos y pods). Los pods pueden alcanzar el servicio mediante el número de puerto la aplicación desplegada (por ejemplo, puede utilizar el puerto 80 para un servidor web). Obtiene su propia entrada en CoreDNS.
    • NodePort: siempre está disponible en Kubernetes. Crea un puerto con una numeración alta en cada nodo. Este puerto está abierto en la IP de cada nodo, de forma que cualquiera puede conectar si llega a alcanzar el nodo. Los otros pods deben actualizarse a este puerto. Primero crea un servicio de tipo ClusterIp. En resumidas cuentas, permite que se pueda alcanzar el servicio desde una zona externa al cluster mediante la IP del nodo, utilizando el puerto del servicio.
    • LoadBalancer: controla un endpoint de balanceador de carga externo al cluster. Únicamente está disponible si la infraestructura suministra un balanceador de carga. Crea un servicio NodePort y un ClusterIp, indicándole al balanceador que comunique con el NodePort correspondiente. Se trata básicamente de un sistema que permite automatizar la configuración del balanceador.
    • ExternalName: añade un registro DNS CNAME al CoreDNS de Kubernetes. Sirve para proporcionar un nombre DNS de un servicio externo al cluster para que los pods puedan acceder a él. Se utiliza normalmente en casos de migraciones de servicios.
  • Nampespace: también llamado cluster virtual, es un grupo filtrado de objetos. Se trata de una división administrativa que permite agrupar objetos. No tiene nada que ver con los namespace de Linux. Se denomina contexto a la suma de cluster, usuario autenticado y namespace. Se pueden obtener los contextos mediante la orden kubectl config get-contexts. Este comando muestra la configuración contenida en el fichero YAML ~/.kube/config.

Contenedores y servicios de Kubernetes

  • CoreDNS: es el servicio DNS por defecto en Kubernetes desde la versión 1.11. La resolución de nombres puede hacerse de varias formas:
    • Mediante el nombre del servicio únicamente: sirve para servicios que se encuentran dentro del mismo namespace
    • Mediante su FQDN: el FQDN de un servicio por defecto tiene la forma: <hostname>.<namespace>.svc.cluster.local.

Persistencia

Kubernetes permite crear objetos para la persistencia de información. Son los llamados StatefulSets. Se pueden crear 2 tipos de volúmenes:

  • Tipo Volume: su ciclo de vida coincide con el del Pod. Todos los contenedores de un Pod pueden acceder al mismo Volume.
  • Tipo PersistentVolume: se crean a nivel de cluster, por lo que van más allá del ciclo de vida del Pod. Permite por lo tanto separar su configuración de la configuración del Pod que lo utiliza. Puede ser utilizado por varios pods de forma simultánea.

¿Qué es Ingress?

Ingress es un controlador que trabaja en la capa 7 de los niveles OSI (https). Permite que un cluster pueda ser atacado en el mismo puerto, diferenciando el servicio al que atacar mediante la URL Ingress Controller es un controlador opcional en Kubernetes que trabaja con servidores proxy de terceros (nginx, Traefik, F5, Envoy, etc...). Se encarga de gestionar cuestiones como qué URLs deben atacar a qué servicios, si se deben usar certificados SSL...

¿Qué es dashboard?

Dasboard es una interfaz gráfica de usuario (GUI) web que permite conocer el estado del cluster de Kubernetes y llevar a cabo ciertas tareas administrativas. No forma parte de la instalación por defecto, pero sí es un proyecto oficial de Kubernetes (https://github.com/kubernetes/dashboard). Algunas distribuciones disponen de su propio dashboard, que sobrescribe al oficial. Normalmente los servicios cloud, que únicamente ofrecen nodos worker y no permiten una administración directa del cluster, no suministran esta interfaz gráfica por defecto. Se debe instalar con mucha precaución, puesto que puede considerarse un potencial problema de seguridad, y por lo tanto no se recomienda su uso en entornos productivos. En caso de utilizarse, se recomienda utilizar puertos aleatorios con numeración alta, soluciones VPN, restricción del acceso por IP, o el control de la autorización mediante un servidor proxy.