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、内存或自定义指标
- 特点: 水平扩缩与垂直扩缩不同
💻 三、命令汇总
调度相关命令
# 查看节点标签
kubectl get nodes --show-labels
# 给节点添加标签
kubectl label nodes NODE-NAME KEY=VALUE
# 给节点添加污点
kubectl taint nodes NODE-NAME KEY=VALUE:EFFECT
部署管理命令
# 更新部署
kubectl apply -f deployment.yaml
# 查看部署状态
kubectl rollout status deployment/<DEPLOYMENT-NAME>
# 回滚部署
kubectl rollout undo deployment/<DEPLOYMENT-NAME>
# 查看部署历史
kubectl rollout history deployment/<DEPLOYMENT-NAME>
自动扩缩命令
# 创建HPA
kubectl autoscale deployment <DEPLOYMENT-NAME> --min=2 --max=10 --cpu-percent=80
# 查看HPA状态
kubectl get hpa
🆕 四、最新技术补充
4.1 HPA高级配置 🎛️
基于最新实践,HPA 现在支持更丰富的指标类型:
自定义指标扩缩容
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 滚动更新优化策略 ⚡
最新的滚动更新实践建议:
优化配置示例
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 年的最新实践:
节点亲和性配置示例
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"
📊 五、技术要点总结
调度机制核心要点 🎯
- NodeSelector: 简单但功能有限,适合基础场景
- 节点亲和性: 支持软硬策略,操作符丰富,灵活性强
- Pod亲和性: 基于拓扑域控制Pod间部署关系
- 污点容忍: 节点级别的排斥机制,配合Pod容忍使用
部署管理核心要点 🚀
- 滚动更新: 零停机部署,通过maxSurge和maxUnavailable控制
- 回滚机制: 支持快速回退到历史版本
- HPA: 基于指标自动扩缩,支持多种指标类型
最佳实践建议 💡
- 合理设置资源请求和限制: 确保调度决策准确
- 使用readinessProbe: 确保Pod就绪后才接收流量
- 配置优雅终止: 通过preStop和terminationGracePeriodSeconds实现平滑关闭
- 监控调度效果: 使用Prometheus等工具监控调度性能
🎓 六、学习建议
学习路径 📈
- 基础掌握: 先理解NodeSelector和基本亲和性配置
- 实践操作: 通过实际部署练习滚动更新和回滚
- 深入理解: 学习HPA的自定义指标配置
- 性能优化: 掌握调度策略的性能调优技巧
实践建议 🛠️
- 从简单的NodeSelector开始,逐步学习复杂的亲和性配置
- 在测试环境中充分练习滚动更新和回滚操作
- 结合监控工具观察调度效果和性能指标
- 关注Kubernetes版本的更新和新特性
0