Deploy GMP with Kube-Prometheus
之前跟大家分享過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內部使用狀態), 或是NodeExporter(OS節點上的效能資訊),捧油們可以參考部署。
(2) Self-Deployed Collector [Ref 2]: 這部分之前的Blog我是使用開源的prometheus搭配Jobs的方式進行Scrape,有一些同事建議我應該使用大家比較常用的kube-prometheus stack來介紹,今天我們就分享GMP Self-Deployed Collector如何落地在這個開源專案上,並快速搭建一整套的kiali, jaeger (如下圖)。
使用元件:
在撰寫這一篇的時候,我們使用的安裝元件版本如下:
- 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