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. 专家级注意事项
- 标签污染预防:建立标签命名规范(如team/env/role三级结构)
- 调度器性能:单个集群超过5000节点时需评估API Server负载
- 跨版本兼容:v1.20后nodeSelectorTerms的匹配逻辑发生变化
- 监控盲区:注意kubelet与metrics-server的时间同步问题
- 资源碎片化:建议定期执行defragmentation操作
8. 总结与展望
节点管理就像打理花园:亲和性是规划不同植物的种植区域,污点是设置隔离带防止虫害传播,资源监控就是定期检查土壤湿度。未来的发展方向包括:
- 智能弹性调度算法
- 基于AI的异常预测
- 边缘计算场景优化
通过本文的配置示例和场景分析,相信你已经掌握了节点管理的核心要领。在实践中记得多使用kubectl describe node命令观察调度结果,就像老园丁要经常巡视苗圃一样。
评论