⚠️注意: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
須要用到的鏡像有:網絡
同時備份到時速雲:app
注:全部鏡像都是從官方鏡像倉庫下載下。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頁面
該圖中的數據顯示明顯有問題,還須要修正。
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。
該項目的代碼中存在幾個問題。
須要用到兩個 clusterrolebinding:
kube-state-metrics
,對應的serviceaccount
是kube-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
從 kube-state-metrics
日誌中能夠看出用戶 kube-state-metrics 沒有權限訪問以下資源類型:
而在咱們使用的 kubernetes 1.6.0 版本的集羣中 API 路徑跟 kube-state-metrics
中不一樣,沒法 list 以上三種資源對象的資源。詳情見:https://github.com/giantswarm/kubernetes-prometheus/issues/77
在 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
wait-for-endpoints init-containers fails to load with k8s 1.6.0 #56