收集TCP服务的Metrics

本章介绍如何配置istio去自动收集mesh中的TCP服务指标。本章结尾部分,一个新的监控指标可以用mesh去调用TCP服务。

BookInfo应用作为介绍本章的示例应用。

开始之前

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

  • 本章假定BookInfo中的示例应用被部署在default命名空间中。如果部署在不同的命名空间,你需要修改例子中的配置和命令。

  • 安装Prometheus插件,Prometheus用来验证任务是否成功执行。

    1. kubectl apply -f install/kubernetes/addons/prometheus.yaml

    详细内容查看Prometheus

收集新的遥测数据

  1. 创建YAML文件来保存新的metric配置,Istio将自动生成和收集。

    把以下内容保持为tcp_telemetry.yaml文件:

    1. # Configuration for a metric measuring bytes sent from a server
    2. # to a client
    3. apiVersion: "config.istio.io/v1alpha2"
    4. kind: metric
    5. metadata:
    6. name: mongosentbytes
    7. namespace: default
    8. spec:
    9. value: connection.sent.bytes | 0 # uses a TCP-specific attribute
    10. dimensions:
    11. source_service: source.service | "unknown"
    12. source_version: source.labels["version"] | "unknown"
    13. destination_version: destination.labels["version"] | "unknown"
    14. monitoredResourceType: '"UNSPECIFIED"'
    15. ---
    16. # Configuration for a metric measuring bytes sent from a client
    17. # to a server
    18. apiVersion: "config.istio.io/v1alpha2"
    19. kind: metric
    20. metadata:
    21. name: mongoreceivedbytes
    22. namespace: default
    23. spec:
    24. value: connection.received.bytes | 0 # uses a TCP-specific attribute
    25. dimensions:
    26. source_service: source.service | "unknown"
    27. source_version: source.labels["version"] | "unknown"
    28. destination_version: destination.labels["version"] | "unknown"
    29. monitoredResourceType: '"UNSPECIFIED"'
    30. ---
    31. # Configuration for a Prometheus handler
    32. apiVersion: "config.istio.io/v1alpha2"
    33. kind: prometheus
    34. metadata:
    35. name: mongohandler
    36. namespace: default
    37. spec:
    38. metrics:
    39. - name: mongo_sent_bytes # Prometheus metric name
    40. instance_name: mongosentbytes.metric.default # Mixer instance name (fully-qualified)
    41. kind: COUNTER
    42. label_names:
    43. - source_service
    44. - source_version
    45. - destination_version
    46. - name: mongo_received_bytes # Prometheus metric name
    47. instance_name: mongoreceivedbytes.metric.default # Mixer instance name (fully-qualified)
    48. kind: COUNTER
    49. label_names:
    50. - source_service
    51. - source_version
    52. - destination_version
    53. ---
    54. # Rule to send metric instances to a Prometheus handler
    55. apiVersion: "config.istio.io/v1alpha2"
    56. kind: rule
    57. metadata:
    58. name: mongoprom
    59. namespace: default
    60. spec:
    61. match: context.protocol == "tcp"
    62. && destination.service == "mongodb.default.svc.cluster.local"
    63. actions:
    64. - handler: mongohandler.prometheus
    65. instances:
    66. - mongoreceivedbytes.metric
    67. - mongosentbytes.metric
  2. 推送新的配置。

    1. istioctl create -f tcp_telemetry.yaml

    输出类似如下内容:

    1. Created config metric/default/mongosentbytes at revision 3852843
    2. Created config metric/default/mongoreceivedbytes at revision 3852844
    3. Created config prometheus/default/mongohandler at revision 3852845
    4. Created config rule/default/mongoprom at revision 3852846
  3. 设置并使用MongoDB

    1. 安装v2版本的ratings服务。

      如果您启用了自动注入sidecar功能的集群,只需使用kubectl部署服务即可:

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

      如果您正在使用手动注入sidecar,请改用以下命令:

      1. kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/kube/bookinfo-ratings-v2.yaml)

      输出如下内容:

      1. deployment "ratings-v2" configured
    2. 安装mongodb服务:

      如果您启用了自动注入sidecar功能的集群,只需使用kubectl部署服务即可:

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

      如果您正在使用手动注入sidecar,请改用以下命令:

      1. kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/kube/bookinfo-db.yaml)

      输出如下内容:

      1. service "mongodb" configured
      2. deployment "mongodb-v1" configured
    3. 添加路由规则将流量发送到ratings服务的v2版本:

    1. istioctl create -f samples/bookinfo/kube/route-rule-ratings-db.yaml

    输出如下内容:

    1. Created config route-rule//ratings-test-v2 at revision 7216403
    2. Created config route-rule//reviews-test-ratings-v2 at revision 7216404
  4. 把流量发送到示例的应用。

    参照BookInfo中的例子,使用浏览器访问http://$GATEWAY_URL/productpage或者使用如下命令:

    1. curl http://$GATEWAY_URL/productpage
  5. 验证新的监控信息是否产生并被收集

    在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 UI查看新的监控指标项采集的数据。

    使用提供的链接打开Prometheus UI并查询mongo_received_bytesmetric收集的数据。在Console tab页展示类似以下信息:

    1. istio_mongo_received_bytes{destination_version="v1",instance="istio-mixer.istio-system:42422",job="istio-mesh",source_service="ratings.default.svc.cluster.local",source_version="v2"} 2317

    注意:Istio还收集MongoDB特定协议的统计信息。 例如,从ratings服务发送的所有OP_QUERY信息的值,用以下metric收集:envoy_mongo_mongo_collection_ratings_query_total_counter单击此处执行查询)。

理解TCP遥测收集

在此任务中,您添加了Istio的配置,使Mixer能自动生成mesh内TCP服务的所有流量的metric并收集。

收集指标和日志类似,新配置由instanceshandlerrule组成。 请参阅该任务了解获取metric数据收集的完整说明。

TCP服务的监控数据收集配置仅在instances中有有限几个属性有所不同。

TCP属性

几个特定的TCP属性可以在Istio中启用TCP策略和控制。 这些属性由服务器端的Envoy代理生成,并在连接建立和关闭时转发给Mixer。 另外,上下文属性提供区分httptcp协议的能力。

Attribute Generation Flow for TCP Services in an Istio Mesh.
TCP Attribute Flow

清理

  • 删除新的配置:

    1. istioctl delete -f tcp_telemetry.yaml
  • 删除端口映射:

    1. killall kubectl
  • 如果您不打算继续后面的章节,请参阅BookInfo cleanup的说明关闭应用程序。

进一步阅读