在 Kubernetes Infra 节点上隔离日志组件

本指南说明如何通过标签、污点和节点选择器,将与日志相关的基础设施组件隔离到专用的 Kubernetes infra 节点上。

目标

  • 隔离资源:防止与业务工作负载发生资源争用。
  • 保证稳定性:减少驱逐和调度冲突。
  • 简化管理:通过一致的调度规则集中管理基础设施组件。

前提条件

  1. 已配置好指向目标集群的 kubectl
  2. 基础设施组件未通过 local-PV nodeAffinity 绑定到节点,或者您已考虑到这些节点(见下文)。
  3. 参考 Cluster Node Planning 规划基础设施节点。

检查 Local PV 和 nodeAffinity

如果您的组件使用本地存储(例如 TopoLVM、本地 PV),请确认 PV 是否具有 spec.nodeAffinity。如果有,则需要:

  1. 将所有由 pv.spec.nodeAffinity 引用的节点加入 infra 节点组,或者
  2. 重新部署使用无节点亲和性的存储类的组件(例如 Ceph/RBD)。

示例(Elasticsearch):

# 1) 获取 ES PVC
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 节点也被标记/污点为 infra:

kubectl get nodes -l kafka=true
kubectl get nodes -l zk=true
# 将列出的节点按上述方式加入 infra 节点组

将日志组件迁移到 Infra 节点

ACP 日志组件默认容忍 infra 污点。使用 nodeSelector 将工作负载固定到 infra 节点。

Elasticsearch

# 数据节点
kubectl patch statefulset cpaas-elasticsearch -n cpaas-system \
  --type='merge' \
  -p='{"spec":{"template":{"spec":{"nodeSelector":{"node-role.kubernetes.io/infra":""}}}}}'

# 主节点(如果存在)
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 Pod 仍在 infra 节点上运行,可通过更新这些工作负载(例如修改注解)或添加选择器以排除 infra 节点,触发重新调度。

故障排除

常见问题及解决方案:

问题诊断方法解决方案
Pod 卡在 Pending 状态kubectl describe pod &lt;pod&gt; | grep Events添加容忍或调整选择器
污点/容忍不匹配kubectl describe node &lt;node&gt; | grep Taints给工作负载添加匹配的容忍
资源不足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}

解决方法:给工作负载添加匹配的容忍。