https://openkruise.io/zh/docs/
安装这里就不说了,使用可以看官网,但是官网针对写入多一些例子有一些异常,不过不太重要,也就格式的问题,如果不喜欢的话,可以看看我的,首先,我这里已经安装好了,我需要做一个demo,这里我使用标签的方式进行日志收集,先看一下我的demo。
cat nginx.yml apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx # 注入 filebeat sidecar 容器的label kruise.io/inject-filebeat: "true" spec: containers: - name: nginx image: nginx:latest volumeMounts: # 通过 volumeMounts 与filebeat sidecar容器共享 log 目录 - mountPath: /var/log/nginx name: log volumes: - name: log emptyDir: {} --- apiVersion: v1 kind: Service metadata: labels: app: nginx name: nginx spec: ports: - name: nginx port: 80 protocol: TCP targetPort: 80 selector: app: nginx release: prod type: ClusterIP
这里有两个注意事项,第一个是我在spec.template.metadata.labels下加了一个标签“kruise.io/inject-filebeat: "true"”这个是我需要在SidecarSet定义好我的日志收集方式的,只要我把我的模版里添加这个标签,后期有其他服务发布就会自动添加日志收集功能,另外一个是需要定义日志收集的目录。我需要把nginx的日志目录共享给filebeate,然后filebate才能读取日志内容,为了不占有磁盘空间,我这里就选择临时目录。spec.template.spec.containers这里定义了两个目录,分别是nginx的目录和共享给filebate的目录。
下面是设置filebeate,日志共享给filebeate了,filebate需要收集日志内容,在filebeate里有一个配置文件,可以根据自己的环境选择不通的收集方式,我这里选择的是kafaka,我需要在filebate里定义日志收集的方式。
cat filebeat-config.yml apiVersion: v1 data: filebeat.yml: | filebeat.inputs: - type: log paths: - /var/log/* output.kafka: hosts: ["173.32.48.92:9092","173.33.214.42:9092","173.32.48.91:9092"] topic: "test" version: 0.11.0.0 compression: gzip max_message_bytes: 1000000 partition.round_robin: reachable_only: true required_acks: 1 kind: ConfigMap metadata: name: filebeat-config
定义好kafka的topic,然后写入到kafka里最后通过logstash过滤,最后写入到es里,我这里就先不说后面的过程里,直接贴一下filebate的yml文件。
cat filebeat-sidecarset.yml apiVersion: apps.kruise.io/v1alpha1 kind: SidecarSet metadata: name: filebeat-sidecarset spec: selector: # 需要注入 sidecar 容器的 pod labels matchLabels: kruise.io/inject-filebeat: "true" #namespace: default updateStrategy: type: RollingUpdate maxUnavailable: 1 containers: - args: - -e - -E - http.enabled=true image: elastic/filebeat:8.6.2 name: filebeat resources: limits: cpu: "1" memory: 200Mi requests: cpu: 100m memory: 100Mi podInjectPolicy: AfterAppContainer volumeMounts: - mountPath: /usr/share/filebeat/filebeat.yml readOnly: true subPath: filebeat.yml name: filebeat-config - mountPath: /var/log name: log podInjectPolicy: AfterAppContainer volumes: - configMap: name: filebeat-config name: filebeat-config - name: log emptyDir: {} - name: host-time hostPath: path: /etc/localtime
上面已经说过了,只要定义了filebate相通的标签,在启动服务的时候自动会初始化filebate,,另外就是定义的日志收集,这里要说明一下,定义目录后原本nginx的stout输出将不能在继续使用,不过已经写到容器的目录文件中了,下面创建filebeat。
[wolf@wulaoer.org 🔥🔥🔥🔥 ~ ]$ kubectl apply -f filebeat-config.yml [wolf@wulaoer.org 🔥🔥🔥🔥 ~ ]$ kubectl apply -f filebeat-sidecarset.yml [wolf@wulaoer.org 🔥🔥🔥🔥 ~ ]$ kubectl apply -f nginx.yml
创建完成之后,如果你直接写到es里就可以在es集群中看看,如果写到是kafka在kafka中,本文中是发送到kafka中,在kafka中是否有数据,如果没有数据看一下是否有test这个topic,如果没有就创建一下。另外需要注意,如果你一个namespace下有前端有后端,那就需要通过正则进行匹配,前端是通过ip开头后端是通过时间开头,可以参考:https://www.wulaoer.org/?p=1360
另为就是上下文的问题,如果你的日志内容中有分行,建议在采集的时候就进行通过正则进行采集,
cat filebeat-config.yml apiVersion: v1 data: filebeat.yml: | filebeat.inputs: - type: log paths: - /var/log/* multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}\ [0-9]{2}:[0-9]{2}:[0-9]{2}|(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)' multiline.negate: true multiline.match: after output.kafka: hosts: ["173.32.48.92:9092","173.33.214.42:9092","173.32.48.91:9092"] topic: "test" version: 0.11.0.0 compression: gzip max_message_bytes: 1000000 partition.round_robin: reachable_only: true required_acks: 1 kind: ConfigMap metadata: name: filebeat-config
这样在采集的时候就通过正则,然后在过滤的时候也使用这个正则即可,没有了,看看其他的吧。
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏