可察看性是 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:9090
NAME: mesh
LAST DEPLOYED: Fri Nov 20 18:38:40 2020
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
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/v1beta1
Also if you enabled external metrics:
kubectl get --raw /apis/external.metrics.k8s.io/v1beta1
Wait 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-adapter
mesh-kube-metrics-adapter-6cb47f849d-ts5jh 1/1 Running 0 154m
部署示例程序
示例程序咱们抉择 istio 官网 httpbin。不过咱们为了演示 HPA,部署实现之后,查看一下 pod 运行状态:
kubectl get pods
NAME READY STATUS RESTARTS AGE
httpbin-779c54bf49-mvscg 2/2 Running 0 56s
并创立了 VirtualService 和 Gateway,从而让咱们能够从咱们的压测机器上发动对 httpbin 的申请。
配置 HPA
定义一个 HPA,该 HPA 将依据 qps 来扩缩 httpbin 的工作负载数量。当 qps 负载超过 5 req/sec 时,以下配置将扩充负载数量。
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
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 hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
httpbin Deployment/httpbin 17075m/5 (avg) 1 5 4 5m57s
发现基准指标曾经发生变化,示例数目也曾经变动。
此时咱们查看一下 pod 数目:
kubectl get pods
NAME READY STATUS RESTARTS AGE
httpbin-779c54bf49-hkqp7 2/2 Running 0 48s
httpbin-779c54bf49-ljj9z 2/2 Running 0 108s
httpbin-779c54bf49-mvscg 2/2 Running 0 14m
httpbin-779c54bf49-nxnz4 2/2 Running 0 108s
httpbin-779c54bf49-xldt7 2/2 Running 0 108s
发现曾经扩到最大值 5。
压测完结之后一段时间,pod 数目逐渐减小,最终复原到 1 个。