Kubernetes 容器日志采集

优采云 发布时间: 2020-08-20 11:11

  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

  同样您可以在 机器列表听到机器,并中心化管理。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线