# Orquestación de contenedores con Kubernetes
## Introducción

Kubernetes es un sistema de código abierto diseñado para automatizar el despliegue, escalado y administración de aplicaciones contenerizadas. Agrupa contenedores para facilitar su manejo.
Kubernetes por si mismo no puede ejecutar los contenedores y depende de un entorno de ejecución de contenedores existente para ello. Kubernetes suporta muchos entornos de ejecución contenidos:
* CRIO-o
* containerd
* Docker Engina
* Mirantes Container Runtine

## Funcionalidades

* Desenrollo y retroceso automátizado
Despliega cambios progresivos a la aplicación o configuración mientras monitorea su salud. Si algo falla, el cambio es revertido automáticamente.
* Descubrimiento de servicios y balanceo de carga
* Orquestación de almacenamiento
* Autosanación
* Configuración y administración de secretos
* Empacado automático de binarios
* Ejecución por bloques
* Escalado horizontal
* Pila doble IPv4/IPv6
* Diseñado para extensibilidad
Automáticamente coloca los contenedores basandose en los requerimientos de recursos y liitaciones sin sacrificar su disponibilidad.

# Adquisición e instalación

Kubernetes distribuye los binarios para diferentes Sistemas Operativos y arquitecturas de sistema.
Página para descarga de Kubernetes

## minikube

Mikibe es el servidor de grupos de Kubernetes

### Distribuible en Arch Linux
## kubectl

Permite administrar los grupos de kubernetes. Se utiliza para desplegar aplicaciones, inspeccionar, manejar los recursos de los grupos y ver los registros.
Por omisión se carga la configuración del archivo $HOME/.kube/config

## kubeadm

Herramienta para "bootstraping" de clusters de Kubernetes

# Minikube
## Plano de control

Es imporante mantener el plano de control en ejecución constante, su interrupción puede conllevar interrupciones en el servicio.
La comunicación con los clusters peude darse madiante la línea de comandos CLI, la interfaz web (Web UI) o mediante un API
Para asegurar su disponibilidad, se pueden agregar repiclas configuradas en modo Alta Disponibilidad

### kube-scheduler

Asigna nuevos objetos de cargas de trabajo, tales como "pods" encapsulados en contenedores, a los nodos.
Durante el proceso de agendado, se toman decisiones basadas en el estado del cluster Kubernetes y los requerimientos del nuevo objeto de carga de trabajo. Mediante la API del servidor, el planificador recibe datos de los recursos para cada nodo trabajador. EL planificador también toma en cuenta parámetros para la Calidad del Servicio (Quality of Service)

# Arquitectura

Kubernetes es escencialmente un cúmulo de sistemas de computo clasificados según su rol:

#### Manejador de control
##### Control Manager

* Ejecuta Controladores u operadores cuando los nodeos se vuelven indisponibles
* Crea puntos de salida
* Cuentas de servicio
* Tokens de acceso

##### Cloud Control Manager

* Controladores u operadores responsables de interactuar con el servicio de nube de computo cuando los nodos se vuelve indisponibles
* Balanceo de carga
* Enrutamiento

### etcd

Es un proyecto de código abierto ahuspiciado por la Cloud Native Computing Foundation. Porporciona almacenamiento distribuido, fuertemente consistente de datos emparejados tipo: llave=valor utilizado para almacenar el estado de los grupos en Kubernetes.

## Trabajadores

Los trabajadores proporcionan un entorno de ejecución para las aplicaciones cliente. Los contenedores de aplicaciones son empacados en "pods". Controlado por el grupo de plano de control, los pods son asignados a un trabajador dónde encontraran las recursos para su ejecución.
Un pod es la unidad mínima de asignación de trabajo. Es una colección lógica de uno o más contenedores asignados juntos. La colección puede ser iniciada, detenida o reasignada cómo una sola unidad de trabajo.
Los nodos trabajadores estan a su vex compuestos por un entorno de ejecución, agente de node (kubelet), proxu (kube-proxy), extensiones para el DNS, panel del usuario, monitoreo y registro de actividad.

### kubelet

Maneja la comunicación con el entorno de ejecución de contenedores. Adaptadores populadres para los entornos de ejecución:
* cri-containerd
* cri-o
* cri-dockerd

### kube-proxy

Porporciona los servicios de red

#### Red

La complejidad de la red presenta nuevos retos de conectividad que habran de manejarse antes de realizar un despliegue:
* Contenedor a contenedor dentro de un Pod
* Pod a Pod entre grupos de nodos
* Servicio a Pod dentro del mismo espacio de nombres y atraves del mismo espacio de nombre de grupo
* Externas al servicio. Para manejar las comunicaciones de los clientes para acceder a las aplicaciones del grupo.

### Distribuible en Arch Linux
# Contenedores de imágenes

Todas las imagenes de kubernetes son desplegadas en el registro

# Configuración

Para poder acceder al grupo de Kubernetes, es necesario un de configuración el cuál es generado automáticamente al crear un grupo con kube-up.sh o desplegar un grupo Minikube

## Grupos

Los grupos son manejados mediante contextos con el siguiente comando kubectl config use-context

## Interfaz de Ejecución de Contenedores

Kubernetes se comunica mediante la Interfaz de Ejecución de COntenedores con la entorno de ejcución correspondiente, algunos entornos de ejecución comunes compatibles con Kubernetes son:
* containerd
* CRI-O
* Docker Engine
* Mirantis Container Runtime

# Enlaces externos

Kubernetes - Página oficial Kubernetes The Hard Way