摘要:比较 VPA 的资源推荐与更新模式,理解 Cluster Autoscaler 的节点扩缩容流程,以及与 HPA、调度约束和 PDB 的协作边界。
- VPA(Vertical Pod Autoscaler):垂直 Pod 自动扩缩容。
- Cluster Autoscaler(CA):集群节点自动扩缩容。
先看一个生产环境中的场景。
假设你运行一个 Java 微服务:
flowchart TB
N0["Deployment"]
N1["Pod-1:CPU 500m,Memory 512Mi"]
N2["Pod-2:CPU 500m,Memory 512Mi"]
N3["Pod-3:CPU 500m,Memory 512Mi"]
N0 --> N1
N0 --> N2
N0 --> N3
业务运行一段时间后,发现:
- 每个 Pod 的 CPU 使用率不高。
- 每个 Pod 的内存长期接近 512Mi。
- 部分请求出现 OOMKilled。
- 增加 Pod 数量并没有完全解决单个实例内存不足的问题。
这时候就需要考虑 VPA。
另一方面,如果 HPA 将 Pod 数量从 3 个增加到 20 个,但集群已经没有足够资源,就需要 Cluster Autoscaler。
一、VPA:Vertical Pod Autoscaler
1. 什么是 VPA?
VPA 全称:
Vertical Pod Autoscaler,垂直 Pod 自动扩缩容器。
它的主要作用是:
根据容器历史资源使用情况,自动推荐或调整 CPU 和 Memory 的 Requests、Limits。
注意与 HPA 的区别:
- HPA:调整 Pod 数量。
- VPA:调整单个 Pod 的资源配置。
例如:
原来的配置:
resources: requests: cpu: 500m memory: 512MiVPA 分析一段时间的运行情况后,可能推荐:
resources: requests: cpu: "1" memory: "1Gi"也就是说:
原来:CPU:500mMemory:512Mi
调整后:CPU:1 核Memory:1Gi这样可以使 Pod 的资源请求更接近实际需求。
2. VPA 解决什么问题?
实际生产环境中,经常遇到以下问题:
| 问题 | VPA 的作用 |
|---|---|
| CPU Requests 设置过高 | 推荐降低 Requests |
| CPU Requests 设置过低 | 推荐增加 Requests |
| Memory Requests 设置不合理 | 优化内存请求 |
| 容器频繁 OOMKilled | 根据历史使用情况提供更合理的资源建议 |
| 不知道应用需要多少资源 | 根据运行数据生成推荐值 |
注意:
VPA 不能保证消除 OOMKilled。如果应用存在内存泄漏或瞬时内存峰值过高,仍然需要从应用本身排查。
二、VPA 的整体架构
VPA 主要由三个组件构成:
- Recommender
- Updater
- Admission Controller
1. Recommender:资源推荐器
Recommender 负责分析 Pod 的历史资源使用情况。
例如:
Pod-1CPU 使用:200m250m300m280m
Memory 使用:400Mi450Mi500Mi480MiRecommender 根据历史指标和算法,计算资源推荐值。
输出:
CPU Request:350mMemory Request:600Mi它的核心职责:
- 收集资源使用历史。
- 分析资源使用趋势。
- 计算资源推荐值。
- 将推荐值提供给 VPA。
注意:推荐值不一定等于简单的平均值。VPA 会根据资源使用分布、历史窗口和安全边际等因素进行计算。
2. Updater:更新器
Updater 负责检查现有 Pod 是否需要调整资源配置。
例如:
当前 Pod:Memory Request = 512Mi
VPA 推荐:Memory Request = 1Gi如果配置允许自动更新,Updater 会判断是否需要驱逐并重新创建 Pod。
为什么需要重新创建?
因为传统 Kubernetes 工作负载中的容器资源 Requests 和 Limits 通常不能直接在运行中的容器上任意修改。
因此,VPA 的部分更新模式需要通过重新创建 Pod 来应用新的资源配置。
3. Admission Controller:准入控制器
Admission Controller 负责在 Pod 创建时,根据 VPA 推荐结果调整 Pod 的资源配置。
例如:
Deployment 创建新 Pod:
resources: requests: cpu: 500m memory: 512MiAdmission Controller 拦截 Pod 创建请求,并根据 VPA 推荐结果调整:
resources: requests: cpu: 1 memory: 1Gi随后 Pod 按照新的资源配置创建。
4. 三个组件的关系
| 组件 | 主要职责 |
|---|---|
| Recommender | 计算资源推荐值 |
| Updater | 决定是否更新现有 Pod |
| Admission Controller | 在创建 Pod 时应用推荐值 |
可以记忆为:
Recommender:计算Updater:替换Admission Controller:注入三、VPA 更新模式:Off、Initial、Recreate 与 InPlaceOrRecreate
VPA 有几种不同的更新模式。
其中最重要的是:
- Off
- Initial
- Recreate
- InPlaceOrRecreate
1. Off:只推荐,不自动修改
updatePolicy: updateMode: "Off"含义:
VPA 只计算推荐资源值,不自动修改现有 Pod。
例如:
当前 Requests:CPU:500mMemory:512Mi
VPA 推荐:CPU:1Memory:1Gi但现有 Pod 仍然使用:
CPU:500mMemory:512Mi适合:
- 生产环境资源评估。
- 观察资源使用趋势。
- 在正式调整之前进行验证。
这是比较安全的初始使用方式。
2. Initial:只在创建 Pod 时调整
updatePolicy: updateMode: "Initial"含义:
只在新 Pod 创建时应用推荐资源。
已经运行的 Pod 不会因为 VPA 推荐变化而被主动驱逐更新。
例如:
旧 Pod:CPU Requests = 500m
VPA 推荐:CPU Requests = 1
新 Pod 创建:CPU Requests = 1适合:
希望新创建的 Pod 使用更合理的资源配置,但不希望 VPA 主动重建现有 Pod。
3. Recreate:通过重新创建 Pod 更新
updatePolicy: updateMode: "Recreate"含义:
当资源推荐值变化,需要更新现有 Pod 时,Updater 可以驱逐旧 Pod,再由工作负载控制器创建新 Pod。
例如:
flowchart TB
N0["旧 Pod:<br/>Memory Requests = 512Mi"]
N1["VPA 推荐:<br/>Memory Requests = 1Gi"]
N2["Updater 驱逐旧 Pod"]
N3["Deployment 创建新 Pod"]
N4["Admission Controller 注入新资源"]
N5["新 Pod:<br/>Memory Requests = 1Gi"]
N0 --> N1
N1 --> N2
N2 --> N3
N3 --> N4
N4 --> N5
注意:
这可能造成 Pod 重启或短暂容量下降。
生产环境需要结合副本数量、PodDisruptionBudget 和应用可用性设计。
4. InPlaceOrRecreate:优先原地调整
较新版本的 VPA 还支持:
updatePolicy: updateMode: "InPlaceOrRecreate"含义:
优先尝试原地调整容器资源;如果无法原地调整,再考虑通过重新创建 Pod 完成更新。
但需要注意:
原地调整能力与 Kubernetes 版本、VPA 版本、容器资源更新支持及具体资源类型有关,不能假设所有集群都能无重启修改资源。
5. 四种模式对比
| 模式 | 推荐资源 | 修改新 Pod | 修改已有 Pod |
|---|---|---|---|
| Off | 是 | 不自动修改 | 不修改 |
| Initial | 是 | 应用推荐值 | 不修改 |
| Recreate | 是 | 应用推荐值 | 可能驱逐重建 |
| InPlaceOrRecreate | 是 | 应用推荐值 | 优先原地更新,必要时重建 |
四、安装与配置 VPA
VPA 不是所有 Kubernetes 集群默认安装的组件,需要额外部署。
它属于 Kubernetes 自动伸缩生态中的独立组件。
1. 检查 VPA 是否安装
kubectl get crd | grep verticalpodautoscaler如果已经安装,通常能看到类似:
verticalpodautoscalers.autoscaling.k8s.io也可以检查组件:
kubectl get pods -n kube-system | grep vpa2. VPA 示例配置
假设已经安装 VPA。
创建:
apiVersion: autoscaling.k8s.io/v1kind: VerticalPodAutoscaler
metadata: name: nginx-vpa
spec: targetRef: apiVersion: apps/v1 kind: Deployment name: nginx
updatePolicy: updateMode: "Off"解释:
| 字段 | 含义 |
|---|---|
| targetRef | 指定要管理的工作负载 |
| updatePolicy | 更新策略 |
| updateMode | 更新模式 |
这里先使用 Off 模式,只生成资源推荐值。
3. 查看 VPA 推荐结果
kubectl get vpa查看详细信息:
kubectl describe vpa nginx-vpa重点关注:
Recommendation: Container Recommendations: Container Name: nginx
Target: Cpu: 350m Memory: 600Mi不同 VPA 版本的输出格式可能有所不同。
常见推荐字段:
| 字段 | 含义 |
|---|---|
| Lower Bound | 推荐资源下界 |
| Target | 推荐资源目标值 |
| Upper Bound | 推荐资源上界 |
| Uncapped Target | 未经过资源上下限约束的推荐值 |
注意:
VPA 资源推荐结果并不代表资源已经应用到正在运行的 Pod。
需要区分:
Recommendation 是建议,Update 是实际调整。
五、VPA 推荐值如何理解?
VPA 不只是给出一个资源数字,还会提供多个推荐范围。
例如:
Container Recommendations:
CPU: Lower Bound: 200m Target: 500m Upper Bound: 800m
Memory: Lower Bound: 256Mi Target: 768Mi Upper Bound: 1Gi它们分别代表什么?
| 字段 | 含义 |
|---|---|
| Lower Bound | 推荐资源下界 |
| Target | 推荐的目标资源 |
| Upper Bound | 推荐资源上界 |
| Uncapped Target | 未经过配置上下限约束的推荐值 |
例如:
CPU Target = 500m意味着 VPA 建议将 CPU Requests 调整到 500m 左右。
注意:这些推荐值主要用于资源配置优化,不是容器实际使用量的硬性保证。
1. VPA 的资源计算逻辑
可以简单理解为:
flowchart TB
N0["历史资源使用数据"]
N1["统计资源使用分布"]
N2["计算资源需求"]
N3["加入安全边际"]
N4["生成推荐值"]
N5["应用资源上下限约束"]
N6["输出推荐结果"]
N0 --> N1
N1 --> N2
N2 --> N3
N3 --> N4
N4 --> N5
N5 --> N6
例如:
某个 Java 应用长期内存使用在 500Mi 左右,但偶尔出现 800Mi 峰值。
VPA 不一定会将 Requests 设置为 500Mi,而可能根据使用分布推荐更高的数值,避免资源请求长期偏低。
2. VPA 只调整 Requests 吗?
不完全是。
VPA 可以根据配置和版本调整 CPU、Memory 的 Requests,也可以涉及 Limits。
通常生产环境需要特别关注:
- Requests 是否合理。
- Limits 是否过低。
- 是否会因为资源调整触发容器重启。
- 是否影响 QoS 等级。
一个常见的设计方式是让 VPA 主要负责 Requests 推荐,再由团队根据应用特性确定 Limits。
六、VPA 与 HPA 如何协同?
这是生产环境非常重要的内容。
假设:
flowchart TB
N0["Deployment"]
N1["Pod-1"]
N2["Pod-2"]
N3["Pod-3"]
N0 --> N1
N0 --> N2
N0 --> N3
HPA 根据 CPU 使用率决定是否增加 Pod。
VPA 根据历史资源使用情况调整 CPU Requests。
但是问题来了:
HPA 的 CPU 利用率计算依赖 CPU Requests,而 VPA 又会修改 CPU Requests。
这可能造成控制器之间相互影响。
1. 冲突示例
假设:
CPU 实际使用:400mCPU Requests:500m那么:
[ CPU 利用率 =\frac{400}{500}\times100%=80% ]
HPA 目标是 50%,因此可能扩容。
随后 VPA 将 Requests 调整到:
CPU Requests:1此时:
[ CPU 利用率 =\frac{400}{1000}\times100%=40% ]
HPA 又可能认为当前资源使用率已经偏低。
于是:
flowchart TB
N0["VPA 提高 Requests"]
N1["HPA 计算 CPU 利用率下降"]
N2["HPA 缩容"]
N0 --> N1
N1 --> N2
这可能形成不理想的控制关系。
2. 生产环境建议
| 方案 | 适用场景 |
|---|---|
| HPA 管理副本,VPA 只推荐资源 | 最容易控制 |
| HPA 使用自定义业务指标,VPA 调整 CPU/Memory | 适合复杂业务 |
| HPA 管理 CPU,VPA 只推荐内存 | 需要明确分离管理维度 |
需要注意,VPA 的具体资源控制范围应结合所用版本及配置确认。
核心原则:避免 HPA 与 VPA 同时争夺同一资源指标的控制权。
七、Cluster Autoscaler:节点自动扩缩容
现在进入 Kubernetes 自动伸缩体系的第三个组件。
1. 什么是 Cluster Autoscaler?
Cluster Autoscaler,简称 CA。
它的主要作用:
根据集群中 Pod 的调度需求,自动增加或减少 Kubernetes Node。
例如:
当前集群:
Node-1:4 核 CPUNode-2:4 核 CPU现在 HPA 扩容:
当前 Pod:4目标 Pod:12但两个节点已经没有足够资源。
于是出现:
Pod-1:RunningPod-2:RunningPod-3:RunningPod-4:Running
Pod-5:PendingPod-6:PendingPod-7:Pending...Cluster Autoscaler 会检查这些 Pending Pod。
如果发现增加节点可以解决调度问题,就会向底层基础设施申请新的 Node。
例如:
flowchart TB
N0["HPA 扩容"]
N1["Pod Pending"]
N2["Cluster Autoscaler"]
N3["检查调度条件"]
N4["请求云平台扩容"]
N5["新增 Node"]
N6["Scheduler"]
N7["Pod 成功调度"]
N0 --> N1
N1 --> N2
N2 --> N3
N3 --> N4
N4 --> N5
N5 --> N6
N6 --> N7
注意:
Cluster Autoscaler 并不是直接创建 Pod,而是负责节点容量调整。
2. Cluster Autoscaler 的工作前提
Cluster Autoscaler 通常需要:
- Kubernetes 集群存在可扩缩节点组。
- 节点组能够通过云平台 API 或其他基础设施接口扩缩容。
- 有可用的节点资源规格。
- 节点组没有超过最大节点数量。
- 新节点能够加入 Kubernetes 集群。
例如云平台中:
Node Group:worker-group
Min Size:2Max Size:10Desired Size:3含义:
| 参数 | 含义 |
|---|---|
| Min Size | 最少节点数 |
| Max Size | 最多节点数 |
| Desired Size | 当前期望节点数 |
当集群资源不足时,CA 可以请求增加节点,但不能超过 Max Size。
八、Cluster Autoscaler 如何触发扩容?
重点来了:
是不是只要节点 CPU 使用率达到 80%,Cluster Autoscaler 就会增加节点?
不是。
Cluster Autoscaler 最核心的扩容触发条件是:
存在无法调度的 Pod,并且增加节点能够帮助这些 Pod 成功调度。
1. Pending Pod 触发扩容
例如:
Node-1:
CPU Allocatable:4 核已分配 Requests:3.8 核Node-2:
CPU Allocatable:4 核已分配 Requests:3.9 核现在创建一个 Pod:
resources: requests: cpu: "1"Scheduler 检查:
Node-1:剩余 0.2 核Node-2:剩余 0.1 核没有节点满足要求。
于是:
Pod:PendingReason:FailedSchedulingCA 检测到这个 Pending Pod。
如果节点组中存在适合该 Pod 的节点类型,就会尝试扩容。
2. 扩容过程
flowchart TB
N0["Pod Pending"]
N1["Scheduler 调度失败"]
N2["Cluster Autoscaler 检查"]
N3["模拟增加节点后的调度结果"]
N4["选择合适的 Node Group"]
N5["调用云平台 API"]
N6["增加云主机"]
N7["Node 加入 Kubernetes"]
N8["Pod 被 Scheduler 调度"]
N0 --> N1
N1 --> N2
N2 --> N3
N3 --> N4
N4 --> N5
N5 --> N6
N6 --> N7
N7 --> N8
注意:
如果 Pod 因为节点亲和性、污点、卷拓扑等约束而无法调度,即使增加普通节点,也可能无法解决问题。
例如:
nodeSelector: gpu: nvidia如果新增节点没有:
gpu=nvidia那么新增普通节点也无法帮助该 Pod 调度。
CA 需要的是能够满足 Pod 调度条件的节点,而不是任意节点。
九、Cluster Autoscaler 如何缩容?
扩容解决资源不足问题。
缩容则解决资源浪费问题。
假设:
Node-1:运行 3 个 PodNode-2:运行 2 个 PodNode-3:没有业务 PodNode-4:没有业务 Pod如果业务流量下降,HPA 将副本数量从 20 减少到 5。
那么:
Node-3、Node-4 可能变成空闲节点。
Cluster Autoscaler 可以尝试将它们缩容。
1. 节点缩容的基本条件
通常需要满足:
- 节点资源利用率足够低。
- 节点上的 Pod 可以安全迁移。
- 其他节点有足够资源容纳这些 Pod。
- 不违反 PodDisruptionBudget。
- 不存在阻止节点删除的特殊条件。
2. 缩容过程
flowchart TB
N0["业务流量下降"]
N1["HPA"]
N2["减少 Pod 副本"]
N3["部分 Node 空闲"]
N4["Cluster Autoscaler"]
N5["检查节点是否可以迁移 Pod"]
N6["驱逐可迁移 Pod"]
N7["删除空闲 Node"]
N8["云平台释放计算资源"]
N0 --> N1
N1 --> N2
N2 --> N3
N3 --> N4
N4 --> N5
N5 --> N6
N6 --> N7
N7 --> N8
注意:
Cluster Autoscaler 不会简单地因为节点 CPU 使用率低就立即删除节点。
它需要先评估节点上的工作负载是否可以安全迁移。
十、PodDisruptionBudget(PDB):节点缩容保护机制
这是理解 Cluster Autoscaler 缩容时必须掌握的知识。
1. 什么是 PDB?
PDB 全称:
PodDisruptionBudget。
它用于限制应用在主动中断操作期间允许同时不可用的 Pod 数量。
例如:
一个 Web 服务有 5 个副本。
我们希望:
无论节点维护还是集群缩容,至少保持 4 个 Pod 可用。
可以使用 PDB。
2. 创建 PDB
apiVersion: policy/v1kind: PodDisruptionBudget
metadata: name: web-pdb
spec: minAvailable: 4
selector: matchLabels: app: web解释:
minAvailable: 4表示主动中断期间,至少需要保持 4 个匹配的 Pod 可用。
如果当前有 5 个健康 Pod:
允许同时中断:1 个如果已经有 1 个 Pod 不健康:
当前健康 Pod:4允许再中断:0 个3. maxUnavailable
PDB 还可以使用:
apiVersion: policy/v1kind: PodDisruptionBudget
metadata: name: web-pdb
spec: maxUnavailable: 1
selector: matchLabels: app: web表示:
最多允许 1 个匹配的 Pod 不可用。
注意:
minAvailable 和 maxUnavailable 不能同时配置。
4. PDB 如何影响节点缩容?
假设:
Web Deployment:5 个副本
PDB:minAvailable = 4现在 CA 想要删除 Node-1。
Node-1 上运行:
Web-1Web-2如果一次驱逐两个 Pod,就可能违反 PDB。
因此 CA 需要通过 Eviction API 进行受 PDB 约束的驱逐。
如果没有足够的可用 Pod 预算,节点缩容可能被阻止或延迟。
这可以避免节点维护或缩容时,大量业务副本同时中断。
5. PDB 与普通 Pod 删除的区别
这是容易考错的知识点:
PDB 主要约束通过 Eviction API 发起的自愿中断。
它不是一个绝对的 Pod 存活保证。
例如:
- 节点突然宕机。
- 内核崩溃。
- 直接删除 Pod 对象。
- 某些不受 Eviction API 约束的操作。
都不能认为一定会被 PDB 阻止。
另外,Deployment 正常缩容属于工作负载自身的副本调整,不等同于节点维护时的 Eviction 操作,不能依赖 PDB 阻止 HPA 缩容。
十一、HPA + Cluster Autoscaler 联动
这是 Kubernetes 生产环境最重要的弹性伸缩架构之一。
1. 完整业务场景
假设一个电商系统:
初始状态:
Node-1:4 CPUNode-2:4 CPU
Deployment:3 个 Web Pod突然出现促销活动,访问量大幅增加。
HPA 检测到 CPU 使用率超过目标:
当前 Pod:3目标 Pod:15HPA 将 Deployment 的期望副本数调整为 15。
但是:
Node-1:资源不足Node-2:资源不足于是部分 Pod 进入 Pending。
CA 检测到:
存在无法调度的 Pod开始请求云平台增加节点。
最终:
Node-1 +--- Web-1 +--- Web-2
Node-2 +--- Web-3 +--- Web-4
Node-3 +--- Web-5 +--- Web-6 +--- Web-7
Node-4 +--- Web-8 +--- Web-9 ...业务恢复后:
- HPA 减少 Pod 副本。
- 部分节点变为空闲节点。
- CA 检查是否可以安全迁移 Pod。
- CA 删除多余节点。
- 云平台释放计算资源。
2. 完整架构
Kubernetes 弹性伸缩架构
flowchart TB
N0["业务流量变化"]
N1["Metrics Server / Prometheus<br/>提供 CPU、Memory、业务指标"]
N2["HPA<br/>调整 Pod 副本数量"]
N3["Scheduler<br/>尝试将 Pod 调度到现有节点"]
N4["Pod Pending<br/>现有节点资源不足或无法满足调度条件"]
N5["Cluster Autoscaler<br/>请求底层基础设施增加 Node"]
N6["新 Node 加入集群"]
N7["Pod 成功调度,业务扩容完成"]
N0 --> N1
N1 --> N2
N2 --> N3
N3 --> N4
N4 --> N5
N5 --> N6
N6 --> N7
3. 三种自动伸缩机制的分工
| 组件 | 解决的问题 | 调整对象 |
|---|---|---|
| HPA | Pod 数量不够 | Pod 副本 |
| VPA | 单个 Pod 资源配置不合理 | CPU、Memory |
| CA | 节点容量不足 | Node 数量 |
实际生产中还需要注意:
HPA 扩容速度、节点启动速度、镜像下载时间、应用启动时间都存在延迟。
因此,不能认为 HPA 和 CA 一旦联动,业务流量增长时就一定能立即完成扩容。
对于流量突发业务,还可以结合:
- 预热副本。
- 最小副本设置。
- 节点预留容量。
- 节点组最小规模。
- 合理的扩容策略。
十二、Cluster Autoscaler 与 HPA 的常见故障
1. HPA 已经扩容,但 Pod 一直 Pending
查看:
kubectl get pods -o wide查看:
kubectl describe pod <pod-name>如果出现:
FailedSchedulingInsufficient cpu说明节点资源不足。
进一步检查:
kubectl get nodes如果 CA 已安装,还需要检查 CA 日志:
kubectl logs -n kube-system \ deployment/cluster-autoscaler具体 Deployment 名称取决于安装方式。
2. Pod Pending,但是 CA 没有扩容
常见原因:
| 原因 | 说明 |
|---|---|
| 达到节点组最大数量 | 无法继续增加节点 |
| 没有合适节点类型 | 新节点也无法满足 Pod 条件 |
| 节点组未正确配置 | CA 无法控制节点组 |
| 亲和性限制 | 新节点标签不满足要求 |
| 污点不匹配 | Pod 无法容忍新节点污点 |
| 存储拓扑限制 | 新节点无法满足卷调度条件 |
重点:
CA 不是看到 Pending Pod 就无条件扩容。
它需要判断新增节点是否能够解决调度问题。
3. CA 无法缩容
常见原因:
- 节点上有不能安全驱逐的 Pod。
- PDB 不允许继续驱逐。
- Pod 使用了本地存储。
- Pod 有特殊调度约束。
- 其他节点没有足够资源容纳这些 Pod。
- 节点仍然有较高资源利用率。
- 节点处于缩容保护状态。
排查:
kubectl logs -n kube-system \ deployment/cluster-autoscaler以及:
kubectl get pdb -Akubectl describe pdb web-pdb十三、CKA 必须掌握的命令
| 操作 | 命令 |
|---|---|
| 查看 VPA CRD | kubectl get crd | grep verticalpodautoscaler |
| 查看 VPA | kubectl get vpa -A |
| 查看 VPA 推荐值 | kubectl describe vpa nginx-vpa |
| 查看 HPA | kubectl get hpa -A |
| 查看 PDB | kubectl get pdb -A |
| 查看 PDB 详情 | kubectl describe pdb web-pdb |
| 查看 Pending Pod | kubectl get pods -A --field-selector=status.phase=Pending |
| 查看调度失败原因 | kubectl describe pod <pod-name> |
| 查看节点状态 | kubectl get nodes |
| 查看 CA 日志 | kubectl logs -n kube-system deployment/cluster-autoscaler |
| 排空节点 | kubectl drain worker-1 --ignore-daemonsets |
| 恢复节点调度 | kubectl uncordon worker-1 |
补充:
VPA、Cluster Autoscaler 属于扩展组件,是否可用取决于集群是否安装和配置。CKA 核心考试中更应优先掌握 Pod、Deployment、资源配置、HPA 和 PDB 的基本操作与排错。
十四、本节知识体系总结
Kubernetes 自动伸缩体系
HPA:Horizontal Pod Autoscaler 水平扩缩容 调整 Pod 副本数量
VPA:Vertical Pod Autoscaler 垂直扩缩容 调整 Pod CPU、Memory 资源配置
CA:Cluster Autoscaler 节点扩缩容 调整 Kubernetes Node 数量
VPA 组件
| 组件 | 作用 |
|---|---|
| Recommender | 计算资源推荐值 |
| Updater | 判断是否更新现有 Pod |
| Admission Controller | 创建 Pod 时注入推荐资源 |
VPA 更新模式
| 模式 | 作用 |
|---|---|
| Off | 只推荐 |
| Initial | 只影响新 Pod |
| Recreate | 通过重建更新 |
| InPlaceOrRecreate | 优先原地更新 |
PDB 关键字段
| 字段 | 含义 |
|---|---|
| minAvailable | 最少可用 Pod 数 |
| maxUnavailable | 最大不可用 Pod 数 |