使用 Prometheus 監控多叢集 Istio
概觀
本指南旨在提供關於如何設定監控由兩個或多個獨立 Kubernetes 叢集組成的 Istio 網格的操作指導。它並非要建立「唯一」可行的途徑,而是要展示一種使用 Prometheus 進行多叢集遙測的可行方法。
我們對於使用 Prometheus 監控 Istio 的多叢集建議,是建立在 Prometheus 階層式聯合的基礎之上。由 Istio 部署在每個叢集本機的 Prometheus 實例充當初始收集器,然後聯合到網格範圍的生產環境 Prometheus 實例。該網格範圍的 Prometheus 可以位於網格之外(外部),或者位於網格內其中一個叢集中。
多叢集 Istio 設定
請遵循多叢集安裝章節,以在支援的多叢集部署模型之一中設定您的 Istio 叢集。就本指南而言,任何這些方法都可行,但需注意以下事項:
請確保每個叢集中都安裝了叢集本機的 Istio Prometheus 實例。
需要在每個叢集中個別部署 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(.*)"}'