收集 TCP 服务指标
本文任务展示了如何对 Istio 进行配置,从而自动收集网格中 TCP 服务的遥测数据。在任务最后,会为网格中的一个 TCP 服务启用一个新的指标。
在本例中会使用 Bookinfo 作为示例应用。
开始之前
在集群中安装 Istio 并部署一个应用。你必须安装Prometheus。
任务中假设 Bookinfo 应用部署在
default
命名空间中。如果使用不同的命名空间,需要更新例子中的相关配置和命令。
收集新的遥测数据
设置 Bookinfo 使用 Mongodb。
安装
ratings
服务的v2
版本。如果使用的是启用了 Sidecar 自动注入的集群,可以简单使用
kubectl
进行服务部署:$ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo-ratings-v2.yaml@
如果使用手工的 Sidecar 注入方式,就需要使用下面的命令:
$ kubectl apply -f <(istioctl kube-inject -f @samples/bookinfo/platform/kube/bookinfo-ratings-v2.yaml@) deployment "ratings-v2" configured
安装
mongodb
服务:如果使用的是启用了 Sidecar 自动注入的集群,可以简单使用
kubectl
进行服务部署:$ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo-db.yaml@ service/mongodb created deployment.apps/mongodb-v1 created
如果使用手工的 Sidecar 注入方式,就需要使用下面的命令:
$ kubectl apply -f <(istioctl kube-inject -f @samples/bookinfo/platform/kube/bookinfo-db.yaml@) service "mongodb" configured deployment "mongodb-v1" configured
Bookinfo 示例部署了每个微服务的多个版本,因此您将首先创建目标规则定义每个版本对应的服务子集,以及每个子集的负载均衡策略。
$ kubectl apply -f @samples/bookinfo/networking/destination-rule-all.yaml@
如果您启用了双向 TLS,请执行以下操作
$ kubectl apply -f @samples/bookinfo/networking/destination-rule-all-mtls.yaml@
您可以使用以下命令显示目标规则:
$ kubectl get destinationrules -o yaml
由于虚拟服务中的子集引用依赖于目标规则, 在添加引用这些子集的虚拟服务之前,请等待几秒钟以使目标规则传播。
创建
ratings
以及reviews
两个虚拟服务:$ kubectl apply -f @samples/bookinfo/networking/virtual-service-ratings-db.yaml@ virtualservice.networking.istio.io/reviews created virtualservice.networking.istio.io/ratings created
向应用发送流量。
对于 Bookinfo 应用来说,在浏览器中浏览
http://$GATEWAY_URL/productpage
,或者使用下面的命令:$ curl http://"$GATEWAY_URL/productpage"
检查是否已经生成并收集了新的指标。
在 Kubernetes 环境中,使用下面的命令为 Prometheus 设置端口转发:
$ istioctl dashboard prometheus
在 Prometheus 浏览器窗口查看新指标的值。选择 Graph。 输入
istio_mongo_received_bytes
指标并选择 Execute。 在 Console 标签页中显示的表格包含了类似如下的内容:istio_tcp_connections_opened_total{ destination_version="v1", instance="172.17.0.18:42422", job="istio-mesh", canonical_service_name="ratings-v2", canonical_service_revision="v2"}
istio_tcp_connections_closed_total{ destination_version="v1", instance="172.17.0.18:42422", job="istio-mesh", canonical_service_name="ratings-v2", canonical_service_revision="v2"}
理解 TCP 遥测数据的收集过程
这一任务中,我们加入了一段 Istio 配置,对于所有目标为网格内 TCP 服务的流量,Mixer 自动为其生成并报告新的指标。默认情况下,每15秒
记录一次所有活动连接的 TCP 指标,并且该计时器是可配置的通过tcpReportingDuration
。连接的指标也记录在连接的末尾。
TCP 属性
几个特定于 TCP 的属性可在 Istio 中启用 TCP 策略和控制。这些属性由 Envoy 代理生成,并使用 Envoy 的 Node Metadata 从 Istio 获得。Envoy 使用基于 ALPN 的隧道和基于前缀的协议将节点元数据转发给对等 Envoy。我们定义了一个新的协议 istio-peer-exchange
,该协议定义了网格中的客户端和 Sidecar 服务器的通告和优先级。对于启用了 Istio 之间的连接,ALPN 协商将协议解析为 istio-peer-exchange
代理,不再启用 Istio 的代理和任何其他代理。该协议扩展了 TCP,如下所示:
- TCP 客户端,作为第一个字节序列,发送一个魔术字节串和一个长度带前缀的有效载荷。
- TCP 服务端,作为第一个字节序列,发送一个魔术字节串和一个长度带前缀的有效载荷,这些有效载荷是 protobuf 编码的序列化元数据。
- 客户端和服务器可以同时写入并且顺序混乱。Envoy 中的扩展筛选器会在下游和上游进行处理,直到魔术字节序列不匹配或读取了整个有效负载。
清除
删除
port-forward
进程:$ killall istioctl
如果不准备进一步探索其他任务,请参照 Bookinfo 清除,关闭示例应用。