kubernets学习kuberne...

vpa 原理简介

2022-07-08  本文已影响0人  zoux

1. 原生vpa简介

VPA 全称 Vertical Pod Autoscaler,即垂直 Pod 自动扩缩容,可以根据容器资源使用情况自动设置 CPU 和 内存 的请求值,从而允许在节点上进行适当的调度,以便为每个 Pod 提供适当的资源。它既可以缩小过度请求资源的容器,也可以根据其使用情况随时提升资源不足的容量。注意:VPA 不会改变 Pod 的资源限制值

vpa的优点:

使用VPA可以带来以下好处:

vpa的缺点:

vpa项目来源autoscaler下面的一个子项目,github地址为:https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler

1.1 原生vpa用法

和hpa一样,vpa只需要创建deploy, 和 vpa对象即可。

(1) 创建deploy, 不用额外的指定。

可以通过vpaObservedContainers针对某一个容器的值进行推荐

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: zx-vpa-test
    project: test
    sym-apiversion: v3
    sym-app: zx-vpa
    sym-manager-injected: "true"
  name: zx-vpa
  namespace: test-test
spec:
  progressDeadlineSeconds: 600
  replicas: 2
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: zx-vpa-test
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:         
      creationTimestamp: null
      labels:
        app: zx-vpa-test
        project: test
        sym-apiversion: v3
        sym-app: zx-vpa
        sym-manager-injected: "true"
        uuid: 96402213-d9fa-4c97-8723-51ca0249d55b
      name: zx-vpa-test
    spec:
      containers:
      - command:
        - sleep
        - "36000"
        image: dockerhub.nie.netease.com/fanqihong/ubuntu:stress
        imagePullPolicy: IfNotPresent
        name: zx-vpa
        resources:
          limits:
            cpu: "1"
            memory: 131072k
          requests:
            cpu: "1"
            memory: 131072k
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      - command:
        - sleep
        - "36000"
        image: ncr.nie.netease.com/zouxiang/testcpu:v1
        imagePullPolicy: IfNotPresent
        name: zx-vpa2
        resources:
          limits:
            cpu: "2"
            memory: 200Mi
          requests:
            cpu: "2"
            memory: 200Mi
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File

(2)创建vpa对象

apiVersion: "autoscaling.k8s.io/v1beta2"
kind: VerticalPodAutoscaler
metadata:
  name: hamster-vpa  
spec:
  targetRef:
    apiVersion: "apps/v1"       // 指定需要绑定的对象(上诉的deploy)
    kind: Deployment
    name: zx-vpa
  updatePolicy:
    updateMode: "Auto"          // 更新模式

VPA 有以下四种更新策略:

1.2 原生的vpa工作逻辑

原生的vpa架构图如下所示,一个常见的vpa处理逻辑如下:

(1)创建好1.1所示的deploy, vpa对象

(2)Recommender组件发现有vpa存在,就会去metrics server获取所有vpa绑定pod的cpu, mem当前使用值(1分钟平均使用),然后结合历史数据(vpa维护的一个crd对象),给出当前vpa所有容器的推荐值。(会将当前的cpu,mem值当做历史数据保持起来)

(3)updater组件 负责监听vpa资源变化,一旦vpa有推荐值。就会判断当前的推荐值是否需要 更新到 绑定的POD.

判断逻辑比如:资源推荐值 和当前POD正在使用的值是否差距过大,过大则需要更新,不大则忽略。

updater更新的逻辑非常简单,就是直接将该pod驱逐

(4)admissoin controller组件 负责pod的重建,一旦发现有pod重建,并且该pod受到vpa控制,修改pod的资源为vpa推荐值。

所以,依靠 recommenderupdater, admissoin controller 这三个组件,就实现了pod资源的更新。

image-20220708171459455.png

1.3 原生vpa存在的问题

(1)监控数据的获取问题。原生的使用是metrics Sever, 无法自定义metric server

(2)pod资源更新需要重建

(3)vpa目前推荐值没有上限和下限

上一篇下一篇

猜你喜欢

热点阅读