Что такое etcd и какова его роль в Kubernetes?

«Что такое etcd и какова его роль в Kubernetes?» — вопрос из категории Kubernetes, который задают на 24% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Etcd — это распределенное, отказоустойчивое key-value хранилище, выступающее в роли единственного источника истины (single source of truth) для кластера Kubernetes. В нем хранится вся конфигурация и состояние кластера.

Что именно хранится в etcd:

  • Конфигурация объектов: Nodes, Pods, ConfigMaps, Secrets, Deployments, Services.
  • Состояние: Текущие желаемые и актуальные состояния всех ресурсов.
  • Информация о кластере: Настройки сети (например, подсети для CNI), информация о kube-scheduler и kube-controller-manager.

Архитектура и важность для DevOps:

  1. Консенсус и отказоустойчивость: Etcd использует алгоритм консенсуса Raft. Для устойчивости к сбоям требуется кластер из нечетного количества нод (обычно 3 или 5). Потеря кворума нод (например, 2 из 3) делает кластер Kubernetes неработоспособным для внесения изменений.
  2. Критический компонент: Без работающего etcd kube-apiserver не может получить или изменить состояние кластера. Работающие Pods продолжат работать, но управлять ими (масштабировать, обновлять) будет невозможно.
  3. Бэкап и восстановление: Регулярный бэкап etcd — обязательная практика для аварийного восстановления (Disaster Recovery).
    # Пример создания снапшота etcd с помощью etcdctl
    ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 
      --cacert=/etc/kubernetes/pki/etcd/ca.crt 
      --cert=/etc/kubernetes/pki/etcd/server.crt 
      --key=/etc/kubernetes/pki/etcd/server.key 
      snapshot save /var/backup/etcd-snapshot-$(date +%Y%m%d).db
  4. Безопасность: В продакшене etcd должен быть защищен TLS-сертификатами для клиентской и пир-коммуникации (порты 2379 и 2380 соответственно).

Проверка состояния:

# Проверка здоровья кластера etcd
ETCDCTL_API=3 etcdctl endpoint health
# Получение списка ключей (например, всех Pods в namespace default)
ETCDCTL_API=3 etcdctl get /registry/pods/default --prefix