# 监控

## 先决条件

* 部署prometheus kubectl apply -f [https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/prometheus.yaml](https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/prometheus.yaml)
* 该任务假定Bookinfo示例将部署在default 名称空间中。如果使用其他名称空间,请更新示例配置和命令。

## 收集新的指标数据

1. 设置Bookinfo以使用MongoDB。
   1.  安装v2了的ratings服务。

       如果使用启用了自动边车注入的集群,请使用kubectl以下命令部署服务:

       ```
       $ kubectl apply -f samples/bookinfo/platform/kube/bookinfo-ratings-v2.yaml
       serviceaccount/bookinfo-ratings-v2 created
       deployment.apps/ratings-v2 created
       ```

       如果使用手动边车注入,请改为运行以下命令:

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

如果使用启用了自动边车注入的集群,请使用kubectl以下命令部署服务:

```
$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo-db.yaml
service/mongodb created
deployment.apps/mongodb-v1 created
```

如果使用手动边车注入,请改为运行以下命令:

```
$ 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在您的Web浏览器中访问或使用以下命令](http://$gateway_url/productpage%E5%9C%A8%E6%82%A8%E7%9A%84Web%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B8%AD%E8%AE%BF%E9%97%AE%E6%88%96%E4%BD%BF%E7%94%A8%E4%BB%A5%E4%B8%8B%E5%91%BD%E4%BB%A4):

```
$ curl http://"$GATEWAY_URL/productpage"
```

$GATEWAY\_URL是在Bookinfo示例中设置的值。 验证是否正在生成和收集TCP度量标准值。

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

```
$ istioctl dashboard prometheus
```

在Prometheus浏览器窗口中查看TCP度量的值。选择图。输入istio\_tcp\_connections\_opened\_total指标或,istio\_tcp\_connections\_closed\_total然后选择执行。"控制台"选项卡中显示的表 包含类似于以下内容的条目:

```
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服务的所有流量的度量。15s默认情况下,每个活动连接的TCP度量标准都会默认记录一次,并且可以通过设置此计时器tcpReportingDuration。连接的指标也记录在连接的末尾。

### tcp属性

几个特定于TCP的属性可在Istio中启用TCP策略和控制。这些属性由Envoy代理生成,并使用Envoy的Node Metadata从Istio获得。Envoy使用基于ALPN的隧道和基于前缀的协议将节点元数据转发给对等Envoy。我们定义了一个新协议istio-peer-exchange,该协议由网状网络中的客户端和服务器边车广告并确定优先级。ALPN协商将协议解析istio-peer-exchange为启用Istio的代理之间的连接,但不解析为启用Istio的代理与任何其他代理之间的连接。该协议对TCP的扩展如下:

1. 作为第一个字节序列,TCP客户端发送一个魔术字节字符串和一个长度为前缀的有效负载。
2. TCP服务器作为第一个字节序列,发送一个魔术字节序列和一个长度为前缀的有效负载。这些有效载荷是protobuf编码的序列化元数据。
3. 客户端和服务器可以同时写入并且顺序混乱。然后,Envoy中的扩展过滤器在下游和上游进行进一步处理,直到魔术字节序列不匹配或读取整个有效负载为止。

![TCP属性流](https://istio.io/latest/docs/tasks/observability/metrics/tcp-metrics/alpn-based-tunneling-protocol.svg)

## 清理

删除port-forward过程:

```
$ killall istioctl
```
