当前位置: 首页 > news >正文

Kubernetes节点亲和性与调度策略优化

Kubernetes节点亲和性与调度策略优化

引言

在Kubernetes集群中,Pod的调度是一个复杂的过程,涉及到资源分配、节点选择和负载均衡等多个方面。节点亲和性(Node Affinity)是Kubernetes提供的一种强大的调度机制,允许用户根据节点的标签和条件来控制Pod的调度位置。本文将深入探讨节点亲和性的原理、配置和优化策略。

一、节点调度概述

1.1 Kubernetes调度流程

Kubernetes调度器通过以下步骤将Pod调度到合适的节点:

  1. 过滤阶段:根据Pod的资源需求和约束条件筛选出可用节点
  2. 评分阶段:对筛选出的节点进行评分,选择最优节点
  3. 绑定阶段:将Pod绑定到选定的节点

1.2 调度约束类型

约束类型描述示例
NodeSelector简单的节点标签匹配nodeSelector: { zone: us-west-2a }
NodeAffinity更灵活的节点亲和性规则支持多种匹配条件
PodAffinityPod间的亲和性约束调度到同一节点或拓扑域
PodAntiAffinityPod间的反亲和性约束避免调度到同一节点
Taints/Tolerations节点污点和容忍度控制哪些Pod可以调度到节点

二、节点亲和性配置

2.1 NodeSelector配置

apiVersion: v1 kind: Pod metadata: name: my-app spec: nodeSelector: zone: us-west-2a instance-type: c5.large containers: - name: app image: my-app:latest

2.2 NodeAffinity配置

apiVersion: v1 kind: Pod metadata: name: my-app spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: zone operator: In values: - us-west-2a - us-west-2b preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 preference: matchExpressions: - key: instance-type operator: In values: - c5.large - c5.xlarge - weight: 50 preference: matchExpressions: - key: disk-type operator: In values: - ssd containers: - name: app image: my-app:latest

2.3 亲和性操作符

操作符描述
In标签值在指定列表中
NotIn标签值不在指定列表中
Exists标签存在(不关心值)
DoesNotExist标签不存在
Gt标签值大于指定值(仅适用于数值型标签)
Lt标签值小于指定值(仅适用于数值型标签)

三、Pod亲和性与反亲和性

3.1 PodAffinity配置

apiVersion: v1 kind: Pod metadata: name: my-app spec: affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - database topologyKey: kubernetes.io/hostname preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: team operator: In values: - backend topologyKey: topology.kubernetes.io/zone containers: - name: app image: my-app:latest

3.2 PodAntiAffinity配置

apiVersion: v1 kind: Pod metadata: name: my-app spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - my-app topologyKey: kubernetes.io/hostname preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: team operator: In values: - frontend topologyKey: topology.kubernetes.io/zone containers: - name: app image: my-app:latest

四、污点与容忍度

4.1 Taints配置

# 添加污点 kubectl taint nodes node-1 key=value:NoSchedule kubectl taint nodes node-2 key=value:PreferNoSchedule kubectl taint nodes node-3 key=value:NoExecute # 查看节点污点 kubectl describe node node-1 | grep Taints # 删除污点 kubectl taint nodes node-1 key=value:NoSchedule-

4.2 Tolerations配置

apiVersion: v1 kind: Pod metadata: name: my-app spec: tolerations: - key: "key" operator: "Equal" value: "value" effect: "NoSchedule" - key: "key" operator: "Equal" value: "value" effect: "NoExecute" tolerationSeconds: 3600 containers: - name: app image: my-app:latest

4.3 污点效果对比

效果描述
NoSchedule不调度没有对应容忍度的Pod
PreferNoSchedule尽量不调度没有对应容忍度的Pod
NoExecute不调度没有对应容忍度的Pod,并驱逐已存在的Pod

五、调度策略优化

5.1 节点选择器优化

apiVersion: v1 kind: Pod metadata: name: my-app spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/os operator: In values: - linux - key: node-role.kubernetes.io/worker operator: Exists preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 preference: matchExpressions: - key: topology.kubernetes.io/zone operator: In values: - us-west-2a - weight: 50 preference: matchExpressions: - key: node.kubernetes.io/instance-type operator: In values: - c5.large - c5.xlarge containers: - name: app image: my-app:latest

5.2 拓扑分布约束

apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 6 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: topologySpreadConstraints: - maxSkew: 1 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: DoNotSchedule labelSelector: matchLabels: app: my-app - maxSkew: 1 topologyKey: kubernetes.io/hostname whenUnsatisfiable: DoNotSchedule labelSelector: matchLabels: app: my-app containers: - name: app image: my-app:latest

5.3 资源感知调度

apiVersion: v1 kind: Pod metadata: name: my-app spec: containers: - name: app image: my-app:latest resources: requests: cpu: "1" memory: "1Gi" limits: cpu: "2" memory: "2Gi" affinity: nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 preference: matchExpressions: - key: node.kubernetes.io/instance-type operator: In values: - c5.xlarge - c5.2xlarge

六、调度器配置

6.1 自定义调度器配置

apiVersion: v1 kind: ConfigMap metadata: name: custom-scheduler-config data: config.yaml: | apiVersion: kubescheduler.config.k8s.io/v1beta3 kind: KubeSchedulerConfiguration schedulerName: custom-scheduler profiles: - schedulerName: custom-scheduler pluginConfig: - name: NodeResources args: scoringStrategy: type: LeastAllocated resources: - name: cpu weight: 1 - name: memory weight: 1

6.2 使用自定义调度器

apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: schedulerName: custom-scheduler containers: - name: app image: my-app:latest

七、调度监控与优化

7.1 调度指标监控

apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: kube-scheduler-monitor spec: selector: matchLabels: component: kube-scheduler endpoints: - port: http path: /metrics interval: 30s

7.2 调度告警规则

apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: name: scheduler-alerts spec: groups: - name: scheduler.rules rules: - alert: HighPendingPods expr: sum(kube_pod_status_phase{phase="Pending"}) > 10 for: 5m labels: severity: warning annotations: summary: "High number of pending pods" description: "{{ $value }} pods are pending" - alert: SchedulerHighLatency expr: histogram_quantile(0.99, sum(rate(scheduler_e2e_scheduling_duration_seconds_bucket[5m])) by (le)) > 10 for: 5m labels: severity: warning annotations: summary: "High scheduler latency" description: "99th percentile scheduling latency is {{ $value }}s"

八、最佳实践

8.1 节点标签管理

# 添加节点标签 kubectl label nodes node-1 zone=us-west-2a kubectl label nodes node-1 instance-type=c5.large kubectl label nodes node-1 role=worker # 查看节点标签 kubectl get nodes -L zone,instance-type,role # 删除节点标签 kubectl label nodes node-1 zone-

8.2 混合云调度策略

apiVersion: v1 kind: Pod metadata: name: my-app spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: cloud.provider operator: In values: - aws - gcp preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 preference: matchExpressions: - key: cloud.provider operator: In values: - aws containers: - name: app image: my-app:latest

8.3 调度优先级配置

apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: high-priority value: 1000000 description: "High priority pods" --- apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: low-priority value: 1000 description: "Low priority pods" --- apiVersion: v1 kind: Pod metadata: name: my-app spec: priorityClassName: high-priority containers: - name: app image: my-app:latest

九、总结

节点亲和性是Kubernetes调度机制的重要组成部分,通过合理配置节点亲和性、Pod亲和性和污点容忍度,可以实现精细的调度控制。

在实际生产环境中,建议根据业务需求制定合理的调度策略,结合拓扑分布约束和资源感知调度,提高集群的资源利用率和应用的可用性。同时,建立完善的调度监控体系,及时发现和处理调度问题。

http://www.rkmt.cn/news/1421564.html

相关文章:

  • 双行星搅拌机工作原理与匀浆机制:解密高效混合的核心密码 - 上海奎特机电
  • ESP32-S3边缘AI实践:Teachable Machine模型部署与离线图像识别
  • 体验Taotoken旗舰模型Qwen3.7在代码生成任务中的响应速度与稳定性
  • 2026 年吉安黄金回收行业解析|实时金价 + 正规门店名录 + 市民变现案例合集 - 润富黄金珠宝行
  • 如何快速安装赛马娘汉化插件:终极中文游戏体验指南
  • PS常用快捷键大全(2026最新版)| 新手入门必收藏
  • 从实验室到产线:当客户要求测1024QAM EVM时,我们该如何定标与判断?
  • 如何高效使用SDR++:跨平台软件定义无线电完整配置指南
  • 大模型入门:从 MHA 到 GQA,一次讲清 KV Cache 为什么能省显存
  • Ice:彻底解决Mac菜单栏杂乱问题的终极管理神器
  • 3分钟让Windows老游戏重获新生:DDrawCompat完全配置指南
  • 从CoinGecko看加密数据平台:技术架构、API实践与开发者应用
  • 终极Windows热键冲突修复指南:3种智能检测方案
  • AI项目为何总在ETL上卡脖子?从传统ETL到现代特征工程流水线的演进与实践
  • 厦门靓之声:以全场景声学定制与工艺匠心重新定义汽车隔音标杆 - 汽车音响改装
  • 基于Arduino与MQ-2传感器的智能气体烟雾探测器DIY指南
  • League Akari:英雄联盟玩家的5大必备智能工具功能解析
  • 告别盲目猜Bug!Claude Code装上Systematic Debugging,一个困扰两天的问题20分钟解决
  • 保姆级教程:手把手教你用VMware安装SUSE Linux Enterprise Server 15(附双ISO镜像配置避坑指南)
  • Ubuntu 20.04 新手必看:刚装完系统,ifconfig和vim都用不了?5分钟搞定镜像源和基础工具安装
  • 面向非技术团队的 Agent 实战入门课
  • Windows系统代理配置全攻略:从零搭建安全流量拦截环境
  • 别再折腾虚拟机桌面了!用MobaXterm SSH直连Ubuntu 20.04,效率翻倍(附VMware NAT模式避坑指南)
  • Fooocus终极指南:3步开启AI绘画创作新时代 [特殊字符]
  • ArkUI实战演练05-动画手势与综合实战
  • 2026年货源批发网站排名TOP5权威发布:垂直赛道黑马领跑,批发网站工具成新宠 - 速递信息
  • 别再傻傻分不清了!Playwright启动Chrome、Edge和Firefox的保姆级代码指南
  • NetTools Pro V1.1.0 发布!
  • 告别命令行恐惧!Ubuntu 22.04 上用 GParted 图形化给硬盘扩容,保姆级图文教程
  • 别再轮询了!用STM32F407的串口空闲中断+DMA接收,让你的主循环轻松处理Modbus协议