使用 Prometheus 监控多集群 Istio

概述

本指南旨在提供有关如何配置由两个或多个独立 Kubernetes 集群组成的 Istio 网格监控的操作指南。它并非旨在确定唯一可能的解决方案,而是旨在演示一种使用 Prometheus 进行多集群遥测的可行方法。

我们建议使用 Prometheus 的 Istio 多集群监控方案建立在 Prometheus 分层联合的基础之上。由 Istio 部署到每个集群的本地 Prometheus 实例充当初始收集器,然后联合到生产网格范围的 Prometheus 实例。该网格范围的 Prometheus 可以位于网格外部(外部),也可以位于网格内的某个集群中。

多集群 Istio 设置

请按照多集群安装部分中的说明,在受支持的多集群部署模型之一中设置 Istio 集群。对于本指南的目的,任何这些方法都可以使用,但需注意以下事项

确保在每个集群中都安装了集群本地 Istio Prometheus 实例。

每个集群中单独部署 Istio Prometheus 是必需的,它通过联合到在外部或某个集群中运行的生产就绪型 Prometheus 实例,形成了跨集群监控的基础。

验证每个集群中是否正在运行 Prometheus 实例

$ kubectl -n istio-system get services prometheus
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
prometheus   ClusterIP   10.8.4.109   <none>        9090/TCP   20h

配置 Prometheus 联合

外部生产 Prometheus

您可能希望在 Istio 部署之外运行 Prometheus 实例,这有几个原因。也许您希望进行与正在监控的集群分离的长期监控。也许您希望在一个地方监控多个独立的网格。或者您可能还有其他动机。无论您的原因是什么,您都需要一些特殊的配置才能使这一切正常工作。

Architecture of external Production Prometheus for monitoring multicluster Istio.
用于监控多集群 Istio 的外部生产 Prometheus

Istio 提供了一种通过网关在外部公开集群服务的方法。您可以为集群本地 Prometheus 配置一个入口网关,为集群内 Prometheus 端点提供外部连接。

对于每个集群,请按照远程访问遥测附加组件任务中的相应说明操作。另请注意,您**应该**建立安全的(HTTPS)访问。

接下来,使用如下所示的配置(替换入口域名和集群名称)配置您的外部 Prometheus 实例以访问集群本地 Prometheus 实例

scrape_configs:
- job_name: 'federate-{{CLUSTER_NAME}}'
  scrape_interval: 15s

  honor_labels: true
  metrics_path: '/federate'

  params:
    'match[]':
      - '{job="kubernetes-pods"}'

  static_configs:
    - targets:
      - 'prometheus.{{INGRESS_DOMAIN}}'
      labels:
        cluster: '{{CLUSTER_NAME}}'

注释

  • CLUSTER_NAME 应设置为创建集群时使用的相同值(通过 values.global.multiCluster.clusterName 设置)。

  • 未提供对 Prometheus 端点的身份验证。这意味着任何人都可以查询您的集群本地 Prometheus 实例。这可能不可取。

  • 如果没有正确配置网关的 HTTPS,所有内容都将通过明文传输。这可能不可取。

网格内集群上的生产 Prometheus

如果您希望在其中一个集群中运行生产 Prometheus,则需要从该集群建立到网格中其他集群本地 Prometheus 实例的连接。

这实际上只是外部联合配置的一个变体。在这种情况下,运行生产 Prometheus 的集群上的配置与远程集群 Prometheus 刮取的配置不同。

Architecture of in-mesh Production Prometheus for monitoring multicluster Istio.
用于监控多集群 Istio 的网格内生产 Prometheus

配置您的生产 Prometheus 以访问本地远程 Prometheus 实例。

首先执行以下命令

$ kubectl -n istio-system edit cm prometheus -o yaml

然后为远程集群添加配置(替换每个集群的入口域名和集群名称),并为本地集群添加一个配置

scrape_configs:
- job_name: 'federate-{{REMOTE_CLUSTER_NAME}}'
  scrape_interval: 15s

  honor_labels: true
  metrics_path: '/federate'

  params:
    'match[]':
      - '{job="kubernetes-pods"}'

  static_configs:
    - targets:
      - 'prometheus.{{REMOTE_INGRESS_DOMAIN}}'
      labels:
        cluster: '{{REMOTE_CLUSTER_NAME}}'

- job_name: 'federate-local'

  honor_labels: true
  metrics_path: '/federate'

  metric_relabel_configs:
  - replacement: '{{CLUSTER_NAME}}'
    target_label: cluster

  kubernetes_sd_configs:
  - role: pod
    namespaces:
      names: ['istio-system']
  params:
    'match[]':
    - '{__name__=~"istio_(.*)"}'
    - '{__name__=~"pilot(.*)"}'
此信息是否有用?
您是否有任何改进建议?

感谢您的反馈!