可察看性是Istio4大个性之一。在 Istio可察看性--Metrcis篇 文中咱们讲到,Istio会为Istio服务网格内,外所有服务流量生成指标。这些度量规范提供无关行为的信息,例如总流量,流量中的错误率以及申请的响应工夫。

这些丰盛的指标信息,不仅能够精确形容服务行为和服务质量,而且能够用来作为工作负载弹性伸缩的规范参考。比方咱们能够依据qps,来对工作负载进行弹性伸缩。

部署 kube-metrcis-adaptor

Kube Metrics Adapter 是Kubernetes的通用指标适配器,能够收集和提供用于程度Pod主动缩放的自定义指标和内部指标。

它反对基于Prometheus度量规范,SQS队列和其余现成的扩大。
它会发现Horizontal Pod Autoscaling资源,并开始收集申请的指标并将其存储在内存中。它是应用 custom-metrics-apiserver 库实现的。

咱们应用helm3部署,部署之前先下载 Kube Metrics Adapter 代码仓库,而后进入到chart门路下,执行上面的语句:

helm -n kube-system install mesh ./kube-metrics-adapter  --set prometheus.url=http://monitor-pod-agent.kube-admin.svc:9090NAME: meshLAST DEPLOYED: Fri Nov 20 18:38:40 2020NAMESPACE: kube-systemSTATUS: deployedREVISION: 1TEST SUITE: NoneNOTES:mesh-kube-metrics-adapter has been deployed.In a few minutes you should be able to list metrics using the following command:  kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1Also if you enabled external metrics:  kubectl get --raw /apis/external.metrics.k8s.io/v1beta1Wait till deployment is done by:  kubectl -n kube-system rollout status deployment mesh-kube-metrics-adapter

部署实现之后,咱们能够确定一下pod是否失常运行:

kubectl get po -n kube-system |grep mesh-kube-metrics-adaptermesh-kube-metrics-adapter-6cb47f849d-ts5jh   1/1     Running   0          154m

部署示例程序

示例程序咱们抉择istio官网 httpbin。不过咱们为了演示HPA,部署实现之后,查看一下pod运行状态:

kubectl get podsNAME                             READY   STATUS    RESTARTS   AGEhttpbin-779c54bf49-mvscg         2/2     Running       0          56s

并创立了VirtualService 和Gateway,从而让咱们能够从咱们的压测机器上发动对httpbin的申请。

配置HPA

定义一个HPA,该HPA将依据qps来扩缩httpbin的工作负载数量。 当qps负载超过5 req/sec 时,以下配置将扩充负载数量。

apiVersion: autoscaling/v2beta2kind: HorizontalPodAutoscalermetadata:  name: httpbin  annotations:    metric-config.external.prometheus-query.prometheus/processed-requests-per-second: |      sum(          rate(              istio_requests_total{                destination_service_name="httpbin",                destination_service_namespace="default",                reporter="source"              }[1m]          )      ) spec:  maxReplicas: 5  minReplicas: 1  scaleTargetRef:    apiVersion: apps/v1    kind: Deployment    name: httpbin  metrics:    - type: External      external:        metric:          name: prometheus-query          selector:            matchLabels:              query-name: processed-requests-per-second        target:          type: AverageValue          averageValue: "5"

这是配置为基于Prometheus查问获取指标的HPA的示例。该查问在正文metric-config.external.prometheus-query.prometheus/processed-requests-per-second定义,其中processed-requests-per-second是与查问后果相关联的查问名称。必须在度量规范定义的matchLabels中定义匹配的query-name标签。这容许将多个Prometheus查问与单个HPA相关联。

列出Prometheus适配器提供的自定义内部指标。

kubectl 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"      ]    }  ]}

压测

咱们应用wrk即可,

wrk -c10 -d180s -t8 --latency http://httpbin.example.com/

压测过程中,咱们察看hpa变动:

kubectl get hpaNAME      REFERENCE            TARGETS          MINPODS   MAXPODS   REPLICAS   AGEhttpbin   Deployment/httpbin   17075m/5 (avg)   1         5         4          5m57s

发现基准指标曾经发生变化,示例数目也曾经变动。

此时咱们查看一下pod数目:

kubectl get podsNAME                       READY   STATUS    RESTARTS   AGEhttpbin-779c54bf49-hkqp7   2/2     Running   0          48shttpbin-779c54bf49-ljj9z   2/2     Running   0          108shttpbin-779c54bf49-mvscg   2/2     Running   0          14mhttpbin-779c54bf49-nxnz4   2/2     Running   0          108shttpbin-779c54bf49-xldt7   2/2     Running   0          108s

发现曾经扩到最大值5。

压测完结之后一段时间,pod数目逐渐减小,最终复原到1个。