利用docker-compose建立Grafana與上傳圖片功能

N|Solid
Build Status
Build Status

docker-compose

實務上一個服務,一定由眾多 service 共同運作。若只使用 docker run,則勢必寫 Bash 來管理 4 個 service,還必須考慮:

  • 4 個 service 必須在同一個虛擬 network 下
  • 4 個 service 的啟動順序

… 等問題。Docker 為此提出 Docker Compose 概念。在 docker-compose.yml 檔描述各 service 間的參數與關係,也就是 Infrastructure as Code。

  • docker-compose.yml 檔案很小,只是文字檔而已
  • 由於 docker-compose.yml 是文字檔,可以 git 版控

間單的說,docker-compose.yml 就是 container 的管理文件,只是採用 code 形式描述

Granafa & Influxdb & Telegraf

  • influxdb 是一款專為時序性資料開發的高性能資料庫,使用GO語言開發且開源!不同的是可以直接對 influxdb 用 curl 新增刪除修改資料。

  • telegraf 是用Go寫的代理程式,可以用在收集系統和服務的統計資料,它擁有輸入套件,可以直接從系統抓取指標數據,從第三方API獲得指標數據,甚至可以通過statsd和Kafka得到資料。它還具備输出套件,可以將採集的數據發送到各種資料庫儲存。比如InfluxDB,Graphite,OpenTSDB,Datadog,Librato,Kafka,MQTT,NSQ等等。支援 Linux 與 Windows。

  • grafana 是一個開源數據分析和視覺化圖形套件,常用在視覺化基礎設施的性能資料和應用程式分析的時間序列資料。

可以參考下方的網站來進行更細部了解與額外的設定
本文章只進行簡單的使用docker-compose建立grafana & influxdb的建置
telegraf因容器的特性暫不加入與研究放進docker-compose內
額外的google cloud platform平台與網域需要事先申請與購買才能完成本篇章設定
當然也有不需要上述方法也可以完成設定,只需要在docker-compose修改設定

Tech研讀

  • docker - Docker is a platform for developers and sysadmins to develop, deploy, and run applications with containers.
  • grafana - The leading open source software for time series analytics.
  • influxdb - InfluxData provides the leading time series platform to instrument, observe, learn and automate any system, application and business process across a variety of use cases.
  • telegraf - Telegraf is part of the TICK Stack and is a plugin-driven server agent for collecting and reporting metrics.
  • docker-compose - Compose is a tool for defining and running multi-container Docker applications.

Google Cloud Platform設定DNS與Oauth2與Storage

step.1 先到GCP(google cloud platform的簡單)的控制台,點選左上邊的Menu菜單後選擇網路服務→Cloud DNS
在此建立區域

進入區域後新增紀錄集用來當作grafana網站的網域A紀錄(e.q:grafana.monitor.com)

step2. 再到GCP的Menu菜單點選API和服務→憑證,然後點選OAuth同意畫面新增你的Grafna網域
應用程式類型:公開
應用程式名稱:任意輸入(主要是在google驗證的時候所跳出來的顯示名稱,告知登入者此跳轉至應用登入)
支援電子郵件:輸入自己的E-mail信箱(顯示在同意畫面中,方便使用者尋求支援)
已授權網域:輸入個人的網域(e.q:假設grafana.monitor.com是你的網域那就只需要輸入monitor.com即可)
完成後儲存

step.3 再切回到憑證的畫面後,再點選建立憑證→OAuth用戶端ID→網路應用程式
名稱:給予一個名稱用來辨識此OAuth用戶端ID
已授權的重新導向 URI:依照上述例子輸入http://grafana.monitor.com/login/google

step.4 之後到GCP的IAM管理員的頁面點選+建立服務帳戶

填寫服務帳號名稱:這邊可以設定為單一服務或功能型的名稱:grafana or storages for grafana等等…
服務帳戶說明:看個人願不願意輸入此服務帳戶的詳細資訊,避免日後太久回來忘記還是建議輸入一下

設定服務帳戶權限(可選項):請選擇儲存空間的storages的物件建立者or物件管理員(至少確保有寫入權限)
點選繼續之後

再完成後記得點選下載json格式的金鑰,此金鑰為你所創立的服務帳號所授予寫入storage權限的証明
有了此金鑰檔案就可以有權限任意的往你的storage新增刪除物件了
所以金鑰要很小心的管理唷!!!

step.5 建立可以暫存圖片的storage bucket
點選GCP Menu的Storage 瀏覽器後,按下建立值區(就是bucket的意思)

名稱:因為GCP的bucket的特殊性,全世界的bucket不可以有相同的名稱,因此請自己取一個符合服務或功能性的名稱
如果出現重複名稱GCP會有紅色通知你需要更換名稱
預設儲存空間級別:依照個人需求,假設你上傳與下載圖片頻率越高,則使用Multi-Regional;反之則選擇約低層級就好
詳細的費用計算方法請參考這裡

Installation

1
$ sudo apt-get update

用來取得遠端更新伺服器的套件檔案清單。

1
$ sudo apt-get upgrade

自動找出所有有新版的軟體套件並逐一升級。

1
$ sudo apt-get install docker.io

下載docker

1
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

下載docker-compose(用來定義容器之間的關係與容器啟動的順序)

1
$ sudo chmod +x /usr/local/bin/docker-compose

將剛剛下載的docker-compose的加上執行的權限

1
$ sudo mkdir -p /data/influxdb /data/grafana

新增資料夾,用來存在grafana與inlfuxdb的資料(避免容器重啟後即消失)

1
$ sudo chmod 777 /data/grafana /data/influxdb

將資料夾權限開到最大(不安全的做法,如可以的話請使用安全的權限寫入,如這邊無法寫入的話,容器將會因為啟動的時候要將資料寫入對應資料夾而失敗造成無限重啟)

1
$ sudo vim docker-compose.yml

請注意將你剛剛下載下載的json金鑰檔案放置在/data/grafana底下,因為容器內的路徑對應到外部的data/grafana資料夾下,因此丟到此路徑就可以讓容器讀取金鑰

編寫docker-compose的檔案

這樣一來就能讓grafana的服務存取金鑰內容後可以去跟storage做存取圖片的動作權限了

docker-compose內容如下…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
version: "3"
services:

influxdb:
image: influxdb
container_name: influxdb
ports:
- "8086:8086"
restart: always
volumes:
- /data/influxdb:/var/lib/influxdb
networks:
- monitor
grafana:
image: grafana/grafana
container_name: grafana
ports:
- "80:3000"
restart: always
networks:
- monitor
volumes:
- /data/grafana:/var/lib/grafana
environment:
- GF_SERVER_ROOT_URL=http://grafana.costworlds.com
- GF_AUTH_DISABLE_LOGIN_FORM=false
- GF_AUTH_GOOGLE_ENABLED=true
- GF_AUTH_GOOGLE_CLIENT_ID=957269883000-82e4758ih5a74u9jj7rldc427lg67sfl.apps.googleusercontent.com
- GF_AUTH_GOOGLE_CLIENT_SECRET=A1dclGMsDOXepyv6oXhAfpMu
- GF_AUTH_GOOGLE_ALLOWED_DOMAINS=gosmio.biz
- GF_AUTH_GOOGLE_ALLOW_SIGN_UP=true
- GF_EXTERNAL_IMAGE_STORAGE_PROVIDER=gcs
- GF_EXTERNAL_IMAGE_STORAGE_S3_BUCKET_URL=https://s3-ap-southeast-1.amazonaws.com/gt-to3
- GF_EXTERNAL_IMAGE_STORAGE_S3_ACCESS_KEY=AKIAIVBWSCYVD45MHWHQ
- GF_EXTERNAL_IMAGE_STORAGE_S3_SECRET_KEY=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


networks:
monitor:

記得docker-compose是有縮排的,因此服務與環境變數之間的空白要注意否有對齊

再來準備安裝資料收集器:Telegraf

1
$ wget https://dl.influxdata.com/telegraf/releases/telegraf_1.9.5-1_amd64.deb

下載Telegraf的安裝包

1
$ sudo dpkg -i telegraf_1.9.5-1_amd64.deb

解壓縮並安裝

1
$ vim /etc/telegraf/telegraf.conf

修改設定檔
將config內的設定檔照以下的資訊設定完成

logfile = “/var/log/telegraf/telegraf.log”

urls = [“http://127.0.0.1:8086"]

database = “telegraf”

logfile:主要是將telegraf的log檔案指定在特定路徑下
urls:指定要telegraf將收集的資料丟往哪一個資料庫存放
database:指定在丟資料時要存放進哪一個資料庫
儲存好了之後重啟服務 & 確認服務Running

1
$ service telegraf restart
1
$ service telegraf status

Dashboard & Metric & Alert 配置

首先先開啟瀏覽器輸入剛剛你設定grafana的前台網址,然後會看到類似的登入畫面

這邊要注意的是因為在docker-compose把環境變數的- GF_AUTH_DISABLE_LOGIN_FORM設定false

所以還是會出現同帳號密碼的輸入畫面出現,如果不希望的話可以先用google登出入後再使用admin帳號進去將google的帳號權限拉升至admin管理者,再將變數修改為true後重啟docker-compose

預設帳號是admin / amdin

第一步驟是新增data source,也就是把Grafana新增資料的讀取來源Influxdb

第二步驟填寫Influxdb的連線資訊後儲存
URL:http://influxdb:8086(這邊要注意的是一定要寫influxdb唷,容器只互相認得容器名稱)
Database:Telegraf

設定要抓取定特的值來視覺化,telegraf預設上已經有最基本的系統監控(CPU、記憶體、硬碟等)
因此這邊再queries to選擇data sourece,下方則是選擇此data source內的監控資料
下圖選擇cpu的監控值來顯示

之後我們來設定Alerting Channel讓Grafana發出告警到Slack並夾帶告警截圖

Slack Setting的部份需要個人去申請Slack的帳號後新開自己的Workplace(工作群組)後前往slack的app Directory應用程序去申請Incoming WebHooks的URL在這邊填上
網址:https://slack.com/apps

再來開始設定Metric的Alert的告警水位與發送告警到Slack的頻道

TEST

測試上述設定與安裝與配置都是成功的,成功會有告警的截圖傳送到Slack的頻道內
將水位調整成會出發告警之後查看剛剛新創立的slack頻道是否有出現Grafana告警的截圖與incoming webhook的告警通知