公司最近监控系统从zabbix切换到open-falcon,需要将open-falcon部署到私有的kubernetes集群上。open-falcon团队最近没有更新维护,提交的PR没有反应,所以将部署方法记录到这里。

kubernetes 环境

部署环境为kubernetes 1.14 , 详情见 kubectl version :

1
2
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服务方法如下:

1
kubectl apply -f mysql.yaml

然后,初始化open-falcon需要使用的mysql库:

1
sh init_mysql_data.sh

脚本内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/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服务方法如下:

1
kubectl apply -f redis.yaml

启动open-falcon后端服务全家桶

1
kubectl apply -f openfalcon-plus.yaml

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

1
2
3
4
5
6
7
8
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

1
kubectl apply -f openfalcon-dashboard.yaml

dashboard的部署,主要关注其中的 API_ADDR 这个环境变量是指向kubernetes集群中open-falcon服务。我这里偷懒,直接定义到deployment中了,合理的方式应该是configmap。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
 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 :

1
2
3
4
5
6
NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                         AGE
kubernetes              ClusterIP   10.96.0.1       <none>        443/TCP                         105d
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文件