度量和日志的常见问题

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

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

代理内遥测(v2)和基于 Mixer 的遥测(v1)报告的遥测有什么区别?

与基于 Mixer 的遥测 (v1) 方法相比,代理内遥测 (v2) 降低了资源成本并提高了代理性能,是 Istio 中呈现遥测的首选机制。 但是,v1 和 v2 之间报告的遥测数据区别不大,如下所列:

  • 网格外流量缺少标签

    代理内遥测依赖于 Envoy 代理之间的元数据交换来收集对​​等工作负载名称、命名空间和标签等信息。 在基于 Mixer 的遥测中,此功能由 Mixer 执行,作为将请求属性与平台数据组合的一部分。 此元数据交换由 Envoy 代理通过为 HTTP 协议添加特定 HTTP 标头或为 TCP 协议增加 ALPN 协议来执行, 如此处所述。 这需要在客户端和服务器工作负载中注入 Envoy 代理,这意味着当一个对等点不在网格中时报告的遥测数据将缺少如工作负载名称、命名空间和标签等对等点属性。 但是,如果两个对等点都注入了代理,则此处提到的所有标签都可以在生成的指标中使用。 当服务器工作负载脱离网格时,服务器工作负载元数据仍被分发到客户端边车,导致客户端指标填充了服务器工作负载元数据标签。

  • TCP 元数据交换需要 mTLS

    TCP 元数据交换依赖于 Istio ALPN 协议, 该协议需要启用双向 TLS (mTLS) 以便 Envoy 代理能够成功交换元数据。 这意味着如果您的集群中未启用 mTLS,则 TCP 协议的遥测将不包括工作负载名称、命名空间和标签等对等信息。

  • 没有为直方图指标配置自定义存储桶的机制

    基于 Mixer 的遥测支持为直方图类型指标(如请求持续时间和 TCP 字节大小)自定义存储桶。 代理内遥测没有这样的可用机制。此外,与基于 Mixer 的遥测中的秒数相比,代理内遥测中可用于延迟指标的存储桶以毫秒为单位。 但是,默认情况下,代理内遥测中有更多存储桶可用于较低延迟级别的延迟指标。

  • 短期指标没有指标过期

    基于 Mixer 的遥测支持指标过期,即在可配置的时间量内未生成的指标将被取消注册以供 Prometheus 采集。 这在生成短期指标的场景(例如一次性作业)中很有用。取消注册指标可防止报告将来不再更改的指标, 从而减少 Prometheus 中的网络流量和存储。这个过期机制在代理内遥测中不可用。 可以在此处找到解决此问题的方法。

如何管理短期指标?

短期指标可能会阻碍 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 规范中。