度量和日志的常见问题

可以通过 REST 接口访问 Istio 指标吗?

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

如何控制 sidecar 上报数据?

有时会对访问的特定 URL 排除在上报之外,这样做是有用的。例如,你可能希望把健康检测的 URL 剔除。可以配置使用 match 语法来跳过匹配到的 URL 上报,比如:

match: source.name != "health"
如何管理短期指标?

短期指标可能会阻碍 Prometheus 的性能,因为它们通常是标签基数的重要来源。基数是标签唯一值数量的度量。要管理短期指标对 Prometheus 的影响,您必须首先确定高基数指标和标签。Prometheus 在其 /status 页面上提供基数信息。可以通过 PromQL 检索其他信息。 有几种方法可以减少 Istio 指标的基数:

  • 禁用主机报头回退。 destination_service 标签是高基数的一个潜在来源。 如果 Istio 代理无法从其他请求元数据中确定目标服务,则 destination_service 的值默认出现在主机报头中。 如果客户端使用各种主机报头,这可能会导致 destination_service 产生的大量值。 在这种情况下,请按照指标自定义指南禁用主机报头回退网格范围。 要禁用特定工作负载或命名空间的主机头回退,您需要复制统计 EnvoyFilter 配置,更新它以禁用主机报头回退,并应用一个更具体的选择器。 这个问题有更多关于如何实现这一点的细节。
  • 从集合中删除不必要的标签。如果不需要具有高基数的标签,您可以使用 tags_to_remove 通过指标自定义 将其从指标集合中删除。
  • 通过联合或分类规范化标签值。 如果需要标签提供的信息,您可以使用 Prometheus 联邦请求分类来规范化标签。
如何迁移现有的 Mixer 功能?

Mixer在 Istio 1.8 版本中被移除。 如果您仍然依赖于 Mixer 的内置适配器或任何进程外的适配器进行网格扩展,则需要迁移。

对于内置适配器,提供了几种替代方案:

对于自定义进程外适配器,强烈建议迁移到基于 Wasm 的扩展。请参阅有关 Wasm 模块开发扩展分发的指南。作为临时解决方案,您可以在 Mixer 中启用 Envoy ext-authz 和 gRPC 访问日志 API 支持,这允许您将 Istio 升级到发布 1.7 版本,同时仍然使用 1.7 Mixer 的进程外适配器。这将使您有更多时间迁移到基于 Wasm 的扩展。请注意,此临时解决方案未经实战测试,不太可能得到补丁修复,因为它只在 Istio 1.7 分支上可用,这是在 2021 年 2月 之后的支持窗口之外的。

Prometheus 适配器能在非 Kubernetes 环境下使用吗?

您可以使用 docker-compose 来安装 Prometheus。

怎样查看 Istio 的请求都发生了什么?

您可以启用 tracing 以确定 Istio 中的请求是怎样流动的。

另外,您还可以使用如下命令以了解网格中的更多状态信息:

  • istioctl proxy-config:获取 Kubernetes 运行期间的 proxy 配置信息:

    # 在指定的 pod 中 Envoy 实例的启动(bootstrap)配置信息。
    $ istioctl proxy-config bootstrap productpage-v1-bb8d5cbc7-k7qbm
    
    # 在指定的 pod 中 Envoy 实例的集群(cluster)配置信息。
    $ istioctl proxy-config cluster productpage-v1-bb8d5cbc7-k7qbm
    
    # 在指定的 pod 中 Envoy 实例的监听器(listener)配置信息。
    $ istioctl proxy-config listener productpage-v1-bb8d5cbc7-k7qbm
    
    # 在指定的 pod 中 Envoy 实例的路由(route)配置信息。
    $ istioctl proxy-config route productpage-v1-bb8d5cbc7-k7qbm
    
    # 在指定的 pod 中 Envoy 实例的端点(endpoint)配置信息。
    $ istioctl proxy-config endpoints productpage-v1-bb8d5cbc7-k7qbm
    
    # 查看更多 proxy-config 的用法可用如下命令
    $ istioctl proxy-config --help
    
  • kubectl get:通过路由配置获取网格中不同资源的信息:

    # 列出所有的 virtual services
    $ kubectl get virtualservices
    
我可以使用 Prometheus 配合 Istio 抓取应用程序指标吗?

是的。Istio 附带 Prometheus 的配置,在启用或禁用双向 TLS 时启动收集应用程序指标的功能。

kubernetes-pods job 从没有双向 TLS 环境中的 pod 收集应用程序指标。当为 Istio 启用双向 TLS 时,kubernetes-pods-istio-secure job 从应用程序的 pod 中收集指标。

这两个 job 都要求将以下注释添加到需要从中收集应用程序指标的所有 deployment 中:

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

一些注意事项:

  • 如果 Prometheus pod 在 Istio Citadel pod 生成所需证书并将其分发给 Prometheus 之前启动,则 Prometheus pod 需要重启以便收集双向 TLS 保护的目标信息。
  • 如果您的应用程序在专用端口上公开了 Prometheus 指标,则应将该端口添加到 service 和 deployment 规范中。