eventrouter可以采集集群中的event 到es中。 对于集群的问题排查,事件取证还是很有帮助的。开源的eventrouter 支持多种sink,可以方便的和es结合,这里采用代码库中的代码打包到本地仓库后部署。
- clone 源代码
git clone https://github.com.cnpmjs.org/heptiolabs/eventrouter.git
- 修改Makefile中相关参数,以适应中国网络
- 修改REGISTRY变量为自己私服的地址
- 修改BUILD_IMAGE为golang:1.14.2以支持通过env设置go-proxy
- 修改编译步骤中$(DOCKER_BUILD)后边的参数为 "go env -w GO111MODULE=on && go env -w GOPROXY=https://goproxy.cn,direct && CGO_ENABLED=0 go build"
- 修改Dockerfile
- 在MAINTAINER行后追加"RUN echo "http://mirrors.aliyun.com/alpine/v3.8/main" > /etc/apk/repositories"
- 执行编译:
make all
- 将编译好的镜像推送到自己的私服
docker push xxxxx
- 部署到集群
- 修改yaml目录中eventrouter.yaml文件中image地址为本地私服
- 部署到集群
kubectl apply -f yaml/eventrouter.yaml
说明:
默认配置是将event推动到日志中。可以通过kubectl logs 查看。 原生还支持kafka ,httpapi 等方式。代码库中的配置示例:
config.json
{
"kubeconfig": "/var/run/kubernetes/admin.kubeconfig",
"sink": "glog",
"kafkaBrokers": "kafka:9092",
"kafkaTopic": "topic",
"kafkaSaslUser": "user",
"kafkaSaslPwd": "password"
"httpSinkUrl": "http://localhost:8080",
"httpSinkBufferSize": 1500,
"httpSinkDiscardMessages": true,
"rocksetAPIKey": "",
"rocksetCollectionName": "",
"rocksetWorkspaceName": "",
"s3SinkAccessKeyID": "",
"s3SinkSecretAccessKey": "",
"s3SinkRegion": "ap-south-1",
"s3SinkBucket": "",
"s3SinkBucketDir": "",
"s3SinkBufferSize": 1500,
"s3SinkDiscardMessages": true,
"s3SinkOutputFormat": "flatjson",
"s3SinkUploadInterval": 120
}
遇到的问题:
在推送event到kafka 的过程中,发现topic生成。 但是日志推送失败:
E0412 09:16:43.252120 1 kafkasink.go:88] Failed to send to: topic(myevent)/partition(-1)/offset(-1)
吐槽下代码这个报错太简单了。修改了下87行, 将err 打印出来重新编译。
84 case sarama.SyncProducer:
85 partition, offset, err := p.SendMessage(msg)
86 if err != nil {
87 glog.Errorf("###%v###",err) //add
88 glog.Errorf("Failed to send to: topic(%s)/partition(%d)/offset(%d)\n",
89 ks.Topic, partition, offset)
90 }
才发现原来kafka集群是默认的配置。 没有修改listener等参数。 导致拿到的broker 地址为hostname
E0412 09:16:41.141840 1 kafkasink.go:87] ###dial tcp: lookup dx-dev-test701.novalocal on 10.96.0.10:53: no such host###
修改broker相关参数即可。
有疑问加站长微信联系(非本文作者)