Изоляция компонентов логирования на Kubernetes Infra узлах
В этом руководстве объясняется, как изолировать инфраструктурные компоненты, связанные с логированием, на выделенных Kubernetes infra узлах с помощью меток, taints и node selectors.
Цели
- Изоляция ресурсов: Предотвратить конкуренцию с бизнес-нагрузками.
- Обеспечение стабильности: Снизить количество эвикций и конфликтов при планировании.
- Упрощение управления: Централизовать инфраструктурные компоненты с едиными правилами планирования.
Предварительные требования
- kubectl настроен для работы с целевым кластером.
- Инфраструктурные компоненты не привязаны к узлам через local-PV nodeAffinity, либо вы учли такие узлы (см. ниже).
- Планирование infra узлов с опорой на Cluster Node Planning
Проверка Local PV и nodeAffinity
Если ваши компоненты используют локальное хранилище (например, TopoLVM, local PV), убедитесь, есть ли у PV spec.nodeAffinity. Если да, то:
- Добавьте все узлы, указанные в
pv.spec.nodeAffinity, в группу infra узлов, или
- Перезапустите компоненты с использованием 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 узлы.
Устранение неполадок
Распространённые проблемы и способы их решения:
Пример ошибки:
Events:
Warning FailedScheduling 2m default-scheduler 0/3 nodes are available:
3 node(s) had untolerated taint {node-role.kubernetes.io/infra: true}
Решение: добавить соответствующие tolerations для нагрузки.