为集群超配节点容量

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

通过保持一些未使用的容量,确保在新 Pod 被创建时资源可以立即可用,防止 Pod 在集群扩缩容时进入 Pending 状态。

准备开始

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

创建 PriorityClass

首先为占位 Pod 定义一个 PriorityClass。 先创建一个优先级值为负数的 PriorityClass,稍后将其分配给占位 Pod。 接下来,你将部署使用此 PriorityClass 的 Deployment。

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: placeholder # 这些 Pod 表示占位容量
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

接下来,你将定义一个 Deployment,使用优先级值为负数的 PriorityClass 并运行最小的容器。 当你将此 Deployment 添加到集群中时,Kubernetes 会运行这些占位 Pod 以预留容量。 每当出现容量短缺时,控制面将选择这些占位 Pod 中的一个作为第一个候选者进行抢占

运行请求节点容量的 Pod

查看样例清单:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: capacity-reservation
  # 你应决定要将此 Deployment 部署到哪个命名空间
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: # 有可能的话,将这些 Pod 开销放到不同的节点
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchLabels:
                app: placeholder
            topologyKey: "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:

# 你要更改命名空间名称 "example"
kubectl --namespace example apply -f https://k8s.io/examples/deployments/deployment-with-capacity-reservation.yaml

调整占位资源请求

为占位 Pod 配置资源请求和限制,以定义你希望保持的超配资源量。 这种预留确保为新 Pod 保留可以使用的、特定量的 CPU 和内存。

要编辑 Deployment,可以修改 Deployment 清单文件中的 resources 一节, 设置合适的 requestslimits。 你可以将该文件下载到本地,然后用自己喜欢的文本编辑器进行编辑。

你也可以使用 kubectl 来编辑 Deployment:

kubectl edit deployment capacity-reservation

例如,要为 5 个占位 Pod 预留 500m CPU 和 1Gi 内存,请为单个占位 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

接下来

  • 进一步了解 PriorityClass 及其如何影响 Pod 调度。
  • 探索节点自动扩缩容, 以基于工作负载需求动态调整集群的大小。
  • 了解 Pod 抢占, 这是 Kubernetes 处理资源竞争的关键机制。这篇文档还涵盖了驱逐, 虽然与占位 Pod 方法相关性较小,但也是 Kubernetes 在资源竞争时做出反应的一种机制。
最后修改 November 21, 2024 at 9:04 AM PST: [zh] Resync node-overprovisioning.md (cbb153d7bb)