Kubernetes通过VPA实现动态垂直缩放

261 阅读3分钟

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

VPA介绍

VPA工作流程:

image.png

VPA 由三部分组成:

Recommender:用于根据监控指标结合内置机制给出资源建议值,自动扩展所需的初始任务是获取指标并确定工作负载的当前使用情况。根据资源的当前和过去指标,推荐器将为每个容器确定一组“推荐”的CPU和内存值。

Updater:用于实时更新 pod resource requests,当检测到应将哪些”正确“请求委托给推荐程序时,更新程序控制器会将每个部署的当前请求和建议请求与委托的垂直容器自动缩放器对象进行比较。如果部署的相应VPA对象的更新模式设置为“自动”或“重新创建”,则更新程序控制器将有助于创建包含新建议请求的新Pod。

Admission Controller: 用于在 pod 创建时修改 resource requests,如果您已经弄清了什么是准入控制器及其用途,则VPA还包括一个变异的准入钩子。如果VPA对象的模式设置为“自动”,“重新创建”或“初始”,则该Webhook将在将Pod接纳到集群时注入由Recommender生成的当前请求值。

VPA 有四种更新模式:

Auto:将使用指定的更新机制在pod启动时和pod处于活动状态时分配请求值。

Recreate:将在容器启动时分配请求值,如果当前推荐值与当前请求值相差很大,则将驱逐该容器并创建一个新的容器。

Initial:仅在pod创建时分配资源请求,以后再也不会更改它们。

Off:不会自动更改容器的资源要求。将计算建议,并可以在VPA对象中对其进行检查。

VPA部署

部署metrics-server

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
kubectl get deployment metrics-server -n kube-system

部署vpa

匹配的版本

VPA versionKubernetes version
0.141.25+
0.131.25+
0.121.25+
0.111.22 - 1.24
0.101.22+
0.91.16+
0.81.13+
0.4 to 0.71.11+
0.3.X and lower1.7+

安装vpa


git clone https://github.com/kubernetes/autoscaler.git
cd autoscaler/vertical-pod-autoscaler/
./hack/vpa-up.sh
kubectl get pods -n kube-system

image.png

部署应用

task-scheduling-api.yaml

apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
  name: "task-scheduling-api"
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind: Deployment
    name: "task-scheduling-api"
  resourcePolicy:
    containerPolicies:
      - containerName: '*'
        minAllowed:
          cpu: '0.1'
          memory: 1024M
        maxAllowed:
          cpu: '2'
          memory: 5120M
        controlledResources: ["cpu", "memory"]
 ---
 apiVersion: apps/v1
kind: Deployment
metadata:
  name: "task-scheduling-api"
  namespace: data-platform
  labels:
    app.kubernetes.io/name: "task-scheduling-api"
    app: "task-scheduling-api"
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: "task-scheduling-api"
      app: "task-scheduling-api"
  template:
    metadata:
      labels:
        app.kubernetes.io/name: "task-scheduling-api"
        app: "task-scheduling-api"
    spec:
      containers:
        - name: task-scheduling-api
          image: "***.dkr.ecr.us-east-2.amazonaws.com/task-scheduling-api:0.0.43"
          imagePullPolicy: Always
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
          resources:
            requests:
              cpu: '0.1'
              memory: 1024M
          readinessProbe:
            tcpSocket:
              port: 80
            initialDelaySeconds: 30
            timeoutSeconds: 10
      imagePullSecrets:
        - name: docker-registry

image.png

查看 kubectl -n data-platform describe vpa

kubectl -n data-platform describe vpa                                                                                                    xiexiong@bogon
Name:         task-scheduling-api
Namespace:    data-platform
Labels:       app.kubernetes.io/managed-by=Helm
              helm.toolkit.fluxcd.io/name=data-platform
              helm.toolkit.fluxcd.io/namespace=data-platform
Annotations:  meta.helm.sh/release-name: data-platform
              meta.helm.sh/release-namespace: data-platform
API Version:  autoscaling.k8s.io/v1
Kind:         VerticalPodAutoscaler
Metadata:
  Creation Timestamp:  2023-06-27T08:44:30Z
  Generation:          9
  Managed Fields:
    API Version:  autoscaling.k8s.io/v1
    Fields Type:  FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          .:
          f:meta.helm.sh/release-name:
          f:meta.helm.sh/release-namespace:
        f:labels:
          .:
          f:app.kubernetes.io/managed-by:
          f:helm.toolkit.fluxcd.io/name:
          f:helm.toolkit.fluxcd.io/namespace:
      f:spec:
        .:
        f:resourcePolicy:
          .:
          f:containerPolicies:
        f:targetRef:
    Manager:      helm-controller
    Operation:    Update
    Time:         2023-06-27T08:44:30Z
    API Version:  autoscaling.k8s.io/v1
    Fields Type:  FieldsV1
    fieldsV1:
      f:status:
        .:
        f:conditions:
        f:recommendation:
          .:
          f:containerRecommendations:
    Manager:         recommender
    Operation:       Update
    Time:            2023-06-27T08:45:16Z
  Resource Version:  236431579
  UID:               60aeff7f-d87a-4eac-b08f-d3b625808a6d
Spec:
  Resource Policy:
    Container Policies:
      Container Name:  *
      Controlled Resources:
        cpu
        memory
      Max Allowed:
        Cpu:     2
        Memory:  5120M
      Min Allowed:
        Cpu:     0.1
        Memory:  1024M
  Target Ref:
    API Version:  apps/v1
    Kind:         Deployment
    Name:         task-scheduling-api
Status:
  Conditions:
    Last Transition Time:  2023-06-27T08:45:16Z
    Status:                True
    Type:                  RecommendationProvided
  Recommendation:
    Container Recommendations:
      Container Name:  task-scheduling-api
      Lower Bound:
        Cpu:     100m
        Memory:  1024M
      Target:
        Cpu:     100m
        Memory:  1024M
      Uncapped Target:
        Cpu:     49m
        Memory:  813749082
      Upper Bound:
        Cpu:     1884m
        Memory:  5120M
Events:          <none>