Ab压力测试模拟实现Kubernetes Pod水平自动伸缩

简介: kubernetes HPA资源对象学习

Horizontal Pod Autoscaler 可以根据 CPU 利用率自动伸缩 replication controllerdeploymentreplica set 中的Pod数量(除了 CPU 利用率)也可以 基于其他应程序提供的度量指标custom metrics

pod 自动缩放不适用于无法缩放的对象,比如 DaemonSets

Pod 水平自动伸缩特性由 Kubernetes API 资源和控制器实现。资源决定了控制器的行为。 控制器会周期性的获取平均 CPU 利用率,并与目标值相比较后来调整 replication controllerdeployment 中的副本数量。

通过实际的 Demo 开体验一下HPAcl基于资源实现的水平自动伸缩,为了演示 Horizontal Pod Autoscaler,我们将使用tomcat镜像作为测试对象,以下为配置 tomcat 的deployment的配置清单:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: dp-tomcat
  namespace: learning
spec:
  revisionHistoryLimit: 15
  replicas: 1
  selector:
    matchLabels:
      app: dp-tomcat
    matchExpressions:
      - key: app
        operator: In
        values: [dp-tomcat]
  template:
    metadata:
      labels:
        app: dp-tomcat
    spec:
      nodeSelector:
        kubernetes.io/hostname: dev-k8s-05.xsl.link
      containers:
        - name: dp-tomcat
          image: tomcat:9.0
          resources:
            limits:
              memory: "1024Mi"
              cpu: "500m"
          ports:
            - containerPort: 8080
              name: web

上面的 yaml 说明一下:

  • 运行了一个副本数为 3 的 deployment
  • 暴露出一个名为 nginxsvc 的 service
  • 指定了revisionHistoryLimit表示保留历史版本的个数
  • 因为要通过资源负载模拟 HPA 功能的场景,必须依赖 template 中对 pod 做资源限制
  • 集群环境需要安装 metrics-server,方便观察集群资源负载
➜  00-template.resources.yaml git:(master) ✗ (☸ kubernetes-admin@kubernetes:default) k get pods -n learning
NAME                               READY   STATUS    RESTARTS   AGE
abcontainer-58c67cfb87-g4j8q       1/1     Running   0          25d
dp-tomcat-5b4465b6bf-82llc         1/1     Running   0          125m
dp-tomcat-5b4465b6bf-zsttg         1/1     Running   0          126m
nginx-deployment-8558b4659-6dkmr   1/1     Running   0          17s
nginx-deployment-8558b4659-v8fzf   1/1     Running   0          17s
nginx-deployment-8558b4659-w5tlq   1/1     Running   0          8m56s

现在,dp-tomcat服务已经运行,我们将通过 定义一个 HPA 资源对象来创建 Horizontal Pod Autoscaler。 以下配置清单将创建一个Horizontal Pod Autoscaler用于控制我们上一步骤中创建的 deployment,使 Pod 的副本数量在维持在 1 到 10 之间。 大致来说,HPA 将通过增加或者减少 Pod 副本的数量(通过 Deployment )以保持所有 Pod 的平均 CPU 利用率在 50%以内

定义一个 HPA 资源对象

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: dp-tomcat
  namespace: learning
spec:
  minReplicas: 1
  maxReplicas: 10
  scaleTargetRef:
    kind: Deployment
    name: dp-tomcat
    apiVersion: apps/v1
  targetCPUUtilizationPercentage: 10

接下来,我们通过部署一个含有ab命令的httpd镜像来模拟负载

apiVersion: apps/v1
kind: Deployment
metadata:
  name: abcontainer
  namespace: abcontainer
spec:
  selector:
    matchLabels:
      app: abcontainer
  template:
    metadata:
      labels:
        app: abcontainer
    spec:
      containers:
      - name: abcontainer
        image: httpd
        ports:
        - containerPort: 80

在部署完成 httpd 之后,进入到 abcontainer 通过 ab 增加负载

k exec abcontainer-58c67cfb87-g4j8q -n learning -it -- bash

使用ab命令进行压力测试

ab -c 5000 -n 2000000 http://tomcat-svc:8080/

查看 HPA 资源变化

NAME        REFERENCE              TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
dp-tomcat   Deployment/dp-tomcat   0%/10%    1         10        1          16m
NAME        REFERENCE              TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
dp-tomcat   Deployment/dp-tomcat   98%/10%   1         10        1          18m
# 中断ab测试
NAME        REFERENCE              TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
dp-tomcat   Deployment/dp-tomcat   36%/10%   1         10        10         19m
# pods的变化
NAME                           READY   STATUS              RESTARTS   AGE
abcontainer-58c67cfb87-g4j8q   1/1     Running             0          25d
dp-tomcat-96b7b9f6f-54v84      0/1     Pending             0          13s
dp-tomcat-96b7b9f6f-55hsf      0/1     ContainerCreating   0          13s
dp-tomcat-96b7b9f6f-btbzr      0/1     ContainerCreating   0          13s
dp-tomcat-96b7b9f6f-dpppj      0/1     ContainerCreating   0          13s
dp-tomcat-96b7b9f6f-k4jqq      1/1     Running             0          12m
dp-tomcat-96b7b9f6f-mxd4f      1/1     Running             0          28s
dp-tomcat-96b7b9f6f-tjpj6      1/1     Running             0          28s
dp-tomcat-96b7b9f6f-zztqm      1/1     Running             0          28s

默认情况下,当ab模拟完成之后,当流量开始下降,5 分钟后 pod 的数量会慢慢恢复到 replicas 的值。

更多精彩文章

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
10月前
|
Kubernetes Docker 容器
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
398 25
|
Prometheus Kubernetes 监控
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
|
10月前
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
371 12
|
存储 Kubernetes Docker
【赵渝强老师】Kubernetes中Pod的基础容器
Pod 是 Kubernetes 中的基本单位,代表集群上运行的一个进程。它由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。基础容器负责维护 Pod 的网络空间,对用户透明。文中附有图片和视频讲解,详细介绍了 Pod 的组成结构及其在网络配置中的作用。
254 1
【赵渝强老师】Kubernetes中Pod的基础容器
|
Kubernetes 监控 Cloud Native
Kubernetes集群的高可用性与伸缩性实践
Kubernetes集群的高可用性与伸缩性实践
303 1
|
运维 Kubernetes Shell
【赵渝强老师】K8s中Pod的临时容器
Pod 是 Kubernetes 中的基本调度单位,由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。临时容器用于故障排查和性能诊断,不适用于构建应用程序。当 Pod 中的容器异常退出或容器镜像不包含调试工具时,临时容器非常有用。文中通过示例展示了如何使用 `kubectl debug` 命令创建临时容器进行调试。
261 1
|
3月前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
345 1
|
3月前
|
弹性计算 监控 调度
ACK One 注册集群云端节点池升级:IDC 集群一键接入云端 GPU 算力,接入效率提升 80%
ACK One注册集群节点池实现“一键接入”,免去手动编写脚本与GPU驱动安装,支持自动扩缩容与多场景调度,大幅提升K8s集群管理效率。
269 89
|
8月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
343 9
|
8月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
本文介绍如何利用阿里云的分布式云容器平台ACK One的多集群应用分发功能,结合云效CD能力,快速将单集群CD系统升级为多集群CD系统。通过增加分发策略(PropagationPolicy)和差异化策略(OverridePolicy),并修改单集群kubeconfig为舰队kubeconfig,可实现无损改造。该方案具备多地域多集群智能资源调度、重调度及故障迁移等能力,帮助用户提升业务效率与可靠性。

推荐镜像

更多