Kubernetes executa pods, que són grups de contenidors que sempre s'executen junts al mateix node i al mateix espai de noms.
Introducció
De la mateixa manera que Compose ens permet executar un grup de contenidors estretament relacionats, kubernetes utilitza pods.
La majoria de pods només tenen un contenidor, però un contenidor sempre s’ha d’executar dins d’un pod.
Minikube
Minikube és una eina que et permet utilitzar Kubernetes en un únic node per realitzar proves o com a entorn de desenvolupament.
Crea una màquina Linux i instal·la Docker
Instal·la l’última versió estable de minikube utilitzant el paquet Debian:
Configura minikube perquè tingui més “potència”:
Inicia el clúster:
Com t’has excedit amb la memòria (potser no 😅), modifica la configuració corresponent:
Som-hi 🚀:
Al principi, és possible que alguns serveis, com el proveïdor d’emmagatzematge, encara no estiguin en estat d’execució. Aquesta és una situació normal durant l’activació del clúster i es resoldrà per si sola en uns moments.
Comprova l’estat del clúster:
Pots comprovar que estem utilitzant el driver docker:
|||||||||||
| | | | | | | | | | |
|||||||||||
| | | | | | | | | | |
|||||||||||Pots aturar el clúster amb la comanda stop:
I també, pots esborrar el clúster amb la comanda delete (no cal que ho provis 🙄):
I si ets una mica curiós, hauries de ser-ho 🧐, pots entrar dins de la màquina virtual Minikube:
En aquest cas és “docker”, però podria ser una màquina virtual de veritat.
Com a administrador has de dominar el clúster des del shell, però a vegades és útil un entorn gràfic.
Obre un nou terminal, i executa:
Fes clic a l’enllaç que t’indica 👉.
Important El port és dinàmic, per tant, fes clic a l’enllaç del teu shell, no al de la documentació! 🫡
kubectl
Instal·la kubectl:
Habilita l’autocompletat de kubectl (et permet utilitzar la tecla tab per completar les comandes):
Amb kubectl pots controlar un clúster kubernetes mitjançant peticions REST al servidor API que s’executa al node “master”.
Per exemple, pots obtenir la informació del clúster:
Pots veure que el clúster està actiu i diferents URLs de diversos components de kubernetes.
A continuació mira quants nodes formen part del clúster:
Com era d’esperar només hi ha un node, que és “minikube”.
Amb la comanda kubectl get pots obtenir una llista de diferents tipus d’objectes “kubernetes” (en el nostre exemple has demanat una llista de tots els objectes de tipus “node”).
Si vols obtenir detalls addicionals d’un objecte pots utilitzar la comanda describe amb el tipus d’objecte i nom de l’objecte.
Per exemple, obtén els detalls de l’objecte “minikube” de tipus “node”:
La descripció mostra l’estat del node, les dades de CPU i memòria, informació del sistema, els contenidors que s’estan executant dins del node, i molta més informació.
Pod
La forma més habitual i senzilla és executar un pod amb un sol contenidor.
A continuació executa un pod amb un únic contenidor apache:
Amb la comanda get pots veure tots els pods que estan desplegats al clúster:
Si vols pots obtenir una descripció d’un contenidor amb la comanda describe:
Pots veure que el pod té la IP 10.244.0.13 i un contenidor “apache”.
També pots executar una comanda en un contenidor de la mateixa manera que ho fas amb docker:
Com el pod només té un contenidor no cal especificar el contenidor, però si no fos així has d’especificar el contenidor amb l’argument : -c
Executa bash al contenidor “apache” en un terminal interactiu:
Show solution
IP
La IP d’un pod és interna al clúster, la comparteixen tots els contenidors del pod, i canvia cada cop que es crea el pod.
Elimina el pod “apache” i torna a crear el pod:
Mira l’adreça IP del pod amb el flag : -o wide
Si només vols l’adreça IP, pots utilitzar una “plantilla Go” per formatar la informació del Pod i retornar només l’adreça IP del Pod.
Si executes curl pots veure que no tens accés a aquesta IP:
Però si entres dins del clúster, tens accés al servidor “apache”:
Com hem explicat al principi, la IP és interna del clúster, el que vol dir que qualsevol pod pot utilitzar aquesta IP perquè comparteixen la mateixa xarxa.
Crea un pod “nginx” i crea una sessió interactiva:
Show solution
Verifica que des del contenidor “nginx” tens accés al contenidor “apache”:
Una altra manera de connectar-se a un pod per fer proves, o per “debugging”, és mitjançant un port forwarding:
Ara et pots connectar directament des del navegador: http://localhost:8000/.
A Servei aprendràs com exposar un pod a l’exterior mitjançant la configuració de serveis.
Descriptor
De la mateixa manera que a Compose utilitzes un fitxer yaml per definir una composició de contenidors, amb kubernetes també pots utilitzar un fitxer yaml per definir un pod.
A continuació mira la definició del pod que està en execució en format yaml:
$ kubectl get pod apache -o yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2025-02-01T21:19:23Z"
labels:
run: apache
name: apache
namespace: default
resourceVersion: "3554"
uid: c58a72ec-83c7-4d4e-b49e-3413a72a2a2c
spec:
containers:
- image: httpd
imagePullPolicy: Always
name: apache
resources:
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: kube-api-access-gjqjw
readOnly: true
...Pot semblar molt complicat al principi, però a mesura que aprenguis els conceptes bàsics i aprenguis a distingir les parts importants del que són detalls menors veuràs que és molt fàcil d’entendre.
A més, per definir un pod no necessites escriure tot això.
A continuació desplegaràs un pod amb MongoDB
Crea un fitxer mongodb.yaml
apiVersion: v1
kind: Pod
metadata:
name: mongodb
spec:
containers:
- image: mongo
name: mongodb
ports:
- containerPort: 27017
protocol: TCPPots veure que en la definició d’un pod:
-
metadatainclou el nom, l’espai de noms, etiquetes i altra informació sobre el pod. -
specinclou la descripció dels continguts del pod, com són els contenidors, volums i altres dades. -
statusinclou la informació sobre l’execució del pod, per la qual cosa no forma part del fitxer de definició.
Pots consultar per a què serveix cada entrada del fitxer amb la comanda explain.
Important! El port és només descriptiu, perquè tu o qualsevol altre sàpiga quins ports utilitza el contenidor.
Per exemple:
Utilitza la comanda create per crear un pod a partir d’un fitxer yaml:
Pots veure que ara tens dos pods:
Connecta’t a la base de dades mongodb des de l’exterior amb mongosh:
Show solution
Obre un altre terminal i fes un port forward:
Connecta’t amb mongosh:
&serverSelectionTimeoutMS=2000&appName=mongosh+2.3.4
Logs
Les aplicacions que s’executen en contenidors normalment no escriuen els “logs” en fitxers, sinó que els envien a la sortida estàndard, de tal manera que els usuaris poden accedir a aquesta informació d’una manera simple i estàndard.
D’aquesta forma, Docker redirigeix aquests “streams” a fitxers que et permeten accedir als “logs” dels contenidors a través de Docker de forma homogènia.
Pots utilitzar kubectl per accedir a aquests logs, per exemple els d’Apache:
Ten en cuenta que cuando borras un pod ya no tienes acceso a los logs de los contenedores de ese pod.
Si vols conservar els logs dels pods fins i tot després que siguin eliminats, has d’implementar un registre centralitzat que guardi els logs de tot el clúster.
Etiquetes
Un clúster kubernetes està pensat per desplegar centenars i milers de pods.
Per sort, pots posar etiquetes als pods per organitzar i posar ordre.
De fet, pots etiquetar qualsevol mena d’objecte kubernetes.
Crea un pod amb un contenidor nginx:
Show solution
A continuació anem a etiquetar els tres pods amb una etiqueta type:
Per defecte la comanda kubectl get pods no mostra les etiquetes, però pots fer que es mostrin amb el paràmetre : --show-labels
Pots veure que a més de la nostra etiqueta, els pods apache i nginx tenen l’etiqueta run perquè no els has creat a partir d’un fitxer sinó directament amb kubectl run.
A més de l’etiqueta type, afegeix l’etiqueta env per indicar si un pod s’executa en entorn de producció o depuració:
En lloc de veure totes les etiquetes amb , podem seleccionar les etiquetes que volem veure amb el flag , de manera que cada etiqueta es desplega en la seva pròpia columna: --show-labels``-L
Per modificar una etiqueta necessites utilitzar el flag , per evitar una modificació accidental: --overwrite
Pots veure que és fàcil afegir etiquetes als recursos i modificar-les.
A Replicació veuràs una de les utilitats més importants que tenen.
De moment ens limitarem a filtrar recursos mitjançant un selector d’etiquetes.
Per veure tots els pods que estan en entorn de producció (etiquetats amb env=prod), fes el següent:
Per tenir una llista de tots els pods que tenen l’etiqueta run, sense importar el valor de l’etiqueta:
I aquells que no tenen l’etiqueta run:
Observació. Has d’utilitzar cometes simples al voltant de perquè el shell no avaluï el signe d’exclamació. !run
També pots incloure diversos criteris separats per coma:
Espai de noms
Kubernetes utilitza diferents espais de noms per agrupar i separar recursos.
En un espai de noms el nom del recurs ha de ser únic, però pot haver-hi recursos amb el mateix nom en diferents espais de noms.
Mira els espais de nom que hi ha al teu clúster:
Fins ara has utilitzat l’espai de noms default, que és el que s’utilitza per defecte amb kubectl.
Mira els pods que hi ha a l’espai de noms : kube-system
Consell. Pots utilitzar -n en lloc de --namespace.
En altres activitats aprendràs sobre aquests pods, però a partir del nom kube-system pots intuir que es tracta de pods relacionats amb el sistema d’execució de kubernetes.
Un espai de noms és com qualsevol altre recurs, i el podem crear amb un fitxer yaml:
apiVersion: v1
kind: Namespace
metadata:
name: xtecUtilitza kubectl per enviar el fitxer al servidor API kubernetes:
Com pots haver endevinat també el pots crear directament per línia d’ordres:
A continuació crea un servidor caddy amb el nom “caddy” a l’espai de noms xtec:
Pots veure que no apareix a l’espai de noms default:
Però sí a l’espai de noms xtec:
Show solution
Fes un “port forward”:
Pots veure el servidor caddy funcionant: http://localhost:3000/.
Encara que els pods s’executin en espais separats, es poden comunicar entre ells en funció del tipus de solució de xarxa que s’hagi desplegat al clúster.
El nostre “minikube” utilitza una solució simple com pots veure a continuació:
|
Gestionar pods
A diferència de docker, amb kubernetes no pots aturar contenidors, només pots crear o eliminar pods.
Pots eliminar un pod pel seu nom:
O eliminar un conjunt de pods mitjançant un selector d’etiquetes:
Fins i tot pots eliminar tot un espai de noms (incloent tots els recursos):