Deploy GMP with Kube-Prometheus

Shawn Ho
輕鬆小品-k8s的點滴
11 min readApr 7, 2023

之前跟大家分享過Google Managed Prometheus 主要是提供一個基於Google Monarch Collector,將K8S叢集內相關的Metrics都收集回到Monarch。這個Managed Collector 有兩種部署方式:

(1) Managed Collector CRDs [Ref 1]: 這個機制之前介紹過,離上次介紹到現在也快一年了,Managed CRDs也不僅止有PodMonitoring來收集Application Metrics,也補齊了叢集內部的Kube-State-Metrics (通過kube-apiserver回報叢集內元件狀態的Agent),cAdvisor+Kubelet Exporter(回報容器cgroup內部使用狀態), 或是NodeExporterOS節點上的效能資訊),捧油們可以參考部署。

(2) Self-Deployed Collector [Ref 2]: 這部分之前的Blog我是使用開源的prometheus搭配Jobs的方式進行Scrape,有一些同事建議我應該使用大家比較常用的kube-prometheus stack來介紹,今天我們就分享GMP Self-Deployed Collector如何落地在這個開源專案上,並快速搭建一整套的kiali, jaeger (如下圖)。

藍色部分:Kube-Prometheus, 綠色部分:Istio (aka ASM), 橘色部分: (3rd-party Exporter)

使用元件:

在撰寫這一篇的時候,我們使用的安裝元件版本如下:

  • Kube-Prometheus: Release 45.4.0
  • ASM: Release 1.16.2

部署Kube-Prometheus:

其中我們把kube-prometheus的values.yaml修改以下三個地方:

(1) 修改prometheus.PrometheusSpec如下

    image:
registry: gke.gcr.io
repository: prometheus-engine/prometheus
tag: v2.35.0-gmp.2-gke.0
sha: ""

(2) 為了整合第三方的Exporter,我們將開放使用者可自定義,並保留Helm內部ServiceMonitor & PodMonitor的機制,我們將prometheus.serviceMonitorSelectorNilUsesHelmValues 跟 prometheus.podMonitorSelectorNilUsesHelmValues皆設定為False

    serviceMonitorSelectorNilUsesHelmValues: false
podMonitorSelectorNilUsesHelmValues: false

(3) 修改NodeExporter的Port: (Optional)

如果現有的叢集已經有帶著自己的NodeExporter (e.g. Anthos Bare Metal),我們可以藉由修改以下的values.yaml讓kube-prometheus所部署的NodeExporter使用其他的通訊阜(Port)

prometheus-node-exporter:
namespaceOverride: ""
podLabels:
## Add the 'node-exporter' label to be used by serviceMonitor to match standard common usage in rules and grafana dashboards
##
jobLabel: node-exporter
releaseLabel: true
extraArgs:
- --collector.filesystem.mount-points-exclude=^/(dev|proc|sys|var/lib/docker/.+|var/lib/kubelet/.+)($|/)
- --collector.filesystem.fs-types-exclude=^(autofs|binfmt_misc|bpf|cgroup2?|configfs|debugfs|devpts|devtmpfs|fusectl|hugetlbfs|iso9660|mqueue|nsfs|overlay|proc|procfs|pstore|rpc_pipefs|securityfs|selinuxfs|squashfs|sysfs|tracefs)$
service:
portName: http-metrics
port: 9101
targetPort: 9101

(4) 部署kube-prometheus: 使用以下命令進行部署

helm install prometheus -n monitoring -f ./values.yaml kube-prometheus-stack/

部署Anthos Service Mesh to enable Istio-Proxy Scraper:

我們將Anthos Service Mesh, Kiali, Jaeger等三個部署機制,在這裡一起實現,分成四個步驟:

(1) 部署Anthos Service Mesh: 這裡依照ASM的標準部署步驟,部署In-Cluster Control Plane 加上Istio-IngressGateway,以下假設Istio-IngressGateway被部署於Namespace: gateway。

(2) 部署Jaeger: 這裡我們使用ASM安裝後,產生出的Jaeger.yaml,路徑應位於${asm_outputdir}/istio-${asm_version}/samples/addons/jaeger.yaml

(3) 部署Kiali: 雖然asm的安裝目錄下,也有Kiali.yaml,但由於我們需要介接GMP,需快速修改對應的external_services參數如下:

    external_services:
custom_dashboards:
enabled: true
istio:
config_map_name: "istio-${ASM_LABEL}"
istio_sidecar_injector_config_map_name: "istio-sidecar-injector-${ASM_LABEL}"
istiod_deployment_name: "istiod-${ASM_LABEL}"
root_namespace: istio-system
istio_labels:
app_label_name: "app"
version_label_name: "version"
prometheus:
url: ${PROMETHEUS_SERVICE}
grafana:
enabled: true
in_cluster_url: ${GRAFANA_SERVICE}
tracing:
enabled: true
in_cluster_url: 'http://tracing.istio-system.svc:16685/jaeger'
use_grpc: true

(4) 部署Istiod的ServiceMonitor Scraper:

使用以下的ServiceMonitor來排程讓GMP取得Istio-Ingressgateway跟Istiod的

---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: istio-ingressgateway
spec:
selector:
matchLabels:
istio: ingressgateway
namespaceSelector:
matchNames:
- gateway
endpoints:
- targetPort: http-envoy-prom
path: /stats/prometheus
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: istiod
spec:
selector:
matchLabels:
app: istiod
namespaceSelector:
matchNames:
- istio-system
endpoints:
- targetPort: 15014
interval: 15s
path: /metrics

上述kube-prometheus + ASM是一個簡易的安裝說明,詳細的部署樣板,請見這個GitLab Project

安裝說明:

這個專案裡面有分成五個角色(由上而下):

  • Cloud Admin:
  • Network Admin:
  • Cluster Admin (Anthos BM & GKE):
  • Developer:
  • Data Scientist:

如果想要測試Anthos BM + GMP的功能,請要先執行Cloud Admin + Network Admin的terraform script 創建出Project + VPC,就可以將Anthos BM安裝在生成的專案與VPC上。GMP的部分,在Anthos BM裝好後,可以通過IAP登入admin-workstation的VM,執行裏面的monitoring 3個Sub-Folder裡的install.sh腳本,就可以將Anthos Connect Gateway, Kube-Prometheus, 與ASM安裝完畢。

anthos-bm % tree -L 2 monitor 
monitor
├── 0_connectgw
│ ├── README.md
│ └── install.sh
├── 1_kube-prometheus
│ ├── README.md
│ ├── install.sh
│ └── values.yaml
├── 2_asm
│ ├── README.md
│ ├── install.sh
│ ├── istio-prometheus-scrape.yaml
│ ├── istio-sidecar.yaml
│ └── samples
└── env.sh

安裝後驗證:

如果使用Anthos Bare Metal作為測試叢集,由於安裝腳本是使用GCE,並通過VxLAN打一層Overlaid Tunnel,所以如果想要看安裝的結果,最簡單的方式是在Anthos Admin Workstation機器上,通過Tunnel接到外部Client(如果使用腳本安裝,會自動在防火牆上開啟8010–8013 4個TCP port,供服務使用)

# 看Grafana
kubectl port-forward svc/prometheus-grafana -n monitoring 8081:80 --address 0.0.0.0

# 看Prometheus
kubectl port-forward -n monitoring svc/prometheus-kube-prometheus-prometheus 8011:9090 --address 0.0.0.0

再使用IAP-Tunnel在桌機上,將本機的8080 port,接入上述發布出來的Admin Workstation 通訊阜 (e.g. 8011):

gcloud compute start-iap-tunnel cluster1-abm-ws0-001 8011 --local-host-port=localhost:8080

這時我們打開瀏覽器,連線localhost:8080 就可以看到Grafana的登入畫面,如果使用預設的帳密:admin/prom-operator

Using Port-Forwarding and Start-IAP-Tunnel to view the Grafana inside Anthos BM

--

--

Shawn Ho
輕鬆小品-k8s的點滴

一個心態年輕的中年大叔。年輕時不學好~ 台大電機畢業後,去美國取得了博士學位,念完博士後,不想教書。當過補習班老師,碼農,產品總監,ISO稽核顧問,技術銷售,目前在Google Cloud跟客戶一起玩Kubernetes,也跟喜歡的客戶在金融, 政府, 電信, 高科技業內共同成長學習是斜槓人生的好案例。