为集群超配节点容量
本页指导你在 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 # 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
接下来,你将定义一个 Deployment,使用优先级值为负数的 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:
# 你要更改命名空间名称 "example"
kubectl --namespace example apply -f https://k8s.io/examples/deployments/deployment-with-capacity-reservation.yaml
调整占位资源请求
为占位 Pod 配置资源请求和限制,以定义你希望保持的超配资源量。 这种预留确保为新 Pod 保留可以使用的、特定量的 CPU 和内存。
要编辑 Deployment,可以修改 Deployment 清单文件中的 resources
一节,
设置合适的 requests
和 limits
。
你可以将该文件下载到本地,然后用自己喜欢的文本编辑器进行编辑。
你也可以使用 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
说明:
一些自动扩缩组件,特别是 Karpenter, 在考虑节点扩缩容时将偏好的亲和性规则视为硬性规则。如果你使用 Karpenter 或其他使用同样启发式的节点扩缩容组件,你在此处设置的副本数也就是你的集群的最少节点数。
接下来
- 进一步了解 PriorityClass 及其如何影响 Pod 调度。
- 探索节点自动扩缩容, 以基于工作负载需求动态调整集群的大小。
- 了解 Pod 抢占, 这是 Kubernetes 处理资源竞争的关键机制。这篇文档还涵盖了驱逐, 虽然与占位 Pod 方法相关性较小,但也是 Kubernetes 在资源竞争时做出反应的一种机制。
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.