Kubernetes(五) 集群调度与存储管理完全指南
一、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亲和性与反亲和性
|
策略类型 |
匹配对象 |
拓扑域支持 |
典型场景 |
|---|---|---|---|
|
|
Pod标签 |
✅ |
同域部署(如Web+Cache) |
|
|
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 操作符大全
|
操作符 |
含义 |
示例 |
|---|---|---|
|
|
值在列表中 |
|
|
|
值不在列表中 |
|
|
|
标签存在 |
|
|
|
标签不存在 |
|
|
|
数值比较 |
|
五、污点(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忽略value
value: "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: 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 常见问题与解决
-
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集群环境。
更多推荐
所有评论(0)