1. 为什么要在意节点管理?

在Kubernetes集群的世界里,每个工作节点都像是超市里的收银柜台。当用户想把商品(容器应用)放到结账通道(节点)时,优秀的调度策略能让所有商品快速通过,糟糕的安排则会导致某些收银员忙到冒烟,而另一些却在玩手机。

今天我们就来聊聊三个关键技术:通过节点亲和性设置调度偏好(就像VIP通道)、用污点建立节点隔离区(类似检修中的收银台)、实时监控节点资源(收银台的负载看板)。

2. 节点亲和性:给调度器装上导航系统

2.1 基础概念扫盲

节点亲和性相当于给调度器写了份说明书:

  • 硬性要求:必须满足的条件(比如必须使用SSD硬盘)
  • 软性偏好:尽量满足的条件(如果可能尽量部署到上海机房)

完整示例1:必须跑在GPU节点

(Kubernetes 1.19+)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ai-model-serving
spec:
  replicas: 3
  selector:
    matchLabels:
      app: model-inference
  template:
    metadata:
      labels:
        app: model-inference
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: hardware-type
                operator: In
                values:
                - gpu-node
      containers:
      - name: model-container
        image: tensorflow/serving:latest-gpu
        resources:
          limits:
            nvidia.com/gpu: 2

示例说明(带注释版):

# 核心配置段开始
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:  # 硬性条件配置
      nodeSelectorTerms:
      - matchExpressions:  # 匹配条件组
        - key: hardware-type        # 节点标签键
          operator: In              # 逻辑运算符(包含)
          values:                   # 允许的值列表
          - gpu-node                # 必须带这个标签的节点
# 容器配置段
containers:
- name: model-container
  image: tensorflow/serving:latest-gpu
  resources:
    limits:
      nvidia.com/gpu: 2  # GPU资源声明必须与节点能力匹配

2.2 软亲和性实战:优先选择策略

当我们需要优雅降级时,软亲和性就派上用场了:

完整示例2:优先本地机房(Kubernetes 1.14+)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: regional-service
spec:
  replicas: 5
  selector:
    matchLabels:
      app: region-aware
  template:
    metadata:
      labels:
        app: region-aware
    spec:
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 80  # 优先级权重(0-100)
            preference:
              matchExpressions:
              - key: failure-domain.beta.kubernetes.io/zone
                operator: In
                values:
                - cn-east-1a
          - weight: 20
            preference: 
              matchExpressions:
              - key: failure-domain.beta.kubernetes.io/zone
                operator: In
                values:
                - cn-east-1b
      containers:
      - name: web-server
        image: nginx:1.21

3. 污点与容忍:建立节点隔离区

3.1 污点的三种效应

  • NoSchedule:禁止新Pods调度(已运行的不受影响)
  • PreferNoSchedule:尽量不调度(非强制)
  • NoExecute:驱逐现有Pod(需配置容忍)

完整示例3:专用日志收集节点(kubectl命令示例)

# 给节点打上污点
kubectl taint nodes log-node-01 log-collector=true:NoExecute

# 查看节点污点
kubectl describe node log-node-01 | grep Taint

匹配的容忍配置:

tolerations:
- key: "log-collector"    # 必须与污点key匹配
  operator: "Exists"       # 存在该key即可
  effect: "NoExecute"      # 需要严格匹配效果类型
  tolerationSeconds: 3600  # 被驱逐前的宽限期(秒)

3.2 实战:金丝雀发布场景

# 先给金丝雀节点打标签
kubectl label nodes canary-node-01 deploy-stage=canary

# 设置污点防止常规部署
kubectl taint nodes canary-node-01 experimental=true:NoSchedule

# 金丝雀Deployment配置片段
tolerations:
- key: experimental
  operator: Equal
  value: "true"
  effect: NoSchedule
nodeSelector:
  deploy-stage: canary

4. 节点资源监控:给集群装上仪表盘

4.1 核心监控指标

  • CPU/Memory Allocatable
  • Pods Capacity
  • 磁盘inodes使用率
  • 网络带宽峰值

完整示例4:Metrics Server配置(Helm部署)

helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/
helm upgrade --install metrics-server metrics-server/metrics-server \
  --set args={'--kubelet-insecure-tls','--kubelet-preferred-address-types=InternalIP'}

监控数据查询示例:

# 查看节点实时资源
kubectl top node

# 输出示例:
NAME           CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
worker-node01   138m         6%     2456Mi          32%
worker-node02   324m         16%    3789Mi          49%

4.2 自动扩容配置

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: payment-service
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: payment-service
  minReplicas: 3
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

5. 典型应用场景剖析

5.1 在线教育平台案例

需求背景:直播课服务需要GPU加速,考试系统要求低延迟

技术方案

# 直播服务配置
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: accelerator
          operator: In
          values: [nvidia-tesla]
# 考试系统配置
tolerations:
- key: "low-latency"
  operator: "Exists"
  effect: "NoSchedule"

5.2 混合云环境调度

跨云厂商策略

preferredDuringSchedulingIgnoredDuringExecution:
- weight: 60
  preference:
    matchExpressions:
    - key: topology.kubernetes.io/region
      operator: In
      values: [aws-cn-north-1]
- weight: 40
  preference: 
    matchExpressions:
    - key: topology.kubernetes.io/region
      operator: In
      values: [aliyun-cn-hangzhou]

6. 技术方案优缺点分析

6.1 节点亲和性

优势

  • 精准控制部署位置
  • 支持多级权重配置
  • 可与Pod亲和性配合使用

局限

  • 标签管理复杂度指数增长
  • 可能导致调度失败
  • 跨集群场景支持有限

6.2 污点容忍机制

亮点

  • 实现节点隔离的最佳实践
  • 细粒度的驱逐控制
  • 天然适合金丝雀发布

注意点

  • 容易忘记清理过期污点
  • NoExecute可能引发服务中断
  • 需要配合RBAC使用

7. 专家级注意事项

  1. 标签污染预防:建立标签命名规范(如team/env/role三级结构)
  2. 调度器性能:单个集群超过5000节点时需评估API Server负载
  3. 跨版本兼容:v1.20后nodeSelectorTerms的匹配逻辑发生变化
  4. 监控盲区:注意kubelet与metrics-server的时间同步问题
  5. 资源碎片化:建议定期执行defragmentation操作

8. 总结与展望

节点管理就像打理花园:亲和性是规划不同植物的种植区域,污点是设置隔离带防止虫害传播,资源监控就是定期检查土壤湿度。未来的发展方向包括:

  • 智能弹性调度算法
  • 基于AI的异常预测
  • 边缘计算场景优化

通过本文的配置示例和场景分析,相信你已经掌握了节点管理的核心要领。在实践中记得多使用kubectl describe node命令观察调度结果,就像老园丁要经常巡视苗圃一样。