在kubernetes叢集中部署open-falcon

遊戲不存在發表於2019-04-08

公司最近監控系統從zabbix切換到open-falcon,需要將open-falcon部署到私有的kubernetes叢集上。open-falcon團隊最近沒有更新維護,提交的PR沒有反應,所以將部署方法記錄到這裡。

2019年04月15日更新,PR已經被open-falcon專案團隊接受,給專案官方一個?,全部yaml檔案連結調整到官方專案。

kubernetes 環境

部署環境為kubernetes 1.14 , 詳情見 kubectl version :

Client Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.0", GitCommit:"641856db18352033a0d96dbc99153fa3b27298e5", GitTreeState:"clean", BuildDate:"2019-03-25T15:53:57Z", GoVersion:"go1.12.1", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.0", GitCommit:"641856db18352033a0d96dbc99153fa3b27298e5", GitTreeState:"clean", BuildDate:"2019-03-25T15:45:25Z", GoVersion:"go1.12.1", Compiler:"gc", Platform:"linux/amd64"}
複製程式碼

準備mysql服務

如果已經有mysql服務了,可以跳過建立mysql服務這個步驟。建立mysql服務方法如下:

kubectl apply -f mysql.yaml
複製程式碼

然後,初始化open-falcon需要使用的mysql庫:

sh init_mysql_data.sh
複製程式碼

指令碼內容如下:

#!/bin/sh

mysql_pod=$(kubectl get pods | grep mysql | awk '{print $1}')
cd /tmp && \
	git clone --depth=1 https://github.com/open-falcon/falcon-plus && \
	cd /tmp/falcon-plus/ && \
	for x in `ls ./scripts/mysql/db_schema/*.sql`; do
	    echo init mysql table $x ...;
	    kubectl exec -it $mysql_pod -- mysql -uroot -p123456 < $x;
	done

rm -rf /tmp/falcon-plus/
複製程式碼

這個指令碼主要做了下面幾件事:

  1. 獲取叢集中mysql服務的pod id。
  2. 從open-falcon的github repo中下載資料初始化指令碼。
  3. 執行資料初始化指令碼,初始化open-falcon的資料庫。
  4. 清理臨時檔案和目錄

注意: 按需修改 mysql.yaml 中的mysql密碼,同樣注意openfalcon-plus和dashboard中的mysql密碼。

準備redis服務

如果已經有redis服務了,可以跳過建立redis服務這個步驟。建立redis服務方法如下:

kubectl apply -f redis.yaml
複製程式碼

啟動open-falcon後端服務全家桶

kubectl apply -f openfalcon-plus.yaml
複製程式碼

其中主要的點在使用ConfigMap配置了 entrypoint.sh

apiVersion: v1
kind: ConfigMap
metadata:
  name: openfalcon-configmap
data:
  entrypoint.sh: |-
    #!/bin/bash
    /bin/sh -c 'sleep 10 && sh ctrl.sh start graph hbs judge transfer nodata aggregator gateway api alarm'  & /usr/bin/supervisord -c /etc/supervisord.conf
複製程式碼

這樣在不改動映象和deployment的情況下,調整configmap就可以調整openfalcon啟動的模組。當然正式環境下,從原始碼重新編譯映象更佳。因為supervisord管理程式的方式不 docker

/bin/sh -c 'sleep 10 && sh ctrl.sh start graph hbs judge transfer nodata aggregator gateway api alarm' & /usr/bin/supervisord -c /etc/supervisord.conf 這個命令的邏輯是先啟動supervisord,十秒後再啟動openfalcon的全家桶模組。

啟動open-falcon-dashboard

kubectl apply -f openfalcon-dashboard.yaml
複製程式碼

dashboard的部署,主要關注其中的 API_ADDR 這個環境變數是指向kubernetes叢集中open-falcon服務。我這裡偷懶,直接定義到deployment中了,合理的方式應該是configmap。

 containers:
      - name: open-falcon-dashboard
        image: openfalcon/falcon-dashboard:v0.2.1
        command: ["sh","-c","cd /open-falcon/dashboard &&  ./control startfg"]
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8081
        env:
        - name: API_ADDR
          value: http://open-falcon:8080/api/v1
        - name: PORTAL_DB_HOST
          value: mysql
        - name: PORTAL_DB_PORT
          value: "3306"
        ....
複製程式碼

訪問open-falcon-dashboard

全部完成後,檢視 kubectl get svc :

NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                         AGE
mysql                   NodePort    10.110.20.201   <none>        3306:30535/TCP                  25m
open-falcon             NodePort    10.97.12.125    <none>        8433:31952/TCP,8080:31957/TCP   53s
open-falcon-dashboard   NodePort    10.96.119.231   <none>        8081:30191/TCP                  3s
redis                   ClusterIP   10.98.212.126   <none>        6379/TCP                        32m
複製程式碼

得到 open-falcon-dashboard 服務暴露的本地埠 30191 , 然後瀏覽器訪問 http://192.168.10.21:30191

全部yaml檔案

相關文章