一、Kubernetes 集群调度机制

1.1 核心组件协作机制

Kubernetes 通过 ​​List-Watch​​ 机制实现组件间解耦与实时数据同步:

组件

核心职责

​kubectl/API客户端​

发起资源管理请求

​APIServer​

API入口、权限校验、存储交互

​etcd​

集群状态存储中心

​Controller Manager​

维持副本数、执行自愈逻辑

​Scheduler​

Pod调度决策

​kubelet​

节点代理,管理Pod生命周期

1.2 Pod创建完整流程(List-Watch模型)

graph TB
    A[kubectl创建请求] --> B[APIServer]
    B --> C[etcd存储元数据]
    C --> D[Controller Manager监听]
    D --> E[创建Pod副本]
    E --> F[Scheduler调度决策]
    F --> G[kubelet执行创建]
    G --> H[容器运行时启动]
    H --> I[状态上报完成]

​关键阶段说明:​

  • ​监听启动​​:三大组件(Controller Manager、Scheduler、kubelet)启动后监听APIServer

  • ​事件传递​​:etcd → APIServer → 各组件

  • ​调度决策​​:Scheduler基于算法选择合适节点

  • ​状态同步​​:kubelet上报状态,APIServer写入etcd

二、调度器(Scheduler)深度解析

2.1 调度核心目标

  • ​公平性​​:节点资源均衡分配

  • ​高效性​​:最大化集群资源利用率

  • ​性能​​:快速完成大批量Pod调度

  • ​灵活性​​:支持自定义策略和插件

2.2 调度流程两阶段

阶段一:过滤(Predicate)- 硬性条件
# 常见过滤算法
PodFitsResources    # 资源需求检查
PodFitsHost         # 节点名称匹配  
PodFitsHostPorts    # 端口冲突检测
PodSelectorMatches  # 标签匹配
NoDiskConflict      # 存储卷冲突检测
阶段二:优选(Priorities)- 打分排序
# 常见评分算法
LeastRequestedPriority      # 资源使用率越低分数越高
BalancedResourceAllocation  # CPU/内存使用率均衡性
ImageLocalityPriority       # 节点已有镜像优先

📌 ​​注意​​:若无节点满足Predicate条件,Pod将处于Pending状态持续重试。

三、节点调度策略详解

3.1 直接指定节点(nodeName)

apiVersion: v1
kind: Pod
spec:
  nodeName: node01  # 强制指定节点,跳过Scheduler

​特点​​:绕过调度器,kubelet直接负责启动。

3.2 标签选择调度(nodeSelector)

apiVersion: v1
kind: Pod  
spec:
  nodeSelector:
    disktype: ssd    # 匹配具有disktype=ssd标签的节点
    gpu: "true"      # 匹配GPU节点

​节点标签管理命令:​

# 添加标签
kubectl label nodes node01 disktype=ssd

# 查看标签
kubectl get nodes --show-labels

# 修改标签(需覆盖)
kubectl label nodes node02 disktype=hdd --overwrite

# 删除标签
kubectl label nodes node02 disktype-

四、高级调度策略

4.1 节点亲和性(NodeAffinity)

硬策略(必须满足)
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: NotIn
          values: [node02]  # 禁止调度到node02
软策略(优先满足)
affinity:
  nodeAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 1
      preference:
        matchExpressions:
        - key: disktype
          operator: In
          values: [ssd]     # 优先SSD节点

4.2 Pod亲和性与反亲和性

策略类型

匹配对象

拓扑域支持

典型场景

podAffinity

Pod标签

同域部署(如Web+Cache)

podAntiAffinity

Pod标签

跨域分布(如高可用)

​Pod亲和性示例:​

affinity:
  podAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
    - labelSelector:
        matchExpressions:
        - key: app
          operator: In
          values: [cache]
      topologyKey: kubernetes.io/hostname  # 同一节点

​Pod反亲和性示例:​

affinity:
  podAntiAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 100
      podAffinityTerm:
        labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values: [web]
        topologyKey: topology.kubernetes.io/zone  # 不同可用区

4.3 操作符大全

操作符

含义

示例

In

值在列表中

env In (dev, test)

NotIn

值不在列表中

env NotIn (prod)

Exists

标签存在

Exists zone

DoesNotExist

标签不存在

DoesNotExist debug

Gt/Lt

数值比较

version Gt 3

五、污点(Taint)与容忍(Toleration)

5.1 污点类型与效果

效果

说明

NoSchedule

禁止调度新Pod

PreferNoSchedule

尽量避免调度

NoExecute

禁止调度+驱逐现有Pod

5.2 污点管理命令

# 设置污点
kubectl taint node node01 key1=value1:NoSchedule

# 查看污点
kubectl describe node node01 | grep Taints

# 删除污点  
kubectl taint node node01 key1:NoSchedule-

5.3 容忍配置示例

tolerations:
- key: "key1"
  operator: "Equal"      # Equal需指定value,Exists忽略value
  value: "value1" 
  effect: "NoExecute"
  tolerationSeconds: 3600  # 被驱逐前可运行时间

六、节点维护操作

6.1 维护命令对比

命令

功能

适用场景

kubectl cordon <node>

标记不可调度

计划性维护准备

kubectl drain <node>

驱逐Pod+标记不可调度

节点下线维护

kubectl uncordon <node>

恢复可调度状态

维护完成后恢复

​完整驱逐命令:​

kubectl drain node01 \
  --ignore-daemonsets \
  --delete-local-data \
  --force

七、Pod生命周期状态

阶段

描述

​Pending​

已创建,调度或拉取镜像中

​Running​

容器已启动运行

​Succeeded​

成功终止(Job类)

​Failed​

容器异常退出

​Unknown​

状态无法获取

八、存储管理:PV与PVC

8.1 存储卷类型对比

类型

生命周期

共享性

持久性

场景

emptyDir

Pod生命周期

同Pod内

临时缓存

hostPath

节点生命周期

单节点

节点级存储

NFS

独立服务

多节点

✅✅

共享存储

PV+PVC

集群级别

按需分配

✅✅✅

生产环境

8.2 PV与PVC概念解析

  • ​PV(PersistentVolume)​​:运维定义的存储资源

  • ​PVC(PersistentVolumeClaim)​​:应用申请的存储需求

  • ​StorageClass​​:动态PV创建模板

8.3 PV生命周期状态

  • ​Available​​:可用状态,未绑定

  • ​Bound​​:已绑定到PVC

  • ​Released​​:PVC删除,资源待回收

  • ​Failed​​:自动回收失败

8.4 回收策略

  • ​Retain​​:手动清理数据

  • ​Delete​​:自动删除存储资源

  • ​Recycle​​:清空数据重新可用(仅NFS/HostPath)

九、实战案例:NFS+PV+PVC

9.1 静态PV配置

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /data/volumes/v1
    server: 192.168.10.10

9.2 PVC申请

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 2Gi

9.3 Pod使用PVC

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - name: app
    image: nginx
    volumeMounts:
    - name: data
      mountPath: /var/www/html
  volumes:
  - name: data
    persistentVolumeClaim:
      claimName: nfs-pvc

十、动态存储:StorageClass

10.1 NFS动态供给架构

PVC请求 → StorageClass → Provisioner → 自动创建PV → 绑定

10.2 StorageClass配置

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-sc
provisioner: nfs.csi.k8s.io
parameters:
  server: 192.168.10.10
  path: /data/dynamic

十一、故障排查指南

11.1 常用排查命令

# Pod状态检查
kubectl describe pod <pod-name>
kubectl logs <pod-name> [-c container]

# 集群状态检查  
kubectl cluster-info
kubectl get nodes

# 存储相关检查
kubectl get pv,pvc,sc
kubectl describe pvc <pvc-name>

# 节点级别检查
journalctl -xefu kubelet

11.2 常见问题与解决

  1. ​Pod一直Pending​​:检查资源、节点选择器、污点容忍

  2. ​调度失败​​:查看事件日志kubectl describe pod

  3. ​存储挂载失败​​:验证PV/PVC绑定状态、存储后端可访问性

  4. ​节点通信异常​​:检查kubelet服务状态、网络连通性

十二、核心总结

12.1 调度策略层次

  1. ​nodeName​​:直接绑定(跳过调度)

  2. ​nodeSelector​​:标签匹配调度

  3. ​nodeAffinity​​:亲和性调度

  4. ​污点/容忍​​:排斥与例外机制

  5. ​维护操作​​:cordon/drain节点管理

12.2 存储选择策略

  • ​临时数据​​:emptyDir

  • ​节点持久化​​:hostPath

  • ​共享存储​​:NFS+PV/PVC

  • ​大规模动态​​:StorageClass

12.3 一句话核心思想

​"调度是吸引与排斥的艺术,存储是持久与共享的平衡"​

通过合理组合调度策略和存储方案,可以构建出高效、稳定、可扩展的Kubernetes集群环境。

更多推荐