Kubernetes(五) 集群调度与存储管理完全指南
一、Kubernetes 集群调度机制
1.1 核心组件协作机制
Kubernetes 通过 List-Watch 机制实现组件间解耦与实时数据同步:
组件 | 核心职责 |
---|---|
kubectl/API客户端 | 发起资源管理请求 |
APIServer | API入口、权限校验、存储交互 |
etcd | 集群状态存储中心 |
Controller Manager | 维持副本数、执行自愈逻辑 |
Scheduler | Pod调度决策 |
kubelet | 节点代理,管理Pod生命周期 |
1.2 Pod创建完整流程(List-Watch模型)
graph TBA[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/hostnameoperator: NotInvalues: [node02] # 禁止调度到node02
软策略(优先满足)
affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 1preference:matchExpressions:- key: disktypeoperator: Invalues: [ssd] # 优先SSD节点
4.2 Pod亲和性与反亲和性
策略类型 | 匹配对象 | 拓扑域支持 | 典型场景 |
---|---|---|---|
| Pod标签 | ✅ | 同域部署(如Web+Cache) |
| Pod标签 | ✅ | 跨域分布(如高可用) |
Pod亲和性示例:
affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues: [cache]topologyKey: kubernetes.io/hostname # 同一节点
Pod反亲和性示例:
affinity:podAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 100podAffinityTerm:labelSelector:matchExpressions:- key: appoperator: Invalues: [web]topologyKey: topology.kubernetes.io/zone # 不同可用区
4.3 操作符大全
操作符 | 含义 | 示例 |
---|---|---|
| 值在列表中 |
|
| 值不在列表中 |
|
| 标签存在 |
|
| 标签不存在 |
|
| 数值比较 |
|
五、污点(Taint)与容忍(Toleration)
5.1 污点类型与效果
效果 | 说明 |
---|---|
| 禁止调度新Pod |
| 尽量避免调度 |
| 禁止调度+驱逐现有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忽略valuevalue: "value1" effect: "NoExecute"tolerationSeconds: 3600 # 被驱逐前可运行时间
六、节点维护操作
6.1 维护命令对比
命令 | 功能 | 适用场景 |
---|---|---|
| 标记不可调度 | 计划性维护准备 |
| 驱逐Pod+标记不可调度 | 节点下线维护 |
| 恢复可调度状态 | 维护完成后恢复 |
完整驱逐命令:
kubectl drain node01 \--ignore-daemonsets \--delete-local-data \--force
七、Pod生命周期状态
阶段 | 描述 |
---|---|
Pending | 已创建,调度或拉取镜像中 |
Running | 容器已启动运行 |
Succeeded | 成功终止(Job类) |
Failed | 容器异常退出 |
Unknown | 状态无法获取 |
八、存储管理:PV与PVC
8.1 存储卷类型对比
类型 | 生命周期 | 共享性 | 持久性 | 场景 |
---|---|---|---|---|
| Pod生命周期 | 同Pod内 | ❌ | 临时缓存 |
| 节点生命周期 | 单节点 | ✅ | 节点级存储 |
| 独立服务 | 多节点 | ✅✅ | 共享存储 |
| 集群级别 | 按需分配 | ✅✅✅ | 生产环境 |
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: 5GiaccessModes:- ReadWriteManynfs:path: /data/volumes/v1server: 192.168.10.10
9.2 PVC申请
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nfs-pvc
spec:accessModes:- ReadWriteManyresources:requests:storage: 2Gi
9.3 Pod使用PVC
apiVersion: v1
kind: Pod
metadata:name: test-pod
spec:containers:- name: appimage: nginxvolumeMounts:- name: datamountPath: /var/www/htmlvolumes:- name: datapersistentVolumeClaim: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.10path: /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 常见问题与解决
-
Pod一直Pending:检查资源、节点选择器、污点容忍
-
调度失败:查看事件日志
kubectl describe pod
-
存储挂载失败:验证PV/PVC绑定状态、存储后端可访问性
-
节点通信异常:检查kubelet服务状态、网络连通性
十二、核心总结
12.1 调度策略层次
-
nodeName:直接绑定(跳过调度)
-
nodeSelector:标签匹配调度
-
nodeAffinity:亲和性调度
-
污点/容忍:排斥与例外机制
-
维护操作:cordon/drain节点管理
12.2 存储选择策略
-
临时数据:emptyDir
-
节点持久化:hostPath
-
共享存储:NFS+PV/PVC
-
大规模动态:StorageClass
12.3 一句话核心思想
"调度是吸引与排斥的艺术,存储是持久与共享的平衡"
通过合理组合调度策略和存储方案,可以构建出高效、稳定、可扩展的Kubernetes集群环境。