本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
不知道大家最近有没有注意到 CNCF 发布的重磅消息,Kubernetes 1.35 正式发布,代号为“Timbernetes”。
这个 GA 的版本包含 60 项增强功能,其中 22 项为 Alpha 特性,19 项晋升为 Beta,17 项达到通用可用或稳定状态,同时还包含若干弃用和移除内容。
这其中,最让我兴奋的是,Pod 原地扩缩容特性。要知道这个特性经历了 6 年打磨,现在 K8S 1.35 终于将 Pod 原地扩缩容(In-Place Pod Resize)推至正式版本了。这一革命性特性将彻底改变我们管理应用资源的方式,尤其是对 Java 开发者来说,意味着再也不用为 JVM 启动时的资源浪费而头疼了!
所以,接下来,我们就一起来了解、学习和解读一下这个新特性吧。
Kubernetes 1.35 核心亮点
2025 年 12 月,Kubernetes 社区正式发布 v1.35 版本。虽然这个版本包含多项改进,但最引人注目的无疑是In-Place Pod Resize特性从 Beta 毕业到 Stable(GA)状态。
这意味着什么?简单来说:你可以在不重启 Pod 的情况下,动态调整容器的 CPU 和内存资源!
彻底告别过去“一改配置就要重启”的痛苦时代,K8S 终于实现了真正的“热扩容”能力。
接下来,我们重点就放在 In-Place Pod Resize 详解上吧。先来了解一下什么是原地扩缩容?
原地扩缩容
在过去,一旦 Pod 创建成功,resources.requests 和 resources.limits 就变成了“铁律”,任何修改都逃不过“删 Pod → 重建”的命运。对于 Stateful 应用、实时服务或有状态批处理任务,这种中断简直就是噩梦。
而现在的In-Place Pod Resize特性的核心突破在于无需重启即可完成资源的再分配。
# 旧方式:修改资源 = 必须重启 Pod
kubectl patch pod my-app --patch '{"spec":{"containers":[{"name":"app","resources":{"requests":{"cpu":"2"}}}]}}'
# 结果:Pod 被终止,新 Pod 调度启动(中断服务)
# 新方式:直接调整,无需重启
kubectl patch pod my-app --subresource=resize --patch '{"spec":{"containers":[{"name":"app","resources":{"requests":{"cpu":"2"}}}]}}'
# 结果:容器资源配置实时更新,业务零中断!
工作原理揭秘
要完成不用重启就能实现原地扩缩容,Kubernetes 1.35 引入了两个关键概念。
- Desired Resources(期望资源):
spec.containers[*].resources现在代表“你想要的目标”,CPU 和内存字段完全可变 - Actual Resources(实际资源):
status.containerStatuses[*].resources显示“当前生效的配置”
当你通过 resize 子资源提交变更后。
- Kubelet 接收到调整请求
- 调用容器运行时(如 containerd)修改 cgroup 限制
- 容器进程立即在新资源边界内运行
无需重启容器,业务无感知!
做个运维或使用过 k8s 的应该知道这个功能有多香。因为它有不少使用场景,下面我们简单展开说说。
五大核心使用场景
根据官方博客和社区实践,这个特性解锁了以下革命性场景。
游戏服务器的弹性伸缩
在线游戏玩家数量波动巨大。白天需要 8 核 CPU 支撑高峰,深夜玩家寥寥,可缩减至 2 核。现在无需重启游戏服务器进程,即可平滑调整资源。
预热 Worker 的智能调度
机器学习训练集群中,预加载数据的 Worker 在空闲时可压缩资源,任务到达瞬间扩容。资源利用率提升 40% 以上不再是梦。
JIT 编译的启动加速
这正是 Java 开发者的福音!Java 程序启动阶段需要大量 CPU 进行类加载和即时编译,启动完成后需求骤降。现在可以为启动阶段分配 4 核,30 秒后自动降至 1 核,既保证快速启动又节省成本。
动态负载适应
Web 服务在促销活动期间 CPU 飙升,活动结束立即回缩。配合 VPA(Vertical Pod Autoscaler),实现秒级响应的垂直自动扩缩容。
内存限制的精细化控制
v1.35 新特性支持降低内存 limits。虽然有一定风险(需要确保当前使用量低于新限制),但为内存优化提供了更大灵活性。
对 Java 开发者的超级利好
作为 Java 开发者,这个特性简直是量身定制!让我们看看这其中的具体优势。
痛点迎刃而解
过去存在的一些问题。
- JVM 启动慢:类加载、JIT 编译需要大量 CPU,但启动后需求下降
- 资源浪费:为启动峰值预留的资源,在运行时被闲置
- 优化困难:无法区分“启动资源”和“运行资源”,只能一刀切
- 在云原生时代,Java 启动慢总是被诟病
现在多出了一些新的解决方案。
# 示例:Java 应用的智能资源分配
apiVersion: v1
kind: Pod
metadata:
name: java-app
annotations:
# 使用 VPA 的 CPU Startup Boost 功能
vpa.kubernetes.io/startup-cpu-boost: "true"
spec:
containers:
- name: java-app
image: my-java-app:1.0
resources:
requests:
cpu: "500m" # 正常运行需求
memory: "1Gi"
limits:
cpu: "1" # 正常运行上限
memory: "2Gi"
env:
- name: JAVA_OPTS
value: "-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0"
CPU Startup Boost
CPU Startup Boost,这可是启动加速的黑科技。
目前,社区正在推进的AEP-7862提案(Vertical Pod Autoscaler CPU Startup Boost)完美配合 In-Place Resize。
- 启动阶段:自动将 CPU 提升至 4 核,JVM 以火箭速度完成预热
- 预设时间后(如 60 秒):平滑降至正常运行配置(如 1 核)
- 全程无中断:业务在容器内持续运行,只是资源配置动态变化
实测效果。
- Spring Boot 应用启动时间缩短
50%-70% - 资源成本降低
30%-50%(按实际使用量计费) - 再也不用担心 OOMKilled 或 CPU 饥饿!
但也需要注意,一些线程池、资源池等,启动时按 CPU 个数计算,缩小资源后,对应的资源池等可能不会跟着缩减。现在是虚拟线程时代了,也是时候抛弃一些平台线程池了。
实战
下面,我们看一个 Java 应用启动优化完整方案。
前提条件
- Kubernetes 集群版本 ≥ 1.35
- VPA 组件已部署(支持 In-Place Resize 的版本)
- 节点内核支持 cgroup v2(推荐)
方案一:使用 VPA 自动模式(推荐)
步骤 1,部署 VPA。
# 安装支持 In-Place Resize 的 VPA
kubectl apply -f https://github.com/kubernetes/autoscaler/releases/download/vertical-pod-autoscaler-1.4.0/vpa-v1.4.0.yaml
步骤 2,配置 StartupCPU Boost。
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: java-app-vpa
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: java-app
updatePolicy:
updateMode: "InPlaceOrRecreate" # Beta 版本已支持
resourcePolicy:
containerPolicies:
- containerName: java-app
startupCpuBoost:
enabled: true
boostDuration: "60s" # 提升持续 60 秒
minCpu: "4" # 启动时最小 CPU
targetCpu: "8" # 启动时目标 CPU
接下来,就是观察效果了。
# 查看 Pod 资源变化
kubectl describe pod java-app-xxx
# 关注 Events 中的 Resize 事件
# Normal InPlacePodResized Successfully resized Pod java-app-xxx
方案二:手动控制
这个方案适合手动控制的场景,适合定制化场景。Java 应用启动时需要 4 核,启动后降为 1 核。
# 1. 创建 Pod(启动配置)
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: java-app-manual
spec:
containers:
- name: java-app
image: openjdk:17-jre
command: ["java", "-jar", "/app/myapp.jar"]
resources:
requests:
cpu: "4" # 启动时高配置
memory: "2Gi"
limits:
cpu: "4"
memory: "2Gi"
EOF
# 2. 等待应用启动完成(通过健康检查或日志判断)
kubectl wait --for=condition=Ready pod/java-app-manual --timeout=300s
# 3. 关键操作:执行原地缩容
kubectl patch pod java-app-manual --subresource=resize --patch '{"spec":{"containers":[{"name":"java-app","resources":{"requests":{"cpu":"1"},"limits":{"cpu":"1"}}}]}}'
# 4. 验证调整
kubectl get pod java-app-manual -o yaml | grep -A 5 status:
方案三:Application Controller 自动化
编写自定义 Operator,监听应用启动事件,自动触发缩容。
// 伪代码示例
public class StartupOptimizer {
public void onApplicationReadyEvent() {
// 应用启动完成后调用 K8s API
k8sClient.pods().withName("my-pod")
.resize(new ResourceRequirementsBuilder()
.addToRequests("cpu", new Quantity("1"))
.addToLimits("cpu", new Quantity("1"))
.build());
}
}
最佳实践与注意事项
一般来说,推荐的做法如下。
- 始终设置 requests 和 limits:确保 QoS 等级明确
- 配合 VPA 使用:利用
InPlaceOrRecreate模式实现智能化 - 监控 Resize 事件:建立告警机制,跟踪资源调整
- 测试你的应用:验证应用在资源变化下的稳定性
- 使用 CPU Startup Boost:Java 应用启动优化的黄金搭档
但也需要避免注意以下事项。
- 不要过度依赖内存缩容:降低内存限制可能导致 OOMKill,务必确保使用量低于新限制
- 避免频繁震荡:设置合理的调整阈值,防止资源抖动
- 注意运行时限制:Java 目前不支持内存热调整(需重启),但 CPU 完全支持
- 不兼容场景:Swap、static CPU Manager、static Memory Manager 目前仍不支持
总结与展望
Kubernetes 1.35 的 In-Place Pod Resize GA 标志着云原生资源管理进入精细化、动态化的新纪元。对 Java 开发者而言。
- 启动速度可能不再是瓶颈:通过 CPU Startup Boost,JVM 启动时间大幅缩短
- 成本效益最大化:精准匹配应用生命周期资源需求
- 运维负担减轻:告别为”峰值”预留资源的浪费模式
对于接下来的一些新特性未来依然可期。
- VPA 的
InPlace模式即将 GA - Java 运行时内存热调整已在 OpenJDK 社区讨论(JDK-8359211)
- 与 Ray、Agent-sandbox 等项目深度集成
以上,对于有动态所扩容的可以升级试一试,期待大家都有好的体验。
参考资料
- 官方文档:调整容器资源
https://kubernetes.io/docs/tasks/configure-pod-container/resize-container-resources/ - VPA In-Place 更新提案 AEP-4016
https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler/enhancements/4016-in-place-updates-support - CPU Startup Boost 提案 AEP-7862
https://github.com/kubernetes/autoscaler/pull/7863 - https://bugs.openjdk.org/browse/JDK-8359211

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » 苦等6年,K8s 1.35正式GA发布,支持原地扩缩容,Java启动提速70%!