Kubernetes 容器日志采集
容器日志收集与处理 -- Kubernetes 容器云平台日志采集
在 nginx 日志分析搭建案例中大家已经明白如何通过 Pandora 快速搭建实时监控与报警平台的整个过程。除了 nginx 这类常见基础组件之外,您可能本身有一些自研的程序,也需要做相应的日志收集处理工作,那么操作方法与之类似,只是日志的解析方式不同而已。但是如果您的程序运行在容器云(如 Kubernetes)之上,那么该如何处理呢?
本文将以 Kubernetes 容器云平台运维 和 Kubernetes 容器云用户两个视角,为您介绍如何使用 logkit-pro 进行日志收集。
Kubernetes 容器云平台运维视角
作为 Kubernetes 容器云平台的运维,想要收集日志非常简单,因为 Kubernetes 已经将日志统一存放在/var/log/containers/
文件夹下,如下图所示:
对于每一个日志,都是一个软连接,连接到实际的日志文件。对于此类日志,使用 logkit-pro 的文件读取模式 (tailx) 即可直接读取,接入方式如下。
1.安装 logkit-pro
1.登录 logkit-pro,进入机器管理页面,点击添加机器。
2.手动安装:根据您机器的操作系统版本选择对应的命令,复制到命令行工具即可,如图所示:
详细的安装文档可以阅读 logkit-pro 安装 。
- 安装完毕后,您可以在机器列表页面看到您安装的机器:
2.使用 logkit-pro 收集日志
安装好 logkit-pro 以后,您就可以使用 logkit-pro 来收集日志。
进入数据收集页面,点击 添加收集器 -> 日志收集。
- 从数据源读取日志,选择数据源类型为
从文件读取(tailx)
模式,填写日志路径为/var/log/containers/*.log
。您需要注意这里的来源标签
字段,在解析 Kubernetes 日志时需要用到这个字段。
- 解析数据:选择按原始日志逐行发送:
- 数据转换,选择专门为 Kubernetes 数据收集打造的数据转换器
k8stag
,该转换器的原理是根据用户收集的文件路径和名称,解析出 Kubernetes 日期的 pod 和 node 信息。
注意:
这一步在解析的时候可能会报错误,因为测试过程中读取的数据里面没有带上文件路径,但是不影响实际运行,请不用担心,添加上即可。
- 发送数据:将数据发送至日志分析平台,填写工作流(pipeline)名称和智能日志平台的实时仓库名称即可。日志仓库名称无需填写,开启
自动创建并导出到日志分析
,系统将会自动创建与实时仓库同名的日志仓库。
- 确认日志收集:
- 分发收集器到指定机器:确认添加收集器之后系统会提示您是否需要分发到当前机器,选择确认分发。
到这里您就将日志收集好了,下面让我们来看看,作为 Kubernetes 平台的用户,我们该如何使用 logkit Pro。
Kubernetes 容器云平台用户视角
当您作为 Kubernetes 用户时,你无法将 logkit Pro 安装在服务器上收集日志,但是你可以利用 Kubernetes 的 Daemonset 功能, 将 logkit Pro 以 daemonset 的形式运行在 Kubernetes 的每一个机器上,此时 logkit Pro 容器与您的实际容器通过共享 volume 的方式收集日志数据。
Docker 的日志统一放置在宿主机的 /var/lib/docker/containers
目录上,作为 daemonset 的 logkit Pro 会自动探测该目录中新生成的日志并将之收集。
1. 下载配置文件
您可以通过如下命令获取部署到 Kubernetes 的配置文件。
保存下面的配置文件到本地,假设命名为logkit_on_k8s.yaml
,具体的配置如下(其中用到的logkit-pro镜像为 qiniupandora/logkit:v1.0.3
, 请根据实际版本对应修改镜像):
---
apiVersion: v1
kind: ConfigMap
metadata:
name: logkit-config
namespace: kube-system
labels:
k8s-app: logkit
data:
k8s.conf: |-
{
"name": "k8s_runner",
"batch_interval": 60,
"batch_size": 2097152,
"extra_info": true,
"reader": {
"mode": "tailx",
"log_path": "/var/log/containers/*.log",
"read_from": "oldest",
"datasource_tag": "source_file",
"expire": "240h",
"max_open_files": "1024",
"stat_interval": "3m"
},
"parser": {
"type": "raw",
"timestamp": "true"
},
"transforms": [
{
"sourcefilefield": "source_file",
"type": "k8stag"
}
],
"senders": [
{
"sender_type": "pandora",
"pandora_workflow_name": "k8s_log",
"pandora_repo_name": "k8s_log",
"pandora_ak": "${QINIU_ACCESS_KEY}",
"pandora_sk": "${QINIU_SECRET_KEY}",
"pandora_host": "https://nb-pipeline.qiniuapi.com",
"pandora_region": "nb",
"pandora_schema_free": "true",
"pandora_enable_logdb": "true",
"pandora_logdb_host": "https://nb-insight.qiniuapi.com",
"pandora_gzip": "true",
"logkit_send_time":"false",
"pandora_uuid": "false",
"pandora_withip": "true",
"ft_strategy": "backup_only",
"ignore_invalid_field": "true",
"pandora_auto_convert_date": "true"
}
]
}
---
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: logkit
namespace: kube-system
labels:
k8s-app: logkit
spec:
updateStrategy:
type: RollingUpdate
template:
metadata:
labels:
k8s-app: logkit
spec:
terminationGracePeriodSeconds: 30
containers:
- name: logkit
image: qiniupandora/logkit:v0.3.1
env:
- name: QINIU_ACCESS_KEY
value: change_me_to_your_qiniu_access_key
- name: QINIU_SECRET_KEY
value: change_me_to_your_qiniu_secret_key
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
securityContext:
runAsUser: 0
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 100Mi
volumeMounts:
- name: config
mountPath: /app/confs
readOnly: true
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
- name: varlogcontainers
mountPath: /var/log/containers
readOnly: true
- name: varlogpods
mountPath: /var/log/pods
readOnly: true
- name: logkitmeta
mountPath: /app/meta
- name: logkitconfs
mountPath: /app/.logkitconfs
volumes:
- name: config
configMap:
defaultMode: 0600
name: logkit-config
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
- name: varlogcontainers
hostPath:
path: /var/log/containers
- name: varlogpods
hostPath:
path: /var/log/pods
- name: logkitmeta
hostPath:
path: /local/logkit/meta
- name: logkitconfs
hostPath:
path: /local/logkit/.logkitconfs
- name: data
emptyDir: {}
2. 修改配置文件
默认情况下,我们的配置文件会使用 kube-system
这个 Kubernetes 的 namespace ,所有的部署仅针对该 namespace 生效。如果你想要使用别的 namespace ,只需要修改配置文件的 namespace 部分,将之改为你的 namespace 名称。
另外,这份默认的配置文件,你只需要修改2个基本参数,就可以运行。
- name: QINIU_ACCESS_KEY
value: change_me_to_your_qiniu_access_key
- name: QINIU_SECRET_KEY
value: change_me_to_your_qiniu_secret_key
将 change_me_to_your_qiniu_access_key
改为您七牛账号的 AK(access_key) ,将 change_me_to_your_qiniu_secret_key
改为您七牛账号的 SK(secret_key)。
3. 部署到 Kubernetes
部署到 Kubernetes 非常简单,只需要运行一行命令即可。
kubectl create -f logkit_on_k8s.yaml
通过以下命令查看部署是否成功:
$ kubectl --namespace=kube-system get ds/logkit
此时日志就源源不断的流向您的数据源啦,可以在智能日志分析平台中查看。如下图所示。
默认就能获得机器的 hostname 信息,Kubernetes container 信息, Kubernetes 的 namespace 信息,Kubernetes 的 pod 信息,容器的 IP 地址,机器的操作系统,原始的用户日志。
4. 在logkit-pro网站中心化管理agent
同样您可以在 http://logkit-pro.qiniu.com/ 机器列表看到机器,并中心化管理。