Kubernetes 调度是确保集群中的 Pod 在合适的节点上运行的关键组件。通过灵活配置调度策略,可以提高资源利用率、负载均衡和高可用性。在本文中,我们将深入研究一些实际的 Kubernetes 调度场景,并提供相应的配置示例和最佳实践。
1. 基础场景 - NodeSelector
场景描述: 我们有一些节点标记了具有 SSD 硬盘的标签,我们希望将需要高性能存储的 Pod 调度到这些节点上。
Pod 配置:
apiVersion: v1
kind: Pod
metadata:
name: high-performance-pod
spec:
containers:
- name: my-container
image: my-image
nodeSelector:
disktype: ssd
2. 高级场景 - Node Affinity
场景描述: 我们希望将需要 GPU 的任务调度到具有 GPU 标签的节点上。
Pod 配置:
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod
spec:
containers:
- name: my-container
image: my-image
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: gpu
operator: In
values:
- "true"
3. 资源分配 - Pod 优先级和预选调度
场景描述: 为了确保关键任务具有更高的优先级,我们可以定义 PriorityClass,并将其应用于 Pod。
PriorityClass 配置:
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 1000000
globalDefault: false
description: "High priority class"
Pod 配置:
apiVersion: v1
kind: Pod
metadata:
name: high-priority-pod
spec:
containers:
- name: my-container
image: my-image
priorityClassName: high-priority
4. 防止 Pod 在相同节点上运行 - Pod Anti-Affinity
场景描述: 通过 Pod Anti-Affinity,我们可以确保同一组中的 Pod 不会被调度到同一个节点上,以提高高可用性。
Pod 配置:
apiVersion: v1
kind: Pod
metadata:
name: anti-affinity-pod
spec:
containers:
- name: my-container
image: my-image
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- web
topologyKey: kubernetes.io/hostname
5. 多副本的拓扑域分布 - Pod Topology Spread
场景描述: 确保同一应用的多个 Pod 分布在不同的拓扑域中,提高可用性。
Deployment 配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: "app"
operator: In
values:
- "web"
topologyKey: "kubernetes.io/hostname"
6. 节点 Taints 和 Pod Tolerations
场景描述: 通过节点的 Taints,我们可以标记节点,只有具有相应 Tolerations 的 Pod 才能被调度到这些节点上。
Node 配置:
apiVersion: v1
kind: Node
metadata:
name: node1
spec:
taints:
- key: special
value: unique
effect: NoSchedule
Pod 配置:
apiVersion: v1
kind: Pod
metadata:
name: toleration-pod
spec:
containers:
- name: my-container
image: my-image
tolerations:
- key: "special"
operator: "Equal"
value: "unique"
effect: "NoSchedule"
这些场景覆盖了从基本到高级的 Kubernetes 调度实战案例。根据你的需求,可以选择合适的场景进行配置,以优化集群的资源利用和性能。在实际应用中,根据具体需求调整配置,确保调度器的策略满足业务和性能需求。