• Русский
  • Развертывание кластера Etcd

    Содержание

    Обзор

    TIP

    В этом руководстве показано, как развернуть высокодоступный кластер etcd с помощью etcd operator. Etcd — это распределённое хранилище ключ-значение, обеспечивающее надёжное хранение данных для распределённых систем, часто используемое в качестве хранилища данных управляющей плоскости Kubernetes.

    INFO

    Для развертывания кластера etcd необходимо установить плагин кластера Alauda Build Of etcd Operator, пожалуйста, обратитесь к разделу Install

    Предварительные требования

    Перед развертыванием кластера etcd убедитесь, что выполнены следующие условия:

    • Рабочий кластер Kubernetes с установленным etcd operator
    • Установлен и настроен cert-manager в вашем кластере
    • Достаточно ресурсов для кластера etcd (CPU, память и хранилище)
    • Настроен класс хранилища для постоянных томов (например, sc-topolvm)
    • Инструмент CLI kubectl настроен для доступа к вашему кластеру

    Управление сертификатами

    Etcd требует TLS-сертификаты для безопасного взаимодействия между участниками кластера. Вы можете либо сгенерировать новые сертификаты с помощью cert-manager, либо использовать существующие.

    Параметры, используемые в этом разделе:

    • {ROOT_CA_NAME}: Имя корневого CA сертификата и секрета (например, etcd-root-ca)
    • {CA_ISSUER_NAME}: Имя Issuer в cert-manager (например, etcd-ca-issuer)

    Вариант 1: Создание CA с помощью Cert-Manager

    Если у вас нет существующего CA, вы можете создать его с помощью cert-manager.

    Шаг 1: Создание секрета CA

    Создайте ресурс Certificate, который сгенерирует корневой CA:

    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
      name: {ROOT_CA_NAME}
      namespace: cpaas-system
    spec:
      isCA: true
      commonName: {ROOT_CA_NAME}
      secretName: {ROOT_CA_NAME}
      duration: 87600h # 10 лет
      renewBefore: 720h # Обновлять за 30 дней до истечения
      issuerRef:
        name: cpaas-ca
        kind: Issuer

    Примените эту конфигурацию:

    kubectl apply -f root-ca-certificate.yaml

    Шаг 2: Создание Issuer для корневого CA

    После создания секрета CA создайте Issuer, который на него ссылается:

    apiVersion: cert-manager.io/v1
    kind: Issuer
    metadata:
      name: {CA_ISSUER_NAME}
      namespace: cpaas-system
    spec:
      ca:
        secretName: {ROOT_CA_NAME}

    Примените конфигурацию Issuer:

    kubectl apply -f ca-issuer.yaml

    Проверьте готовность Issuer:

    kubectl get issuer {CA_ISSUER_NAME} -n cpaas-system

    Вариант 2: Использование существующего CA

    Если у вас уже есть сертификат CA, сохранённый как секрет Kubernetes, вы можете создать Issuer напрямую:

    apiVersion: cert-manager.io/v1
    kind: Issuer
    metadata:
      name: {CA_ISSUER_NAME}
      namespace: cpaas-system
    spec:
      ca:
        secretName: {ROOT_CA_NAME}

    Примените конфигурацию:

    kubectl apply -f ca-issuer.yaml

    Процедура развертывания

    Шаг 1: Определение версии Etcd

    Сначала определите подходящую версию etcd. Вы можете проверить версию, используемую вашим глобальным кластером:

    kubectl get pods -n kube-system -l component=etcd \
      -o jsonpath='{.items[0].spec.containers[0].image}' | awk -F: '{print $NF}'

    Эта команда выведет версию etcd, например: v3.5.21

    Шаг 2: Создание ресурса EtcdCluster

    Создайте кастомный ресурс EtcdCluster с нужной конфигурацией:

    apiVersion: operator.etcd.io/v1alpha1
    kind: EtcdCluster
    metadata:
      name: {ETCD_CLUSTER_NAME}
      namespace: cpaas-system
    spec:
      size: 3  # Количество участников etcd (рекомендуется: 3, 5 или 7)
      storageSpec:
        accessModes: ReadWriteOnce
        storageClassName: {SC_NAME}  # Используйте ваш класс хранилища
        volumeSizeLimit: 20Gi  # Максимальный размер тома
        volumeSizeRequest: 10Gi  # Начальный размер тома
      tls:
        provider: cert-manager
        providerCfg:
          certManagerCfg:
            issuerKind: Issuer
            issuerName: {CA_ISSUER_NAME}  # Ссылка на ваш Issuer CA
            validityDuration: 87600h 
      version: {ETCD_VERSION}  # например, v3.5.21
      etcdOptions:
      - --auto-compaction-mode=periodic
      - --auto-compaction-retention=24h

    Замените заполнители:

    • {ETCD_CLUSTER_NAME}: Имя вашего кластера etcd
    • {SC_NAME}: Имя вашего класса хранилища
    • {CA_ISSUER_NAME}: Имя вашего Issuer cert-manager
    • {ETCD_VERSION}: Версия etcd (например, v3.5.21)

    Примените конфигурацию:

    kubectl apply -f etcd-cluster.yaml

    Шаг 3: Мониторинг статуса развертывания

    Отслеживайте создание и запуск StatefulSet:

    # Проверить статус StatefulSet
    kubectl get statefulset -n cpaas-system {ETCD_CLUSTER_NAME}
    
    # Наблюдать за созданием подов
    kubectl get pods -n cpaas-system -l controller={ETCD_CLUSTER_NAME} -w 

    Дождитесь, пока все поды перейдут в состояние Running и будут готовы (это может занять несколько минут).

    Проверка

    После развертывания проверьте, что кластер etcd работает корректно и здоров:

    Установите следующие переменные:

    • {ETCD_CLUSTER_NAME}: Имя вашего кластера etcd (такое же, как в ресурсе EtcdCluster)
    • {NAMESPACE}: Пространство имён, где развернут etcd (например, cpaas-system)

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

    Подключитесь к одному из подов etcd и проверьте состояние кластера:

    
    ETCD_CLUSTER_NAME={ETCD_CLUSTER_NAME}
    NAMESPACE={NAMESPACE}
    ETCD_POD=$(kubectl get pods -n cpaas-system -l controller=$ETCD_CLUSTER_NAME -o jsonpath='{.items[0].metadata.name}')
    
    # Проверка состояния кластера
    kubectl exec -n cpaas-system $ETCD_POD -- etcdctl \
      --endpoints=$ETCD_POD.$ETCD_CLUSTER_NAME.$NAMESPACE.svc.cluster.local:2379 \
      --cacert=/etc/etcd/certs/server/ca.crt \
      --cert=/etc/etcd/certs/server/tls.crt \
      --key=/etc/etcd/certs/server/tls.key \
      endpoint health

    Проверка участников кластера

    Выведите список всех участников кластера:

    kubectl exec -n cpaas-system $ETCD_POD -- etcdctl \
      --endpoints=$ETCD_POD.$ETCD_CLUSTER_NAME.$NAMESPACE.svc.cluster.local:2379 \
      --cacert=/etc/etcd/certs/server/ca.crt \
      --cert=/etc/etcd/certs/server/tls.crt \
      --key=/etc/etcd/certs/server/tls.key \
      member list

    Тест операций с данными

    Выполните простую запись и чтение:

    # Записать тестовый ключ
    kubectl exec -n cpaas-system $ETCD_POD -- etcdctl \
      --endpoints=$ETCD_POD.$ETCD_CLUSTER_NAME.$NAMESPACE.svc.cluster.local:2379 \
      --cacert=/etc/etcd/certs/server/ca.crt \
      --cert=/etc/etcd/certs/server/tls.crt \
      --key=/etc/etcd/certs/server/tls.key \
      put test-key Hello
    
    # Прочитать тестовый ключ
    kubectl exec -n cpaas-system $ETCD_POD -- etcdctl \
      --endpoints=$ETCD_POD.$ETCD_CLUSTER_NAME.$NAMESPACE.svc.cluster.local:2379 \
      --cacert=/etc/etcd/certs/server/ca.crt \
      --cert=/etc/etcd/certs/server/tls.crt \
      --key=/etc/etcd/certs/server/tls.key \
      get test-key

    Параметры конфигурации

    Размер кластера

    Поле size определяет количество участников etcd. Для продакшн-среды:

    • 3 участника: Стандартная конфигурация, выдерживает 1 отказ
    • 5 участников: Высокая доступность, выдерживает 2 отказа
    • 7 участников: Максимально рекомендуемое, выдерживает 3 отказа
    WARNING

    Всегда используйте нечётное количество участников для поддержания кворума при отказах.

    Конфигурация хранилища

    • storageClassName: Укажите ваш класс хранилища, поддерживающий динамическое выделение
    • volumeSizeRequest: Начальный размер постоянного тома
    • volumeSizeLimit: Максимальный размер, до которого может увеличиваться том (если поддерживается классом хранилища)

    Конфигурация TLS

    • validityDuration: Период действия сертификата (рекомендуется: 8760h или 1 год)
    • Сертификаты автоматически обновляются cert-manager до истечения срока действия

    Устранение неполадок

    Параметры, используемые в этом разделе:

    • {ETCD_CLUSTER_NAME}: Имя вашего кластера etcd
    • {POD_NAME}: Имя конкретного пода (получить через kubectl get pods)
    • {OTHER_POD_IP}: IP-адрес другого пода (получить через kubectl get pods -o wide)
    • {ROOT_CA_NAME}: Имя корневого CA сертификата
    • {CA_ISSUER_NAME}: Имя Issuer cert-manager

    Поды не запускаются

    Если поды не запускаются, проверьте следующее:

    # Просмотр событий пода
    kubectl describe pods -n cpaas-system -l controller={ETCD_CLUSTER_NAME}
    
    # Просмотр логов пода
    kubectl logs -n cpaas-system {POD_NAME}
    
    # Проверка статуса PVC
    kubectl get pvc -n cpaas-system
    
    # Просмотр логов контроллера
    kubectl logs -n cpaas-system -l service_name=etcd-operator-controller-manager

    Распространённые проблемы:

    • Недостаточно места в хранилище
    • Класс хранилища не найден
    • Issuer сертификатов не готов
    • Ограничения ресурсов (CPU/память)

    Кластер не формирует кворум

    Если кластер не может сформировать кворум:

    # Просмотр логов всех подов
    kubectl logs -n cpaas-system -l controller={ETCD_CLUSTER_NAME} --all-containers=true

    Проблемы с сертификатами

    Проверьте корректность выдачи сертификатов:

    # Просмотр ресурсов сертификатов
    kubectl get certificates -n cpaas-system
    
    # Просмотр деталей сертификата
    kubectl describe certificate {ROOT_CA_NAME} -n cpaas-system
    
    # Проверка статуса Issuer
    kubectl get issuer {CA_ISSUER_NAME} -n cpaas-system -o yaml

    Рекомендации по лучшим практикам

    1. Стратегия резервного копирования: Реализуйте регулярное резервное копирование etcd для восстановления после сбоев
    2. Мониторинг: Настройте мониторинг и оповещения о состоянии кластера
    3. Ограничения ресурсов: Настройте соответствующие запросы и лимиты ресурсов
    4. Сетевые политики: Внедрите сетевые политики для защиты коммуникаций etcd
    5. Регулярное обслуживание: Поддерживайте актуальную версию etcd и контролируйте использование хранилища