简介:应用级扩缩容是相对于运维级而言的。像监控CPU/内存的利用率就属于应用无关的纯运维指标,针对这种指标进行扩缩容的HPA配置就是运维级扩缩容。而像请求数量、请求延迟、P99分布等指标就属于应用相关的,或者叫业务感知的监控指标。 本篇将介绍3种应用级监控指标在HPA中的配置,以实现应用级自动扩缩容。

应用级扩缩容是相对于运维级而言的。像监控CPU/内存的利用率就属于应用无关的纯运维指标,针对这种指标进行扩缩容的HPA配置就是运维级扩缩容。而像请求数量、请求延迟、P99分布等指标就属于应用相关的,或者叫业务感知的监控指标。

本篇将介绍3种应用级监控指标在HPA中的配置,以实现应用级自动扩缩容。

Setup HPA

1 部署metrics-adapter

执行如下命令部署kube-metrics-adapter(完整脚本参见:demo_hpa.sh)。:

helm --kubeconfig "$USER_CONFIG" -n kube-system install asm-custom-metrics \$KUBE_METRICS_ADAPTER_SRC/deploy/charts/kube-metrics-adapter \--set prometheus.url=http://prometheus.istio-system.svc:9090

执行如下命令验证部署情况:

#验证POD
kubectl --kubeconfig "$USER_CONFIG" get po -n kube-system | grep metrics-adapterasm-custom-metrics-kube-metrics-adapter-6fb4949988-ht8pv   1/1     Running     0          30s#验证CRD
kubectl --kubeconfig "$USER_CONFIG" api-versions | grep "autoscaling/v2beta"autoscaling/v2beta1
autoscaling/v2beta2#验证CRD
kubectl --kubeconfig "$USER_CONFIG" get --raw "/apis/external.metrics.k8s.io/v1beta1" | jq .{"kind": "APIResourceList","apiVersion": "v1","groupVersion": "external.metrics.k8s.io/v1beta1","resources": []
}

2 部署loadtester

执行如下命令部署flagger loadtester:

kubectl --kubeconfig "$USER_CONFIG" apply -f $FLAAGER_SRC/kustomize/tester/deployment.yaml -n test
kubectl --kubeconfig "$USER_CONFIG" apply -f $FLAAGER_SRC/kustomize/tester/service.yaml -n test

3 部署HPA

3.1 根据应用请求数量扩缩容

首先我们创建一个感知应用请求数量(istio_requests_total)的HorizontalPodAutoscaler配置:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:name: podinfo-totalnamespace: testannotations:metric-config.external.prometheus-query.prometheus/processed-requests-per-second: |sum(rate(istio_requests_total{destination_workload_namespace="test",reporter="destination"}[1m]))
spec:maxReplicas: 5minReplicas: 1scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: podinfometrics:- type: Externalexternal:metric:name: prometheus-queryselector:matchLabels:query-name: processed-requests-per-secondtarget:type: AverageValueaverageValue: "10"

执行如下命令部署这个HPA配置:

kubectl --kubeconfig "$USER_CONFIG" apply -f resources_hpa/requests_total_hpa.yaml

执行如下命令校验:

kubectl --kubeconfig "$USER_CONFIG" get --raw "/apis/external.metrics.k8s.io/v1beta1" | jq .

结果如下:

{"kind": "APIResourceList","apiVersion": "v1","groupVersion": "external.metrics.k8s.io/v1beta1","resources": [{"name": "prometheus-query","singularName": "","namespaced": true,"kind": "ExternalMetricValueList","verbs": ["get"]}]
}

类似地,我们可以使用其他维度的应用级监控指标配置HPA。举例如下,不再冗述。

3.2 根据平均延迟扩缩容

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:name: podinfo-latency-avgnamespace: testannotations:metric-config.external.prometheus-query.prometheus/latency-average: |sum(rate(istio_request_duration_milliseconds_sum{destination_workload_namespace="test",reporter="destination"}[1m]))/sum(rate(istio_request_duration_milliseconds_count{destination_workload_namespace="test",reporter="destination"}[1m]))
spec:maxReplicas: 5minReplicas: 1scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: podinfometrics:- type: Externalexternal:metric:name: prometheus-queryselector:matchLabels:query-name: latency-averagetarget:type: AverageValueaverageValue: "0.005"

3.3 根据P95分布扩缩容

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:name: podinfo-p95namespace: testannotations:metric-config.external.prometheus-query.prometheus/p95-latency: |histogram_quantile(0.95,sum(irate(istio_request_duration_milliseconds_bucket{destination_workload_namespace="test",destination_canonical_service="podinfo"}[5m]))by (le))
spec:maxReplicas: 5minReplicas: 1scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: podinfometrics:- type: Externalexternal:metric:name: prometheus-queryselector:matchLabels:query-name: p95-latencytarget:type: AverageValueaverageValue: "4"

验证HPA

1 生成负载

执行如下命令产生实验流量,以验证HPA配置自动扩容生效。

alias k="kubectl --kubeconfig $USER_CONFIG"
loadtester=$(k -n test get pod -l "app=flagger-loadtester" -o jsonpath='{.items..metadata.name}')
k -n test exec -it ${loadtester} -c loadtester -- hey -z 5m -c 2 -q 10 http://podinfo:9898

这里运行了一个持续5分钟、QPS=10、并发数为2的请求。

hey命令详细参考如下:

Usage: hey [options...] <url>Options:-n  Number of requests to run. Default is 200.-c  Number of workers to run concurrently. Total number of requests cannotbe smaller than the concurrency level. Default is 50.-q  Rate limit, in queries per second (QPS) per worker. Default is no rate limit.-z  Duration of application to send requests. When duration is reached,application stops and exits. If duration is specified, n is ignored.Examples: -z 10s -z 3m.-o  Output type. If none provided, a summary is printed."csv" is the only supported alternative. Dumps the responsemetrics in comma-separated values format.-m  HTTP method, one of GET, POST, PUT, DELETE, HEAD, OPTIONS.-H  Custom HTTP header. You can specify as many as needed by repeating the flag.For example, -H "Accept: text/html" -H "Content-Type: application/xml" .-t  Timeout for each request in seconds. Default is 20, use 0 for infinite.-A  HTTP Accept header.-d  HTTP request body.-D  HTTP request body from file. For example, /home/user/file.txt or ./file.txt.-T  Content-type, defaults to "text/html".-a  Basic authentication, username:password.-x  HTTP Proxy address as host:port.-h2 Enable HTTP/2.-host HTTP Host header.-disable-compression  Disable compression.-disable-keepalive    Disable keep-alive, prevents re-use of TCPconnections between different HTTP requests.-disable-redirects    Disable following of HTTP redirects-cpus                 Number of used cpu cores.(default for current machine is 4 cores)

2 自动扩容

执行如下命令观察扩容情况:

watch kubectl --kubeconfig $USER_CONFIG -n test get hpa/podinfo-total

结果如下:

Every 2.0s: kubectl --kubeconfig /Users/han/shop_config/ack_zjk -n test get hpa/podinfo                                            East6C16G: Tue Jan 26 18:01:30 2021NAME      REFERENCE            TARGETS           MINPODS   MAXPODS   REPLICAS   AGE
podinfo   Deployment/podinfo   10056m/10 (avg)   1         5         2          4m45s

另外两个HPA类似,命令如下:

kubectl --kubeconfig $USER_CONFIG -n test get hpawatch kubectl --kubeconfig $USER_CONFIG -n test get hpa/podinfo-latency-avg
watch kubectl --kubeconfig $USER_CONFIG -n test get hpa/podinfo-p95

3 监控指标

同时,我们可以实时在Prometheus中查看相关的应用级监控指标的实时数据。示意如下:

原文链接:https://developer.aliyun.com/article/783551?

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

Flagger on ASM——基于Mixerless Telemetry实现渐进式灰度发布系列 2 应用级扩缩容相关推荐

  1. Flagger on ASM——基于Mixerless Telemetry实现渐进式灰度发布系列 1 遥测数据

    简介:服务网格ASM的Mixerless Telemetry技术,为业务容器提供了无侵入式的遥测数据.遥测数据一方面作为监控指标被ARMPS/prometheus采集,用于服务网格可观测性:另一方面被 ...

  2. Flagger on ASM·基于Mixerless Telemetry实现渐进式灰度发布系列 1 遥测数据

    简介: 服务网格ASM的Mixerless Telemetry技术,为业务容器提供了无侵入式的遥测数据.遥测数据一方面作为监控指标被ARMPS/prometheus采集,用于服务网格可观测性:另一方面 ...

  3. Flagger on ASM——基于Mixerless Telemetry实现渐进式灰度发布系列 3 渐进式灰度发布

    简介:作为CNCF[成员](https://landscape.cncf.io/card-mode?category=continuous-integration-delivery&group ...

  4. 通过Dapr实现一个简单的基于.net的微服务电商系统(十一)——一步一步教你如何撸Dapr之自动扩/缩容...

    上一篇我们讲到了dapr提供的bindings,通过绑定可以让我们的程序轻装上阵,在极端情况下几乎不需要集成任何sdk,仅需要通过httpclient+text.json即可完成对外部组件的调用,这样 ...

  5. Kubernetes:HPA 详解-基于 CPU、内存和自定义指标自动扩缩容

    目录 HPA 基本原理 Metrics Server 聚合 API 安装Metrics Server HPA 基于 CPU自动扩缩容 查看 HPA 资源的对象了解工作过程: HPA 基于 内存自动扩缩 ...

  6. Istio服务网格进阶③:基于Istio服务网格实现灰度发布机制

    基于Istio服务网格实现灰度发布机制 文章目录 基于Istio服务网格实现灰度发布机制 1.应用程序主流发布方案 1.1.蓝绿发布 1.2.滚动发布 1.3.灰度发布 1.4.A/B测试发布 2.I ...

  7. 基于 Nginx+lua+Memcache 实现灰度发布

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 一.灰度发布原理说明 灰度发布在百度百科中解释: 灰度发布 ...

  8. k8s自定义指标HPA实践(微服务基于自定义指标自动扩缩容的实践)附demo

    先上demo代码仓库 https://github.com/wentjiang/prometheus-HPA-test 自动扩缩容的使用场景 在开发微服务时,我们会有一些请求量突增的场景,举个例子,快 ...

  9. Knative 基于流量的灰度发布和自动弹性实践

    作者| 李鹏(元毅) 来源 | 阿里巴巴云原生公众号 Knative Knative 提供了基于流量的自动扩缩容能力,可以根据应用的请求量,在高峰时自动扩容实例数:当请求量减少以后,自动缩容实例,做到 ...

最新文章

  1. Kmeans++、Mini-Batch Kmeans、Bisecting Kmeans、K中心点(K-Medoids)算法、K众数聚类、核K均值聚类
  2. 各版本jdk下载地址
  3. python脚本监控网站状态 - 赵海华_运维之路 - 51CTO技术博客
  4. 车主无忧:天下武功,唯快不破,神策让我们快人一步
  5. [AHOI2005]COMMON 约数研究
  6. 【数据结构与算法】之深入解析“不同的二叉搜索树II”的求解思路与算法示例
  7. JavaFX 2.1:Toolkit not initialized
  8. api demo 京东商品详情_jd-demo
  9. 【codevs3732】【BZOJ3751】解方程,hash+秦九韶算法
  10. FCKeditor集锦
  11. sublime text3安装、注册及常用插件
  12. JAVA bugFree!
  13. MySQL KEY分区
  14. QQ一键加群android代码,PC和移动端一键添加和打开QQ群代码分析
  15. 顶隙计算公式_齿轮参数计算公式
  16. Linux重启tomcat服务
  17. C++ 解决大数运算(大数加法,大数幂运算,大数求余)
  18. 腾讯笔试题之数字转换机
  19. IntelliJ IDEA现有项目连接SVN(2)
  20. php 发送带附件邮件

热门文章

  1. 深入理解javascript原型和闭包(4)——隐式原型
  2. 第一个hibernate程序
  3. python数据分析与挖掘 | 挖掘建模
  4. 使用 做签名的post_ASP.NET WebApi 基于分布式Session方式实现Token签名认证
  5. android 自动更新 服务端,搭建android版本更新服务器使用android系统自带的DownloadManager下载文件...
  6. Firefox下代码触发a标签的click事件无效
  7. NOIP2007 字符串的展开
  8. 设计模式第19篇:访问者模式
  9. JMeter 正则表达式提取器(二)
  10. Android:日常学习笔记(8)———探究UI开发(2)