K8s调度策略:深入剖析与实战指南

一、K8s调度策略概述
Kubernetes(简称K8s)作为当今最流行的容器编排平台,其核心功能之一就是调度。K8s调度策略是指K8s如何根据一定的规则和优先级,将Pod分配到合适的节点上。本文将深入剖析K8s调度策略,并结合实战案例,为您讲解如何在实际项目中运用这些策略。
二、K8s调度策略分类
1. 节点选择器(Node Selector)
节点选择器是一种简单的调度策略,用于将Pod调度到具有特定标签的节点上。例如,我们可以为具有特定硬件资源(如GPU)的节点设置标签,然后使用节点选择器将需要GPU的Pod调度到这些节点上。
2. 亲和性(Affinity)
亲和性策略分为两种:节点亲和性和Pod亲和性。
(1)节点亲和性:将Pod调度到具有特定标签的节点上,或者尽量将Pod调度到与其亲和性较高的节点上。
(2)Pod亲和性:将具有相同亲和性的Pod调度到同一个节点上,或者尽量将Pod调度到与其亲和性较高的节点上。
3. 反亲和性(Anti-Affinity)
反亲和性策略与亲和性策略相反,用于将Pod调度到具有不同标签的节点上,或者尽量将Pod调度到与其亲和性较低的节点上。
4. 调度约束(Pod Priority and Preemption)
调度约束包括Pod优先级和抢占。Pod优先级用于决定当资源不足时,哪些Pod应该被优先调度。抢占则允许K8s在必要时暂停正在运行的Pod,并将资源分配给更高优先级的Pod。
三、K8s调度策略实战
以下是一个使用节点选择器和亲和性策略的实战案例:
1. 为节点设置标签
首先,我们需要为节点设置标签,以便后续使用节点选择器和亲和性策略。
```shell
kubectl label nodes node1 gpu=true
kubectl label nodes node2 gpu=true
```
2. 创建Deployment
接下来,我们创建一个Deployment,该Deployment包含需要GPU资源的Pod。
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: gpu-app
spec:
replicas: 2
selector:
matchLabels:
app: gpu-app
template:
metadata:
labels:
app: gpu-app
spec:
containers:
- name: gpu-container
image: nvidia/cuda:10.0-base
resources:
limits:
gpu: 1
nodeSelector:
gpu: "true"
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- gpu-app
topologyKey: "kubernetes.io/hostname"
```
在上面的Deployment配置中,我们设置了节点选择器和亲和性策略:
(1)节点选择器:将Pod调度到具有标签`gpu=true`的节点上。
(2)亲和性策略:将具有相同亲和性的Pod调度到同一个节点上,并且尽量将Pod调度到与其亲和性较高的节点上。
3. 查看Pod调度结果
通过以下命令,我们可以查看Pod的调度结果。
```shell
kubectl get pods -o wide
```
输出结果如下:
```
NAME READY STATUS RESTARTS AGE NODE
gpu-app-5c7c5d6d4-8q8qk 1/1 Running 0 7m19s node1
gpu-app-5c7c5d6d4-z6tzn 1/1 Running 0 7m19s node2
```
从输出结果可以看出,两个Pod均成功调度到了具有标签`gpu=true`的节点上。
四、总结
本文深入剖析了K8s调度策略,包括节点选择器、亲和性、反亲和性以及调度约束等。通过实战案例,我们了解到如何在实际项目中运用这些策略。掌握K8s调度策略对于优化资源利用率、提高系统稳定性具有重要意义。






