Azure Kubernetes 水平自动扩充Pod

当我们将应用部署到AKS中以pod的形式对外提供服务时,为了确保用户可以获得良好的使用体验,我们需要关注如下两种情况:

  • POD因为不明原有挂掉,导致服务不可用
  • 当出现大量用户访问时,Pod在高负荷的情况下能否支撑我们的应用

对于Pod的高可用性我们可以使用AKS的deployment控制器来确保Pod可以持续对外提供服务,但是对于面临大量用户访问时,我们就需要扩展我们的资源来满足业务需求。
前面的文章中给大家介绍了手动扩展pod来满足业务的扩展需求,但是相信大家都已经意识到了如果我们人工监控pods,人工进行调整副本那么这个工作量无疑是巨大的,但kubernetes已经有了相应的机制来应对了。这就是我们今天要为大家介绍的水平自动扩充POD(HPA)
HPA全称Horizontal Pod Autoscaler控制器工作流程

HPA的工作流程如下:

  • 创建HPA资源对象,关联对应资源例如Deployment,设定目标CPU使用率阈值,最大,最小replica数量。
    前提:pod一定要设置资源限制,参数request,HPA才会工作。
  • HPA控制器每隔15秒钟(可以通过设置controller manager的–horizontal-pod-autoscaler-sync-period参数设定,默认15s)通过观测metrics值获取资源使用信息
  • HPA控制器将获取资源使用信息与HPA设定值进行对比,计算出需要调整的副本数量
  • 根据计算结果调整副本数量,使得单个POD的CPU使用率尽量逼近期望值,但不能照顾设定的最大,最小值。
  • 以上2,3,4周期循环

说了这么多,下面我们来看下如何配置HPA:
在配置HPA之前,我们需要先了解Node节点的配置情况
检查与配置resource limit
使用kubectl get nodes命令检查node信息(node名称)

使用命令 kubectl describe nodes NODE_NAME 确认 Node 资源配置的状态, 因为我们之前没有配置Resource quata,因此我们需要先设定好 Resource 限制:

打开我们之前创建的yaml文件,修改 Resources 配置, 其中 CPU 配置 Container 只使用 1 个 CPU 单元, Request 限制使用 0.5 个 CPU 单元:

修改完成以后使用kubectl apply -f FILE_NAME重新部署对应POD

设置水平自动扩充HPA
使用命令 kubectl autoscale deployment nginx--cpu-percent=1 --min=1 --max=10 将自动扩充设定为 CPU-percent 设定为1%, 并且将 minimum replica 数设为 1, maximum replica 数设为 10.

配置完成以后我们使用webbench来对我们部署的NGINX网站进行压力测试:

使用命令 kubectl get hpa 观察水平自动扩充状态, 请注意 Target 中有两个数字, 是 Current/Target CPU 使用率

使用命令 kubectl get deployment 观察 deployment 数量有无增加

使用命令 kubectl get pod 观察 pod 数量有无增加, 并且注意状态, 如果 > 1 表示水平自动扩充 (hpa) 已经成功设置且生效了

清除资源
测试完成以后,我们可以使用kubect delete -f FILE_NAME 来删除对应的deployment资源:

使用kubectl delete hpa nginx来删除hpa资源:

原文地址:https://blog.51cto.com/wuyvzhang/2465776

时间: 2024-10-05 07:14:01

Azure Kubernetes 水平自动扩充Pod的相关文章

Kubernetes高级进阶之pod的自动扩容/缩容

目录:实践1:基于autoscaling cpu指标的扩容与缩容实践2:基于prometheus自定义指标QPS的扩容与缩容 Pod自动扩容/缩容(HPA) Horizontal Pod Autoscaler(HPA,Pod水平自动伸缩),根据资源利用率或者自定义指标自动调整replication controller, deployment 或 replica set,实现部署的自动扩展和缩减,让部署的规模接近于实际服务的负载.HPA不适于无法缩放的对象,例如DaemonSet. HPA主要是

kubernetes云平台管理实战:HPA水平自动伸缩(十一)

一.自动伸缩 1.启动 [root@k8s-master ~]# kubectl autoscale deployment nginx-deployment --max=8 --min=2 --cpu-percent=80 deployment "nginx-deployment" autoscaled 2.查看创建 [root@k8s-master ~]# kubectl get all NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE de

Kubernetes之深入了解Pod

1.yaml格式的Pod配置文件内容及注解 深入Pod之前,首先我们来了解下Pod的yaml整体文件内容及功能注解. 如下: # yaml格式的pod定义文件完整内容: apiVersion: v1 #必选,版本号,例如v1 kind: Pod #必选,Pod metadata: #必选,元数据 name: string #必选,Pod名称 namespace: string #必选,Pod所属的命名空间 labels: #自定义标签 - name: string #自定义标签名字 annota

kubernetes集群发布 Pod 端口

kubernetes集群发布Pod 端口 创建测试环境 vi nginx.yaml apiVersion: apps/v1 kind: Deployment metadata: name: my-nginx spec: selector: matchLabels: run: my-nginx replicas: 2 template: metadata: labels: run: my-nginx spec: containers: - name: my-nginx image: nginx p

Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片

Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片 自定义ADPager 自定义水平滚动的ScrollView效仿ViewPager 当遇到要在ViewPager中添加多张网络请求图片的情况下,不能进行复用,导致每次都要重新去求情已经请求过的数据致使流量数据过大 自定义的数据结构解决了这个问题,固定传递的图片数据之后进行统一请求,完成后进行页面切换数据复用 代码中涉及网络请求是用的Volley网络请求框架 PicCarousel是网络数据请求的U

JavaSE8基础 StringBuffer append 向缓冲区中变量的末尾追加字符串与缓冲区容量的自动扩充

os :windows7 x64    jdk:jdk-8u131-windows-x64    ide:Eclipse Oxygen Release (4.7.0)        code: package jizuiku1; public class Demo000 { public static void main(String[] args) { StringBuffer sb = new StringBuffer(); System.out.println("缓冲容的容量是:"

ASP.NET Core在Azure Kubernetes Service中的部署和管理

目录 ASP.NET Core在Azure Kubernetes Service中的部署和管理 目标 准备工作 注册 Azure 账户 AKS文档 进入Azure门户(控制台) 安装 Azure Cli 安装 Docker 进入正题 资源组 创建资源组 删除资源组 容器注册表 Azure Container Register (ACR) 创建 ACR 登录 ACR 服务主体 service principle 创建服务主体 给服务主体配置 ACR 的pull权限 K8s服务集群 Azure Ku

设置Kubernetes master可调度pod

默认配置下Kubernetes不会将Pod调度到Master节点.如果希望将k8s-master也当作Node使用,可以执行如下命令: taint命令说明: taint          Update the taints on one or more nodes kubectl taint node node01 node-role.kubernetes.io/master- 其中k8s-master是主机节点hostname如果要恢复Master Only状态,执行如下命令: kubectl

Kubernetes中强制删除Pod、namespace

Kubernetes中强制删除Pod.namespace 解决方法 可使用kubectl中的强制删除命令 # 删除POD kubectl delete pod PODNAME --force --grace-period=0 # 删除NAMESPACE kubectl delete namespace NAMESPACENAME --force --grace-period=0 若以上方法无法删除,可使用第二种方法,直接从ETCD中删除源数据 # 删除default namespace下的pod