导读:本期聚焦于小伙伴创作的《如何在 Kubernetes 集群中运行多实例应用并实现自动扩缩?》,敬请观看详情。把单体服务搬进 Kubernetes 后,最容易被忽略的是“多实例怎么稳、流量怎么均、负载高了怎么自动加机器”。直接改副本数只是手动挡,遇上突发流量依旧会撑爆 Pod。本文从 Deployment 管理多副本的机制讲起,说明就绪探针如何决定流量能否进入新实例;再拆解 HorizontalPodAutoscaler 基于 CPU 与内存指标算目标副本数的公式,配上自定义指标扩缩思路;最后给出资源请求与限制的设置误区,以及扩缩振荡的抑制办法。读完能搭出一套不怕峰值、也不会空转烧钱的多实例应用运行方案。

在 Kubernetes 里跑多实例应用,核心并不是简单地把同一个镜像启动多次,而是让调度器、服务发现和负载均衡共同配合,保证任意时刻都有足够且健康的副本处理请求,并在压力变化时自动调整规模。本文围绕 Deployment 与 HorizontalPodAutoscaler 两个对象,说明从静态多副本到动态扩缩的完整路径。

如何在 Kubernetes 集群中运行多实例应用并实现自动扩缩?

用 Deployment 稳定运行多实例应用

Deployment 是 Kubernetes 中管理无状态多实例应用最常用的控制器。它通过 ReplicaSet 保证集群中始终存在指定数量的 Pod 副本,当某个节点宕机或 Pod 被误删时,控制器会迅速在其它节点上重建,使实际副本数向声明值收敛。我们在编写 Deployment 时,最核心的字段是 spec.replicasspec.template,前者定义期望副本数,后者描述 Pod 的容器与配置。

只设置副本数并不能算“稳”。如果新启动的容器需要几秒完成缓存预热,而服务注册中心已把流量打过来,就会出现大量超时。因此必须在模板中配置就绪探针(readinessProbe),例如 HTTP 探针访问 /healthz,只有返回 200 时,Endpoint 控制器才会把该 Pod 的 IP 加入 Service 的后端列表。下面给出一个基础的 Deployment 示例,其中运行了三个副本并带就绪检查:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: web
        image: nginx:1.25
        ports:
        - containerPort: 80
        readinessProbe:
          httpGet:
            path: /healthz
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 10

上面的配置虽然写死了三个副本,但已经具备多实例容错能力。若想手动扩缩,只需修改 replicas 或执行 kubectl scale deployment web-app --replicas=5。不过手动方式依赖人盯监控,不适合生产峰值场景,这就需要后面的自动扩缩机制。

基于指标的自动扩缩原理与配置

HorizontalPodAutoscaler(简称 HPA)负责根据观测指标动态调整 Deployment 的副本数。其底层逻辑是:每隔一个同步周期(默认 15 秒),从 Metrics Server 或自定义指标适配器拉取当前 Pod 的平均资源使用率,再对照用户设定的目标值,按“当前副本数 × 当前使用率 ÷ 目标使用率”向上取整算出期望副本数。比如三个 Pod 平均 CPU 用了 80%,目标是 40%,则期望副本为 3×80%÷40%=6。

配置 HPA 最常见的是基于 CPU 利用率。集群需先部署 Metrics Server,使 kubectl top pod 能取到数据。注意 HPA 只能缩放到 spec.replicas 范围之外,但受 minReplicasmaxReplicas 约束。以下示例让 web-app 在平均 CPU 超 50% 时扩容,最少 2 个、最多 10 个副本:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: web-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

除了 CPU,内存指标也常被使用,写法类似只需把 name 换成 memory。但内存不同于 CPU,下降慢且释放不确定,单纯按内存扩缩容易滞后。更精细的做法是接 Prometheus 适配器,用每秒请求数(QPS)做自定义指标,这样扩缩直接跟随业务压力而非间接资源。无论哪种指标,都要给容器设好 resources.requests,否则 HPA 无法计算使用率百分比。

资源设置与扩缩振荡的避坑实践

很多团队在接入 HPA 后发现副本数反复横跳:刚扩到 8 个,下一周期又缩到 4 个,如此循环既拖慢响应又增加调度开销。根源往往是资源请求设得太低,导致使用率轻微波动就触发阈值;或是没有配置缩容稳定窗口。从 Kubernetes 1.18 起,HPA 行为可用 behavior 字段细调,比如规定缩容时每次最多减少 1 个副本,且缩容前等待 300 秒,能显著抑制抖动。

另一个常见误区是只设限制(limits)不设请求(requests)。若漏了 requests,调度器以为 Pod 占用极小,会把大量副本堆到同一节点,真正来流量时节点资源争抢,Pod 被驱逐反而更不稳定。正确姿势是 requests 贴近真实均值、limits 留一点突发余量。示例如下,在容器里明确声明:

        resources:
          requests:
            cpu: "100m"
            memory: "128Mi"
          limits:
            cpu: "500m"
            memory: "256Mi"

最后提醒,多实例应用扩缩不是孤立动作。Service 的会话保持、Pod 优雅终止(preStop 钩子)、以及应用自身无状态化(不写本地磁盘会话)都直接影响扩缩质量。把这些都理顺后,再配合 HPA 的指标与行为调优,才能在 Kubernetes 集群中既跑得稳又花得省。

KubernetesHorizontalPodAutoscalerDeployment修改时间:2026-08-14 01:48:28

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。