Skip to main content

Command Palette

Search for a command to run...

GKE 中配置 Pod 的垂直伸缩

Updated
3 min read

原文:Configuring vertical pod autoscaling

在 GKE 1.11.3 中提供了 Pod 垂直伸缩功能的 Beta 版本。这一功能在未来可能会收取费用,没有提供 SLA 以及过期策略,也有可能发生不向后兼容的更改。

本文阐述如何在 GKE 中配置 Pod 的垂直伸缩,该功能包含对 Pod 的 CPU 和内存申请进行调整的能力。

概述

可以配置 VerticalPodAutoscaler CRD来对容器的CPU以及内存需求进行分析和调整。

开始之前

开始这一任务之前,首先要完成以下步骤:

  • 确认开启了 GKE API

  • 安装 Cloud SDK

  • 设置缺省的 Project ID

    gcloud config set project [PROJECT_ID]

  • 如果运行的是 zonal 集群,设置缺省的 compute zone

    gcloud config set compute/zone [COMPUTE_ZONE]

  • 如果运行的是 regional 集群,设置缺省的 compute region

    gcloud config set compute/region [COMPUTE_REGION]

  • 更新 gcloud 到最新版本:

    gcloud components update

为集群启用 Pod 的垂直自动伸缩功能

可以使用下面的命令创建包含 Pod 垂直自动伸缩功能的新集群:

gcloud beta container clusters create [CLUSTER_NAME] \
    --enable-vertical-pod-autoscaling

[CLUSTER_NAME] 就是该集群的名称。

如果要给现有集群启用 Pod 垂直自动伸缩功能,可以用下列命令:

cloud beta container clusters update [CLUSTER-NAME] \
    --enable-vertical-pod-autoscaling

[CLUSTER_NAME] 就是该集群的名称。

获取资源推荐

下面的练习中会创建一个 VerticalPodAutoscaler,其中的 updateMode 设置为 Off。接下来创建一个包含两个 Pod 的 Deployment,每个 Pod 包含一个容器。当 Pod 创建时,VerticalPodAutoscaler 会分析容器的 CPU 和内存需要,并将推荐设置保存在 status 字段中。VerticalPodAutoscaler 在这一过程中不会对运行中的容器采取任何更新资源需求的措施。

VerticalPodAutoscaler 的配置如下:

apiVersion: autoscaling.k8s.io/v1beta1
kind: VerticalPodAutoscaler
metadata:
  name: my-rec-vpa
spec:
  selector:
    matchLabels:
      purpose: try-recommend
  updatePolicy:
    updateMode: "Off"

将代码保存为 my-rec-vpa.yaml 并创建该资源:

kubectl create -f my-rec-vpa.yaml

Deployment 的代码如下:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-rec-deployment
  labels:
    purpose: try-recommend
spec:
  replicas: 2
  template:
    metadata:
      labels:
        purpose: try-recommend
    spec:
      containers:
      - name: my-rec-container
        image: nginx

上述代码中并未设置 CPU 和内存的请求数量。而 Deployment 中的 Pod,具有标签 purpose: try-recommend,符合 VerticalPodAutoscaler 的 selector 中定义的选择标准,因此是会受到管理的。

将上述代码命名为 my-rec-deployment.yaml,创建对象:

kubectl create -f my-rec-deployment.yaml

稍候片刻,查看 VirticalPodAutoscaler:

kubectl get vpa my-rec-vpa --output yaml

会显示 CPU 和内存资源的推荐设置:

...
  recommendation:
    containerRecommendations:
    - containerName: my-rec-container
      lowerBound:
        cpu: 25m
        memory: 262144k
      target:
        cpu: 25m
        memory: 262144k
      upperBound:
        cpu: 7931m
        memory: 8291500k
...

现在看到了推荐的 CPU 和内存请求了,可以选择删除 Deployment,加入 CPU 和内存请求的相关内容,并重新启动。

自动更新资源

接下来的练习会创建一个 Deployment ,其中包含两个 Pod,每个 Pod 包含一个容器,容器请求 100m 的 CPU 以及 50M 的内存。然后创建一个 VerticalPodAutoscaler 对象,自动对 CPU 和内存的请求进行修正。

下面是该 Deployment 的代码:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-deployment
  labels:
    purpose: try-auto-requests
spec:
  replicas: 2
  template:
    metadata:
      labels:
        purpose: try-auto-requests
    spec:
      containers:
      - name: my-container
        image: k8s.gcr.io/ubuntu-slim:0.1
        resources:
          requests:
            cpu: 100m
            memory: 50Mi
        command: ["/bin/sh"]
        args: ["-c", "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"]

把上述代码保存为文件 my-deployment.yaml,并创建对象:

kubectl create -f my-deployment.yaml

列出运行中的 Pod:

kubectl get pods

输出内容中包含了 my-deployment 中的 Pod:

NAME                            READY     STATUS             RESTARTS   AGE
my-deployment-cbcdd49fb-d6bf9   1/1       Running            0          8s
my-deployment-cbcdd49fb-th288   1/1       Running            0          8s

为了后续方便,记录下 Pod 名称。

这个 Deployment 申请的 CPU 和内存非常小,所以可能提供更多资源会给这一 Deployment 带来更好的效果。

下面代码用于创建一个 VerticalPodAutoscaler

apiVersion: autoscaling.k8s.io/v1beta1
kind: VerticalPodAutoscaler
metadata:
  name: my-vpa
spec:
  selector:
    matchLabels:
      purpose: try-auto-requests
  updatePolicy:
    updateMode: "Auto"

这段代码中的 selector 字段中声明,所有带有标签 purpose: try-auto-requests 的 Pod 都会受其影响。

updateMode 字段取值为 Auto,代表 VerticalPodAutoscaler 会更新 Pod 的 CPU 和内存请求,也就是说 VerticalPodAutoscaler 会删除 Pod、调整 CPU 和内存申请,然后启动一个新 Pod。

把代码保存为 my-vpa.yaml,并创建该资源:

kubectl create -f my-vpa.yaml

几分钟之后,再次查看 Pod:

kubectl get pods

会看到 Pod 名称已经发生了变化,如果没有,请隔一段时间再次查看。

获取一个新 Pod 的信息:

kubectl get pod [POD_NAME] --output yaml

输出内容中,会看到 VerticalPodAutoscaler 提高了内存和 CPU 的设置。还会看到注解中也发生了更新:

apiVersion: v1
kind: Pod
metadata:
  annotations:
    vpaUpdates: 'Pod resources updated by my-vpa: container 0: cpu capped to node
      capacity, memory capped to node capacity, cpu request, memory request'
...
spec:
  containers:
  ...
    resources:
      requests:
        cpu: 510m
        memory: 262144k
    ...

查看一下 VerticalPodAutoscaler 的详情:

kubectl get vpa my-vpa --output yaml

输出内容中显示了三组对 CPU 和内存申请的建议:lowerBoundtargetupperBound

...
  recommendation:
    containerRecommendations:
    - containerName: my-container
      lowerBound:
        cpu: 536m
        memory: 262144k
      target:
        cpu: 587m
        memory: 262144k
      upperBound:
        cpu: 27854m
        memory: "545693548"

target 的含义是,该容器使用 587m 的 CPU 和 262144 KB 的内存会获得更好的运行效果。

VerticalPodAutoscaler 会使用 lowerBoundupperBound 来决定是否重新创建 Pod,如果一个 Pod 申请的资源少于 lowerBound 或者大于 upperBound,就会被 VerticalPodAutoscaler 删除并使用 target 推荐的规格进行重建。

Selector 不可重叠

VerticalPodAutoscaler 包含了一个 selector 字段,用来决定该对象的影响范围。如果创建了不止一个的 VerticalPodAutoscaler,要保证其 selector 不能发生重叠。

例如下面的两个 VerticalPodAutoscaler:

...
kind: VerticalPodAutoscaler
metadata:
  name: my-vpa-1
spec:
  selector:
    matchLabels:
      app: metrics
      department: engineering
...
...
...
kind: VerticalPodAutoscaler
metadata:
  name: my-vpa-2
spec:
  selector:
    matchLabels:
      department: engineering
...

带有 app: metricsdepartment: engineering 标签的 Pod 会被两个对象同时管理,会引发问题。

More from this blog

龙虾恐慌:AIOps 又要改名了?

ChatGPT 开始,把 AI 拉近到普罗大众的面前,让无数人感受到 AI 的亲民魅力。而龙虾,则把大模型驱动的自动化能力,突然间变得水灵灵、活泼泼地走进千家万户。它不只是“风口上的猪”,而是风口本身。热度高到让 Mac mini 一度断货,不知道这在不在库克的预料之内。 每代人都有每代人的鸡蛋,春节期间,我就领了我的鸡蛋。翻出古老的 MacBook Air M1,充值各种大模型。当然了,这个工具

Mar 9, 20261 min read

再见 2025

我猜不少人以为这个号废了吧?并没有,只是今年变化有点大,一直有种抄起键盘,无从说起的感觉,所以一直偷懒到今天,2025 的最后一天。 今年是我的第四个本命年,去年末一期播客里,大内说本命年不是灾年,是变化年,有危也有机。可是讲真啊,只看到危,没看到机。 各种因缘际会,从鹅厂跳槽到前东家,已经接近四年,第一个合同期已经进入尾声。除了前两年还在云原生领域嗷嗷叫,后两年基本都是些鸡零狗碎的东西了,用老东家的术语说是——偏离主航道,可谓是前景暗淡了。 一旦确定要滚蛋,反倒心思轻松起来,每天骑着我的小红车...

Jan 5, 20261 min read

辅助编程?dora 说:我知道你很急可是请你别急

从 OpenGPT 把大模型的火烧旺了之后,这三年来,相信很多组织或摩拳擦掌、或躬身入局,希望借助聪明能干的大模型,或想偿还技术宅,或想降本增效,或想弯道超车。一时间,沉寂许久的 AIxx 又活过来了,LLM Ops、Vibe Coding、中医大模型、GPT 算命等等,全都老树发新芽,焕发了勃勃生机。那么视角拉回从业者最关注的饭碗相关的领域之一——AI 辅助开发,产生了什么触动,应该如何拥抱呢? DORA 的年度报告中给出了很有意思的结论——强者恒强。 执行摘要部分总结了几个有趣的点: 问题...

Oct 6, 20251 min read

[译]dora:ai 辅助软件开发状态报告

执行摘要 在 2025 年,科技领导者面临的核心问题已不再是“是否要采用 AI”,而是“如何实现其价值”。 DORA 的研究基于超过 100 小时的定性访谈和来自全球近 5,000 名技术专业人士的问卷调查。研究揭示了一个关键事实:AI 在软件开发中的主要角色是“放大器”。它会放大高效能组织的优势,也会凸显组织的缺陷。 关键结论:AI 是放大器 AI 投资的最大回报并非来自工具本身,而是来自组织底层系统的战略性建设: 高质量的内部平台 清晰的工作流 团队的协同能力 缺少这些基础,AI ...

Oct 2, 202514 min read

僭越了,有人在用 Rust 写 Kubernetes

一个新语言问世,最爱做的事情之一,就是重写存量软件了。 云原生喝酒 SIG 重点扶持项目——rk8s(https://github.com/rk8s-dev/rk8s) 也可以归在这个范畴里,只不过这个项目重写的东西比较大,是 Kubernetes。 从 2025 年 1 月第一个 Commit 开始,到现在有了 200 多次 Commit,十几万行代码。当然距离 Kubernetes 的几百万行代码还差得远——老马就是喜欢整这种大无畏项目。 另外该项目也是国内第一个脱离 Cargo 转向使用 ...

Sep 27, 20253 min read

【伪】架构师

342 posts