获取 TCP 服务指标

本文任务展示了如何对 Istio 进行配置,从而自动收集网格中 TCP 服务的遥测数据。在任务最后,会为网格中的一个 TCP 服务启用一个新的指标。

在本例中会使用 Bookinfo 作为示例应用。

开始之前

  • 在集群中安装 Istio 并部署一个应用。

  • 任务中假设 Bookinfo 应用部署在 default 命名空间中。如果使用不同的命名空间,需要更新例子中的相关配置和命令。

收集新的遥测数据

  • 创建一个新的 YAML 文件用于配置新的指标,Istio 会据此文件生成并自动收集新建指标。

把下面的文本保存为 tcp_telemetry.yaml

  1. # 配置一个指标,描述从服务器发送到客户端的字节数量
  2. apiVersion: "config.istio.io/v1alpha2"
  3. kind: metric
  4. metadata:
  5. name: mongosentbytes
  6. namespace: default
  7. spec:
  8. value: connection.sent.bytes | 0 # uses a TCP-specific attribute
  9. dimensions:
  10. source_service: source.workload.name | "unknown"
  11. source_version: source.labels["version"] | "unknown"
  12. destination_version: destination.labels["version"] | "unknown"
  13. monitoredResourceType: '"UNSPECIFIED"'
  14. ---
  15. # 这一指标代表从客户端到服务器的字节数
  16. apiVersion: "config.istio.io/v1alpha2"
  17. kind: metric
  18. metadata:
  19. name: mongoreceivedbytes
  20. namespace: default
  21. spec:
  22. value: connection.received.bytes | 0 # uses a TCP-specific attribute
  23. dimensions:
  24. source_service: source.workload.name | "unknown"
  25. source_version: source.labels["version"] | "unknown"
  26. destination_version: destination.labels["version"] | "unknown"
  27. monitoredResourceType: '"UNSPECIFIED"'
  28. ---
  29. # 配置 Prometheus 的 Handler
  30. apiVersion: "config.istio.io/v1alpha2"
  31. kind: prometheus
  32. metadata:
  33. name: mongohandler
  34. namespace: default
  35. spec:
  36. metrics:
  37. - name: mongo_sent_bytes # Prometheus metric name
  38. instance_name: mongosentbytes.metric.default # Mixer instance name (fully-qualified)
  39. kind: COUNTER
  40. label_names:
  41. - source_service
  42. - source_version
  43. - destination_version
  44. - name: mongo_received_bytes # Prometheus metric name
  45. instance_name: mongoreceivedbytes.metric.default # Mixer instance name (fully-qualified)
  46. kind: COUNTER
  47. label_names:
  48. - source_service
  49. - source_version
  50. - destination_version
  51. ---
  52. # 这里定义一个 rule,把 metric 发送给 Prometheus handler
  53. apiVersion: "config.istio.io/v1alpha2"
  54. kind: rule
  55. metadata:
  56. name: mongoprom
  57. namespace: default
  58. spec:
  59. match: context.protocol == "tcp"
  60. && destination.service.host == "mongodb.default.svc.cluster.local"
  61. actions:
  62. - handler: mongohandler.prometheus
  63. instances:
  64. - mongoreceivedbytes.metric
  65. - mongosentbytes.metric
  • 应用新配置。
  1. $ kubectl apply -f tcp_telemetry.yaml
  2. Created config metric/default/mongosentbytes at revision 3852843
  3. Created config metric/default/mongoreceivedbytes at revision 3852844
  4. Created config prometheus/default/mongohandler at revision 3852845
  5. Created config rule/default/mongoprom at revision 3852846
  • 设置 Bookinfo 使用 Mongodb。

    • 安装 ratings 服务的 v2 版本。

如果使用的是启用了 Sidecar 自动注入的集群,可以简单使用 kubectl 进行服务部署:

Zip

  1. $ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo-ratings-v2.yaml@

如果使用手工的 Sidecar 注入方式,就需要使用下面的命令:

Zip

  1. $ kubectl apply -f <(istioctl kube-inject -f @samples/bookinfo/platform/kube/bookinfo-ratings-v2.yaml@)
  2. deployment "ratings-v2" configured
  • 安装 mongodb 服务:

如果使用的是启用了 Sidecar 自动注入的集群,可以简单使用 kubectl 进行服务部署:

Zip

  1. $ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo-db.yaml@

如果使用手工的 Sidecar 注入方式,就需要使用下面的命令:

Zip

  1. $ kubectl apply -f <(istioctl kube-inject -f @samples/bookinfo/platform/kube/bookinfo-db.yaml@)
  2. service "mongodb" configured
  3. deployment "mongodb-v1" configured
  • Bookinfo 示例部署了每个微服务的多个版本,因此您将首先创建目标规则定义每个版本对应的服务子集,以及每个子集的负载均衡策略。

Zip

  1. $ kubectl apply -f @samples/bookinfo/networking/destination-rule-all.yaml@

如果您启用了双向 TLS,请执行以下操作

Zip

  1. $ kubectl apply -f @samples/bookinfo/networking/destination-rule-all-mtls.yaml@

您可以使用以下命令显示目标规则:

  1. $ kubectl get destinationrules -o yaml

由于虚拟服务中的子集引用依赖于目标规则,在添加引用这些子集的虚拟服务之前,请等待几秒钟以使目标规则传播。

  • 创建 ratings 以及 reviews 两个虚拟服务:

Zip

  1. $ kubectl apply -f @samples/bookinfo/networking/virtual-service-ratings-db.yaml@
  2. Created config virtual-service/default/reviews at revision 3003
  3. Created config virtual-service/default/ratings at revision 3004
  • 向应用发送流量。

对于 Bookinfo 应用来说,在浏览器中浏览 http://$GATEWAY_URL/productpage,或者使用下面的命令:

  1. $ curl http://$GATEWAY_URL/productpage
  • 检查是否已经生成并收集了新的指标。

在 Kubernetes 环境中,使用下面的命令为 Prometheus 设置端口转发:

  1. $ kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=prometheus -o jsonpath='{.items[0].metadata.name}') 9090:9090 &

使用 Prometheus 界面 浏览新的指标值。

上面的连接会打开 Promethe 界面,并执行了对 istio_mongo_received_bytes 指标的查询。Console 标签页中包含了大致如下的内容:

  1. istio_mongo_received_bytes{destination_version="v1",instance="172.17.0.18:42422",job="istio-mesh",source_service="ratings-v2",source_version="v2"}

理解 TCP 遥控数据的收集过程

这一任务中,我们加入了一段 Istio 配置,对于所有目标为网格内 TCP 服务的流量,Mixer 自动为其生成并报告新的指标。

类似收集指标和日志任务中的情况,新的配置由 instance 、一个 handler 以及一个 rule 构成。请参看该任务来获取关于指标收集的组件的完整信息。

instances 中属性集的可选范围不同,是 TCP 服务的指标收集过程的唯一差异。

TCP 属性

TCP 相关的属性是 Istio 中 TCP 策略和控制的基础。这些属性是由服务端的 Envoy 代理生成的。它们在连接建立时发给 Mixer,在连接的存活期间周期性的进行发送(周期性报告),最后在连接关闭时再次发送(最终报告)。周期性报告的缺省间隔时间为 10 秒钟,最小取值为 1 秒。另外上下文属性让策略有了区分 httptcp 协议的能力。

Istio 服务网格中的 TCP 服务属性生成流程

TCP 属性流程

清理

  • 删除新的遥测配置:
  1. $ kubectl delete -f tcp_telemetry.yaml
  • 删除端口转发进程:
  1. $ killall kubectl
  • 如果不准备进一步探索其他任务,请参照 Bookinfo 清理,关闭示例应用。

相关内容

收集指标和日志

这一任务讲述如何配置 Istio,进行指标和日志的收集工作。

收集日志

这一任务讲述如何配置 Istio,进行日志的收集工作。

查询 Prometheus 的指标

此任务说明如何使用 Prometheus 查询 Istio 指标。

深入遥测

演示如何使用 Istio Mixer 和 Istio sidecar 获取指标和日志,并在不同的服务间进行追踪。

使用外部 MongoDB 服务

描述了一个基于 Istio 的 Bookinfo 示例的简单场景。

使用外部 TCP 服务

描述基于 Istio 的 Bookinfo 示例的简单场景。