使用Prometheus監控kubernetes集羣

使用Prometheus監控kubernetes集羣

⚠️注意:Prometheus和Grafana已經支持helm快速安裝(http://www.javashuo.com/article/p-udvmvitt-gr.html),下面的方法不建議使用。node

--------------------------------------------------------------git

一鍵安裝(網絡可訪問quay.io):github

kubectl apply --filename https://raw.githubusercontent.com/giantswarm/kubernetes-prometheus/master/manifests-all.yaml

操做面板(到https://github.com/giantswarm/kubernetes-prometheus下載文件):docker

kubectl apply --filename ./manifests/grafana/import-dashboards/job.yaml

 

國內:json

咱們使用 Giantswarm 開源的 kubernetes-promethues 來監控 kubernetes 集羣,全部的 YAML 文件能夠在 ../manifests/prometheus 目錄下找到。api

須要用到的鏡像有:網絡

  • sz-pg-oam-docker-hub-001.tendcloud.com/library/prometheus-alertmanager:v0.7.1
  • sz-pg-oam-docker-hub-001.tendcloud.com/library/grafana:4.2.0
  • sz-pg-oam-docker-hub-001.tendcloud.com/library/giantswarm-tiny-tools:latest
  • sz-pg-oam-docker-hub-001.tendcloud.com/library/prom-prometheus:v1.7.0
  • sz-pg-oam-docker-hub-001.tendcloud.com/library/kube-state-metrics:v1.0.1
  • sz-pg-oam-docker-hub-001.tendcloud.com/library/dockermuenster-caddy:0.9.3
  • sz-pg-oam-docker-hub-001.tendcloud.com/library/prom-node-exporter:v0.14.0

同時備份到時速雲:app

  • index.tenxcloud.com/jimmy/prometheus-alertmanager:v0.7.1
  • index.tenxcloud.com/jimmy/grafana:4.2.0
  • index.tenxcloud.com/jimmy/giantswarm-tiny-tools:latest
  • index.tenxcloud.com/jimmy/prom-prometheus:v1.7.0
  • index.tenxcloud.com/jimmy/kube-state-metrics:v1.0.1
  • index.tenxcloud.com/jimmy/dockermuenster-caddy:0.9.3
  • index.tenxcloud.com/jimmy/prom-node-exporter:v0.14.0

:全部鏡像都是從官方鏡像倉庫下載下。curl

部署

我將部署時須要用的的配置文件分紅了 namespace、serviceaccount、configmaps、clusterrolebinding 和最後的部署 prometheus、grafana 的過程。ide

## 建立 monitoring namespaece
kubectl create -f prometheus-monitoring-ns.yaml
## 建立 serviceaccount
kubectl create -f prometheus-monitoring-serviceaccount.yaml
## 建立 configmaps
kubectl create -f prometheus-configmaps.yaml
## 建立 clusterrolebinding
kubectl create clusterrolebinding kube-state-metrics --clusterrole=cluster-admin --serviceaccount=monitoring:kube-state-metrics
kubectl create clusterrolebinding prometheus --clusterrole=cluster-admin --serviceaccount=monitoring:prometheus
## 部署 Prometheus
kubectl create -f prometheus-monitoring.yaml

訪問 kubernetes 任何一個 node 上的 Grafana service 的 nodeport:

Grafana頁面

圖片 - Grafana頁面

該圖中的數據顯示明顯有問題,還須要修正。

prometheus-monitoring.yaml 文件中有一個 Job 就是用來導入 grafana dashboard 配置信息的,若是該 Job 執行失敗,能夠單獨在在 monitoring 的 namespace 中啓動一個容器,將 manifests/prometheus 目錄下的 json 文件複製到容器中,而後進入容器 json 文件的目錄下執行:

for file in *-datasource.json ; do
              if [ -e "$file" ] ; then
                echo "importing $file" &&
                curl --silent --fail --show-error \
                  --request POST http://admin:admin@grafana:3000/api/datasources \
                  --header "Content-Type: application/json" \
                  --data-binary "@$file" ;
                echo "" ;
              fi
            done ;
            for file in *-dashboard.json ; do
              if [ -e "$file" ] ; then
                echo "importing $file" &&
                ( echo '{"dashboard":'; \
                  cat "$file"; \
                  echo ',"overwrite":true,"inputs":[{"name":"DS_PROMETHEUS","type":"datasource","pluginId":"prometheus","value":"prometheus"}]}' ) \
                | jq -c '.' \
                | curl --silent --fail --show-error \
                  --request POST http://admin:admin@grafana:3000/api/dashboards/import \
                  --header "Content-Type: application/json" \
                  --data-binary "@-" ;
                echo "" ;
              fi
            done

這樣也能夠向 grafana 中導入 dashboard。

存在的問題

該項目的代碼中存在幾個問題。

1. RBAC 角色受權問題

須要用到兩個 clusterrolebinding:

  • kube-state-metrics,對應的serviceaccountkube-state-metrics
  • prometheus,對應的 serviceaccount是 prometheus-k8s

在部署 Prometheus 以前應該先建立 serviceaccount、clusterrole、clusterrolebinding 等對象,不然在安裝過程當中可能由於權限問題而致使各類錯誤,因此這些配置應該寫在一個單獨的文件中,而不該該跟其餘部署寫在一塊兒,即便要寫在一個文件中,也應該寫在文件的最前面,由於使用 kubectl 部署的時候,kubectl 不會判斷 YAML 文件中的資源依賴關係,只是簡單的從頭部開始執行部署,所以寫在文件前面的對象會先部署。

解決方法

也能夠繞過複雜的 RBAC 設置,直接使用下面的命令將對應的 serviceaccount 設置成 admin 權限,以下:

kubectl create clusterrolebinding kube-state-metrics --clusterrole=cluster-admin --serviceaccount=monitoring:kube-state-metrics
kubectl create clusterrolebinding prometheus --clusterrole=cluster-admin --serviceaccount=monitoring:prometheus

參考 RBAC——基於角色的訪問控制

2. API 兼容問題

從 kube-state-metrics 日誌中能夠看出用戶 kube-state-metrics 沒有權限訪問以下資源類型:

  • *v1.Job
  • *v1.PersistentVolumeClaim
  • *v1beta1.StatefulSet
  • *v2alpha1.CronJob

而在咱們使用的 kubernetes 1.6.0 版本的集羣中 API 路徑跟 kube-state-metrics 中不一樣,沒法 list 以上三種資源對象的資源。詳情見:https://github.com/giantswarm/kubernetes-prometheus/issues/77

3. Job 中的權限認證問題

在 grafana-import-dashboards 這個 job 中有個 init-containers 其中指定的 command 執行錯誤,應該使用

curl -sX GET -H "Authorization:bearer `cat /var/run/secrets/kubernetes.io/serviceaccount/token`" -k https://kubernetes.default/api/v1/namespaces/monitoring/endpoints/grafana

不須要指定 csr 文件,只須要 token 便可。

參考 wait-for-endpoints init-containers fails to load with k8s 1.6.0 #56

參考

Kubernetes Setup for Prometheus and Grafana

RBAC——基於角色的訪問控制

wait-for-endpoints init-containers fails to load with k8s 1.6.0 #56

相關文章
相關標籤/搜索