Kubernetes(K8s)作为当今最流行的容器编排平台,其核心功能之一就是精准调度工作负载至指定节点。精准的调度策略可以显著提高集群的效率和应用性能。以下是一些关键技巧,帮助您在K8s中实现精准调度。

1. 使用Node Selector和Node Affinity

Node Selector和Node Affinity是Kubernetes中用于调度Pod到特定节点的关键机制。

Node Selector

Node Selector类似于SQL查询中的WHERE子句,允许您根据特定条件选择节点。在Pod定义中添加Node Selector,Kubernetes调度器会尝试将Pod调度到匹配这些标签的节点上。

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  nodeSelector:
    kubernetes.io/role: master

Node Affinity

Node Affinity则更加灵活,允许您指定Pod与节点之间的亲和性偏好。它分为三种类型:requiredDuringSchedulingIgnoredDuringExecution、preferredDuringSchedulingIgnoredDuringExecution和preferredDuringSchedulingRequiredDuringExecution。

  • requiredDuringSchedulingIgnoredDuringExecution:强制将Pod调度到具有指定标签的节点上。
  • preferredDuringSchedulingIgnoredDuringExecution:优先调度到具有指定标签的节点上,但不是必须的。
  • preferredDuringSchedulingRequiredDuringExecution:类似于requiredDuringSchedulingIgnoredDuringExecution,但优先级更高。
apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  affinity:
    nodeAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 1
          preference:
            matchExpressions:
              - key: kubernetes.io/role
                operator: In
                values:
                - master

2. 利用Taints和Tolerations

Taints和Tolerations用于防止某些Pod调度到特定的节点上。

Taints

Taints是节点上的标记,用于标记节点为不可接受某些类型的Pod。Pod可以通过Tolerations来容忍这些Taints。

apiVersion: v1
kind: Node
metadata:
  name: master-node
spec:
  taints:
  - key: "dedicated"
    value: "master"
    effect: "NoSchedule"

Tolerations

Tolerations定义了Pod能够容忍的Taints。

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  tolerations:
  - key: "dedicated"
    operator: "Equal"
    value: "master"
    effect: "NoSchedule"

3. 利用Pod Priority和Preemption

Pod Priority和Preemption允许您根据Pod的重要性和优先级进行调度。

Pod Priority

您可以通过指定Pod的Priority字段来设置优先级。

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  priority: 10

Preemption

Preemption允许Kubernetes在需要时抢占低优先级Pod的节点,以便高优先级Pod可以调度。

apiVersion: v1
kind: Pod
metadata:
  name: high-priority-pod
spec:
  priority: 20
  preemptionPolicy: Preempt

4. 使用调度插件

某些第三方调度插件,如NVIDIA Device Plugin,可以增强Kubernetes的调度能力,使其能够处理特定硬件资源(如GPU)的调度。

apiVersion: kubeflow.org/v1alpha1
kind: K8sPod
metadata:
  name: nvidia-gpu-pod
spec:
  template:
    spec:
      containers:
      - name: nvidia-container
        image: nvidia/cuda:10.0-base
        resources:
          limits:
            nvidia.com/gpu: 1

总结

精准调度工作负载至指定节点是优化Kubernetes集群性能的关键。通过合理使用Node Selector、Node Affinity、Taints/Tolerations、Pod Priority和Preemption以及调度插件,您可以有效地控制Pod的调度行为,从而提高集群的效率和稳定性。