• Русский
  • Изоляция компонентов логирования на Kubernetes Infra узлах

    В этом руководстве объясняется, как изолировать инфраструктурные компоненты, связанные с логированием, на выделенных Kubernetes infra узлах с помощью меток, taints и node selectors.

    Цели

    • Изоляция ресурсов: Предотвратить конкуренцию с бизнес-нагрузками.
    • Обеспечение стабильности: Снизить количество эвикций и конфликтов при планировании.
    • Упрощение управления: Централизовать инфраструктурные компоненты с едиными правилами планирования.

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

    1. kubectl настроен для работы с целевым кластером.
    2. Инфраструктурные компоненты не привязаны к узлам через local-PV nodeAffinity, либо вы учли такие узлы (см. ниже).
    3. Планирование infra узлов с опорой на Cluster Node Planning

    Проверка Local PV и nodeAffinity

    Если ваши компоненты используют локальное хранилище (например, TopoLVM, local PV), убедитесь, есть ли у PV spec.nodeAffinity. Если да, то:

    1. Добавьте все узлы, указанные в pv.spec.nodeAffinity, в группу infra узлов, или
    2. Перезапустите компоненты с использованием storage class без node affinity (например, Ceph/RBD).

    Пример (Elasticsearch):

    # 1) Получить PVC Elasticsearch
    kubectl get pvc -n cpaas-system | grep elastic
    
    # 2) Просмотреть один PV
    kubectl get pv elasticsearch-log-node-pv-192.168.135.243 -o yaml

    Если PV содержит:

    spec:
      local:
        path: /cpaas/data/elasticsearch/data
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - 192.168.135.243

    Это означает, что данные Elasticsearch закреплены за узлом 192.168.135.243. Убедитесь, что этот узел входит в группу infra узлов, либо перенесите хранилище.

    Добавление узлов Kafka/ZooKeeper в infra узлы

    По историческим причинам убедитесь, что узлы Kafka и ZooKeeper также помечены/имеют taint как infra:

    kubectl get nodes -l kafka=true
    kubectl get nodes -l zk=true
    # Добавьте перечисленные узлы в infra узлы, как описано выше

    Перемещение компонентов логирования на infra узлы

    Компоненты логирования ACP по умолчанию допускают infra taints. Используйте nodeSelector для закрепления нагрузок на infra узлах.

    Elasticsearch

    # Data узлы
    kubectl patch statefulset cpaas-elasticsearch -n cpaas-system \
      --type='merge' \
      -p='{"spec":{"template":{"spec":{"nodeSelector":{"node-role.kubernetes.io/infra":""}}}}}'
    
    # Master узлы (если есть)
    kubectl patch statefulset cpaas-elasticsearch-master -n cpaas-system \
      --type='merge' \
      -p='{"spec":{"template":{"spec":{"nodeSelector":{"node-role.kubernetes.io/infra":""}}}}}'
    
    # Проверка
    kubectl get pods -n cpaas-system -o wide | grep cpaas-elasticsearch

    Kafka

    kubectl patch statefulset cpaas-kafka -n cpaas-system \
      --type='merge' \
      -p='{"spec":{"template":{"spec":{"nodeSelector":{"node-role.kubernetes.io/infra":""}}}}}'
    
    kubectl get pods -n cpaas-system -o wide | grep cpaas-kafka

    ZooKeeper

    kubectl patch statefulset cpaas-zookeeper -n cpaas-system \
      --type='merge' \
      -p='{"spec":{"template":{"spec":{"nodeSelector":{"node-role.kubernetes.io/infra":""}}}}}'
    
    kubectl get pods -n cpaas-system -o wide | grep cpaas-zookeeper

    ClickHouse

    kubectl patch chi cpaas-clickhouse -n cpaas-system --type='json' -p='[
      {"op":"add","path":"/spec/templates/podTemplates/0/spec/nodeSelector/node-role.kubernetes.io~1infra","value":""},
      {"op":"add","path":"/spec/templates/podTemplates/1/spec/nodeSelector/node-role.kubernetes.io~1infra","value":""}
    ]'
    
    kubectl get pods -n cpaas-system -o wide | grep clickhous

    lanaya

    kubectl patch deployment lanaya -n cpaas-system \
      --type='merge' \
      -p='{"spec":{"template":{"spec":{"nodeSelector":{"node-role.kubernetes.io/infra":""}}}}}'
    
    kubectl get pods -n cpaas-system -o wide | grep lanaya

    razor

    # Если развернуто как Deployment (бэкенд Elasticsearch)
    kubectl patch deployment razor -n cpaas-system \
      --type='merge' \
      -p='{"spec":{"template":{"spec":{"nodeSelector":{"node-role.kubernetes.io/infra":""}}}}}'
    
    # Если развернуто как StatefulSet (бэкенд ClickHouse)
    kubectl patch statefulset razor -n cpaas-system \
      --type='merge' \
      -p='{"spec":{"template":{"spec":{"nodeSelector":{"node-role.kubernetes.io/infra":""}}}}}'
    
    kubectl get pods -n cpaas-system -o wide | grep razor

    Любой другой компонент логирования

    # Deployment
    kubectl patch deployment <deployment-name> -n cpaas-system \
      --type='merge' \
      -p='{"spec":{"template":{"spec":{"nodeSelector":{"node-role.kubernetes.io/infra":""}}}}}'
    
    # StatefulSet
    kubectl patch statefulset <statefulset-name> -n cpaas-system \
      --type='merge' \
      -p='{"spec":{"template":{"spec":{"nodeSelector":{"node-role.kubernetes.io/infra":""}}}}}'
    
    kubectl get pods -n cpaas-system -o wide | grep <deployment-name>
    kubectl get pods -n cpaas-system -o wide | grep <statefulset-name>

    Эвакуация не-infra нагрузок с infra узлов

    Если на infra узлах продолжают работать не-infra Pod'ы, вызовите повторное планирование, обновив эти нагрузки (например, изменив аннотацию) или добавив селекторы, исключающие infra узлы.

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

    Распространённые проблемы и способы их решения:

    ПроблемаДиагностикаРешение
    Pod'ы застряли в Pendingkubectl describe pod &lt;pod&gt; | grep EventsДобавить tolerations или скорректировать селекторы
    Несовпадение taint/tolerationkubectl describe node &lt;node&gt; | grep TaintsДобавить соответствующие tolerations для нагрузок
    Недостаток ресурсовkubectl top nodes -l node-role.kubernetes.io/infraМасштабировать infra узлы или настроить запросы ресурсов

    Пример ошибки:

    Events:
      Warning  FailedScheduling  2m  default-scheduler  0/3 nodes are available:
      3 node(s) had untolerated taint {node-role.kubernetes.io/infra: true}

    Решение: добавить соответствующие tolerations для нагрузки.