Mantenimiento Y actualización

El mantenimiento de kubernetes es una tarea que se realiza con frecuencia.

Backup base de datos etcd

Durante los procesos de actualización, por muy estables que sean, siempre es buena idea crear una copia de seguridad de la base de datos del cluster.

  1. Lo primero que tenemos que hacer es buscar el directorio de los datos de etcd:
sudo grep data-dir /etc/kubernetes/manifests/etcd.yaml

Toda esta parte se realiza ejecutando comandos dentro del contenedor de etcd. Se llama etcd-<nombre nodo> , aunque podrías listar los pods del sistema para encontrarlo con kubectl -n kube-system get pods.

  1. Comprobamos el estado de la base de datos de etcd:
kubectl -n kube-system exec -it etcd-<nombre_pod> -- sh -c "ETCDCTL_API=3 \
ETCDCTL_CACERT=/etc/kubernetes/pki/etcd/ca.crt \
ETCDCTL_CERT=/etc/kubernetes/pki/etcd/server.crt \
ETCDCTL_KEY=/etc/kubernetes/pki/etcd/server.key \
etcdctl endpoint health"
  1. Comprobamos el estado del cluster:
kubectl -n kube-system exec -it etcd-kube-master -- sh -c "ETCDCTL_API=3 \
ETCDCTL_CACERT=/etc/kubernetes/pki/etcd/ca.crt \
ETCDCTL_CERT=/etc/kubernetes/pki/etcd/server.crt \
ETCDCTL_KEY=/etc/kubernetes/pki/etcd/server.key \
etcdctl --endpoints=https://127.0.0.1:2379 member list -w table"
  1. Por último, hacemos la copia de seguridad con el comando snapshot:
kubectl -n kube-system exec -it etcd-kube-master -- sh -c "ETCDCTL_API=3 \
ETCDCTL_CACERT=/etc/kubernetes/pki/etcd/ca.crt \
ETCDCTL_CERT=/etc/kubernetes/pki/etcd/server.crt \
ETCDCTL_KEY=/etc/kubernetes/pki/etcd/server.key \
etcdctl --endpoints=https://127.0.0.1:2379 snapshot save /var/lib/etcd/snapshot.db"

Si hacemos un ls en directorio del paso 1 (normalmente /var/lib/etcd) podremos ver el la base de datos que acabamos de extraer:

sudo ls -l /var/lib/etcd

Actualizar el cluster

Lo primero es actualizar la herramienta kubeadm, la cuál, nos ayudará a actualizar el cluster.

  1. Actualizamos los metadatos de los paquetes del sistema con:
sudo apt update
  1. Podemos consultar las versiones disponibles con la herramienta madison las versiones disponibles con la herramienta madison:
sudo apt-cache madison kubeadm
  1. Si teníamos bloqueado el paquete kubeadm para que no se actualizara automáticamente, lo desbloqueamos:
sudo apt-mark unhold kubeadm
  1. Instalamos la versión deseada:
sudo apt install -y kubeadm=1.23.1-00
  1. Volvemos a bloquear la actualización del paquete:
sudo apt-mark hold kubeadm
  1. Podemos comprobar la versión que accabamos de instalar:
sudo kubeadm version
  1. Para preparar el nodo para la actualización, tenemos que desalojar a todos los pods como sea posible (si estuvieramos actualizando un nodo trabajador el drain tendríamos que hacerlo desde el maestro). Se puede realizar así:
kubectl drain <nombre_nodo> --ignore-daemonsets
  1. El comando kubeadm nos permite previsualizar los cambios que va a generar la actualización con el comando plan:
sudo kubeadm upgrade plan
  1. Podemos realizar la actualización del nodo con el comando apply:
sudo kubeadm upgrade plan
  1. Actualizamos el resto de paquetes a la misma version:
sudo apt-mark unhold kubelet kubectl
sudo apt-get install -y kubelet=1.23.1-00 kubectl=1.23.1-00
sudo apt-mark hold kubelet kubectl
  1. Aunque hemos actualizado correctamente, si ejecutamos kubectl get nodes nos seguirá mostrando la versión anterior. La actualización se hará efectiva hasta que reiniciemos los servicios:
sudo systemctl daemon-reload
sudo systemctl restart kubelet
  1. Por último, en el proceso de actualización de un nodo, este desactiva el planificador de tareas. Podemos desbloquearlo así:
kubectl uncordon <nombre_nodo>

Se puede verificar el estado con el comando:

kubectl get nodes