高级调度策略:Kubernetes亲和性与污点容忍详解
categories: - Kubernetes调度 tags: - Kubernetes - 亲和性 - 污点 - 容忍 - 调度
节点亲和性
requiredDuringSchedulingIgnoredDuringExecution(硬性要求)
apiVersion: apps/v1
kind: Deployment
metadata:
name: prod-app
spec:
replicas: 3
selector:
matchLabels:
app: prod
template:
metadata:
labels:
app: prod
spec:
containers:
- name: app
image: myapp:v1
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-type
operator: In
values:
- compute-optimized
- key: disktype
operator: In
values:
- ssd
preferredDuringSchedulingIgnoredDuringExecution(软性偏好)
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
preference:
matchExpressions:
- key: topology.kubernetes.io/zone
operator: In
values:
- zone-a
- zone-b
Pod亲和性与反亲和性
Pod反亲和性(分散Pod)
apiVersion: apps/v1
kind: Deployment
metadata:
name: cache-cluster
spec:
replicas: 3
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:7.0
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- redis
topologyKey: kubernetes.io/hostname
Pod亲和性( colocate相关Pod)
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp
spec:
replicas: 2
template:
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- cache
topologyKey: kubernetes.io/hostname
污点与容忍
添加污点到节点
# 标记节点有污点(不可调度普通Pod)
kubectl taint nodes node1 key=value:NoSchedule
# 标记节点有污点(尽量不调度,可被驱逐)
kubectl taint nodes node1 key=value:NoExecute
# 标记节点有污点(仅控制平面)
kubectl taint nodes node1 node-role.kubernetes.io/control-plane:NoSchedule
在Pod上添加容忍
apiVersion: apps/v1
kind: Deployment
metadata:
name: critical-app
spec:
template:
spec:
tolerations:
# 容忍指定污点
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
# 容忍所有NoExecute污点
- key: ""
operator: "Exists"
effect: "NoExecute"
tolerationSeconds: 3600
# 容忍控制平面污点
- key: "node-role.kubernetes.io/control-plane"
operator: "Exists"
effect: "NoSchedule"
常见污点示例
# 专用节点(只运行特定应用)
tolerations:
- key: "dedicated"
operator: "Equal"
value: "database"
effect: "NoSchedule"
# GPU节点
tolerations:
- key: "nvidia.com/gpu"
operator: "Exists"
effect: "NoSchedule"
综合示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: production-db
spec:
replicas: 1
selector:
matchLabels:
app: production-db
template:
metadata:
labels:
app: production-db
spec:
containers:
- name: postgres
image: postgres:15
resources:
requests:
memory: "4Gi"
cpu: "2"
limits:
memory: "8Gi"
cpu: "4"
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-type
operator: In
values:
- storage-optimized
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- production-db
topologyKey: kubernetes.io/hostname
tolerations:
- key: "dedicated"
operator: "Equal"
value: "database"
effect: "NoSchedule"
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。







