k8s学习--kubernetes服务自动伸缩之水平收缩(pod副本收缩)VPA策略应用案例

本文主要是介绍k8s学习--kubernetes服务自动伸缩之水平收缩(pod副本收缩)VPA策略应用案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 应用
    • 环境
      • 1.VPA应用案例 updateMode: "Off"
        • (1)创建应用实例
        • (2)创建vpa
      • 2.VPA应用案例 updateMode: "Auto"
        • (1)创建应用
      • (2)创建vpa
        • (3)执行压测


前言

有任何疑问或不懂的地方均可评论或私信,欢迎交流
关于VPA的详细解释
链接: VPA的详细解释

策略
在VPA中,updateMode 是一个重要的配置选项,它决定了VPA如何应用其提供的资源建议。根据不同的设置,VPA可以采取不同的策略来更新Pod的资源配置:

Off:
VPA不会应用任何资源推荐,只是收集和显示数据。


Auto
概述:
自动调整策略在无需重启 Pod 的情况下动态调整其资源请求。

特性:
动态调整: Pod 的资源请求在运行时逐步增加。

优点:
无需重启 Pod 即可调整资源,最小化中断。
提供更及时的资源调整,适合短周期和不稳定的负载。

缺点:
由于容器运行时资源的硬限制,可能无法完全满足新资源请求,导致资源不足。


Recreate
概述:
当资源需求变化时,使用重建策略重新启动 Pod 以调整资源请求。

特性:
重启调整:Pod 会被杀死并重新创建,以适应新的资源请求。

优点:
确保 Pod 能获取到新的资源请求,避免运行时的资源限制问题。
适合稳定负载且可以容忍短暂停机的应用。

缺点:
重启 Pod 会引起短暂的服务中断。
不适合要求高可用性且不能容忍重启的工作负载。


Initial
概述:
初始调整策略仅在 Pod 第一次创建时设置资源请求,不会对运行中的 Pod 进行调整。
特性:
静态调整:在 Pod 创建时基于历史数据设定初始资源请求。

优点:
避免了运行时调整带来的复杂性。
适合长期运行的负载,初始设置资源合理即可。

缺点:
无法调整已经运行的 Pod 的资源,若需求变化则需手动干预。

应用

环境

虚拟机

Ip主机名cpu内存硬盘
192.168.10.11master012cpu双核4G100G
192.168.10.12worker012cpu双核4G100G
192.168.10.13worker022cpu双核4G100G

版本 centos7.9
已部署k8s-1.27

1.VPA应用案例 updateMode: “Off”

(1)创建应用实例

VPA不会应用任何资源推荐,只是收集和显示数据。

vim 03-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginxname: nginxnamespace: default
spec:replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latest imagePullPolicy: IfNotPresentresources:requests:cpu: 100mmemory: 250Mi
---
apiVersion: v1
kind: Service
metadata:name: nginxnamespace: default
spec:type: NodePortports:- port: 80targetPort: 80selector:app: nginx
kubectl apply -f 03-nginx.yaml
kubectl get pods

在这里插入图片描述

kubectl get svc

在这里插入图片描述

(2)创建vpa

使用updateMode: "Off"模式,这种模式仅获取资源推荐,不更新Pod

 vim nginx-vpa.yaml
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:name: nginx-vpanamespace: default
spec:targetRef:apiVersion: "apps/v1"kind: Deploymentname: nginxupdatePolicy:updateMode: "Off"resourcePolicy:containerPolicies:- containerName: "nginx"minAllowed:cpu: "250m"memory: "100Mi"maxAllowed:cpu: "2000m"memory: "2048Mi"
kubectl apply -f nginx-vpa.yamlkubectl get vpa

稍等片刻
在这里插入图片描述

kubectl describe vpa nginx-vpa
Name:         nginx-vpa
Namespace:    default
Labels:       <none>
Annotations:  <none>
API Version:  autoscaling.k8s.io/v1
Kind:         VerticalPodAutoscaler
Metadata:Creation Timestamp:  2024-06-09T11:10:34ZGeneration:          1Resource Version:    19449UID:                 be19f937-fb0c-4c33-a559-4e5aa52043b8
Spec:Resource Policy:Container Policies:Container Name:  nginxMax Allowed:Cpu:     2000mMemory:  2048MiMin Allowed:Cpu:     250mMemory:  100MiTarget Ref:API Version:  apps/v1Kind:         DeploymentName:         nginxUpdate Policy:Update Mode:  Off
Status:Conditions:Last Transition Time:  2024-06-09T11:11:17ZStatus:                TrueType:                  RecommendationProvidedRecommendation:Container Recommendations:Container Name:  nginxLower Bound:Cpu:     250mMemory:  262144kTarget:Cpu:     250mMemory:  262144kUncapped Target:Cpu:     25mMemory:  262144kUpper Bound:Cpu:     1142mMemory:  1194357142
Events:          <none>

解释如下:
Recommendation::包含对Pod资源需求的推荐值。
Container Recommendations::针对特定容器的推荐值。
Container Name::容器名称。
Lower Bound::推荐的下限资源量。
Target::推荐的最优资源量。
Uncapped Target::如果没有上限约束,则为目标资源量。
Upper Bound::推荐的上限资源量。

kubectl get svc

在这里插入图片描述

yum -y install httpd-tools
ab -c 1000 -n 100000000 http://192.168.10.11:30478/

打开一个新终端

kubectl describe vpa nginx-vpa
Name:         nginx-vpa
Namespace:    default
Labels:       <none>
Annotations:  <none>
API Version:  autoscaling.k8s.io/v1
Kind:         VerticalPodAutoscaler
Metadata:Creation Timestamp:  2024-06-09T11:10:34ZGeneration:          1Resource Version:    20221UID:                 be19f937-fb0c-4c33-a559-4e5aa52043b8
Spec:Resource Policy:Container Policies:Container Name:  nginxMax Allowed:Cpu:     2000mMemory:  2048MiMin Allowed:Cpu:     250mMemory:  100MiTarget Ref:API Version:  apps/v1Kind:         DeploymentName:         nginxUpdate Policy:Update Mode:  Off
Status:Conditions:Last Transition Time:  2024-06-09T11:11:17ZStatus:                TrueType:                  RecommendationProvidedRecommendation:Container Recommendations:Container Name:  nginxLower Bound:Cpu:     250mMemory:  262144kTarget:Cpu:     250mMemory:  262144kUncapped Target:Cpu:     25mMemory:  262144kUpper Bound:Cpu:     802mMemory:  838810574
Events:          <none>

由于使用updateMode: “Off”,所以没有更新pod

kubectl get pods

在这里插入图片描述

2.VPA应用案例 updateMode: “Auto”

此模式当目前运行的pod的资源达不到VPA的推荐值,就会执行pod驱逐,重新部署新的足够资源的服务

(1)创建应用
vim 05-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginxname: nginxnamespace: default
spec:replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latestimagePullPolicy: IfNotPresentresources:requests:cpu: 100mmemory: 50Mi
---
apiVersion: v1
kind: Service
metadata:name: nginxnamespace: default
spec:type: NodePortports:- port: 80targetPort: 80selector:app: nginx
kubectl apply -f 05-nginx.yamlkubectl get pods
 kubectl apply -f 05-nginx.yamlkubectl get pods

在这里插入图片描述

(2)创建vpa

vim nginx-vpa-auto.yaml
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:name: nginx-vpa-autonamespace: default
spec:targetRef:apiVersion: "apps/v1"kind: Deploymentname: nginxupdatePolicy:updateMode: "Auto"resourcePolicy:containerPolicies:- containerName: "nginx"minAllowed:cpu: "250m"memory: "100Mi"maxAllowed:cpu: "2000m"memory: "2048Mi"
 kubectl apply -f nginx-vpa-auto.yaml
kubectl get vpa

在这里插入图片描述

(3)执行压测
kubectl get svc

在这里插入图片描述

ab -c 1000 -n 1000000000 http://192.168.10.11:31115/

打开另一个终端

 kubectl describe vpa nginx-vpa-auto
Name:         nginx-vpa-auto
Namespace:    default
Labels:       <none>
Annotations:  <none>
API Version:  autoscaling.k8s.io/v1
Kind:         VerticalPodAutoscaler
Metadata:Creation Timestamp:  2024-06-09T11:27:07ZGeneration:          1Resource Version:    21845UID:                 453b03aa-fba5-4bcd-aa66-f85e43a57521
Spec:Resource Policy:Container Policies:Container Name:  nginxMax Allowed:Cpu:     2000mMemory:  2048MiMin Allowed:Cpu:     250mMemory:  100MiTarget Ref:API Version:  apps/v1Kind:         DeploymentName:         nginxUpdate Policy:Update Mode:  Auto
Status:Conditions:Last Transition Time:  2024-06-09T11:27:17ZStatus:                TrueType:                  RecommendationProvidedRecommendation:Container Recommendations:Container Name:  nginxLower Bound:Cpu:     250mMemory:  262144kTarget:Cpu:     250mMemory:  262144kUncapped Target:Cpu:     25mMemory:  262144kUpper Bound:Cpu:     521mMemory:  545693548
Events:          <none>
 kubectl get event
LAST SEEN   TYPE      REASON                   OBJECT                        MESSAGE
38m         Normal    Scheduled                pod/nginx-59d7c8bd89-q27gc    Successfully assigned default/nginx-59d7c8bd89-q27gc to worker02
38m         Normal    Pulling                  pod/nginx-59d7c8bd89-q27gc    Pulling image "nginx:latest"
38m         Normal    Pulled                   pod/nginx-59d7c8bd89-q27gc    Successfully pulled image "nginx:latest" in 18.118818504s (18.118826419s including waiting)
38m         Normal    Created                  pod/nginx-59d7c8bd89-q27gc    Created container nginx
38m         Normal    Started                  pod/nginx-59d7c8bd89-q27gc    Started container nginx
11m         Normal    Killing                  pod/nginx-59d7c8bd89-q27gc    Stopping container nginx
38m         Normal    Scheduled                pod/nginx-59d7c8bd89-qb4p4    Successfully assigned default/nginx-59d7c8bd89-qb4p4 to worker01
38m         Normal    Pulling                  pod/nginx-59d7c8bd89-qb4p4    Pulling image "nginx:latest"
38m         Normal    Pulled                   pod/nginx-59d7c8bd89-qb4p4    Successfully pulled image "nginx:latest" in 17.842596583s (17.842603536s including waiting)
38m         Normal    Created                  pod/nginx-59d7c8bd89-qb4p4    Created container nginx
38m         Normal    Started                  pod/nginx-59d7c8bd89-qb4p4    Started container nginx
11m         Normal    Killing                  pod/nginx-59d7c8bd89-qb4p4    Stopping container nginx
38m         Normal    SuccessfulCreate         replicaset/nginx-59d7c8bd89   Created pod: nginx-59d7c8bd89-q27gc
38m         Normal    SuccessfulCreate         replicaset/nginx-59d7c8bd89   Created pod: nginx-59d7c8bd89-qb4p4
11m         Normal    Scheduled                pod/nginx-6f78fbb759-hcbc6    Successfully assigned default/nginx-6f78fbb759-hcbc6 to worker02
11m         Normal    Pulled                   pod/nginx-6f78fbb759-hcbc6    Container image "nginx:latest" already present on machine
11m         Normal    Created                  pod/nginx-6f78fbb759-hcbc6    Created container nginx
11m         Normal    Started                  pod/nginx-6f78fbb759-hcbc6    Started container nginx
10m         Normal    Killing                  pod/nginx-6f78fbb759-hcbc6    Stopping container nginx
9m51s       Normal    Scheduled                pod/nginx-6f78fbb759-jhf7h    Successfully assigned default/nginx-6f78fbb759-jhf7h to worker02
9m51s       Normal    Pulled                   pod/nginx-6f78fbb759-jhf7h    Container image "nginx:latest" already present on machine
9m51s       Normal    Created                  pod/nginx-6f78fbb759-jhf7h    Created container nginx
9m51s       Normal    Started                  pod/nginx-6f78fbb759-jhf7h    Started container nginx
6m31s       Normal    Killing                  pod/nginx-6f78fbb759-jhf7h    Stopping container nginx
6m31s       Normal    EvictedByVPA             pod/nginx-6f78fbb759-jhf7h    Pod was evicted by VPA Updater to apply resource recommendation.
6m30s       Normal    Scheduled                pod/nginx-6f78fbb759-mcppm    Successfully assigned default/nginx-6f78fbb759-mcppm to worker02
6m30s       Normal    Pulled                   pod/nginx-6f78fbb759-mcppm    Container image "nginx:latest" already present on machine
6m30s       Normal    Created                  pod/nginx-6f78fbb759-mcppm    Created container nginx
6m30s       Normal    Started                  pod/nginx-6f78fbb759-mcppm    Started container nginx
9m51s       Normal    Scheduled                pod/nginx-6f78fbb759-s4xzm    Successfully assigned default/nginx-6f78fbb759-s4xzm to worker01
9m51s       Normal    Pulled                   pod/nginx-6f78fbb759-s4xzm    Container image "nginx:latest" already present on machine
9m51s       Normal    Created                  pod/nginx-6f78fbb759-s4xzm    Created container nginx
9m51s       Normal    Started                  pod/nginx-6f78fbb759-s4xzm    Started container nginx
7m31s       Normal    EvictedByVPA             pod/nginx-6f78fbb759-s4xzm    Pod was evicted by VPA Updater to apply resource recommendation.
7m31s       Normal    Killing                  pod/nginx-6f78fbb759-s4xzm    Stopping container nginx
7m30s       Normal    Scheduled                pod/nginx-6f78fbb759-x986h    Successfully assigned default/nginx-6f78fbb759-x986h to worker01
7m30s       Normal    Pulled                   pod/nginx-6f78fbb759-x986h    Container image "nginx:latest" already present on machine
7m30s       Normal    Created                  pod/nginx-6f78fbb759-x986h    Created container nginx
7m30s       Normal    Started                  pod/nginx-6f78fbb759-x986h    Started container nginx
11m         Normal    Scheduled                pod/nginx-6f78fbb759-z4sxb    Successfully assigned default/nginx-6f78fbb759-z4sxb to worker01
11m         Normal    Pulled                   pod/nginx-6f78fbb759-z4sxb    Container image "nginx:latest" already present on machine
11m         Normal    Created                  pod/nginx-6f78fbb759-z4sxb    Created container nginx
11m         Normal    Started                  pod/nginx-6f78fbb759-z4sxb    Started container nginx
10m         Normal    Killing                  pod/nginx-6f78fbb759-z4sxb    Stopping container nginx
11m         Normal    SuccessfulCreate         replicaset/nginx-6f78fbb759   Created pod: nginx-6f78fbb759-hcbc6
11m         Normal    SuccessfulCreate         replicaset/nginx-6f78fbb759   Created pod: nginx-6f78fbb759-z4sxb
9m52s       Normal    SuccessfulCreate         replicaset/nginx-6f78fbb759   Created pod: nginx-6f78fbb759-jhf7h
9m52s       Normal    SuccessfulCreate         replicaset/nginx-6f78fbb759   Created pod: nginx-6f78fbb759-s4xzm
7m31s       Normal    SuccessfulCreate         replicaset/nginx-6f78fbb759   Created pod: nginx-6f78fbb759-x986h
6m31s       Normal    SuccessfulCreate         replicaset/nginx-6f78fbb759   Created pod: nginx-6f78fbb759-mcppm
38m         Normal    ScalingReplicaSet        deployment/nginx              Scaled up replica set nginx-59d7c8bd89 to 2
11m         Normal    ScalingReplicaSet        deployment/nginx              Scaled up replica set nginx-6f78fbb759 to 2
10m         Warning   FailedToUpdateEndpoint   endpoints/nginx               Failed to update endpoint default/nginx: Operation cannot be fulfilled on endpoints "nginx": the object has been modified; please apply your changes to the latest version and try again
9m52s       Normal    ScalingReplicaSet        deployment/nginx              Scaled up replica set nginx-6f78fbb759 to 2

从输出信息可以了解到,vpa执行了EvictedByVPA,自动停掉了nginx,然后使用 VPA推荐的资源启动了新的nginx,我们查看下nginx的pod可以得到确认

kubectl describe pods nginx-6f78fbb759-mcppm
Name:             nginx-6f78fbb759-mcppm
Namespace:        default
Priority:         0
Service Account:  default
Node:             worker02/192.168.10.13
Start Time:       Sun, 09 Jun 2024 19:29:09 +0800
Labels:           app=nginxpod-template-hash=6f78fbb759
Annotations:      cni.projectcalico.org/containerID: 145e1f8509982da00e61eb180bb9f3b52e527bc94d8657237d340fd9bf01475acni.projectcalico.org/podIP: 10.244.30.72/32cni.projectcalico.org/podIPs: 10.244.30.72/32vpaObservedContainers: nginxvpaUpdates: Pod resources updated by nginx-vpa-auto: container 0: cpu request, memory request
Status:           Running
IP:               10.244.30.72
IPs:IP:           10.244.30.72
Controlled By:  ReplicaSet/nginx-6f78fbb759
Containers:nginx:Container ID:   docker://97f865221289a48d042dfd039b2eb33876c2d08a89c2f7863fd7e42b5f7f8018Image:          nginx:latestImage ID:       docker-pullable://nginx@sha256:0f04e4f646a3f14bf31d8bc8d885b6c951fdcf42589d06845f64d18aec6a3c4dPort:           <none>Host Port:      <none>State:          RunningStarted:      Sun, 09 Jun 2024 19:29:10 +0800Ready:          TrueRestart Count:  0Requests:cpu:        250mmemory:     262144kEnvironment:  <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-gfzhm (ro)
Conditions:Type              StatusInitialized       True Ready             True ContainersReady   True PodScheduled      True 
Volumes:kube-api-access-gfzhm:Type:                    Projected (a volume that contains injected data from multiple sources)TokenExpirationSeconds:  3607ConfigMapName:           kube-root-ca.crtConfigMapOptional:       <nil>DownwardAPI:             true
QoS Class:                   Burstable
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:Type    Reason     Age    From               Message----    ------     ----   ----               -------Normal  Scheduled  8m56s  default-scheduler  Successfully assigned default/nginx-6f78fbb759-mcppm to worker02Normal  Pulled     8m56s  kubelet            Container image "nginx:latest" already present on machineNormal  Created    8m56s  kubelet            Created container nginxNormal  Started    8m56s  kubelet            Started container nginx

随着服务的负载的变化,VPA的推荐值也会不断变化。当目前运行的pod的资源达不到VPA的推荐值,就会执行pod驱逐,重新部署新的足够资源的服务。

这篇关于k8s学习--kubernetes服务自动伸缩之水平收缩(pod副本收缩)VPA策略应用案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1048158

相关文章

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

六个案例搞懂mysql间隙锁

《六个案例搞懂mysql间隙锁》MySQL中的间隙是指索引中两个索引键之间的空间,间隙锁用于防止范围查询期间的幻读,本文主要介绍了六个案例搞懂mysql间隙锁,具有一定的参考价值,感兴趣的可以了解一下... 目录概念解释间隙锁详解间隙锁触发条件间隙锁加锁规则案例演示案例一:唯一索引等值锁定存在的数据案例二:

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

Python使用Tkinter打造一个完整的桌面应用

《Python使用Tkinter打造一个完整的桌面应用》在Python生态中,Tkinter就像一把瑞士军刀,它没有花哨的特效,却能快速搭建出实用的图形界面,作为Python自带的标准库,无需安装即可... 目录一、界面搭建:像搭积木一样组合控件二、菜单系统:给应用装上“控制中枢”三、事件驱动:让界面“活”

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio