La forma de garantir la disponibilitat és mantenir un conjunt estable de rèpliques de Pods executant-se en tot moment
Introducció
Un clúster kubernetes es compon de diverses màquines virtuals o màquines físiques independents.
Entorn de treball
Assegura’t de canviar la configuració de cpus i memory en funció del nombre de nodes simulats que utilitzis!
Obtén la llista dels nodes:
També pots comprovar l’estat dels teus nodes:
ReplicaSet
Un ReplicationSet és un recurs que garanteix que un grup de Pods sempre s’estan executant.
Un Pod pot desaparèixer per qualsevol raó, per exemple que el node on s’executa el Pod desapareix del clúster o que el Pod ha estat desallotjat del node.
Un ReplicaSet monitoritza constantment mitjançant un “label selector” una llista de Pods que s’estan executant, i s’assegura que el nombre de Pods en execució sigui igual al nombre desitjat mitjançant la creació o eliminació de Pods a partir d’una plantilla de Pod.
Per tant, un ReplicaSet necessita tres elements fonamentals:
-
Un label selector, que determina quins Pods ha de controlar
-
Un replica count que especifica el nombre desitjat de Pods que haurien d’estar en execució
-
Un Pod template que s’utilitza quan es creen noves rèpliques del Pod.
En qualsevol moment pots modificar el nombre de rèpliques, però els canvis en el “label selector” i el “Pod template” no afecten els Pods que s’estan executant.
A continuació crea un fitxer nginx.yaml:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80 Crea el ReplicaSet:
Pots veure que s’han creat tres Pods amb l’etiqueta nginx en tres nodes diferents:
Kubernetes intenta desplegar els Pods en nodes diferents per “no tenir tots els ous al mateix cistell”.
Esborra un dels Pods:
I verifica que el controlador de replicació crea un nou Pod:
Com hem dit al principi, un ReplicationSet és un recurs igual que un Pod.
Per tant, pots obtenir una llista de tots els ReplicaSet que s’han creat:
Així com una descripció d’un controlador de replicació determinat:
La llista d’esdeveniments mostra les accions realitzades fins al moment pel controlador: ha creat 4 Pods.
Responent a una fallada de node
Quan demanes a kubernetes que desplegui un Pod, el desplegament es farà en qualsevol node que estigui disponible.
El problema és que si aquest node “mor” …
El node ja no està Ready:
Important. El resultat no és immediat perquè el clúster primer s’ha d’assegurar que no és un problema temporal de connexió de pocs segons.
Si mires la llista de Pods, pots veure que el Pod nginx-lvw9l està Running al node multi-m02 …
Tot i que pots verificar que el Pod ja no s’està executant:
El motiu és que Kubernetes espera una estona per assegurar-se que definitivament la falta de connexió amb el node no és per una fallada temporal a la xarxa o perquè Kubelet s’està reiniciant.
Però després d’aquest temps, Kubernetes notifica un canvi de recursos i el controlador de recursos nginx crea un nou Pod:
Torna a arrencar el node multi-m02:
Etiquetes
Un controlador només gestiona els Pods que coincideixen amb el seu selector d’etiquetes.
Per saber a quin controlador està associat un Pod en aquest moment, pots mirar l’atribut metadata.ownerReferences:
"apiVersion":"apps/v1",
"blockOwnerDeletion":true,
"controller":true,
"kind":"ReplicaSet",
"name":"nginx",
"uid":"bb526ba4-f15a-4517-a056-b6ef8c8cd531"
}A un ReplicaSet no li importa si afegeixes etiquetes addicionals als Pods que gestiona:
Pots veure que els Pods són els mateixos que abans perquè aquest canvi no afecta de cap manera al ReplicaSet:
Però si canvies el valor de l’etiqueta app com es mostra a continuació:
El ReplicaSet només trobarà dos Pods etiquetats com app=nginx, i crearà un nou Pod amb aquesta etiqueta:
El flag és necessari perquè d’aquesta manera no modificaràs de manera accidental una etiqueta. --overwrite
Pots verificar que el Pod nginx-lvw9l ja no és gestionat pel controlador:
Això és útil quan un Pod no funciona correctament i vols provar què està passant: el treus de l’abast del controlador, que crearà automàticament un Pod per reemplaçar-lo, i pots depurar o esbrinar què està succeint per després eliminar-lo.
Escalant horitzontalment
Pots modificar el nombre de Pods canviant el valor de l’atribut spec.replicas.
Pots augmentar el nombre de Pods:
O reduir el nombre de Pods:
Eliminar un ReplicaSet
Quan elimines un ReplicaSet mitjançant kubectl delete, també s’eliminen els Pods a menys que utilitzis el flag --cascade=orphan:
Si tornes a crear de nou el ReplicaSet, només cal crear un nou Pod per satisfer les restriccions:
Esborra tots els recursos:
Show solution
DaemonSet
En un ReplicaSet, Kubernetes desplega el nombre de Pods indicats en el recurs als nodes del clúster que li semblin millor.
En canvi, en un DaemonSet Kubernetes desplega un únic Pod per a cada node del clúster.
Això és útil per a Pods de sistema com pot ser un recopilador de “logs”, un monitor de recursos, el procés kube-proxy, etc.
Per exemple, Fluentd és un recopilador de dades per unificar el registre d’esdeveniments del sistema.
Crea el fitxer fluentd.yaml:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
spec:
selector:
matchLabels:
name: fluentd
template:
metadata:
labels:
name: fluentd
spec:
nodeSelector:
fluentd-enabled: "true"
containers:
- name: fluentd-elasticsearch
image: quay.io/fluentd_elasticsearch/fluentd:latestPots veure que en la configuració del recurs utilitzem un selector d’etiquetes per limitar els nodes en què es desplegarà el Pod.
Per exemple, etiqueta el node multi-m02 amb fluentd-enabled=true:
Crea el recurs fluentd:
Pots veure que només s’ha desplegat un Pod fluentd-????? al clúster:
Edita el fitxer fluentd.yaml i elimina el selector:
...
spec:
containers:
- name: fluentd-elasticsearch
image: quay.io/fluentd_elasticsearch/fluentd:latestActualitza el recurs:
Ara es crea un Pod fluentd-????? a cada node del clúster:
Torna a afegir el selector de node i verifica que s’eliminen tots els Pods excepte el de multi-m02:
Modifica l’etiqueta del node multi-m02 a fluentd-enabled=false i verifica que el Pod fluentd-xqlvp s’elimina: