--- title: 为集群超配节点容量 content_type: task weight: 10 --- 本页指导你在 Kubernetes 集群中配置{{< glossary_tooltip text="节点" term_id="node" >}}超配。 节点超配是一种主动预留部分集群计算资源的策略。这种预留有助于减少在扩缩容事件期间调度新 Pod 所需的时间, 从而增强集群对突发流量或突发工作负载需求的响应能力。 通过保持一些未使用的容量,确保在新 Pod 被创建时资源可以立即可用,防止 Pod 在集群扩缩容时进入 Pending 状态。 ## {{% heading "prerequisites" %}} - 你需要有一个 Kubernetes 集群,并且 kubectl 命令行工具必须被配置为与你的集群通信。 - 你应该已经基本了解了 [Deployment](/zh-cn/docs/concepts/workloads/controllers/deployment/)、Pod {{}}和 {{< glossary_tooltip text="PriorityClass" term_id="priority-class" >}}。 - 你的集群必须设置一个基于需求管理节点的[自动扩缩程序](/zh-cn/docs/concepts/cluster-administration/cluster-autoscaling/)。 ## 创建 PriorityClass {#create-a-priorityclass} 首先为占位 Pod 定义一个 PriorityClass。 先创建一个优先级值为负数的 PriorityClass,稍后将其分配给占位 Pod。 接下来,你将部署使用此 PriorityClass 的 Deployment。 {{% code_sample language="yaml" file="priorityclass/low-priority-class.yaml" %}} 然后创建 PriorityClass: ```shell kubectl apply -f https://k8s.io/examples/priorityclass/low-priority-class.yaml ``` 接下来,你将定义一个 Deployment,使用优先级值为负数的 PriorityClass 并运行最小的容器。 当你将此 Deployment 添加到集群中时,Kubernetes 会运行这些占位 Pod 以预留容量。 每当出现容量短缺时,控制面将选择这些占位 Pod 中的一个作为第一个候选者进行{{< glossary_tooltip text="抢占" term_id="preemption" >}}。 ## 运行请求节点容量的 Pod {#run-pods-that-request-node-capacity} 查看样例清单: {{% code_sample language="yaml" file="deployments/deployment-with-capacity-reservation.yaml" %}} ### 为占位 Pod 挑选一个命名空间 {#pick-a-namespace-for-the-placeholder-pods} 你应选择或创建占位 Pod 要进入的{{< glossary_tooltip term_id="namespace" text="命名空间">}}。 ### 创建占位 Deployment {#create-the-placeholder-deployment} 基于该清单创建 Deployment: ```shell # 你要更改命名空间名称 "example" kubectl --namespace example apply -f https://k8s.io/examples/deployments/deployment-with-capacity-reservation.yaml ``` ## 调整占位资源请求 {#adjust-placeholder-resource-requests} 为占位 Pod 配置资源请求和限制,以定义你希望保持的超配资源量。 这种预留确保为新 Pod 保留可以使用的、特定量的 CPU 和内存。 要编辑 Deployment,可以修改 Deployment 清单文件中的 `resources` 一节, 设置合适的 `requests` 和 `limits`。 你可以将该文件下载到本地,然后用自己喜欢的文本编辑器进行编辑。 你也可以使用 kubectl 来编辑 Deployment: ```shell kubectl edit deployment capacity-reservation ``` 例如,要为 5 个占位 Pod 预留 500m CPU 和 1Gi 内存,请为单个占位 Pod 定义以下资源请求和限制: ```yaml resources: requests: cpu: "100m" memory: "200Mi" limits: cpu: "100m" ``` ## 设置所需的副本数量 {#set-the-desired-replica-count} ### 计算总预留资源 {#calculate-the-total-reserved-resources} 例如,有 5 个副本,每个预留 0.1 CPU 和 200MiB 内存: CPU 预留总量:5 × 0.1 = 0.5(在 Pod 规约中,你将写入数量 `500m`) 内存预留总量:5 × 200MiB = 1GiB(在 Pod 规约中,你将写入 `1 Gi`) 要扩缩容 Deployment,请基于集群的大小和预期的工作负载调整副本数: ```shell kubectl scale deployment capacity-reservation --replicas=5 ``` 验证扩缩容效果: ```shell kubectl get deployment capacity-reservation ``` 输出应反映出更新后的副本数: ```none NAME READY UP-TO-DATE AVAILABLE AGE capacity-reservation 5/5 5 5 2m ``` {{< note >}} 一些自动扩缩组件,特别是 [Karpenter](/zh-cn/docs/concepts/cluster-administration/cluster-autoscaling/#autoscaler-karpenter), 在考虑节点扩缩容时将偏好的亲和性规则视为硬性规则。如果你使用 Karpenter 或其他使用同样启发式的节点扩缩容组件,你在此处设置的副本数也就是你的集群的最少节点数。 {{< /note >}} ## {{% heading "whatsnext" %}} - 进一步了解 [PriorityClass](/zh-cn/docs/concepts/scheduling-eviction/pod-priority-preemption/#priorityclass) 及其如何影响 Pod 调度。 - 探索[节点自动扩缩容](/zh-cn/docs/concepts/cluster-administration/cluster-autoscaling/), 以基于工作负载需求动态调整集群的大小。 - 了解 [Pod 抢占](/zh-cn/docs/concepts/scheduling-eviction/pod-priority-preemption/), 这是 Kubernetes 处理资源竞争的关键机制。这篇文档还涵盖了**驱逐**, 虽然与占位 Pod 方法相关性较小,但也是 Kubernetes 在资源竞争时做出反应的一种机制。