为集群超配节点容量

本页指导您配置 Kubernetes 集群中的节点超额配置。节点超额配置是一种主动预留集群计算资源一部分的策略。这种预留有助于减少在伸缩事件期间调度新 Pod 所需的时间,从而提高集群对突发流量或工作负载需求的响应能力。

通过保持一些未使用的容量,您可以确保在创建新 Pod 时立即可用资源,从而防止它们在集群扩展时进入挂起状态。

开始之前

  • 您需要一个 Kubernetes 集群,并且 kubectl 命令行工具必须配置为与您的集群通信。
  • 您应该已经对Deployment、Pod 优先级PriorityClasses有一个基本的了解。
  • 您的集群必须配置了基于需求管理节点的自动伸缩器

创建 PriorityClass

首先,为占位符 Pod 定义一个 PriorityClass。首先,创建一个具有负优先级值的 PriorityClass,您稍后将分配给占位符 Pod。稍后,您将设置一个使用此 PriorityClass 的 Deployment

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: placeholder # these Pods represent placeholder capacity
value: -1000
globalDefault: false
description: "Negative priority for placeholder pods to enable overprovisioning."

然后创建 PriorityClass

kubectl apply -f https://k8s.io/examples/priorityclass/low-priority-class.yaml

接下来,您将定义一个使用负优先级 PriorityClass 并运行最小容器的 Deployment。当您将其添加到集群时,Kubernetes 将运行这些占位符 Pod 以预留容量。当出现容量不足时,控制平面将选择这些占位符 Pod 作为第一个要抢占的 Pod。

运行请求节点容量的 Pod

查看示例清单

apiVersion: apps/v1
kind: Deployment
metadata:
  name: capacity-reservation
  # You should decide what namespace to deploy this into
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: capacity-placeholder
  template:
    metadata:
      labels:
        app.kubernetes.io/name: capacity-placeholder
      annotations:
        kubernetes.io/description: "Capacity reservation"
    spec:
      priorityClassName: placeholder
      affinity: # Try to place these overhead Pods on different nodes
                # if possible
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchLabels:
                  app.kubernetes.io/name: capacity-placeholder
              topologyKey: topology.kubernetes.io/hostname
      containers:
      - name: pause
        image: registry.k8s.io/pause:3.6
        resources:
          requests:
            cpu: "50m"
            memory: "512Mi"
          limits:
            memory: "512Mi"

选择占位符 Pod 的命名空间

您应该选择或创建一个命名空间,占位符 Pod 将进入该命名空间。

创建占位符 Deployment

基于该清单创建 Deployment

# Change the namespace name "example"
kubectl --namespace example apply -f https://k8s.io/examples/deployments/deployment-with-capacity-reservation.yaml

调整占位符资源请求

配置占位符 Pod 的资源请求和限制,以定义您想要维护的超额配置资源量。此预留可确保为新 Pod 保留特定数量的 CPU 和内存。

要编辑 Deployment,请修改 Deployment 清单文件中的 resources 部分,以设置适当的请求和限制。您可以将该文件下载到本地,然后使用您喜欢的文本编辑器进行编辑。

您还可以使用 kubectl 编辑 Deployment

kubectl edit deployment capacity-reservation

例如,要为 5 个占位符 Pod 预留总共 0.5 个 CPU 和 1GiB 内存,请将单个占位符 Pod 的资源请求和限制定义如下

  resources:
    requests:
      cpu: "100m"
      memory: "200Mi"
    limits:
      cpu: "100m"

设置所需的副本计数

计算预留的总资源

例如,使用 5 个副本,每个副本预留 0.1 个 CPU 和 200MiB 内存
预留的总 CPU:5 × 0.1 = 0.5(在 Pod 规范中,您将写下数量 500m
预留的总内存:5 × 200MiB = 1GiB(在 Pod 规范中,您将写下 1 Gi

要缩放 Deployment,请根据集群的大小和预期的工作负载调整副本数

kubectl scale deployment capacity-reservation --replicas=5

验证缩放

kubectl get deployment capacity-reservation

输出应反映更新后的副本数

NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
capacity-reservation   5/5     5            5           2m

接下来

  • 了解更多关于 PriorityClasses 以及它们如何影响 Pod 调度。
  • 探索 节点自动伸缩,以根据工作负载需求动态调整集群的大小。
  • 了解 Pod 抢占,这是 Kubernetes 处理资源争用的关键机制。同一页面还涵盖了驱逐,这与占位符 Pod 方法不太相关,但也是 Kubernetes 响应资源争用的机制。
上次修改时间为 2024 年 11 月 18 日下午 5:22 PST:调整节点容量超额配置任务 (d34ee98252)