2020 It邦幫忙鐵人賽 系列文章
由於我比較熟悉 GCP / GKE 的服務,這篇的操作過程都會以 GCP 平台作為範例,不過操作過程大體上是跨平台通用的。
寫文章真的是體力活,覺得我的文章還有參考價值,請左邊幫我點讚按個喜歡,右上角幫我按個追縱,底下歡迎留言討論。給我一點>繼續走下去的動力。
對我的文章有興趣,歡迎到我的網站上 https://chechiachang.github.io 閱讀其他技術文章>,有任何謬誤也請各方大德直接聯繫我,感激不盡。
生產環境與非生產環境,其中的一指標就是有沒有足夠完整的服務監測系統,這句話可以看出服務監測對於產品化是多麼重要。而監>控資料 (metrics) 的收集與可視化工具其實非常多,例如上周介紹的 ELK Stack,這次我們要來介紹另外一個很多人使用的 prometheus。
Promethues 在官網上提到 是一個 Monitoring system and time series database
基本上 Prometheus 跟 ELK 比,其實是很奇怪的一件事,但這也是最常被問的一個問題。兩者在本質上是完全不同的系統。
是的,他們都能做 metrics 收集,在有限的尺度下,能達到一樣的效果。但這樣說的意思就等於是在說 mesos DC/OS 與 kubenetes 都能跑 container cluster 一樣,底下是完全不一樣的東西。
兩者的差異使用上差非常多
如果要收集服務運行資料,可以直接選 prometheus。如果有收集 log 進行交叉比對,可以考慮 elk。
我們這邊用 helm 部屬,之所以用 helm ,因為這是我想到最簡單的方法,能讓輕鬆擁有一套功能完整的 prometheus。所以我們先用
。
沒用過 helm 的大德可以參考 Helm Quickstart,先把 helm cli 與 kubernetes 上的 helm tiller 都設定好
我把我的寶藏都放在這了https://github.com/chechiachang/prometheus-kubernetes
下載下來的 .sh ,跑之前養成習慣貓一下
cat install.sh
#!/bin/bash
HELM_NAME=prometheus-1
helm upgrade --install ${HELM_NAME} stable/prometheus \
--namespace default \
--values values-staging.yaml
values.yaml 很長,但其實各個元件設定是重複的,設定好各自的 image,
replicas, service, topology 等等
alertmanager:
enabled: true
kubeStateMetrics:
enabled: true
nodeExporter:
enabled: true
server:
enabled: true
pushgateway:
enabled: true
底下有更多 runtime 的設定檔
server:
global:
## How frequently to scrape targets by default
##
scrape_interval: 10s
## How long until a scrape request times out
##
scrape_timeout: 10s
## How frequently to evaluate rules
##
evaluation_interval: 10s
persistentVolume:
## If true, Prometheus server will create/use a Persistent Volume Claim
## If false, use emptyDir
##
enabled: true
## Prometheus server data Persistent Volume access modes
## Must match those of existing PV or dynamic provisioner
## Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
##
accessModes:
- ReadWriteOnce
## Prometheus server data Persistent Volume annotations
##
annotations: {}
## Prometheus server data Persistent Volume existing claim name
## Requires server.persistentVolume.enabled: true
## If defined, PVC must be created manually before volume will be bound
existingClaim: ""
## Prometheus server data Persistent Volume mount root path
##
mountPath: /data
## Prometheus server data Persistent Volume size
##
size: 80Gi
alertmanagerFiles:
serverFiles:
部屬完看一下
kubectl get pods --selector='app=prometheus'
NAME READY STATUS RESTARTS AGE
prometheus-alertmanager-694d6694c6-dvkwd 2/2 Running 0 8d
prometheus-kube-state-metrics-85f6d75f8b-7vlkp 1/1 Running 0 8d
prometheus-node-exporter-2mpjc 1/1 Running 0 8d
prometheus-node-exporter-kg7fj 1/1 Running 0 51d
prometheus-node-exporter-snnn5 1/1 Running 0 8d
prometheus-pushgateway-5cdfb4979c-dnmjn 1/1 Running 0 8d
prometheus-server-59b8b8ccb4-bplkx 2/2 Running 0 8d
kubectl get services --selector='app=prometheus'
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
prometheus-alertmanager ClusterIP 10.15.241.66 <none> 80/TCP 197d
prometheus-kube-state-metrics ClusterIP None <none> 80/TCP 197d
prometheus-node-exporter ClusterIP None <none> 9100/TCP 197d
prometheus-pushgateway ClusterIP 10.15.254.0 <none> 9091/TCP 197d
prometheus-server ClusterIP 10.15.245.10 <none> 80/TCP 197d
kubectl get endpoints --selector='app=prometheus'
NAME ENDPOINTS AGE
prometheus-alertmanager 10.12.6.220:9093 197d
prometheus-kube-state-metrics 10.12.6.222:8080 197d
prometheus-node-exporter 10.140.0.30:9100,10.140.0.9:9100,10.140.15.212:9100 197d
prometheus-pushgateway 10.12.6.211:9091 197d
prometheus-server 10.12.3.14:9090 197d
簡單說明一下
主要服務存取就是透過 prometheus-server
除了直接 exec -it 進去 prometheus-server 以外,由於 prometheus 本身有提供 web portal, 所以我們這邊透過 port forwarding 打到本機上
PROMETHEUS_POD_NAME=$(kc get po -n default --selector='app=prometheus,component=server' -o=jsonpath='{.items[0].metadata.name}')
kubectl --namespace default port-forward ${PROMETHEUS_POD_NAME} 9090
透過 browser 就可以連入操作
http://localhost:9090
也可以透過 HTTP API 用程式接入控制
Prometheus 本身提供的 UI 其實功能就很強大