一、Kubernetes调度概述
Kubernetes调度器负责将Pod分配到合适的节点:
调度流程:
- 过滤不满足条件的节点
- 对合格节点打分
- 选择最高分节点
二、调度策略
1. 节点亲和性
yaml
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values:
- ssd
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: zone
operator: In
values:
- us-east-1a
2. Pod亲和性
yaml
apiVersion: v1
kind: Pod
metadata:
name: with-pod-affinity
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: redis
topologyKey: kubernetes.io/hostname
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchLabels:
app: web
topologyKey: topology.kubernetes.io/zone
3. 污点和容忍
bash
# 添加污点
kubectl taint nodes node1 key=value:NoSchedule
# 添加容忍
apiVersion: v1
kind: Pod
metadata:
name: tolerating
spec:
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
三、资源管理
1. 资源请求和限制
yaml
apiVersion: v1
kind: Pod
metadata:
name: resources
spec:
containers:
- name: app
image: nginx
resources:
requests:
memory: "128Mi"
cpu: "250m"
limits:
memory: "256Mi"
cpu: "500m"
2. LimitRange
yaml
apiVersion: v1
kind: LimitRange
metadata:
name: limits
spec:
limits:
- default:
cpu: "500m"
memory: "256Mi"
defaultRequest:
cpu: "200m"
memory: "128Mi"
type: Container
3. ResourceQuota
yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: quota
spec:
hard:
requests.cpu: "4"
requests.memory: "8Gi"
limits.cpu: "8"
limits.memory: "16Gi"
pods: "20"
四、调度策略配置
1. 自定义调度器
yaml
apiVersion: v1
kind: Pod
metadata:
name: custom-scheduler
spec:
schedulerName: my-custom-scheduler
containers:
- name: nginx
image: nginx
2. 优先级和抢占
yaml
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 1000000
globalDefault: false
description: "高优先级"
五、总结
Kubernetes调度核心要点:
- 节点亲和性:控制Pod调度到特定节点
- Pod亲和性:控制Pod共置或分散
- 污点容忍:特殊节点管理
- 资源管理:请求和限制
六、调度器配置
1. 自定义调度器
yaml
apiVersion: v1
kind: Pod
metadata:
name: custom-scheduler-pod
spec:
schedulerName: my-custom-scheduler
containers:
- name: nginx
image: nginx
2. 优先级和抢占机制
yaml
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 1000000
globalDefault: false
description: "高优先级任务"
---
apiVersion: v1
kind: Pod
metadata:
name: high-priority-pod
spec:
priorityClassName: high-priority
containers:
- name: app
image: myapp
七、资源配额管理
1. 命名空间配额
yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: dev-quota
spec:
hard:
requests.cpu: "10"
requests.memory: "20Gi"
limits.cpu: "20"
limits.memory: "40Gi"
pods: "50"
services: "10"
secrets: "20"
configmaps: "20"
2. 限制范围
yaml
apiVersion: v1
kind: LimitRange
metadata:
name: default-limits
spec:
limits:
- default:
cpu: "500m"
memory: "256Mi"
defaultRequest:
cpu: "200m"
memory: "128Mi"
max:
cpu: "4"
memory: "8Gi"
min:
cpu: "50m"
memory: "64Mi"
type: Container
八、总结
Kubernetes调度与资源管理核心要点:
- 节点亲和性:控制Pod调度到特定节点,满足特殊硬件需求
- Pod亲和性:控制Pod共置或分散,优化通信或隔离
- 污点容忍:特殊节点管理,如GPU节点、专用硬件
- 资源管理:请求/限制确保服务质量,配额防止资源滥用
最佳实践:
- 生产环境务必设置资源请求和限制
- 使用LimitRange为命名空间设置默认值
- 使用ResourceQuota控制命名空间资源总量
- 合理使用优先级和抢占,确保关键业务运行
个人观点,仅供参考