k8s使用log-pilot获取pod日志,并对接到kafka

利用log-pilot + kafka 搭建k8s日志系统

环境

软件 版本
Kubernetes v1.18.6
Rancher v2.4.5

安装kafka

安装log-pilot前,需要先安装kafka

  1. 通过Rancher应用商店安装kafka

)

  1. 获取kafkaBroken地址
1
2
3
4
5
# kubectl -n kafka get svc -o wide 
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kafka-cp-kafka ClusterIP 10.43.180.111 <none> 9092/TCP 2m31s app=cp-kafka,release=kafka
...
...

安装log-pilot

log-pilot支持docker run的方式启动,也支持在k8s中通过daemonsest的方式启动

k8s启动yaml:https://github.com/AliyunContainerService/log-pilot/tree/master/examples

log-pilot安装参考:https://www.cnblogs.com/uglyliu/p/12382214.html

  1. 下载官方的yaml文件,修改kafka-broken地址

https://github.com/AliyunContainerService/log-pilot/blob/master/examples/pilot-kafka-kubernetes.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
apiVersion: apps/v1
kind: DaemonSet
metadata:
namespace: pilot
name: log-pilot
labels:
k8s-app: log-pilot
spec:
selector:
matchLabels:
k8s-app: log-pilot
updateStrategy:
type: RollingUpdate
template:
metadata:
labels:
k8s-app: log-pilot
spec:
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: log-pilot
image: registry.cn-hangzhou.aliyuncs.com/acs/log-pilot:0.9.5-fluentd
env:
- name: "LOGGING_OUTPUT"
value: "kafka"
- name: "KAFKA_BROKERS"
value: "10.43.180.111:9092" ## 修改为对应的broken地址,多个地址以逗号分隔
- name: "NODE_NAME"
valueFrom:
fieldRef:
fieldPath: spec.nodeName
volumeMounts:
- name: sock
mountPath: /var/run/docker.sock
- name: root
mountPath: /host
readOnly: true
- name: pos
mountPath: /pilot/pos
- name: localtime
mountPath: /etc/localtime
securityContext:
capabilities:
add:
- SYS_ADMIN
terminationGracePeriodSeconds: 30
volumes:
- name: sock
hostPath:
path: /var/run/docker.sock
- name: root
hostPath:
path: /
- name: pos
emptyDir: {}
- name: localtime
hostPath:
path: /etc/localtime

官方的yaml使用的是extensions/v1beta1,适用于k8s <=1.15版本,k8s>=1.16版本就要改成apps/v1

  1. 部署log-pilot
1
2
3
4
5
6
7
8
9
10
11
12
13
14
创建命名空间
# kubectl create ns pilot
namespace/pilot created

执行该文件
# kubectl apply -f log-pilot.yaml
daemonset.apps/log-pilot created

查看是否启动成功
# kubectl -n pilot get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
log-pilot-fcddx 1/1 Running 0 70s 10.42.1.13 ubuntu001 <none> <none>
log-pilot-sktpt 1/1 Running 0 70s 10.42.0.22 xie-node001 <none> <none>
log-pilot-td4z8 1/1 Running 0 70s 10.42.2.21 ubuntu002 <none> <none>

收集pod日志

有两种收集方式:

  1. 通过抓取pod 控制台输出
1
2
3
4
5
env:
- name: aliyun_logs_mylog
value: stdout
- name: aliyun_logs_mylog_tags
value: "topic=k8s-mylog"
  1. 通过读取某个日志文件路径
1
2
3
4
5
env:
- name: aliyun_logs_mylog
value: /var/log/xxx.log
- name: aliyun_logs_mylog_tags
value: "topic=k8s-mylog"

参数说明:

aliyun_logs_mylog:收集带有aliyun_logs关键字的pod的日志,对应的值如果为stdout,则会收集控制台输出,如果值为某个日志文件路径,则收集该文件的日志

aliyun_logs_mylog_tags:对接kafka一定要配置这个tag,如果是其他的可以不定义这个。值为设置对应的topic

aliyun_logs_mylog_format:如果日志是json格式,可以设置这个参数,值为json,但是如果日志格式不是json而设置了这个参数,则无法收集到日志