Kubernetes调度与资源管理:从基础到高级策略
Kubernetes调度与资源管理深度解析:从基础到高级策略
一、资源请求与限制:集群稳定的基石
1.1 requests与limits核心概念
在Kubernetes中,requests
和limits
是资源管理的两个关键参数:
resources:
requests:
cpu: "500m" # 0.5个CPU核心
memory: "512Mi"
limits:
cpu: "1" # 1个CPU核心
memory: "1Gi"
- requests:调度依据,表示容器启动所需的最小资源
- limits:运行时限制,容器能使用的资源上限
1.2 CPU与内存的特殊差异
特性 | CPU | Memory |
---|---|---|
超用后果 | 被限流 | 容器可能被OOMKill |
单位 | 1=1vCPU (1000m=1vCPU) | Mi/Gi (二进制单位) |
可压缩性 | 是 | 否 |
实践建议:
- 生产环境必须设置limits
- Java应用建议设置内存limits小于节点内存的75%(考虑JVM开销)
- 使用
LimitRange
为命名空间设置默认值
二、调度策略:智能编排的艺术
2.1 基础调度:nodeSelector
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod
spec:
nodeSelector:
accelerator: nvidia-tesla
containers:
- name: cuda-container
image: nvidia/cuda
2.2 高级调度:Affinity/Anti-Affinity
示例:避免同一服务的Pod集中在同一节点
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values: [web]
topologyKey: kubernetes.io/hostname
2.3 污点与容忍(Taint & Toleration)
典型场景:
- 专用节点(GPU/高IO)
- 节点维护(NoExecute)
- 边缘节点(network=slow:PreferNoSchedule)
三、资源监控:数据驱动的决策
3.1 Metrics Server架构
3.2 HPA高级配置
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
- type: External
external:
metric:
name: requests_per_second
selector:
matchLabels:
app: web
target:
type: AverageValue
averageValue: 500
最佳实践:
- 生产环境建议使用v2版本的HPA
- 结合自定义指标(如QPS)比单纯CPU更可靠
- 设置合理的冷却时间(--horizontal-pod-autoscaler-downscale-stabilization)
四、实战案例:电商系统调度配置
4.1 订单服务配置示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-service
spec:
replicas: 3
selector:
matchLabels:
app: order
template:
metadata:
labels:
app: order
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values: [order]
topologyKey: topology.kubernetes.io/zone
containers:
- name: order
image: registry.example.com/order:v1.2
resources:
requests:
cpu: "300m"
memory: "512Mi"
limits:
cpu: "1"
memory: "1Gi"
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
4.2 关键配置解析
- 多可用区部署:通过podAntiAffinity确保订单服务分散在不同zone
- 资源超卖控制:requests总和不超过节点资源的70%
- 优雅扩缩容:配合readinessProbe确保新Pod完全就绪
五、常见问题排查指南
5.1 调度失败常见原因
kubectl get events --sort-by=.metadata.creationTimestamp
常见错误:
Insufficient cpu/memory
:资源不足didn't match Pod's node affinity
:亲和性冲突unbound immediate PersistentVolumeClaims
:存储未就绪
5.2 资源监控诊断
# 查看节点资源使用
kubectl top nodes --use-protocol-buffers
# 查看Pod资源使用
kubectl top pods -n production
六、演进趋势:调度器的未来
- 动态资源分配(DRA):GPU等扩展资源的精细化管理
- 拓扑感知调度:优化跨NUMA节点的资源分配
- 批调度支持:增强AI训练等批处理任务支持
延伸阅读建议:
- 使用[Kube-bench]进行调度策略合规性检查
- 通过[Descheduler]定期重新平衡集群负载
- 参考[Kubernetes调度器性能调优指南]优化大规模集群
通过合理运用这些调度与资源管理技术,可以显著提升集群的稳定性和资源利用率。建议从业务需求出发,逐步实施高级调度策略。