度量和日志的常见问题

可以通过 REST 方式访问 Istio 度量数据吗?

您可以使用 Prometheus 收集有关 Istio 的遥测数据,然后使用 Prometheus 的 HTTP API 来查询该度量数据。

如何控制被 sidecar 报告的数据?

有时将对特定 URL 的访问排除在报告之外是有用的。 例如,您可能希望排除一些健康检查 URL。 您可以使用遥测配置的 match 子句将其排除,以跳过特定于某些 URL 的遥测报告。 例如:

match: source.name != "health"
Prometheus 适配器能在非 Kubernetes 环境下使用吗?

您可以使用 docker-compose 来安装 Prometheus,这与您安装普通应用程序类似。 与此同时,由于没有 Kubernetes API 服务,像 Mixer 这样的组件将需要被提供 rules/handlers/instances 的本地配置。

如何获知 Istio 中一个请求的生命周期?

用户可以通过打开追踪功能来获知 Istio 中一个请求的流程。

另外,用户可以使用如下的一些指令来获取网格状态的更多信息:

  • istioctl proxy-config:如果是在 Kubernetes 中运行,这一命令可以获取到代理配置方面的信息。

    # 获取特定 Pod 中 Envoy 实例的启动配置信息。
    $ istioctl proxy-config bootstrap productpage-v1-bb8d5cbc7-k7qbm
    
    # 获取特定 Pod 中 Envoy 实例的集群配置信息。
    $ istioctl proxy-config cluster productpage-v1-bb8d5cbc7-k7qbm
    
    # 获取特定 Pod 中 Envoy 实例的监听器配置信息。
    $ istioctl proxy-config listener productpage-v1-bb8d5cbc7-k7qbm
    
    # 获取特定 Pod 中 Envoy 实例的路由配置信息。
    $ istioctl proxy-config route productpage-v1-bb8d5cbc7-k7qbm
    
    # 获取特定 Pod 中 Envoy 实例的 Endpoint 配置信息。
    $ istioctl proxy-config endpoints productpage-v1-bb8d5cbc7-k7qbm
    
    # 该命令中包含更多的相关内容:
    $ istioctl proxy-config --help
    
  • kubectl get:获取不同资源在网格以及路由配置的信息。

    # 罗列所有的虚拟服务
    $ kubectl get virtualservices
    
  • Mixer 访问日志:Mixer 所记录的访问日志包含了请求的一些信息。 用户可以通过如下命令来获取:

    # 使用 Istio 网格的命名空间来填充 <istio namespace>。例如:istio-system
    $ TELEMETRY_POD=`kubectl get po -n <istio namespace> | grep istio-telemetry | awk '{print $1;}'`
    $ kubectl logs $TELEMETRY_POD -c mixer  -n istio-system  | grep accesslog
    
我能在 Istio 中使用 Prometheus 抓取应用指标么?

可以。Istio 发行包中带有 Prometheus 配置,不论是否启用了双向 TLS,都可以借此配置来收集应用的指标数据。

在没有启用双向 TLS 的环境中,kubernetes-pods 任务会从 Pod 中收集应用的指标数据。如果 Istio 启用了双向 TLS,就由 kubernetes-pods-istio-secure 任务完成应用指标数据的收集工作。

两个 Job 都需要在欲抓取指标的应用 Pod 中加入如下注解:

  • prometheus.io/scrape: "true"
  • prometheus.io/path: "<metrics path>"
  • prometheus.io/port: "<metrics port>"

一点说明:

  • 如果在 Citadel Pod 能够生成必要证书并分发给 Prometheus 之前启动了 Prometheus Pod,为了能够在双向 TLS 环境下抓取应用指标,必须重启 Prometheus Pod。

  • 如果你的应用在一个单独的端口上开放 Prometheus 指标接口,这个端口需要加入 Service 和 Deployment 清单之中。