Gestión y Renovación de Certificados Caducados en Clusters Kubernetes

Los clusters Kubernetes desplegados utilizando kubeadm suelen tener una caducidad predeterminada de un año para sus certificados. Es esencial gestionar y renovar estos certificados antes de su expiración para evitar interrupciones en la operatividad del clúster. Este documento describe el procedimiento para renovar certificados en un entorno Kubernetes, con un enfoque en despliegues basados en kubeadm.

  1. Verificación de la Vigencia de los Certificados

Antes de iniciar el proceso de renovación, es crucial verificar el estado actual y las fechas de expiración de todos los certificados relevantes del clúster. Esto ayuda a confirmar cuáles requieren actualización.

1.1 Revisión de la Caducidad de los Certificados Principales

En el nodo maestro, utilice el comando kubeadm certs check-expiration para obtener un resumen de la validez de los certificados del plano de control.

kubeadm certs check-expiration

1.2 Inspección de Ceritficados Kubelet

Los certificados de Kubelet, tanto en el nodo maestro como en los nodos trabajadores, también deben ser inspeccionados. Puede listar los archivos de certificados y luego verificar su período de validez con openssl.

ls -lh /var/lib/kubelet/pki/
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -text | grep 'Not Before\|Not After'
  1. Realización de Copias de Seguridad

Siempre es una buena práctica realizar una copia de seguridad completa de los archivos de configuración y los certificados del clúster antes de proceder con cualquier modificación. Esto facilita la recuperación en caso de imprevistos.

mkdir -p /tmp/respaldo_kube/config /tmp/respaldo_kube/certs
cp -r /etc/kubernetes/ /tmp/respaldo_kube/config/
cp -r /var/lib/kubelet/pki/ /tmp/respaldo_kube/certs/
  1. Renovación de Certificados del Plano de Control en el Nodo Maestro

El comando kubeadm certs renew all se encarga de renovar la mayoría de los certificados internos del plano de control del clúster en el nodo maestro.

kubeadm certs renew all

Tras la ejecución, es recomendable verificar nuevamente la expiración de los certificados para confirmar la renovación.

kubeadm certs check-expiration
ls -lh /etc/kubernetes/pki/
  1. Actualización de Archivos Kubeconfig

La renovación de certificados requiere que los archivos kubeconfig utilizados por los componentes del plano de control (como el scheduler y el controller-manager) sean actualizados para referenciar los nuevos certificados. Aunque kubeadm certs renew actualiza los archivos PKI, los archivos .conf que los utilizan también deben ser recreados o actualizados.

4.1 Regeneración de los Archivos de Configuración

Mueva o elimine los archivos .conf antiguos ubicados en /etc/kubernetes/ y luego regenere los nuevos. Asegúrese de actualizar también el archivo kubeconfig del usuario, si existe.

mv /etc/kubernetes/*.conf /tmp/respaldo_kube/config/
kubeadm init --kubernetes-version=v1.23.6 phase kubeconfig all
cp /etc/kubernetes/admin.conf ~/.kube/config

4.2 Reinicio de Componentes del Plano de Control

Para que componentes como kube-scheduler y kube-controller-manager utilicen los certificados y archivos kubeconfig recién generados, es necesario reiniciarlos. Dado que son pods estáticos, Kubelet los gestiona. Forzar su recreación es una manera eficaz de aplicar los cambios.

# Eliminar el pod del scheduler para forzar su recreación
POD_SCHEDULER=$(kubectl get pod -n kube-system -l component=kube-scheduler -o jsonpath='{.items[0].metadata.name}')
kubectl delete pod $POD_SCHEDULER -n kube-system

# Repetir para kube-controller-manager
POD_CONTROLLER=$(kubectl get pod -n kube-system -l component=kube-controller-manager -o jsonpath='{.items[0].metadata.name}')
kubectl delete pod $POD_CONTROLLER -n kube-system

Verifique que los pods se hayan reiniciado y estén operativos:

kubectl get pods -n kube-system | grep -E 'scheduler|controller-manager'
  1. Actualización de Certificados Kubelet en Nodos Maestros y Trabajadores

Los certificados de Kubelet deben ser actualizados y aprobados tanto en el nodo maestro como en los nodos trabajadores.

5.1 Renovación del Certificado Kubelet del Nodo Maestro

Aunque los certificados principales se renuevan, el servicio Kubelet requiere un reinicio para generar una nueva Solicitud de Firma de Certificado (CSR) y utilizar los archivos de configuración actualizados.

systemctl restart kubelet.service

Después del reinicio, se generará una nueva CSR. Verifique las CSRs pendientes:

kubectl get csr

Apruebe la CSR generada por el Kubelet del nodo maestro (sustituya <NOMBRE_DE_LA_CSR> por el nombre real de la CSR).

kubectl certificate approve <NOMBRE_DE_LA_CSR>

Confirme que el certificado de Kubelet se ha actualizado correctamente:

openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -text | grep 'Not Before\|Not After'

5.2 Renovación de Certificados Kubelet en Nodos Trabajadores

El procedimiento para los nodos trabajadores es análogo, pero implica generar un nuevo archivo kubelet.conf en el nodo maestro y luego transferirlo al nodo trabajador.

5.2.1 Preparación en el Nodo Maestro (por cada nodo trabajador)

En el nodo maestro, genere el archivo kubelet.conf específico para cada nodo trabajador. Reemplace nombre-del-nodo-trabajador-01 con el nombre de host de su nodo.

mkdir -p /tmp/config_nodos_trabajadores
kubeadm init --kubernetes-version=v1.23.6 phase kubeconfig kubelet --node-name nombre-del-nodo-trabajador-01 --kubeconfig-dir /tmp/config_nodos_trabajadores/

5.2.2 Actualización en el Nodo Trabajador

En el nodo trabajador, primero cree una copia de seguridad del archivo kubelet.conf existente.

# En nombre-del-nodo-trabajador-01
mv /etc/kubernetes/kubelet.conf /etc/kubernetes/kubelet.conf.bak

Desde el nodo maestro, copie el nuevo archivo kubelet.conf al nodo trabajador:

# En el nodo maestro
scp /tmp/config_nodos_trabajadores/kubelet.conf root@nombre-del-nodo-trabajador-01:/etc/kubernetes/

Una vez que el archivo ha sido copiado, reinicie el servicio Kubelet en el nodo trabajador:

# En nombre-del-nodo-trabajador-01
systemctl restart kubelet.service

Después del reinicio, el Kubelet del nodo trabajador generará una nueva CSR.

5.2.3 Aprobación de CSRs en el Nodo Maestro

En el nodo maestro, revise las nuevas CSRs pendientes y apruébelas (sustituya <NOMBRE_DE_LA_CSR_DEL_NODO> por el nombre real de la CSR del nodo trabajador):

# En el nodo maestro
kubectl get csr
kubectl certificate approve <NOMBRE_DE_LA_CSR_DEL_NODO>

Finalmente, confirme la validez del certificado de Kubelet en el nodo trabajador:

# En nombre-del-nodo-trabajador-01
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -text | grep 'Not Before\|Not After'

Etiquetas: Kubernetes kubeadm certificados RenovaciónCertificados Kubelet

Publicado el 10-10 09:33