Kubernetes实战(十五)-Pod垂直自动伸缩VPA实战

1 介绍

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

VPA不会改变Pod的资源limits值,只调整pod的request 值。

使用 VPA 的意义:

  • Pod 资源用其所需,提升集群节点使用效率;
  • 不必运行基准测试任务来确定 CPU 和内存请求的合适值;
  • VPA可以随时调整CPU和内存请求,无需人为操作,因此可以减少维护时间。

VPA目前还没有生产就绪,在使用之前需要了解资源调节对应用的影响。 

2 VPA原理

2.1 工作流

首先 Recommender 会根据应用当前的资源使用情况以及历史的资源使用情况,计算接下来可能的资源使用阈值,如果计算出的值和当前值不一致则会给出一条资源调整建议。

然后 Updater 则根据这些建议进行调整,具体调整方法为:

  • 1)Updater 根据建议发现需要调整,然后调用 api 驱逐 Pod
  • 2)Pod 被驱逐后就会重建,然后再重建过程中VPA Admission Controller 会进行拦截,根据 Recommend 来调整 Pod 的资源请求量
  • 3)最终 Pod 重建出来就是按照推荐资源请求量重建的了。

根据上述流程可知,调整资源请求量需要重建 Pod,这是一个破坏性的操作,所以 VPA 还没有生产就绪。

2.2 VPA架构图

VPA 主要包括两个组件:

  • 1)VPA Controller
    • Recommendr:给出 pod 资源调整建议
    • Updater:对比建议值和当前值,不一致时驱逐 Pod
  • 2)VPA Admission Controller
    • Pod 重建时将 Pod 的资源请求量修改为推荐值 

2.3 Recommenderd 设计理念

推荐模型(MVP) 假设内存和CPU利用率是独立的随机变量,其分布等于过去 N 天观察到的变量(推荐值为 N=8 以捕获每周峰值)。

  • 对于 CPU,目标是将容器使用率超过请求的高百分比(例如95%)时的时间部分保持在某个阈值(例如1%的时间)以下。

    • 在此模型中,CPU 使用率 被定义为在短时间间隔内测量的平均使用率。测量间隔越短,针对尖峰、延迟敏感的工作负载的建议质量就越高。
    • 最小合理分辨率为1/min,推荐为1/sec
  • 对于内存,目标是将特定时间窗口内容器使用率超过请求的概率保持在某个阈值以下(例如,24小时内低于1%)。

    • 窗口必须很长(≥24小时)以确保由 OOM 引起的驱逐不会明显影响(a)服务应用程序的可用性(b)批处理计算的进度(更高级的模型可以允许用户指定SLO来控制它)。

2.4 VPA优缺点

2.4.1 优点

  • Pod 资源用其所需,所以集群节点使用效率高。
  • Pod 会被安排到具有适当可用资源的节点上。
  • 不必运行基准测试任务来确定 CPU 和内存请求的合适值。
  • VPA 可以随时调整 CPU 和内存请求,无需人为操作,因此可以减少维护时间。

2.4.2 缺点

  • VPA的成熟度还不足,更新正在运行的 Pod 资源配置是 VPA 的一项试验性功能,会导致 Pod 的重建和重启,而且有可能被调度到其他的节点上。

  • VPA 不会驱逐没有在副本控制器管理下的 Pod。目前 VPA 不能和监控 CPU 和内存度量的Horizontal Pod Autoscaler (HPA) 同时运行,除非 HPA 只监控其他定制化的或者外部的资源度量。

  • VPA 使用 admission webhook 作为其准入控制器。如果集群中有其他的 admission webhook,需要确保它们不会与 VPA 发生冲突。准入控制器的执行顺序定义在 APIServer 的配置参数中。

  • VPA 会处理出现的绝大多数 OOM 的事件,但不保证所有的场景下都有效。

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

  • VPA 对 Pod 资源 requests 的修改值可能超过实际的资源上限,例如节点资源上限、空闲资源或资源配额,从而造成 Pod 处于 Pending 状态无法被调度。

    • 同时使用集群自动伸缩(ClusterAutoscaler) 可以一定程度上解决这个问题。
  • 多个 VPA 同时匹配同一个 Pod 会造成未定义的行为。

2.4.3 限制

  • 不能与HPA(Horizontal Pod Autoscaler )一起使用
  • Pod使用有限制,比如使用副本控制器的工作负载,例如属于Deployment或者StatefulSet

2.5 In-Place Update of Pod Resources

当前 VPA 需要重建 Pod 才能调整 resource.requst,因此局限性会比较大,毕竟频繁重建 Pod 可能会对业务稳定性有影响。

社区在 2019 年就有人提出In-Place Update of Pod Resources 功能,最新进展见 #1287,根据 issue 中的描述,最快在 k8s v1.26 版本就能完成 Alpha 版本。

该功能实现后对 VPA 来说是一个巨大的优化,毕竟一直破坏性的重建 Pod 风险还是有的。

3 VPA测试验证

3.1 部署metrics-server

3.1.1 下载部署清单文件

$ wget  https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.7/components.yaml

3.1.2 修改components.yaml文件

$ cat components.yaml 
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: system:aggregated-metrics-reader
  labels:
    rbac.authorization.k8s.io/aggregate-to-view: "true"
    rbac.authorization.k8s.io/aggregate-to-edit: "true"
    rbac.authorization.k8s.io/aggregate-to-admin: "true"
rules:
- apiGroups: ["metrics.k8s.io"]
  resources: ["pods", "nodes"]
  verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: metrics-server:system:auth-delegator
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:auth-delegator
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: metrics-server-auth-reader
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: extension-apiserver-authentication-reader
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  name: v1beta1.metrics.k8s.io
spec:
  service:
    name: metrics-server
    namespace: kube-system
  group: metrics.k8s.io
  version: v1beta1
  insecureSkipTLSVerify: true
  groupPriorityMinimum: 100
  versionPriority: 100
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: metrics-server
  namespace: kube-system
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: metrics-server
  namespace: kube-system
  labels:
    k8s-app: metrics-server
spec:
  selector:
    matchLabels:
      k8s-app: metrics-server
  template:
    metadata:
      name: metrics-server
      labels:
        k8s-app: metrics-server
    spec:
      serviceAccountName: metrics-server
      volumes:
      # mount in tmp so we can safely use from-scratch images and/or read-only containers
      - name: tmp-dir
        emptyDir: {}
      containers:
      - name: metrics-server
        image: registry.aliyuncs.com/google_containers/metrics-server:v0.3.7
        imagePullPolicy: IfNotPresent
        args:
          - --cert-dir=/tmp
          - --secure-port=4443
          - /metrics-server
          - --kubelet-insecure-tls
          - --kubelet-preferred-address-types=InternalIP
        ports:
        - name: main-port
          containerPort: 4443
          protocol: TCP
        securityContext:
          readOnlyRootFilesystem: true
          runAsNonRoot: true
          runAsUser: 1000
        volumeMounts:
        - name: tmp-dir
          mountPath: /tmp
      nodeSelector:
        kubernetes.io/os: linux
---
apiVersion: v1
kind: Service
metadata:
  name: metrics-server
  namespace: kube-system
  labels:
    kubernetes.io/name: "Metrics-server"
    kubernetes.io/cluster-service: "true"
spec:
  selector:
    k8s-app: metrics-server
  ports:
  - port: 443
    protocol: TCP
    targetPort: main-port
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: system:metrics-server
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - nodes
  - nodes/stats
  - namespaces
  - configmaps
  verbs:
  - get
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: system:metrics-server
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:metrics-server
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
  • 修改了镜像地址为内部地址:registry.aliyuncs.com/google_containers/metrics-server:v0.3.7
  • 修改了metrics-server启动参数args

3.1.3 执行部署

$ kubectl  apply -f components.yaml

3.1.4 验证

$ kubectl  get po -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-5d4b78db86-4wpbx   1/1     Running   0          24d
calico-kube-controllers-5d4b78db86-cdcx6   1/1     Running   0          23d
calico-kube-controllers-5d4b78db86-gmvg5   1/1     Running   0          24d
calico-kube-controllers-5d4b78db86-qfmzm   1/1     Running   0          24d
calico-kube-controllers-5d4b78db86-srrxj   1/1     Running   0          24d
calico-node-f5s6w                          1/1     Running   1          24d
calico-node-f6pmk                          1/1     Running   0          24d
calico-node-jk7zc                          1/1     Running   0          24d
calico-node-p2c7d                          1/1     Running   7          24d
calico-node-v8z5x                          1/1     Running   0          24d
coredns-59d64cd4d4-85h7g                   1/1     Running   0          24d
coredns-59d64cd4d4-tll9s                   1/1     Running   0          23d
coredns-59d64cd4d4-zr4hd                   1/1     Running   0          24d
etcd-ops-master-1                          1/1     Running   8          24d
etcd-ops-master-2                          1/1     Running   3          24d
etcd-ops-master-3                          1/1     Running   0          24d
kube-apiserver-ops-master-1                1/1     Running   9          24d
kube-apiserver-ops-master-2                1/1     Running   8          24d
kube-apiserver-ops-master-3                1/1     Running   0          24d
kube-controller-manager-ops-master-1       1/1     Running   9          24d
kube-controller-manager-ops-master-2       1/1     Running   3          24d
kube-controller-manager-ops-master-3       1/1     Running   1          24d
kube-proxy-cxjz8                           1/1     Running   0          24d
kube-proxy-dhjxj                           1/1     Running   8          24d
kube-proxy-rm64j                           1/1     Running   0          24d
kube-proxy-xg6bp                           1/1     Running   0          24d
kube-proxy-zcvzs                           1/1     Running   1          24d
kube-scheduler-ops-master-1                1/1     Running   9          24d
kube-scheduler-ops-master-2                1/1     Running   4          24d
kube-scheduler-ops-master-3                1/1     Running   1          24d
metrics-server-54cc454bdd-ds4zp            1/1     Running   0          34s

$ kubectl  top nodes
W0110 18:58:33.909569   14156 top_node.go:119] Using json format to get metrics. Next release will switch to protocol-buffers, switch early by passing --use-protocol-buffers flag
NAME           CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
ops-master-1   82m          1%     1212Mi          8%        
ops-master-2   98m          1%     2974Mi          19%       
ops-master-3   106m         1%     2666Mi          17%       
ops-worker-1   55m          0%     2014Mi          13%       
ops-worker-2   59m          0%     2011Mi          13%     

3.2 部署vertical-pod-autoscaler

VPA 与 k8s 版本兼容性如下:

VPA versionKubernetes version
0.121.25+
0.111.22 - 1.24
0.101.22+
0.91.16+

当前使用的是 k8s 1.23.6 版本,根据 VPA 兼容性,这个版本的 k8s 需要使用 VPA 0.11 版本。

3.2.1 克隆autoscaler项目

$ git clone -b vpa-release-0.11 https://github.com/kubernetes/autoscaler.git

3.2.2 替换镜像

将gcr仓库改成国内仓库。

admission-controller-deployment.yaml文件将us.gcr.io/k8s-artifacts-prod/autoscaling/vpa-admission-controller:0.8.0改为scofield/vpa-admission-controller:0.8.0
recommender-deployment.yaml文件将us.gcr.io/k8s-artifacts-prod/autoscaling/vpa-recommender:0.8.0改为image: scofield/vpa-recommender:0.8.0
updater-deployment.yaml文件将us.gcr.io/k8s-artifacts-prod/autoscaling/vpa-updater:0.8.0改为scofield/vpa-updater:0.8.0

3.2.3 部署

$ cd autoscaler/vertical-pod-autoscaler
$ ./hack/vpa-up.sh
customresourcedefinition.apiextensions.k8s.io/verticalpodautoscalers.autoscaling.k8s.io created
customresourcedefinition.apiextensions.k8s.io/verticalpodautoscalercheckpoints.autoscaling.k8s.io created
clusterrole.rbac.authorization.k8s.io/system:metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:vpa-actor created
clusterrole.rbac.authorization.k8s.io/system:vpa-checkpoint-actor created
clusterrole.rbac.authorization.k8s.io/system:evictioner created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-reader created
clusterrolebinding.rbac.authorization.k8s.io/system:vpa-actor created
clusterrolebinding.rbac.authorization.k8s.io/system:vpa-checkpoint-actor created
clusterrole.rbac.authorization.k8s.io/system:vpa-target-reader created
clusterrolebinding.rbac.authorization.k8s.io/system:vpa-target-reader-binding created
clusterrolebinding.rbac.authorization.k8s.io/system:vpa-evictionter-binding created
serviceaccount/vpa-admission-controller created
clusterrole.rbac.authorization.k8s.io/system:vpa-admission-controller created
clusterrolebinding.rbac.authorization.k8s.io/system:vpa-admission-controller created
clusterrole.rbac.authorization.k8s.io/system:vpa-status-reader created
clusterrolebinding.rbac.authorization.k8s.io/system:vpa-status-reader-binding created
serviceaccount/vpa-updater created
deployment.apps/vpa-updater created
serviceaccount/vpa-recommender created
deployment.apps/vpa-recommender created
Generating certs for the VPA Admission Controller in /tmp/vpa-certs.
Generating RSA private key, 2048 bit long modulus (2 primes)
............................................................................+++++
.+++++
e is 65537 (0x010001)
Generating RSA private key, 2048 bit long modulus (2 primes)
............+++++
...........................................................................+++++
e is 65537 (0x010001)
Signature ok
subject=CN = vpa-webhook.kube-system.svc
Getting CA Private Key
Uploading certs to the cluster.
secret/vpa-tls-certs created
Deleting /tmp/vpa-certs.
deployment.apps/vpa-admission-controller created
service/vpa-webhook created

这里如果出现错误: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

需要升级openssl的版本解决,openssl升级见:OpenSSL升级版本-CSDN博客

升级完openssl后执行以下操作:

$ vertical-pod-autoscaler/pkg/admission-controller/gencerts.sh

3.2.4 查看部署结果

可以看到metrics-server和vpa都已经正常运行了。

$ kubectl get po -n kube-system | grep -E "metrics-server|vpa"
metrics-server-5b58f4df77-f7nks                          1/1     Running   0          35d
vpa-admission-controller-7ff888c959-tvtmk                1/1     Running   0          104m
vpa-recommender-74f69c56cb-zmzwg                         1/1     Running   0          104m
vpa-updater-79b88f9c55-m4xx5                             1/1     Running   0          103m

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/309015.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32 使用 DS18B20 温度传感器实现环境温度监测

为了实现环境温度监测系统,我们可以利用STM32微控制器和DS18B20数字温度传感器。在本文中,我们将介绍如何通过STM32微控制器读取DS18B20传感器的温度数据,并展示一个简单的示例代码。 1. 系统概述 环境温度监测系统旨在使用DS18B20数字温度…

PolarDB DDL MDL

PolarDB DDL MDL 转载数据库内核那些事|深度解析PolarDB DDL锁的优化和演进 - 知乎 (zhihu.com) 概述 Request lock问题 MySQL 拿锁 即乐观等待的方式来拿锁MDL-X。问题:会导致DDL后续DML的阻塞。 第三方插件 pt-osc / gh-ost 采用copying method&…

微机原理常考简答题总结

一,8086和8088这两个微处理器在结构上有什么异同? (1)共同点:内部均由EU、BIU组成,结构基本相同;寄存器等功能部件均为16位;内部数据通路为16位;指令系统相同。 &#x…

搜维尔科技:【简报】元宇宙数字人赛道,2022年金奖《金魚姬》赏析!

一名网络直播主名叫琉璃,在即将展开她日常进行的每日准时直播前,肚子极为不舒服,突然很想上厕所,由于时间紧迫,导致琉璃需要在厕所里面完成直播!为了掩饰自己所在的处境,她决定运用自己设计的虚…

vivado 工程管理

管理项目 打开项目 当项目打开时,Vivado IDE会从项目已关闭。项目状态包括当前源文件顺序、已禁用和已启用 源文件、活动约束文件和目标约束文件,以及合成、模拟和实现运行。要打开项目,请使用以下方法之一: •在“入门”页面…

聚道云软件连接器助力某家居公司实现付款流程自动化

客户介绍: 某家居公司是一家集家居研发、生产、销售于一体的综合性家居企业。公司业务遍布全国多个城市,拥有庞大的供应商网络和采购需求。 添加图片注释,不超过 140 字(可选) 客户痛点: 付款申请单需要…

linux --proc文件夹学习笔记

内容在飞书文档: Docshttps://r0dhfl3ujy9.feishu.cn/docx/Xe2wd23MToSmGrxUm9kcVHrPn7g?fromfrom_copylink

mercury靶机

文章妙语 不与伪君子争名,不与真小人争利,不与执拗人争理,不与匹夫争勇,不与酸儒争才。不与蠢人施恩 一、信息收集 主机探测 端口探测 探测主机详细版本信息 8080开了http服务 目录扫描 robots.txt目录下什么也没有 二&#xff0…

lvs+keepalived+nginx双主模式双主热备实现负载均衡

目录 一、原理 二、真实服务器nginx配置 三、lvs的keepalived配置 3.1 配置文件 3.2 开启keepalived服务 四、测试 4.1 测试访问VIP 4.2 模拟lvs01宕机 主机名IPnginx0111.0.1.31nginx0111.0.1.31lvs0111.0.1.33lvs0211.0.1.34VIP111.0.1.29VIP211.0.1.30 一、原理 lvskeepal…

推理证明-条件等价式、德摩根律、双条件

对于命题逻辑部分来说,只需要掌握命题的符号化,以及如何进行推理证明即可。足矣。其他的都是一些基本的概念,扫一遍,记住即可。 对于什么是命题:陈述句、能判断、真值唯一 进行推理证明,我们需要记住以下…

查看服务器的yum 源

1、cd /etc/yum.repos.d 2、编辑 CentOS-Stream-Sources.repo 3、 查看里面的yum源地址 4、更新yum源,执行下面指令 yum clean all # 清除系统所有的yum缓存 yum makeacache # 生成新的yum缓存 yum repolist

TCN 时序卷积网络 (temporal convolutional network)【因果卷积、空洞卷积】

文章目录 TCN 时序卷积 (temporal convolutional network)1.因果卷积2.膨胀卷积 TCN 时序卷积 (temporal convolutional network) 它由膨胀卷积核因果卷积两种卷积构成。 如图:左边是膨胀因果卷积,右边是…

Python从入门到网络爬虫(23个Python开源项目)

前言 随着互联网的快速发展,大量的信息被不断地产生和积累,这也使得网络爬虫变得越来越重要。而Python作为一门高效、易用的编程语言,被广泛地应用于网络爬虫领域。本文将从多个角度分析Python开源爬虫项目的优缺点、应用场景以及未来发展方…

构建安全可靠的系统:第十六章到第二十章

第四部分:维护系统 原文:Part IV. Maintaining Systems 译者:飞龙 协议:CC BY-NC-SA 4.0 准备应对不舒适情况的组织有更好的机会处理关键事件。 尽管不可能为可能扰乱您组织的每种情况制定计划,但作为综合灾难规划策略…

作业--day44

完善对话框,点击登录对话框,如果账号和密码匹配,则弹出信息对话框,给出提示”登录成功“,提供一个Ok按钮,用户点击Ok后,关闭登录界面,跳转到其他界面。如果账号和密码不匹配&#xf…

C语言结构体的字节对齐

C语言结构体的字节对齐 什么是字节对齐 首先来看下面的程序&#xff1a; #include <stdio.h>typedef struct n1{int a;char b;char c; } N_stru1;typedef struct n2{char b;int a;char c; } N_stru2;int main() {N_stru1 n1;N_stru2 n2;printf("%d\n", siz…

MySQL从0到1全教程【1】MySQL数据库的基本概念以及MySQL8.0版本的部署

1 MySQL数据库的相关概念 1.1 数据库中的专业术语 1.1.1 数据库 (DB) 数据库是指:保存有组织的数据的容器(通常是一个文数据库 (database)件或一组文件)。 1.1.2 数据库管理系统 (DBMS) 数据库管理系统(DBMS)又称为数据库软件(产品)&#xff0c;用于管理DB中的数据 注意:…

【MySQL】视图,15道常见面试题---含考核思路详细讲解

目录 一 视图 1.1视图是什么 1.2 创建视图 1.3 查看视图(两种) 1.4 修改视图(两种) 1.5 删除视图 二 外连接&内连接&子查询介绍 2.1 外连接 2.2 内连接 2.3 子查询 三 外连接&内连接&子查询案例 3.1 了解表结构与数据 3.2 15道常见面试题 四 思…

道路拆除的题解

目录 原题描述&#xff1a; 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 样例 #2 样例输入 #2 样例输出 #2 提示 题目大意&#xff1a; 主要思路&#xff1a; 至于dis怎么求&#xff1f; 代码code&#xff1a; 原题描述&#xff1a; 题目描述 …

盖子的c++小课堂——第二十四讲:差分数组

前言 嗨嗨嗨&#xff0c;这里是盖子的小课堂哟&#xff0c;这次更新主要是因为快放假了&#xff0c;时间多了&#xff0c;好嘞&#xff0c;废话不多说&#xff0c;点赞评论拿来吧你~ 差分数组 一维差分数组 假设给你一个数组 nums &#xff0c;先对区间 [a,b] 中每个元素加…