Kubernetes容器日志收集 (3)

4. 日志字段定制
经过origin-aggregated-logging推送至后采集的一条日志如下:

{ "CONTAINER_TAG": "4ad125bb7558", "docker": { "container_id": "4ad125bb7558f52e30dceb3c5e88dc7bc160980527356f791f78ffcaa6d1611c" }, "kubernetes": { "container_name": "fas-dataservice-dev-new", "namespace_name": "fas-cost-dev", "pod_name": "fas-dataservice-dev-new-5c48d7c967-kb79l", "pod_id": "4ad125bb7558f52e30dceb3c5e88dc7bc160980527356f791f78ffcaa6d1611c", "namespace_id": "f95238a6-3a67-11e9-a211-20040fe7b690" }, "systemd": { "t": { "BOOT_ID": "6246327d7ea441339d6d14b44498b177", "CAP_EFFECTIVE": "1fffffffff", "CMDLINE": "/usr/bin/dockerd-current --add-runtime docker-runc=http://www.likecs.com/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=http://www.likecs.com/usr/libexec/docker/docker-proxy-current --init-path=http://www.likecs.com/usr/libexec/docker/docker-init-current --seccomp-profile=http://www.likecs.com/etc/docker/seccomp.json --selinux-enabled=false --log-driver=journald --insecure-registry hub.paas.kjtyun.com --insecure-registry 10.77.0.0/16 --log-level=warn --signature-verification=false --bridge=none --max-concurrent-downloads=20 --max-concurrent-uploads=20 --storage-driver devicemapper --storage-opt dm.fs=xfs --storage-opt dm.thinpooldev=http://www.likecs.com/dev/mapper/docker--vg-docker--pool --storage-opt dm.use_deferred_removal=true --storage-opt dm.use_deferred_deletion=true --mtu=1450", "COMM": "dockerd-current", "EXE": "/usr/bin/dockerd-current", "GID": "0", "MACHINE_ID": "0096083eb4204215a24efd202176f3ec", "PID": "17181", "SYSTEMD_CGROUP": "/system.slice/docker.service", "SYSTEMD_SLICE": "system.slice", "SYSTEMD_UNIT": "docker.service", "TRANSPORT": "journal", "UID": "0" } }, "level": "info", "message": "\tat com.sun.proxy.$Proxy242.execute(Unknown Source)", "hostname": "host11.rqy.kx", "pipeline_metadata": { "collector": { "ipaddr4": "10.76.232.16", "ipaddr6": "fe80::a813:abff:fe66:3b0c", "inputname": "fluent-plugin-systemd", "name": "fluentd", "received_at": "2019-05-15T09:22:39.297151+00:00", "version": "0.12.43 1.6.0" } }, "@timestamp": "2019-05-06T01:41:01.960000+00:00", "viaq_msg_id": "NjllNmI1ZWQtZGUyMi00NDdkLWEyNzEtMTY3MDQ0ZjEyZjZh" }

可以看出,跟原生的journal日志类似,增加了几个字段为了写进es中而已,总体而言,其他字段并没有那么重要,所以我们对其中的字段进行了定制,以减少日志的大小,定制化字段之后,一段日志的输出变为(不是同一段,只是举个例子):

{ "hostname":"dev18.gcloud.set", "@timestamp":"2019-05-17T04:22:33.139608+00:00", "pod_name":"istio-pilot-8588fcb99f-rqtkd", "appName":"discovery", "container_name":"epaas-discovery", "domain":"istio-system", "sortedId":"NjA3ODVhODMtZDMyYy00ZWMyLWE4NjktZjcwZDMwMjNkYjQ3", "log":"spiffluster.local/ns/istio-system/sa/istio-galley-service-account" }

5.部署
最后,在node节点上添加logging-infra-fluentd: "true"的标签,就可以在namespace为openshift-logging中看到节点的收集器了。

logging-fluentd-29p8z 1/1 Running 0 6d logging-fluentd-bpkjt 1/1 Running 0 6d logging-fluentd-br9z5 1/1 Running 0 6d logging-fluentd-dkb24 1/1 Running 1 5d logging-fluentd-lbvbw 1/1 Running 0 6d logging-fluentd-nxmk9 1/1 Running 1 5d

6.关于ip
业务方不仅仅想要podName,同时还有对ip的需求,控制台方式正常上是没有记录ip的,所以这算是一个难点中的难点,我们在kubernetes_metadata_common.rb的kubernetes_metadata中添加了 'pod_ip' => pod_object['status']['podIP'],最终是有些有ip,有些没有ip,这个问题我们继续排查。

三、Sidecar模式

Kubernetes容器日志收集


这种方式的好处是能够获取日志的文件名、容器的ip地址等,并且配置性比较高,能够很好的进行一系列定制化的操作,比如使用log-pilot或者filebeat或者其他的收集器,还能定制一些特定的字段,比如文件名、ip地址等。
sidecar模式用来解决日志收集的问题的话,需要将日志目录挂载到宿主机的目录上,然后再mount到收集agent的目录里面,以达到文件共享的目的,默认情况下,使用emptydir来实现文件共享的目的,这里简单介绍下emptyDir的作用。
EmptyDir类型的volume创建于pod被调度到某个宿主机上的时候,而同一个pod内的容器都能读写EmptyDir中的同一个文件。一旦这个pod离开了这个宿主机,EmptyDir中的数据就会被永久删除。所以目前EmptyDir类型的volume主要用作临时空间,比如Web服务器写日志或者tmp文件需要的临时目录。
日志如果丢失的话,会对业务造成的影响不可估量,所以,我们使用了尚未成熟的subPathExpr来实现,即挂载到宿主的固定目录/data/logs下,然后是namespace,deploymentName,podName,再然后是日志文件,合成一块便是/data/logs/${namespace}/${deploymentName}/${podName}/xxx.log。
具体的做法就不在演示了,这里只贴一下yaml文件。

apiVersion: extensions/v1beta1 kind: Deployment metadata: name: xxxx namespace: element-dev spec: template: spec: volumes: - name: host-log-path-0 hostPath: path: /data/logs/element-dev/xxxx type: DirectoryOrCreate containers: - name: xxxx image: 'xxxxxxx' volumeMounts: - name: host-log-path-0 mountPath: /data/work/logs/ subPathExpr: $(POD_NAME) - name: xxxx-elog-agent image: 'agent' volumeMounts: - name: host-log-path-0 mountPath: /data/work/logs/ subPathExpr: $(POD_NAME)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxjdp.html