kubernetes事件日志采集工具(eventrouter-kafka)业务功能介绍与使用
eventrouter-kafka业务功能介绍与使用简介实现原理1、eventrouter源码实现2、Client-go 中的 Informer 工作流程图使用方法1、编译/镜像制作2、环境部署运行简介eventrouter-kafka是针对kubernetes项目的一个简单的事件路由服务。该服务采用List-Watch机制,获取k8s集群中的实时事件events,并把这些事件推送到不同的通道,例
eventrouter-kafka业务功能介绍与使用
简介
eventrouter-kafka是针对kubernetes项目的一个简单的事件路由服务。该服务采用List-Watch机制,获取k8s集群中的实时事件events,并把这些事件推送到不同的通道,例如kafka等等。
实现原理
1、eventrouter源码实现
eventrouter-kafka采用基于Client-go中的一个核心工具包Informer的List-Watch机制实现的。eventrouter-kafka需要通过List/Get Kubernetes中的事件events记录。如下是源码实现,
Informer主要有两个作用:
通过ListAndWatch 的方法,把 APIServer 中的 API 对象缓存在了本地,并负责更新和维护这个缓存。ListAndWatch通过 APIServer 的 LIST API“获取”所有最新版本的 API 对象;然后,再通过 WATCH API 来“监听”所有这些 API 对象的变化;注册相应的事件,之后如果监听到的事件变化就会调用事件对应的EventHandler,实现回调。
2、Client-go 中的 Informer 工作流程图
Informer 中的 Reflector 通过 List/watch 从 apiserver 中获取到集群中所有资源对象的变化事件(event),将其放入 Delta FIFO 队列中(以 Key、Value 的形式保存),触发 onAdd、onUpdate、onDelete 回调将 Key 放入 WorkQueue 中。同时将 Key 更新 Indexer 本地缓存。Control Loop 从 WorkQueue 中取到 Key,从 Indexer 中获取到该 Key 的 Value,进行相应的处理。
使用方法
1、编译/镜像制作
我使用的亿速云的香港的centos7 linux服务器进行编译的
对应的go env环境变量信息如下,
[root@yisu-5fbe7638d8d41 eventrouter]# go version
go version go1.14.10 linux/amd64
[root@yisu-5fbe7638d8d41 ~]# go env
GO111MODULE="off"
GOARCH="amd64"
GOBIN="/root/gobindir"
GOCACHE="/root/.cache/go-build"
GOENV="/root/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/root/eventrouter"
GOPRIVATE=""
GOPROXY="https://goproxy.io"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build578348278=/tmp/go-build -gno-record-gcc-switches"
- 步骤1: 下载源码
#源码的存放目录:${GOPATH}/src/github.com/heptiolabs/eventrouter
git clone https://github.com/cuishuaigit/eventrouter-kafka.git
- 步骤2: 修改Makefile
把基础镜像替换为国内的镜像golang:1.14.2-alpine
- 步骤1: 编译
cd /root/eventrouter/src/github.com/heptiolabs/eventrouter
make all
2、环境部署运行
我这里使用kubernetes集群环境部署eventrouter-kafka,其他的部署方式可以根据实际情况部署。有了镜像部署方式就很灵活了。
kubectl create -f eventrouter.yaml
其中,eventrouter-kafka的配置文件/etc/eventrouter/config.json挂载到configmap中eventrouter-cm1,在这里配置kafka的信息。
可以尝试创建一个pod,然后看下kafka已收到了events数据,
【附】
eventrouter.yaml内容如下,
apiVersion: v1
kind: ServiceAccount
metadata:
name: eventrouter
namespace: wtops
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: eventrouter
rules:
- apiGroups: [""]
resources: ["events"]
verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: eventrouter
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: eventrouter
subjects:
- kind: ServiceAccount
name: eventrouter
namespace: wtops
---
apiVersion: v1
data:
config.json: |-
{
"sink": "kafka",
"kafkaBrokers": "192.168.227.128:9092"
}
kind: ConfigMap
metadata:
name: eventrouter-cm1
namespace: wtops
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: eventrouter
namespace: wtops
labels:
app: eventrouter
spec:
replicas: 1
selector:
matchLabels:
app: eventrouter
template:
metadata:
labels:
app: eventrouter
tier: control-plane-addons
spec:
containers:
- name: kube-eventrouter
env:
- name: KAFKA_BROKER_URL
value: 192.168.227.128:9092
#image: 172.32.150.15/paas_public/eventrouter:1.0.0
image: gcr.io/heptio-images/eventrouter:v0.4
imagePullPolicy: IfNotPresent
volumeMounts:
- name: config-volume
mountPath: /etc/eventrouter
- name: config-kube
mountPath: /root/.kube
serviceAccount: eventrouter
volumes:
- name: config-volume
configMap:
name: eventrouter-cm1
- hostPath:
path: /root/.kube
name: config-kube
更多推荐
所有评论(0)