使用 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 实例,这有几个原因。也许您希望进行与正在监控的集群分离的长期监控。也许您希望在一个地方监控多个独立的网格。或者您可能还有其他动机。无论您的原因是什么,您都需要一些特殊的配置才能使这一切正常工作。
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 刮取的配置不同。
配置您的生产 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(.*)"}'