Kubernetes调度与部署机制详解

📚 Kubernetes调度与部署机制详解

🎯 学习目标

  • 掌握Kubernetes Pod调度的核心机制
  • 理解部署管理策略和最佳实践
  • 学会配置自动扩缩容和优化调度性能

🏗️ 一、Kubernetes调度机制

1.1 NodeSelector(节点选择器)🎯

  • 概念: 最简单的Pod调度约束方式,通过匹配节点标签控制Pod调度
  • 实现: 在Pod的spec字段中添加nodeSelector字段
  • 应用场景: 将Pod调度到具有特定标签的节点上
  • 示例: 将Pod调度到具有source=qikqiak标签的节点上

1.2 亲和性与反亲和性 🔗

节点亲和性

  • 软策略 (preferredDuringSchedulingIgnoredDuringExecution): 优先满足但不强制
  • 硬策略 (requiredDuringSchedulingIgnoredDuringExecution): 必须满足条件
  • 支持的操作符: In、NotIn、Gt、Lt、Exists、DoesNotExist

Pod亲和性与反亲和性

  • podAffinity: 让Pod与指定Pod部署在同一拓扑域
  • podAntiAffinity: 让Pod不与指定Pod部署在同一拓扑域
  • 拓扑域: 通过topologyKey指定,常用如kubernetes.io/hostname

1.3 污点与容忍 🚫

污点效果

  • NoSchedule: Pod不会被调度到标记的节点
  • PreferNoSchedule: NoSchedule的软策略版本
  • NoExecute: 无对应Tolerate的Pod会被直接逐出

🚀 二、Kubernetes部署管理

2.1 滚动更新 🔄

  • 特点: 默认部署策略,零停机部署
  • 机制: 逐步替换现有Pod实例,确保足够数量的Pod可用
  • 优势: 平滑过渡,最小化服务中断

2.2 回滚机制 ⏪

  • 命令: kubectl rollout undo deployment <DEPLOYMENT-NAME>
  • 作用: 快速恢复生产环境问题
  • 重要性: 保障系统稳定性和可恢复性

2.3 HPA(水平自动扩缩)📈

  • 功能: 根据负载自动调整Pod数量
  • 指标: 基于CPU、内存或自定义指标
  • 特点: 水平扩缩与垂直扩缩不同

💻 三、命令汇总

调度相关命令

1
2
3
4
5
6
# 查看节点标签
kubectl get nodes --show-labels
# 给节点添加标签
kubectl label nodes NODE-NAME KEY=VALUE
# 给节点添加污点
kubectl taint nodes NODE-NAME KEY=VALUE:EFFECT

部署管理命令

1
2
3
4
5
6
7
8
# 更新部署
kubectl apply -f deployment.yaml
# 查看部署状态
kubectl rollout status deployment/<DEPLOYMENT-NAME>
# 回滚部署
kubectl rollout undo deployment/<DEPLOYMENT-NAME>
# 查看部署历史
kubectl rollout history deployment/<DEPLOYMENT-NAME>

自动扩缩命令

1
2
3
4
# 创建HPA
kubectl autoscale deployment <DEPLOYMENT-NAME> --min=2 --max=10 --cpu-percent=80
# 查看HPA状态
kubectl get hpa

🆕 四、最新技术补充

4.1 HPA高级配置 🎛️

基于最新实践,HPA现在支持更丰富的指标类型:

自定义指标扩缩容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: custom-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Pods
pods:
metric:
name: packets-per-second
target:
type: AverageValue
averageValue: 1k

4.2 滚动更新优化策略 ⚡

最新的滚动更新实践建议:

优化配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
apiVersion: apps/v1
kind: Deployment
metadata:
name: optimized-deployment
spec:
replicas: 4
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 额外加1个副本平滑引入新版本
maxUnavailable: 0 # 保证服务不减容
template:
metadata:
labels:
app: my-app
spec:
terminationGracePeriodSeconds: 60
containers:
- name: app
image: my-app:v2
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 3
periodSeconds: 5
lifecycle:
preStop:
exec:
command: ["sh", "-c", "sleep 10"]

4.3 调度策略最佳实践 🎯

根据2024-2025年的最新实践:

节点亲和性配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: gpu
operator: In
values:
- "true"
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
preference:
matchExpressions:
- key: topology.kubernetes.io/zone
operator: In
values:
- "az1"

📊 五、技术要点总结

调度机制核心要点 🎯

  1. NodeSelector: 简单但功能有限,适合基础场景
  2. 节点亲和性: 支持软硬策略,操作符丰富,灵活性强
  3. Pod亲和性: 基于拓扑域控制Pod间部署关系
  4. 污点容忍: 节点级别的排斥机制,配合Pod容忍使用

部署管理核心要点 🚀

  1. 滚动更新: 零停机部署,通过maxSurge和maxUnavailable控制
  2. 回滚机制: 支持快速回退到历史版本
  3. HPA: 基于指标自动扩缩,支持多种指标类型

最佳实践建议 💡

  1. 合理设置资源请求和限制: 确保调度决策准确
  2. 使用readinessProbe: 确保Pod就绪后才接收流量
  3. 配置优雅终止: 通过preStop和terminationGracePeriodSeconds实现平滑关闭
  4. 监控调度效果: 使用Prometheus等工具监控调度性能

🎓 六、学习建议

学习路径 📈

  1. 基础掌握: 先理解NodeSelector和基本亲和性配置
  2. 实践操作: 通过实际部署练习滚动更新和回滚
  3. 深入理解: 学习HPA的自定义指标配置
  4. 性能优化: 掌握调度策略的性能调优技巧

实践建议 🛠️

  • 从简单的NodeSelector开始,逐步学习复杂的亲和性配置
  • 在测试环境中充分练习滚动更新和回滚操作
  • 结合监控工具观察调度效果和性能指标
  • 关注Kubernetes版本的更新和新特性