为集群过度供应节点容量
此页面指导你如何在 Kubernetes 集群中配置节点超量供应。节点超量供应是一种主动保留集群部分计算资源的策略。此保留有助于在扩缩事件期间缩短调度新 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 # 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
查看示例清单
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"
设置所需的副本数量
计算总预留资源
例如,如果每个副本预留 0.1 CPU 和 200MiB 内存,总共有 5 个副本:
总预留 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
注意
某些自动扩缩器,特别是 Karpenter,在考虑节点扩缩时将首选亲和性规则视为硬性规则。如果你使用 Karpenter 或其他使用相同启发式算法的节点自动扩缩器,你在此处设置的副本数量也决定了集群的最小节点数量。下一步
- 了解有关 PriorityClasses 及其如何影响 Pod 调度的更多信息。
- 探索节点自动扩缩,以根据工作负载需求动态调整集群大小。
- 了解 Pod 抢占,这是 Kubernetes 处理资源争用的关键机制。同一页面还介绍了与占位 Pod 方法不太相关的“驱逐”,但它也是 Kubernetes 在资源争用时做出反应的机制。