容器编排:Kubernetes高级调度策略
大家好,我是欧阳瑞(Rich Own)。今天想和大家聊聊Kubernetes高级调度策略这个重要话题。作为一个全栈开发者,Kubernetes已经成为容器编排的标准。今天就来分享一下Kubernetes的高级调度策略。
Kubernetes调度概述
调度器工作原理
Pod创建 → 调度器筛选 → 调度器评分 → 绑定节点
调度策略类型
| 策略 | 说明 |
|---|---|
| NodeSelector | 节点标签选择 |
| NodeAffinity | 节点亲和性 |
| PodAffinity | Pod亲和性 |
| Taints/Tolerations | 污点与容忍 |
| PriorityClass | 优先级调度 |
NodeSelector
配置示例
yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
nodeSelector:
zone: us-west-1
type: worker
containers:
- name: my-container
image: my-image:latest
节点标签管理
bash
# 给节点添加标签
kubectl label nodes node-1 zone=us-west-1
kubectl label nodes node-1 type=worker
# 查看节点标签
kubectl get nodes --show-labels
NodeAffinity
硬亲和性
yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: zone
operator: In
values:
- us-west-1
- us-west-2
containers:
- name: my-container
image: my-image:latest
软亲和性
yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
preference:
matchExpressions:
- key: type
operator: In
values:
- high-performance
containers:
- name: my-container
image: my-image:latest
PodAffinity/PodAntiAffinity
Pod亲和性
yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- backend
topologyKey: kubernetes.io/hostname
containers:
- name: my-container
image: my-image:latest
Pod反亲和性
yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- database
topologyKey: kubernetes.io/hostname
containers:
- name: my-container
image: my-image:latest
Taints与Tolerations
设置污点
bash
# 给节点添加污点
kubectl taint nodes node-1 dedicated=special:NoSchedule
kubectl taint nodes node-2 dedicated=special:PreferNoSchedule
kubectl taint nodes node-3 dedicated=special:NoExecute
容忍配置
yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
tolerations:
- key: "dedicated"
operator: "Equal"
value: "special"
effect: "NoSchedule"
containers:
- name: my-container
image: my-image:latest
PriorityClass
创建优先级
yaml
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 1000000
globalDefault: false
description: "High priority pods."
---
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: low-priority
value: 1000
globalDefault: false
description: "Low priority pods."
使用优先级
yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
priorityClassName: high-priority
containers:
- name: my-container
image: my-image:latest
实战案例:资源调度优化
yaml
apiVersion: v1
kind: Pod
metadata:
name: database-pod
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: type
operator: In
values:
- database
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- database
topologyKey: kubernetes.io/hostname
tolerations:
- key: "dedicated"
operator: "Equal"
value: "database"
effect: "NoSchedule"
priorityClassName: high-priority
containers:
- name: database
image: postgres:latest
resources:
requests:
memory: "4Gi"
cpu: "2"
limits:
memory: "8Gi"
cpu: "4"
总结
Kubernetes提供了丰富的调度策略,可以实现精细化的资源调度。通过合理配置亲和性、污点容忍和优先级,可以优化集群资源利用和应用可用性。
我的鬃狮蜥Hash对调度也有自己的理解------它总是选择最合适的位置捕捉蟋蟀,这也许就是自然界的"调度策略"吧!
如果你对Kubernetes调度有任何问题,欢迎留言交流!我是欧阳瑞,极客之路,永无止境!
技术栈:Kubernetes · 容器编排 · 调度策略