開始以為只要安裝 prometheus-operator 就行了。
git clone https://github.com/coreos/prometheus-operator.git
cd prometheus-operator
sed 's/namespace: default/namespace: monitoring/g' bundle.yaml | kubectl apply -f -
安裝后發現只有一個 prometheus-operator pod 。
$ kubectl get pods -n monitoring
NAME READY STATUS RESTARTS AGE
prometheus-operator-99dccdc56-qq5lm 1/1 Running 0 20m
這時才發現真正要安裝的是 kube-prometheus 。
git clone https://github.com/coreos/kube-prometheus.git
cd kube-prometheus
kubectl create -f manifests/setup && \
until kubectl get servicemonitors --all-namespaces ; do date; sleep 1; echo ""; done && \
kubectl create -f manifests/
kube-prometheus 中包含了 prometheus 監控所用到的所有組件,當然也包含 prometheus-operator 。
$ kubectl get pods -n monitoring
NAME READY STATUS RESTARTS AGE
alertmanager-main-0 2/2 Running 0 112m
grafana-58dc7468d7-pv256 1/1 Running 0 112m
kube-state-metrics-769f4fd4d5-4hfpk 3/3 Running 0 112m
node-exporter-4grdx 2/2 Running 0 112m
prometheus-adapter-5cd5798d96-6zq6f 1/1 Running 0 112m
prometheus-k8s-0 3/3 Running 1 112m
prometheus-operator-99dccdc56-vqq7m 1/1 Running 0 112m
注:如果在部署過程中出現 ErrImagePull 錯誤,那是因為下載 docker 鏡像超時了,可以登錄到對應的 node 手動 pull 鏡像。
安裝 prometheus 之前,運行 kubectl top 命令會報錯 。
$ kubectl top node
Error from server (NotFound): the server could not find the requested resource (get services http:heapster:)
這是由於沒有安裝 metrics-server ,在 kube-prometheus 的 readme 中有這樣一段說明文字:
The kube-prometheus stack includes a resource metrics API server, so the metrics-server addon is not necessary. Ensure the metrics-server addon is disabled on minikube.
從而知道 kube-prometheus 中包含了 resource metrics API server ,所以安裝好 kube-prometheus 之后 kubectl top node 也能正常執行了。
kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k8s-master0 1715m 85% 1001Mi 26%
k8s-master1 347m 17% 972Mi 25%
k8s-master2 286m 14% 1016Mi 26%
k8s-node4 373m 9% 1550Mi 19%
安裝好 prometheus 之后通過 kubectl port-forward 命令暴露端口,可以通過瀏覽器分別訪問 Prometheus, Grafana, AlertManager 控制台了,控制台效果見 Kubernetes Monitoring with Prometheus 。
kubectl --namespace monitoring port-forward svc/prometheus-k8s 9090 --address 10.0.1.81
kubectl port-forward $(kubectl get pods --selector=app=grafana -n monitoring --output=jsonpath="{.items..metadata.name}") -n monitoring 3000 --address 10.0.1.81
kubectl port-forward -n monitoring alertmanager-main-0 9093 --address 10.0.1.81
注1:上面的 10.0.1.81 換成你的服務器 IP 地址,如果不指定 --address ,只能通過 localhost 訪問。
注2:也可以通過修改 prometheus-service.yaml , grafana-service.yaml , alertmanager-service.yaml 配置文件暴露控制台端口。
到這里只是部署了 metrics api server ,只能獲取到 CPU 與內存這2個核心指標,通過下面的命令可以看到這個 api service v1beta1.metrics.k8s.io :
kubectl get apiservices -n monitoring | grep metrics
NAME SERVICE AVAILABLE AGE
v1beta1.metrics.k8s.io monitoring/prometheus-adapter True 27h
通過下面的命令可以向已經部署的 metrics api 發請求。
kubectl get --raw "/apis/metrics.k8s.io/v1beta1" | jq .
接下來需要進一步安裝 k8s-prometheus-adapter 以部署 custom metrics api server (walkthrough)。
首先從 github 上簽出 k8s-prometheus-adapter 倉庫
git clone https://github.com/DirectXMan12/k8s-prometheus-adapter.git
cd k8s-prometheus-adapter
接着創建 CA 證書並將證書用 secret 保存
$ export PURPOSE=serving
$ openssl req -x509 -sha256 -new -nodes -days 365 -newkey rsa:2048 -keyout ${PURPOSE}.key -out ${PURPOSE}.crt -subj "/CN=ca"
$ echo '{"signing":{"default":{"expiry":"43800h","usages":["signing","key encipherment","'${PURPOSE}'"]}}}' > "${PURPOSE}-ca-config.json"
$ kubectl -n monitoring create secret generic cm-adapter-serving-certs --from-file=./serving.crt --from-file=./serving.key
然后進入 deploy 文件夾,用下面的腳本進行部署:
for f in manifests/*.yaml
do
sed -i 's/namespace: custom-metrics/namespace: monitoring/g' $f | kubectl apply -f -
done
該腳本是為了將 namespace 由 custom-metrics 替換為 monitoring ,因為之前部署 prometheus 時用的是 monitoring 命名空間。
部署完成后就可以看到 v1beta1.custom.metrics.k8s.io 這個 custom metrics api 。
$ kubectl get apiservices -n monitoring | grep metrics
v1beta1.custom.metrics.k8s.io monitoring/custom-metrics-apiserver True 12h
v1beta1.metrics.k8s.io monitoring/prometheus-adapter True 43h
用下面的命令請求這個 api :
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1" | jq .
{
"kind": "APIResourceList",
"apiVersion": "v1",
"groupVersion": "custom.metrics.k8s.io/v1beta1",
"resources": []
}
發現 resources 為空,參考 github 上的 issue Resources list is empty at /apis/custom.metrics.k8s.io/v1beta1/ ,將 k8s-prometheus-adapter/deploy/manifests/custom-metrics-apiserver-deployment.yaml 中的 --prometheus-url=http://prometheus.prom.svc:9090/ 改為 --prometheus-url=http://prometheus-k8s.monitoring.svc:9090/ ,重新部署后解決。
kubectl apply -f custom-metrics-apiserver-deployment.yaml
后續:排查 Kubernetes HPA 通過 Prometheus 獲取不到 http_requests 指標的問題
