VPA垂直扩缩容

使用场景

VPA 自动伸缩特性使容器服务具有非常灵活的自适应能力。应对业务负载急剧飙升的情况,VPA 能够在用 户设定范围内快速扩大容器的 Request。在业务负载变小的情况下,VPA 可根据实际情况适当缩小 Request 节省计算资源。整个过程自动化无须人为干预,适用于需要快速扩容、有状态应用扩容等场景。此外,VPA 可用于向用户推荐更合理的 Request,在保证容器有足够使用的资源的情况下,提升容器的资源利用率。

VPA 优势

相较于 自动伸缩功能 HPA,VPA 具有以下优势:
1、VPA 扩容不需要调整 Pod 副本数量,扩容速度更快。
2、VPA 可为有状态应用实现扩容,HPA 则不适合有状态应用的水平扩容。
3、Request 设置过大,使用 HPA 水平缩容至一个 Pod 时集群资源利用率仍然很低,此时可以通过 VPA 进 行垂直缩容提高集群资源利用率。

VPA限制

社区版 VPA 功能处于试验阶段

1、 自动更新正在运行的 Pod 资源是 VPA 的一项实验功能。当 VPA 更新 Pod 资源时,会导致 Pod 的重 建和重启,并且有可能被调度到其他节点上。

VPA 不会驱逐不在控制器下运行的 Pod。对于此类 Pod,Auto 模式等效于 Initial。

2、VPA 与 HPA 不可同时在 CPU 和内存预留上运行。如需同时运行 VPA 与 HPA,则 HPA 需使用除 CPU 和 内存以外的指标。

3、VPA 使用 Admission Webhook 作为其准入控制器。如果集群中存在其他的 Admission Webhook,需要 确保它们不会与 VPA 的 Admission Webhook 发生冲突。准入控制器的执行顺序定义在 API Server 的配 置参数中。

4、VPA 会处理大多数 OOM(Out Of Memory)事件。

5、VPA 性能尚未在大型群集中进行测试。

6、VPA 对 Pod 资源 Request 的建议值可能会超出可用资源(例如节点资源上限、空闲资源或资源配额), 并导致 Pod 处于 Pending 状态无法被调度。同时使用 VPA 与 Cluster Autoscaler 可以部分解决此问 题。 CA 可结合 VK 一起使用。

7、与同一个 Pod 匹配的多个 VPA 资源具有未定义的行为。

详细见:

https://github.com/kubernetes/autoscaler/tree/vpa-release-0.8/vertical-pod-autoscaler#known-limitations

VPA组件

VPA Recommender

1、监视资源利用率并计算目标值,计算方法
2、查看指标历史记录、OOM 事件和 VPA 部署规范并建议公平请求。根据定义的限制请求比例提高/降低限 制
3、Recommender 组件发现有 vpa 存在,就会去 metrics server 获取所有 vpa 绑定 pod 的 cpu, mem 当前使 用值(1 分钟平均使用),然后结合历史数据(vpa 维护的一个 crd 对象),给出当前 vpa 所有容器的推荐 值。(会将当前的 cpu,mem 值当做历史数据保持起来)

VPA Updater

1、驱逐那些需要新资源限制的 pod
2、如果定义了“updateMode: Auto ”,则实现 Recommender 推荐的任何内容
3、监听 vpa 资源变化,一旦 vpa 有推荐值。就会判断当前的推荐值是否需要 更新到 绑定的 POD。判断逻 辑比如:资源推荐值 和当前 POD 正在使用的值是否差距过大,过大则需要更新,不大则忽略。updater 更 新的逻辑非常简单,就是直接将该 pod 驱逐

VPA Admission Controller

1、每当 VPA 更新程序驱逐并重新启动 pod 时,在新 pod 启动之前更改 CPU 和内存设置(使用 webhook) 2、当 Vertical Pod Autoscaler 设置为 updateMode 为“Auto ”时,如果需要更改 pod 的资源请求,则 驱逐 pod。由于 Kubernetes 的设计,修改正在运行的 Pod 的资源请求的唯一方法是重新创建 Pod。

VPA 有以下四种更新策略

· Initial:仅在 Pod 创建时修改资源请求,以后都不再修改。
· Auto:默认策略,在 Pod 创建时修改资源请求,并且在 Pod 更新时也会修改。
· Recreate:类似 Auto,在 Pod 的创建和更新时都会修改资源请求,不同的是,只要 Pod 中的请求值 与新的推荐值不同,VPA 都会驱逐该 Pod,然后使用新的推荐值重新启一个。因此,一般不使用该策略, 而是使用 Auto,除非你真的需要保证请求值是最新的推荐值。
· Off:不改变 Pod 的资源请求,不过仍然会在 VPA 中设置资源的推荐值。pod 不会有任何变化,vpa 对象的推荐值会一直变化

资源定义

涉及到的自定义资源主要有两个:VerticalPodAutoscalerVerticalPodAutoscalerCheckpoint

VerticalPodAutoscaler

VerticalPodAutoscaler:该资源由用户创建,用于设置纵向扩容的目标对象和存储 recommend 组件计算出 的推荐指标。

apiVersion: autoscaling.k8s.io/v1beta2
kind: VerticalPodAutoscalermetadata:
   name: nginx-vpa
   namespace: vpaspec:
   targetRef:
      apiVersion: "apps/v1"
      kind: Deployment
      name: nginx
   updatePolicy:
      updateMode: "Auto"
   resourcePolicy:
      containerPolicies:
      - containerName: "nginx"
        minAllowed:
            cpu: "100m"
            memory: "100Mi"
        maxAllowed:
            cpu: "2000m"
            memory: "2600Mi"

VerticalPodAutoscalerCheckpoint

该资源由 recommend 组件创建和维护,用于存储指标相关信息。一个 vpa 对应的多个容器,每个容器创建一个该资源。

VPA 工作流程

image.png

1.用户配置 VPA 资源 (VerticalPodAutoScaler )。

  1. VPA Recommender 从 API Service 读取 VPA 配置。
  2. VPA Recommender 实时更新资源利用率指标(来自 MetriceServer),对目标 POD 进行计算,提供 pod 资源推荐。
    4.VPA Updater 监听读取 pod 资源建议。
    5.VPA Updater 得到新的建议后终止 pod ( Kubernetes 不支持动态更改正在运行的 pod 的资源限制,因此 VPA 无法使用更新现有 pod。
  3. POD 部署控制器意识到 pod 已终止,并将重新创建 pod 以匹配其副本配置。
  4. 当 Pod 处于重新创建过程中时,VPA Admission controller 获取 Pod 资源推荐。
  5. VPA Admission controoler 将建议覆盖到 pod。 (如上示例,VPA 准入控制器向 pod 设置“250m”的 CPU 的资源限制,替换 POD 定义中的设置。

VPA 实践

部署 VPA 组件

image.png

测试

场景一:使用 VPA 获取 Request 推荐值

1、不建议在生产环境中使用 VPA 自动更新 Request。
2、可以利用 VPA 查看 Request 推荐值,在合适条件下手动触发更新或者作为创建同类任务得推荐值。

updateMode: “OFF”

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
  namespace: vpa
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        resources:
        requests:
          cpu: 100m
          memory: 250Mi
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: vpa
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
  selector:
  app: nginx
---
apiVersion: autoscaling.k8s.io/v1beta2
kind: VerticalPodAutoscaler
metadata:
  name: nginx-vpa
  namespace: vpa
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind: Deployment
    name: nginx
  updatePolicy:
    updateMode: "Off"
  resourcePolicy:
    containerPolicies:
      - containerName: "nginx"
        minAllowed:
          cpu: "250m"
          memory: "100Mi"
        maxAllowed:
          cpu: "2000m"
          memory: "2048Mi"
image.png
字段 说明
lowerBound 推荐的最小值。使用小于该值的 Request 可能会对性能或可用性产生重大影响。
target 推荐值。由 VPA 计算出最合适的 Request。
uncappedTarget 最新建议值。仅基于实际资源使用情况,不考虑 .spec.resourcePolicy.containerPolicies 中设置的容器可以被推荐的数值范围。uncappedTarget 可能与推荐上下界限不同。该字段仅用作状态指示,不会影响实际的资源分配。
upperBound 推荐的最大值。使用高于该值的 Request 可能造成浪费。
压测:
~ ab -c 100 -n 10000000 192.168.206.128:31407/
~ kubectl describe vpa nginx-vpa -n vpa

VPA 对 Pod 给出了推荐值:Cpu: 476m,因为我们这里设置了 updateMode: “Off”,所以不会更新 Pod

场景二:停用特定容器 VPA

Pod 中有多个容器,例如一个是真正的业务容器,另一个是辅助容器。为了节省集群资源,可以选择停止为辅助容器推荐 Request.

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscalermetadata:
  name: tke-opt-vpaspec:
  targetRef:
    apiVersion: "apps/v1"
    kind: Deployment
    name: tke-opt-deployment
  updatePolicy:
    updateMode: "Off"
  resourcePolicy:
    containerPolicies:
    - containerName: tke-opt-sidecar
      mode: "Off"

该 VPA 的 .spec.resourcePolicy.containerPolicies 中,指定了 tke-opt-sidecar 的 mode 为“Off”,VPA 将不会为 tke-opt-sidecar 计算和推荐新的 Request。

场景三:自动更新 Request

updateMode: “Auto”

自动更新正在运行的 Pod 资源是 VPA 的一项实验功能,建议不要在生产环境中使用该功能。VPA 的 updateMode 字段的值为 Auto,表示 VPA 可以在 Pod 的生命周期内更新 CPU 和内存请求。VPA 可以删除 Pod,调整 CPU 和内存请求,然后启动一个新 Pod。


image.png
image.png

image.png

创建 Deployment 时设置了资源的 Request 和 Limits,VPA 此时不仅会推荐 Request 值,还会按照Request 和 Limits 的初始比例自动推荐 Limits 值。例如,YAML 中 CPU 的 Request 和 Limits 的初始比例为 100m:200m = 1:2,那么 VPA 推荐的 Limits 数值则是 VPA 对象中推荐的 Request 数值的两倍。

故障处理

  1. 执行 vpa-up.sh 脚本时报错
ERROR: Failed to create CA certificate for self-signing. If the error is
"unknown option -addext", update your openssl version or deploy VPA from
the vpa-release-0.8 branch.

检查集群 CVM 的 openssl 版本是否大于 1.1.1

使用考虑

影响:
1、无法与 HPA 共同使用
2、针对云平台,影响计费逻辑,pod 销毁在重启,无法保证 pod 重启在原有节点上,对于依赖宿主机某些资源得场景有局限性。在最新的 v1.27 版本新增 alpha 特性,提供 in place update ,避免了重启 POD

可行性:
可结合 OFF 模式为用户提供预计算资源功能,但仅限于内存、CPU 得资源限制且任务需要先创建运行,可演变成同类型任务得资源推荐功能或者预测资源,缺点是支持的资源类型受限。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349