Conceptos básicos sobre Kubernetes
Kubernetes o k8s o kube es un orquestador de Containers como ya hemos hablado otras veces de él. ¿Eso qué significa? Es una plataforma de automatización de containers, que permite simplificar la gestión de clústeres de grupos de hosts que ejecutan containers.
Fue diseñado por ingenieros de Google, gracias a que Google ejecuta toda su plataforma sobre Containers y necesitaban una evolución para ello. A este proyecto se unieron otras grandes empresas, lo que ha hecho que su evolución haya sido meteórica como la referencia en orquestación de Containers.
¿Por qué utilizar Kubernetes?
Cuando colocas una infraestructura de Containers en Producción necesitas unir varios de ellos entre sí. Kubernetes facilita esto, ya que es capaz de integrar tanto el Networking, el Almacenamiento, la Seguridad y otros servicios, facilitando sobre manera la gestión en Pods. Facilita la actualización e implementación de aplicaciones. Se asegura que las aplicaciones se ejecuten como se diseñaron, haciendo que la plataforma sea segura. A su vez comprueba el estado de las mismas, automatizando acciones sobre ellas (escalado, reinicio, replicación…)
Hay que decir que el proyecto Kubernetes no hace todo esto por si solo, necesita apoyarse de otros proyectos como OpenvSwitch (Networking), LDAP (Seguridad), Ansible (Automatización)…
Términos en Kubernetes
Aunque vamos a detallar varios de ellos en un apartado propio os dejo los términos que os vais a encontrar:
- Master: el Master es la máquina que gestiona los nodos de Kubernetes, asignando tareas a cada nodo.
- Nodo: un Nodo es una máquina que realiza las tareas que le indica el Master.
- Pod: un grupo de uno o más contenedores implementados en un nodo único. Todos los contenedores de un pod comparten la dirección IP, la IPC Socket, el nombre del host y otros recursos. Los pods abstraen la red y el almacenamiento del contenedor subyacente. Esto le permite mover los contenedores por el clúster con mayor facilidad.
- Controlador de replicación: controla cuántas copias idénticas de un pod deben estar ejecutándose en algún lugar del clúster.
- Servicio: separa las definiciones de tareas de los pods. Los proxies de servicios de Kubernetes envían automáticamente las solicitudes de servicio al pod correspondiente, sin importar adónde se traslada en el clúster, o incluso si está siendo reemplazado.
- Kubelet: es un servicio que se ejecuta en cada nodo y revisa si los containers están iniciados y ejecutándose.
- kubectl: herramienta para la configuración de la línea de comandos de Kubernetes.
Pods en Kubernetes
La unidad más pequeña de Kubernetes son los Pods, con los que podemos correr Containers. Un pod representa un conjunto de contenedores que comparten almacenamiento y una única IP. Los pods son efímeros, cuando se destruyen se pierde toda la información que contenía. Si queremos desarrollar aplicaciones persistentes tenemos que utilizar volúmenes.
Ejemplo de Pod
Un ejemplo de un Pod, sería una aplicación WordPress con una base de datos MySQL. Para implementarlos correctamente, lo haríamos en dos pods diferenciados, uno para cada servicio. Para ello generaríamos dos ficheros YAML, uno para WordPress y otro para MySQL.
Pod para WordPress (wordpress.yaml):
1 2 3 4 5 6 7 8 9 10 11 12 |
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: wordpress-storage labels: app: wordpress spec: accessModes: - ReadWriteMany resources: requests: storage: 8Gi |
Pod para MySQL (mariadb.yaml):
1 2 3 4 5 6 7 8 9 10 11 12 |
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-storage labels: app: wordpress spec: accessModes: - ReadWriteMany resources: requests: storage: 8Gi |
Lanzamos la creación de los Pods:
1 2 3 4 5 |
kubectl create -f wordpress.yaml pod "wordpress" created kubectl create -f mariadb.yaml pod "mariadb" created |
ReplicaSet en Kubernetes
ReplicaSet es una función de Kubernetes que asegura que siempre se ejecute un número de réplicas de un pod determinado. Nos aseguran que nuestros pods estén siempre disponibles. Nos proporciona las siguientes características:
- Servicio siempre disponible
- Tolerancia a errores
- Escalabilidad totalmente dinámica
Deployment en Kubernetes
Deployment es la unidad de más alto nivel que podemos gestionar en Kubernetes. Nos permite definir diferentes funciones:
- Controlar el número de réplicas
- Pods escalables
- Actualizaciones
- Despliegues automatizados
- Vuelta a atrás o Rollback a versiones anteriores
Services en Kubernetes
Los servicios o services en Kubernetes nos permiten acceder a nuestras aplicaciones.
- Un servicio es una abstracción que define un conjunto de pods que implementan un micro-servicio
- Nos ofrecen una dirección IP virtual (CLUSTERIP) y un nombre que identifica al conjunto de pods que representan
- La conexión al servicio se puede realizar desde otros pods o desde el exterior
Los servicios normalmente se implementan a través de iptables. Es el componente kube-proxy el que se comunica con la API para comprobar si se han creado nuevos servicios.
Cuando se crea un nuevo servicio, se le asigna una nueva ip interna virtual (CLUSTERIP) que permite conexiones desde otros pods dentro del cluster. Además podemos habilitar el acceso desde el exterior, se abre un puerto aleatorio que permite que accediendo a la IP del cluster y a ese puerto se acceda al conjunto de pods. Si tenemos más de un pod el acceso se hará siguiendo una política round-robin.
Tipos de Services en Kubernetes
- ClusterIP: Es el tipo de servicio predeterminado el cual expone una IP pero que sólo es accesible dentro del propio clúster
- NodePort: En cada ClusterIP se enruta un puerto estático al que se puede acceder desde el exterior.
- LoadBalancer: Expone un servicio externamente utilizando el balanceador de carga de un proveedor de la nube. Los servicios NodePort y ClusterIP, a los que se dirigirá el balanceador de carga, se crean automáticamente.
¿Te ha gustado la entrada SÍGUENOS EN TWITTER?
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?
Gran post Raúl, me ha quedado muy claro que son los kubernetes, una tecnología que apenas conocía.
Saludos y buen trabajo compañero!
Gracias compi, yo tb ando aprendiendo “a virtualizar” ;P