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 的值。

更多精彩文章

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
18天前
|
Kubernetes 监控 Cloud Native
Kubernetes自动伸缩方案的终极指南
【4月更文挑战第18天】
23 0
Kubernetes自动伸缩方案的终极指南
|
1月前
|
前端开发 编解码 数据格式
浅谈响应式编程在企业级前端应用 UI 开发中的实践
浅谈响应式编程在企业级前端应用 UI 开发中的实践
24 0
浅谈响应式编程在企业级前端应用 UI 开发中的实践
|
1月前
|
Kubernetes 应用服务中间件 nginx
提升K8S故障排除效率:详解Pod内抓包的高效策略!
提升K8S故障排除效率:详解Pod内抓包的高效策略!
40 0
|
1天前
|
Kubernetes 应用服务中间件 nginx
Kubernetes详解(六)——Pod对象部署和应用
在Kubernetes系列中,本文聚焦Pod对象的部署和管理。首先,通过`kubectl run`命令创建Pod,如`kubectl run pod-test --image=nginx:1.12 --port=80 --replicas=1`。接着,使用`kubectl get deployment`或`kubectl get pods`查看Pod信息,添加`-o wide`参数获取详细详情。然后,利用Pod的IP地址进行访问。最后,用`kubectl delete pods [Pod名]`删除Pod,但因Controller控制器,删除后Pod可能自动重建。了解更多细节,请参阅原文链接。
8 5
|
11天前
|
Kubernetes Perl 容器
在 Kubernetes 中重启 pod 的 3 种方法
【4月更文挑战第25天】
31 1
在 Kubernetes 中重启 pod 的 3 种方法
|
13天前
|
Kubernetes 网络协议 调度
kubernetes最小调度单元pod详解(二)
kubernetes最小调度单元pod详解(二)
|
13天前
|
Kubernetes 应用服务中间件 调度
kubernetes最小调度单元pod详解(一)
kubernetes最小调度单元pod详解(一)
|
29天前
|
Kubernetes 固态存储 调度
Kubernetes节点亲和性分配Pod
Kubernetes节点亲和性分配Pod
33 0
Kubernetes节点亲和性分配Pod
|
29天前
|
存储 Kubernetes 调度
Kubernetes Pod生命周期
Kubernetes Pod生命周期
32 0
Kubernetes Pod生命周期
|
29天前
|
存储 Kubernetes 应用服务中间件
Kubernetes Pod
Kubernetes Pod
84 0
Kubernetes Pod