# Kubernetes

Kubernetes (també anomenat k8s) és un sistema d'orquestració de contenidors per l'automatització del desplegament, escalat i gestió d'aplicacions, arreu d'un clúster de hosts. És de codi obert i funciona amb tota una sèrie de tecnologies de contenidorització, sovint amb Docker. Inicialment fou concebut per Google i posteriorment posat a disposició de la Cloud Native Computing Foundation. Molts de serveis al núvol ofereixen plataformes basades en Kubernetes o infraestructures com a servei (PaaS o IaaS) sobre les que Kubernetes pot ser desplegat com un proveïdor de plataforma. Molts fabricants proveeixen també les seves distribucions amb la seva pròpia marca. Kubernetes prové de l'antic grec κυβερνήτης Kybernḗtēs ('Helmsman', 'Pilot'), que també és l'arrel etimològica de la 'cibernètica'.

## Història

L'origen de kubernertes es troba en la tendència al desenvolupament de microserveis. Això provoca un creixement del nombre de contenidors que executen aquests microserveis i es fa palesa la necessitat d'una eina d'orquestació per aquests microserveis. Ens trobem aplicacions compostes per centenars o milers de contenidors.
Kubernetes (de κυβερνήτης: grec per "timoner" o "pilot") fou anunciat per primer cop per Google a mitjans 2014. El seu desenvolupament i arquitectura van ser fortament influenciats pel sistema Borg de Google, on la majoria dels col·laboradors més importants hi havien treballat. El nom intern de Kubernetes era inicialment Project Seven, en referència al personatge de Star Trek que és un Borg que va esdevenir amistós. Els set radis de timó del logotip de Kubernetes són una referència al nom original.
La versió 1.0 de Kubernetes va ser publicada el 21 de juliol de 2015. Amb el llançament de la primera versió de Kubernetes, Google va associar-se amb la Fundació Linux per crear la Cloud Native Computing Foundation (CNCF) i va oferir a Kubernetes com a tecnologia inicial.
Kubernetes també és utilitzat per RedHat per al seu producte OpenShift, per CoreOS dintre el seu producte Tectonic, i per Rancher Labs per la seva plataforma de gestió de contenidor Rancher.

## Components

Kubernetes defineix un conjunt d'eines ("primitives") que proporcionen conjuntament mecanismes per desplegar, mantenir i escalar aplicacions. Aquests elements que formen Kubernetes estan dissenyats per ser combinats i extensibles i, per tant, per suportar un ampli espectre de càrrega de treball. Aquesta extensibilitat és proporcionada majoritàriament per l'API de Kubernetes, que s'utilitza tant per components interns com per extensions i contenidors que s'executen a Kubernetes.

### Pods

La unitat bàsica de programació de Kubernetes s'anomena "pod" (mola). És una visió abstracta dels components continguts. Un pod consisteix en un o més contenidors que corren al mateix servidor i que poden compartir recursos. Habitualment dintre d'un node hi ha una aplicació que pot allotjar un o més contenidors. Cada pod de Kubernetes té una adreça IP única (dins del clúster), que permet a les aplicacions utilitzar els ports de la màquina sense risc de conflicte. Els Pods són un nivell d'abstracció sobre els contenidors. D'aquesta forma kubernetes és independent de la tecnología de containerització i hom pot treballar amb docker o triar d'altres proveïdors de contenidors. Un pod pot definir un volum, com un directori en un disc local o a la xarxa, exposat als contenidors d'aquest pod. Els pods es poden gestionar manualment a través de l'API de Kubernetes. La seva gestió també pot ser delegada en un controlador.
Els pods pengen del node que els desplega fins que caduquen o són suprimits. Si el node falla, es podran implementar nous pods amb les mateixes propietats que els anteriors a altres nodes disponibles. Els nous pods tenen adreçes IPs diferents dels anteriors. Es per això que existeix una abstracció superior (els serveis) que mantenen un nom estàtic independentment de la IP dels pods que el conformen.

### Etiquetes i selectors

Kubernetes permet als clients (usuaris i components interns) associar claus anomenades "etiquetes" a qualsevol objecte API del sistema, com ara pods i nodes. Complementàriament, els "selectors d'etiquetes" són consultes contra etiquetes que resolen els objectes vinculats.
Les etiquetes i els selectors són el primer mecanisme d'agrupació de Kubernetes i s'utilitzen per determinar els components sobre els quals aplicar una operació.
Per exemple, si els pods d'una aplicació tenen etiquetes per a un sistema nivell ("frontend", "backend", per exemple) i un circuit de versions ("canary", "preproducció", "producció", per exemple), llavors una operació sobre tot els nodes de backend i de canary poden utilitzar una etiqueta de selecció de la manera següent:
   nivell=backend AND circuit de versions=canary

### Controladors

Un controlador és un bucle d' harmonització que duu l'estat actual d'un clúster fins al seu estat desitjat, comunicant-se amb l'API del servidor per crear, actualitzar i eliminar els recursos que gestiona. El gestor del controlador és un procés que gestiona un conjunt de controladors del nucli de Kubernetes.
Un tipus de controlador seria el "controlador de replicació", que gestiona la replicació i l'escalat executant un conjunt específic de còpies d'un pod arreu d'un clúster. També gestiona la creació de pods de substitució si el node subjacent cau.
Alguns dels controladors que formen part del sistema central de Kubernetes són:
* ReplicaSet i Deployments: ReplicaSet assegura que un estol de pods idèntics corren simultàniament. Deployments ajuda a especificar-ne el comportament de forma declarativa, són els més utilitzats.
* Replication Controllers: semblant a l'anterior parell però ja no és recomanat, degut a què no ofereix l'experiència d'usuari de la interfície de Deployments.
* Stateful State: suporta entitats persistents mantigudes internament.
* DaemonSet assegura que s'executa exactament un pod a cada màquina (o un subconjunt de màquines)
* Jobs per llançar pods associats a una tasca (per exemple, scripts). Quan la tasca acaba, el pod és finalitzat. CronJob és usat per tasques planificades.
El conjunt de pods que gestiona un controlador està determinat per les etiquetes de selecció, establertes a la configuració del controlador.

### Serveis

Un servei Kubernetes és un grup de pods que treballen junts, per exemple, una capa en una aplicació multicapa. El pods que constitueixen un servei estan definits per etiquetes. Podem configurar un servei perquè controli cap a quin pod va cada invocació.
Dins d'un clúster de Kubernetes, els components necessiten trobar i connectar-se al serveis disponibles. Això s'anomena "descobriment de serveis" i hi ha tres maneres de fer-ho: usant variables d'entorn, DNS de Kubernetes o amb l'API de descobriment. El servei de descobriment assigna una IP estable i un nom DNS al servei i balanceja les invocacions (amb un algorisme round-robin) a les connexions de xarxa d'aquesta adreça IP, entre els pods que el selector té (fins i tot en cas de fallada, ja que llavors els pods canvien de màquina). Per defecte, un servei és disponible dins d'un clúster (ex: els pods de backend es poden agrupar en un servei, amb peticions de pods de càrrega frontend equilibrats cap al backend), però també pot ser disponible des de fora d'un clúster (per exemple, perquè els clients puguin veure pods de frontend).
Hi ha diferents tipus bàsics de serveis:
* ClusterIP: és el servei per defecte, exposat per una IP interna fixa visible només des de dintre del clúster. Útil per la comunicació interna entre pods.
* NodePort: exposat per la IP de cada node del clúster, a un número de port específic, que és com es veu el servei des de l'exterior i el servei redirecciona cap al pod que toca segons l'algorisme de balanceig.
* LoadBalancer: exposat externament usant un balancejador de càrrega proveït per un cloud provider. És més escalable que el NodePort.
* ExternalName: és referit per nom de domini, no per IP o port.

## Arquitectura

El disseny de Kubernetes es basa en el model mestre/esclau. Podem distingir els components de Kubernetes entre els que gestionen un node individual i els nodes mestre (master) que són d'un pla de control.

### Node mestre. Pla de control Kubernetes

El node mestre de Kubernetes és la unitat de control principal del clúster, gestionant la seva càrrega de treball i dirigint les comunicacions arreu del sistema. El pla de control de Kubernetes consisteix en diversos components, cadascun dintre del seu procés, que poden córrer tant a un node master simple com en múltiples mestres, suportant clústers d'alta disponibilitat. El node mestre és molt important doncs, en cas de caiguda, no és possible accedir al cluster. Es per això que, en entorns productius, hi ha un mínim de dos nodes mestre. Els components d'un pla de control són:
* servidor d'API : és un element clau, serveix l'API sobre HTTP amb REST i JSON, proveint la interfície interna i externa de Kubernetes (tant si accedim per interfície gràfica d'usuari, per línia d'ordres o bé per sol·licituds via API). El servidor d'API gestiona i valida les peticions i actualitza l'estat dels objectes de l'API a l'etcd, permetent així als clients configurar la càrrega de treball i els contenidors als nodes.
* etcd : és una unitat d'emmagatzemament de dades de tipus clau/valor, distribuïda, persistent i lleugera. Conté l'estat del cluster en tot moment. Prioritza la consistència damunt la disponibilitat. Les decisions preses pel servidor d'API de Kubernetes es basen en aquest dispositiu. Per exemple, si etcd determina que hi ha d'haver tres instàncies corrent i el servidor detecta que només n'hi ha dues, Kubernetes planificarà el desplegament de la unitat que falta.
* planificador : és un component addicional que selecciona el node on correrà un pod no planificat, sobre la base de la disponibilitat de recursos.
* gestor del controlador : procés dintre el qual s'executen els controladors principals de Kubernetes, com ara DaemonSet o Replication Controller. Els controladors es comuniquen amb el servidor d'API per crear, posar al dia i eliminar els recursos que gestiona (pods, serveis d'endpoint, etc).

### Node worker

El node worker, també anomena minion, és una màquina on s'hi despleguen contenidors. Cada node del clúster ha d'executar un programa de contenidorització (com ara Docker), així com els elements esmentats a sota, per la comunicació amb el primari amb l'objectiu de definir la configuració de xarxa d'aquests contenidors.
* kubelet : és el component de més baix nivell. És un procés present a cada node responsable de l'execució dels contenidors de cada node (garanteix que tots estan en bon estat). Els arrenca i atura segons el pla de control
* kube-proxy : implementació d'un proxy de xarxa i un repartidor de càrrega, gestiona els servei d'abstracció com ara altres operacions de xarxa. És responsable d'efectuar l'enrutament del trànsit de dades cap al contenidor apropiat, sobre la base de la IP i el número de port de la petició entrant
* cAdvisor : agent que monitoritza i obté les dades de consum dels recursos i rendiment, com el processador, la memòria o l'ús de disc i xarxa dels contenidors de cada node

## Referències

* ↑ «Overview» (en anglès). Kubernetes.
* ↑ «Early Stage Startup Heptio Aims to Make Kubernetes Friendly» (en anglès), 18-11-2016. [Consulta: 23 maig 2020].
* ↑ «As Kubernetes Hits 1.0, Google Donates Technology To Newly Formed Cloud Native Computing Foundation» (en anglès). TechCrunch, 21-07-2015. [Consulta: 23 maig 2020].
* ↑ «Why Red Hat Chose Kubernetes for OpenShift» (en anglès), 07-11-2016. [Consulta: 23/5/2020n].
* ↑ «Launching Kubernetes with Rancher» (en anglès). [Consulta: 23 maig 2020].
* 1 2 3 4 5 6 «An Introduction to Kubernetes» (en anglès), 02-05-2018. [Consulta: 23 maig 2020].
* ↑ «What is a Pod?» (en anglès). kubernetes.io. [Consulta: 23 maig 2020].
* 1 2 «Kubernetes 101 – Networking» (en anglès), 11-02-2015. [Consulta: 23 maig 2020].
* ↑ «Kubernetes for developers» (en anglès), 21-05-2015. [Consulta: 23 maig 2020].
* ↑ «Transformez votre Architecture applicative avec Kubernetes» (en francès). [Consulta: 23 maig 2020].
* ↑ «Containerizing Docker on Kubernetes !!» (en anglès), 16-09-2015. [Consulta: 23 maig 2020].
* 1 2 «Overview of a Replication Controller» (en anglès). Arxivat de l'original el 2015-09-22. [Consulta: 23 maig 2020].
* ↑ «Overview of a Replication Controller» (en anglès). [Consulta: 23 maig 2020].
* ↑ «Kubernetes 101 – External access into the cluster» (en anglès), 19-02-2015. [Consulta: 23 maig 2020].
* ↑ «Service» (en anglès). The Linux Foundation. [Consulta: 15 maig 2023].
* ↑ «Kubernetes from the ground up: the API server» (en anglès), 06-09-2015. [Consulta: 23 maig 2020].
* ↑ «What even is a kubelet?» (en anglès), 27-08-2015. [Consulta: 23 maig 2020].