K8S安裝dashboard、prometheus、grafana進行集羣監控

1.1  準備工做

首先要搭建K8S集羣,請參考另外一篇文檔: https://www.cnblogs.com/taoweizhong/p/10467795.htmlhtml

在此基礎上,本文安裝K8s dashboard、prometheus、grafana進行監控(注意上篇文檔中一個虛擬機的IP地址和這裏有不一樣,緣由沒有配置靜態IP)。前端

本文中涉及容器的部署方式說明:node

  •          K8s dashboard採用K8S集羣管理的部署方式
  •          prometheus和grafana僅僅採用容器化部署,沒有采用K8S集羣管理的部署。

本文須要下載對應的鏡像以下:linux

prom/prometheus latestsql

grafana/grafana latestdocker

docker.io/siriuszg/kubernetes-dashboard-amd64 latest數據庫

docker.io/google/cadvisor v0.24.1(不知道爲啥latest沒法鏈接上prometheus)api

quay.io/prometheus/node-exporter latest瀏覽器

本文組網以下圖:網絡

 

 

1.2  K8S Dashboard

K8S Dashboard是官方的一個基於WEB的用戶界面(我的以爲比較簡陋),專門用來管理K8S集羣,並可展現集羣的狀態。K8S集羣安裝好後默認沒有包含Dashboard,咱們須要額外建立它,下面咱們具體實現如何安裝它。

第一步:查找鏡像

[root@slave1 taoweizhong]# docker search dashboard

docker.io   docker.io/siriuszg/kubernetes-dashboard-amd64    

docker.io/siriuszg/kubernetes-dashboard-amd64                     v1.5.1              be6763d992e0        2 years ago         104 MB           

這裏省略了其餘相似鏡像。

第二步:拉取鏡像:

[root@slave1 taoweizhong]# docker pull docker.io/siriuszg/kubernetes-dashboard-amd64

 

第三步:編寫腳本(這裏dashboard採用K8S集羣管理)

dashboard-service.yaml

[root@master democonfig]# cat dashboard-service.yaml

kind: Service
apiVersion: v1
metadata:
  labels:
    app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 9090
  selector:
    app: kubernetes-dashboard

 

 [root@master democonfig]# cat kubernetes-dashboard.yaml

kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  labels:
    app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: kubernetes-dashboard
  template:
    metadata:
      labels:
        app: kubernetes-dashboard
      annotations:
        scheduler.alpha.kubernetes.io/tolerations: |
          [
            {
              "key": "dedicated",
              "operator": "Equal",
              "value": "master",
              "effect": "NoSchedule"
            }
          ]
    spec:
      containers:
      - name: kubernetes-dashboard
        image: docker.io/siriuszg/kubernetes-dashboard-amd64:v1.5.1
        imagePullPolicy: Always
        ports:
        - containerPort: 9090
          protocol: TCP
        args:
        - --apiserver-host=http://192.168.135.128:8080
        livenessProbe:
          httpGet:
            path: /
            port: 9090
          initialDelaySeconds: 30
          timeoutSeconds: 30

 

第四步:執行並部署

[root@master democonfig]# kubectl create -f kubernetes-dashboard.yaml

[root@master democonfig]# kubectl create -f dashboard-service.yaml

 

這裏對應的刪除腳本爲:

[root@master democonfig]# kubectl delete -f kubernetes-dashboard.yaml

[root@master democonfig]# kubectl delete -f dashboard-service.yaml

 

第五步:訪問Dashboard

先查詢下容器是否啓動:

[root@master democonfig]# kubectl get pods --all-namespaces -o wide

(注意這裏是namespace爲 kube-system,查詢時須要增長命名空間)

打開瀏覽器並輸入:   

http://192.168.135.128:8080/ui   或者

http://192.168.135.128:8080/api/v1/proxy/namespaces/kube-system/services/kubernetes-dashboard/

 

 

遇到的問題說明:

1.關閉iptables防火牆 (若是是防火牆緣由致使的master節點沒法ping通node之上的Pod節點)

systemctl stop iptables

systemctl disable iptables

即便關閉了防火牆跨主機間容器、pod始終沒法ping通

這是因爲linux還有底層的iptables,因此在node上分別執行:

iptables -P INPUT ACCEPT

iptables -P FORWARD ACCEPT

iptables -F

iptables -L -n

2.因爲關閉或者重啓docker而致使的網絡未更新問題引發。

Master節點啓動 注意先啓動kubernetes,再啓動docker(若是是關閉docker或者重啓docker致使的網絡問題,重啓master和node節點,注意重啓順序)

主Master節點重啓順序

systemctl enable docker

systemctl enable etcd kube-apiserver kube-scheduler kube-controller-manager

systemctl restart etcd kube-apiserver kube-scheduler kube-controller-manager

systemctl restart flanneld docker

Node從節點重啓順序

systemctl restart kubelet kube-proxy

systemctl restart flanneld docker

systemctl enable flanneld kubelet kube-proxy docker

1.3  Prometheus安裝

Prometheus 是由 SoundCloud 開發的開源監控報警系統和時序列數據庫(TSDB),自2012年起,許多公司及組織已經採用 Prometheus,該項目有着很是活躍的開發者和用戶社區,如今已成爲一個獨立的開源項目核。

其工做流程是:Prometheus server 按期從配置好的 jobs 或者 exporters 中拉 metrics,或者接收來自 Pushgateway 發過來的 metrics,或者從其餘的 Prometheus server 中拉 metrics。

Prometheus server 在本地存儲收集到的 metrics,並運行已定義好的 alert.rules,記錄新的時間序列或者向 Alertmanager 推送警報。Alertmanager 根據配置文件,對接收到的警報進行處理,發出告警。在圖形界面中,可視化採集數據。

Prometheus 中存儲的數據爲時間序列,是由 metric 的名字和一系列的標籤(鍵值對)惟一標識的,不一樣的標籤則表明不一樣的時間序列。

metric 名字:該名字應該具備語義,通常用於表示 metric 的功能,例如:http_requests_total, 表示 http 請求的總數。

標籤:使同一個時間序列有了不一樣維度的識別。例如 http_requests_total{method="Get"} 表示全部 http 請求中的 Get 請求。當 method="post" 時,則爲新的一個 metric。

樣本:實際的時間序列,每一個序列包括一個 float64 的值和一個毫秒級的時間戳。

格式:<metric name>{<label name>=<label value>, …},例如:http_requests_total{method="POST",endpoint="/api/tracks"}。

 

下面介紹其安裝步驟(這裏直接採用容器化安裝,非基於K8S集羣管理安裝,所以在K8S的pods中看不到):

【步驟1到4在master節點安裝】

第一步:查找鏡像

[root@master prometheus]# docker search prometheus

NAME      DESCRIPTION     STARS    OFFICIAL AUTOMATED

prom/prometheus     692        [OK]

第二步:拉取鏡像

[root@master prometheus]# docker pull prom/prometheus

第三步編寫:prometheus.yml文件

root@master prometheus-1.7.1.linux-amd64]# cat prometheus.yml

global:

  scrape_interval:     15s

  external_labels:

    monitor: 'codelab-monitor'

scrape_configs:
  - job_name: 'prometheus'
    scrape_interval: 5s
    static_configs:
      - targets: ['192.168.135.128:9090']
  - job_name: 'kubernetes-nodes-cadvisor'
    kubernetes_sd_configs:
    - api_server: 'http://192.168.135.128:8080'
      role: node
    relabel_configs:
    - action: labelmap
      regex: __meta_kubernetes_node_label_(.+)
    - source_labels: [__meta_kubernetes_role]
      action: replace
      target_label: kubernetes_role
    - source_labels: [__address__]
      regex: '(.*):10250'
      replacement: '${1}:8080'
      target_label: __address__
  - job_name: 'kubernetes_node'
    kubernetes_sd_configs:
    - role: node
      api_server: 'http://192.168.135.128:8080'
    relabel_configs:
    - source_labels: [__address__]
      regex: '(.*):10250'
      replacement: '${1}:9100'
      target_label: __address__

說明:一個典型的配置格式

global:

  # 抓取間隔,默認爲 1m

  [ scrape_interval: <duration> | default = 1m ]

  # 抓取超時時間,默認爲 10s

  [ scrape_timeout: <duration> | default = 10s ]

  # 規則評估間隔,默認爲 1m

  [ evaluation_interval: <duration> | default = 1m ]

# 抓取配置

scrape_configs:

  [ - <scrape_config> ... ]

# 規則配置

rule_files:

  [ - <filepath_glob> ... ]

# 告警配置

alerting:

  alert_relabel_configs:

    [ - <relabel_config> ... ]

  alertmanagers:

    [ - <alertmanager_config> ... ]

 

第四步:啓動鏡像

[root@master prometheus]# docker run -d -p 9090:9090 --name=prometheus -v /home/taoweizhong/data/prometheus/prometheus-1.7.1.linux-amd64/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus

因爲是容器化安裝, 這裏須要注意虛擬機上編寫的prometheus.yml 文件位置,不然會啓動錯誤。

 

【步驟5到7須要每一個slave節點上都須要安裝】

 在下面的步驟開始以前先了解下:

Prometheus提供的NodeExporter項目能夠提取主機節點的關鍵度量指標,經過Kubernetes的DeamonSet模式能夠在各主機節點上部署一個NodeExporter實例,實現對主機性能指標數據的監控。

Cadvisor Google用來監測單節點的資源信息的監控工具,提供了一目瞭然的單節點多容器的資源監控功能。Google的Kubernetes中也缺省地將其做爲單節點的資源監控工具,各個節點缺省會被安裝上Cadvisor。總結起來主要兩點:展現 Host 和容器兩個層次的監控數據;展現歷史變化數據。

因爲 cAdvisor 提供的操做界面簡陋,且須要在不一樣頁面之間跳轉,只能監控一個 host。但 cAdvisor 的一個亮點是它能夠將監控到的數據導出給第三方工具,由這些工具進一步加工處理。咱們能夠把 cAdvisor 定位爲一個監控數據收集器,收集和導出數據是它的強項,而非展現數據。

 

第五步:拉取cadvisor和node-exporter鏡像

[root@slave1 taoweizhong]# docker pull docker.io/google/cadvisor

[root@slave1 taoweizhong]# docker pull quay.io/prometheus/node-exporter:v0.24.1

注意這裏拉取node-exporter的是:v0.24.1版本,latest不知爲啥沒法和Prometheus集成起來。

 

第六步:啓動cadvisor和node-exporter鏡像

[root@slave1 taoweizhong]#docker run -d -p 9100:9100 -v "/proc:/host/proc" -v "/sys:/host/sys" -v "/:/rootfs" --net=host quay.io/prometheus/node-exporter   --path.procfs /host/proc --path.sysfs /host/sys --collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"

 

[root@slave1 taoweizhong]#docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --privileged=true --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --publish=8080:8080 --detach=true --name=cadvisor --restart=always google/cadvisor:v0.24.1

 

這裏參數不作具體說明了,這兩個容器的目的是在slave節點採集數據給Prometheus

第七步:檢查鏡像啓動狀態

 

 

第八步:先查看下cadvisor 和node-exporter在http端口提供的指標項

在瀏覽器中輸入:http://192.168.135.136:9100/metrics

(注意:IP地址爲部署容器的宿主機,端口是容器映射到虛擬機上的端口) node-exporter返回的指標以下,有不少指標:

 

在瀏覽器中輸入:http://192.168.135.136:8080/metrics

(注意:IP地址爲部署容器的宿主機,端口是容器映射到虛擬機上的端口)cadvisor返回的指標以下,有不少指標:

 

  

第九步:查看cadvisor 的簡陋圖形界面:

cAdvisor 會顯示當前 host 的資源使用狀況,包括 CPU、內存、網絡、文件系統等。

 

 

 

第十步:訪問prometheus圖形界面:

 在運行後,訪問 http://192.168.135.128:9090/graph (IP地址是prometheus容器所在宿主機,端口是啓動時候指定的映射到虛擬機端口

 

 

第十一步:切換到target(從菜單status->Targets),這樣Prometheus的安裝就成功了,咱們能夠看到EndPoint已經鏈接正常UP,若是這裏狀態爲down,表示鏈接不正常,須要查看緣由,多是防火牆之類的。

 

 因爲Grafana提供了很漂亮的圖形界面,下面咱們將Prometheus和Grafana集成起來。

1.4  Grafana安裝

Grafana是一個開源的度量分析與可視化套件。常常被用做基礎設施的時間序列數據和應用程序分析的可視化。Grafana支持許多不一樣的數據源。每一個數據源都有一個特定的查詢編輯器,該編輯器定製的特性和功能是公開的特定數據來源。 官方支持如下數據源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB。

基本概念說明:

Data Source:grafana確切的說是一個前端展現工具,將數據以很是美觀直接的圖形展現出來。那麼這些數據必須有一個來源吧,grafana獲取數據的地方就稱爲Data Source。

DashBoard:儀表盤,就像汽車儀表盤同樣能夠展現不少信息,包括車速,水箱溫度等。Grafana的DashBoard就是以各類圖形的方式來展現從Datasource拿到的數據。

Row:DashBoard的基本組成單元,一個DashBoard能夠包含不少個row。一個row能夠展現一種信息或者多種信息的組合,好比系統內存使用率,CPU五分鐘及十分鐘平均負載等。因此在一個DashBoard上能夠集中展現不少內容。

Panel:面板,實際上就是row展現信息的方式,支持表格(table),列表(alert list),熱圖(Heatmap)等多種方式,具體能夠去官網上查閱。

Query Editor:用來指定獲取哪一部分數據。相似於sql查詢語句,好比你要在某個row裏面展現test這張表的數據,那麼Query Editor裏面就能夠寫成select *from test。

Organization:org是一個很大的概念,每一個用戶能夠擁有多個org,grafana有一個默認的main org。用戶登陸後能夠在不一樣的org之間切換,前提是該用戶擁有多個org。不一樣的org之間徹底不同,包括datasource,dashboard等都不同。

User:這個概念應該很簡單,不用多說。Grafana裏面用戶有三種角色admin,editor,viewer。admin權限最高,能夠執行任何操做,包括建立用戶,新增Datasource,建立DashBoard。editor角色不能夠建立用戶,不能夠新增Datasource,能夠建立DashBoard。viewer角色僅能夠查看DashBoard。在2.1版本及以後新增了一種角色read only editor(只讀編輯模式),這種模式容許用戶修改DashBoard,可是不容許保存。每一個user能夠擁有多個organization。

 

這裏我採用容器化部署,可是grafana容器並無歸入K8S管理範圍,所以安裝後使用kubectl get pod命令是查找不到的,具體操做以下:

第一步:查找鏡像

 [root@master prometheus-1.7.1.linux-amd64]# docker search grafana

NAME       DESCRIPTION      STARS   OFFICIAL  AUTOMATED

grafana/grafana   The official Grafana docker container           1084        

【這裏省略了一部分鏡像列表】  

第二步:下載鏡像

 [root@master prometheus-1.7.1.linux-amd64]# docker pull grafana/Grafana

第三步:啓動鏡像

 [root@master prometheus-1.7.1.linux-amd64]# docker run -d --name grafana  -p 3000:3000 grafana/grafana Grafana

d68d28806b435bee1cce00745820be92dc3f39353e3aabf6c72eb5ab15a0b652

注意端口映射到3000,後續訪問須要

第四步:瀏覽界面

在瀏覽器打開 http://192.168.135.128:3000 (這裏是虛擬機的IP地址),輸入默認用戶名密碼 (admin/admin) 能夠進入 Grafana 。

 

 

第五步:數據源配置

Configuration - Data Resource - Add Data Resource

 

編輯數據源,輸入正確的URL:

 

 

第六步:選擇Prometheus2.0的dashboard(默認已經安裝),這樣咱們就能夠看到漂亮的監控界面了。

 

 

下面咱們演示如何更換換一個dashboard

grafana能夠支持根據本身的需求手動新建一個 Dashboard, grafana 的官方網站上有不少公共的 Dashboard 能夠供使用,咱們這裏可使用(dashboard id 爲315)這個 Dashboard 來展現 Kubernetes 集羣的監控信息:

第一步:先下載下來,地址以下

https://grafana.com/dashboards/315/revisions

 

 

第二步:在左側側邊欄 Create 中點擊import導入,將上面第一個輸入框輸入315,下面文本框直接將下載的文件內容複製到裏面,點擊load

 

第三步:選擇prometheus這個名字的數據源,執行import操做,就能夠進入到 dashboard 頁面:

 

 

第四步:這樣就能夠看到結果了(下面截圖供參考學習)

 

 

 

 

 

 

 

 

--結束---

相關文章
相關標籤/搜索