Despliegue de un Clúster etcd de Alta Disponibilidad para Kubernetes con TLS

  1. Distribución de Certificados TLS

Para asegurar la comunicación en el clúster etcd, es fundamental utilizar autenticación TLS. Los archivos de certificado (ca.pem, kubernetes-key.pem, kubernetes.pem) deben estar presentes en cada nodo que forme parte del clúster etcd, además del nodo local. Ejecute los siguientes comandos para distribuir los certificados:

scp ca.pem kubernetes-key.pem kubernetes.pem root@10.10.90.106:/etc/kubernetes/ssl/
scp ca.pem kubernetes-key.pem kubernetes.pem root@10.10.90.107:/etc/kubernetes/ssl/

Asegúrese de que la ruta /etc/kubernetes/ssl exista en todos los nodos, creándola si es necesario.

  1. Instalación del Servidor etcd

En sistemas basados en CentOS/RHEL, etcd puede instalarse convenientemente a través de yum. Verifique la disponibilidad de la versión deseada y proceda con la instalación:

# Consultar información del paquete etcd (ej. versión 3.2.9)
yum info etcd
# Instalar etcd
yum install etcd -y

Una vez instalado, el binario etcd se encontrará típicamente en /usr/bin/etcd. Tenga en cuenta esta ruta para la confgiuración del servicio Systemd.

  1. Definición del Servicio Systemd para etcd

Cree o modifique el archivo de unidad Systemd para etcd en /usr/lib/systemd/system/etcd.service. Este archivo define cómo se inicia y gestiona el proceso de etcd en cada servidor del clúster.

[Unit]
Description=Servidor etcd de Kubernetes
After=network.target network-online.target
Wants=network-online.target
Documentation=https://etcd.io/docs/

[Service]
Type=notify
WorkingDirectory=/var/lib/etcd/
EnvironmentFile=-/etc/etcd/etcd.conf
ExecStart=/usr/bin/etcd \
  --name=etcd-node-01 \
  --cert-file=/etc/kubernetes/ssl/kubernetes.pem \
  --key-file=/etc/kubernetes/ssl/kubernetes-key.pem \
  --peer-cert-file=/etc/kubernetes/ssl/kubernetes.pem \
  --peer-key-file=/etc/kubernetes/ssl/kubernetes-key.pem \
  --trusted-ca-file=/etc/kubernetes/ssl/ca.pem \
  --peer-trusted-ca-file=/etc/kubernetes/ssl/ca.pem \
  --initial-advertise-peer-urls=https://10.10.90.105:2380 \
  --listen-peer-urls=https://10.10.90.105:2380 \
  --listen-client-urls=https://10.10.90.105:2379,http://127.0.0.1:2379 \
  --advertise-client-urls=https://10.10.90.105:2379 \
  --initial-cluster-token=etcd-cluster-k8s \
  --initial-cluster=etcd-node-01=https://10.10.90.105:2380,etcd-node-02=https://10.10.90.106:2380,etcd-node-03=https://10.10.90.107:2380 \
  --initial-cluster-state=new \
  --data-dir=/var/lib/etcd
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

Puntos clave para la configuración en cada nodo:

  • Direcciones IP del nodo: El valor de --initial-cluster debe incluir las direcciones de todos los nodos del clúster. Las URLs como --initial-advertise-peer-urls, --listen-peer-urls, --listen-client-urls y --advertise-client-urls deben ser las de la interfaz de red local del nodo específico.
  • Nombre del nodo: El parámetro --name debe coincidir con el nombre asignado al nodo en la lista --initial-cluster (ej., etcd-node-01 para el nodo con IP 10.10.90.105).
  • Ruta del ejecutable: Asegúrese de que ExecStart apunte a la ubicación correcta del binario etcd (normalmente /usr/bin/etcd).
  • Directorio de datos: El directorio especificado en --data-dir (/var/lib/etcd) debe existir y taner los permisos adecuados antes de iniciar el servicio.
  1. Configuración de Variables de Entorno de etcd

Cree o ajuste el archivo de configuración de entorno /etc/etcd/etcd.conf. Este archivo permite centralizar algunas variables clave para la ejecución de etcd.

# [member]
ETCD_NAME="infra-node-1"
ETCD_DATA_DIR="/var/lib/etcd"
ETCD_LISTEN_PEER_URLS="https://10.10.90.105:2380"
ETCD_LISTEN_CLIENT_URLS="https://10.10.90.105:2379"

# [cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://10.10.90.105:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-k8s"
ETCD_ADVERTISE_CLIENT_URLS="https://10.10.90.105:2379"

Consideraciones importantes:

  • Reemplace las direcciones IP con las de la interfaz local del nodo actual.
  • ETCD_NAME debe coincidir con el valor de --name configurado en el archivo etcd.service para este nodo.
  • El directorio ETCD_DATA_DIR debe existir antes de iniciar el servicio.
  1. Gestión del Servicio etcd

Una vez configurados los archivos etcd.service y etcd.conf en todos los nodos, proceda a recargar la configuración de Systemd, habilitar el servicio para que enicie al arranque y arrancarlo:

sudo systemctl daemon-reload
sudo systemctl enable etcd
sudo systemctl start etcd
sudo systemctl status etcd

Verifique el estado del servicio en cada nodo para asegurarse de que se haya iniciado correctamente.

  1. Comprobación del Estado del Clúster etcd

Para confirmar que el clúster etcd funciona correctamente, ejecute el siguiente comando en cualquiera de los nodos. Es crucial incluir los parámetros de certificado para la autenticación TLS:

etcdctl \
  --ca-file=/etc/kubernetes/ssl/ca.pem \
  --cert-file=/etc/kubernetes/ssl/kubernetes.pem \
  --key-file=/etc/kubernetes/ssl/kubernetes-key.pem \
  cluster-health

Una salida exitosa indicará que el clúster está saludable, mostrando información similar a esta:

member 2f590aa6fa719c4b is healthy: got healthy result from https://10.10.90.105:2379
member 43ea47a48fb7ffce is healthy: got healthy result from https://10.10.90.106:2379
member d965bb336acbfc6c is healthy: got healthy result from https://10.10.90.107:2379
cluster is healthy

Si encuentra un estado unhealthy o errores relacionados con certificados, considere los siguientes puntos de resolución:

  • Autenticación TLS: Siempre utilice los parámetros --ca-file, --cert-file y --key-file al interactuar con etcd a través de etcdctl. La ausencia de estos resultará en errores de validación de certificado, como el siguiente:
failed to check the health of member 2f590aa6fa719c4b on https://10.10.90.105:2379: Get https://10.10.90.105:2379/health: x509: certificate signed by unknown authority
...
cluster is unhealthy

  • Firewall: Asegúrese de que los puertos 2379 (cliente) y 2380 (peer) de etcd estén abiertos entre todos los nodos del clúster. Deshabilite temporalmente el firewall si es necesario para el diagnóstico (ej., sudo systemctl stop firewalld).
  • Configuración de proxy: Los proxies HTTP/HTTPS pueden interferir con la comunicación interna del clúster. Verifique y deshabilite cualquier configuración de proxy que pueda estar afectando el servicio etcd.

Etiquetas: etcd Kubernetes AltaDisponibilidad TLS systemd

Publicado el 9-18 05:37