智能日志管理平台

  • Kubernetes 容器日志采集

    最近更新时间:2018-08-16 17:01:50

    容器日志收集与处理 -- Kubernetes 容器云平台日志采集

    在 nginx 日志分析搭建案例中大家已经明白如何通过 Pandora 快速搭建实时监控与报警平台的整个过程。除了 nginx 这类常见基础组件之外,您可能本身有一些自研的程序,也需要做相应的日志收集处理工作,那么操作方法与之类似,只是日志的解析方式不同而已。但是如果您的程序运行在容器云(如 Kubernetes)之上,那么该如何处理呢?

    本文将以 Kubernetes 容器云平台运维 和 Kubernetes 容器云用户两个视角,为您介绍如何使用 logkit Pro 进行日志收集。

    1.Kubernetes 容器云平台运维视角

    2.Kubernetes 容器云平台用户视角


    Kubernetes 容器云平台运维视角

    作为 Kubernetes 容器云平台的运维,想要收集日志非常简单,因为 Kubernetes 已经将日志统一存放在/var/log/containers/文件夹下,如下图所示:

    对于每一个日志,都是一个软连接,连接到实际的日志文件。对于此类日志,使用 logkit Pro 的文件读取模式 (tailx) 即可直接读取,接入方式如下。

    1.下载并运行 logkit Pro

    1.根据您机器的操作系统版本下载 logkit Pro:请阅读 logkit-pro 安装

    解压后您可以看到:

    其中 logkit.conf 为主配置文件,用于配置 logkit Pro 的 web 页面及端口配置,其中

    • bind_host 是设置绑定的端口,启动后可以根据这个配置打开 logkit Pro web 页面,默认的端口为 3000

    2.命令行进入 logkit Pro 所在文件夹,输入如下命令启动 logkit Pro:

    ./logkit-pro -f logkit-pro.conf

    3.通过浏览器访问 logkit Pro:

    http://127.0.0.1:3000

    logkit首页

    4.本地登录 logkit Pro:

    在 logkit Pro 首页右上角,点击登录

    本地登录

    本地登录的默认用户名和密码都是 admin。

    2.使用 logkit Pro 收集日志

    进入数据收集页面,点击添加收集器开始配置收集器。

    1.注意选择数据源类型为 "tailx" 模式,填写日志路径为 /var/log/containers/*.log

    2.配置解析方式,选择按原始日志解析 :

    1. 数据转换,选择专门为Kubernetes数据收集打造的数据转换器k8stag,该转换器的原理是根据用户收集的文件路径和名称,解析出Kubernetes日期的pod和node信息。

    注意,这一步在解析的时候可能会报错误,因为测试过程中读取的数据里面没有带上文件路径,但是不影响实际运行,请不用担心,添加上即可。

    4.发送数据:将数据发送至日志分析平台,填写日志分析仓库名称即可。

    同时需要填写工作流名称与数据源名称,将日志发送到工作流平台,方便在工作流平台对数据进行计算。

    5.确认日志收集:

    到这里您就将日志收集好了,下面让我们来看看,作为 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:v0.3.0, 随版本更新变动):

    ---
    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
          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: 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
    此时日志就源源不断的流向您的数据源啦,可以在 Pandora 日志分析平台中查看。如下图所示。

    默认就能获得机器的 hostname 信息,Kubernetes container 信息, Kubernetes 的 namespace 信息,Kubernetes 的 pod 信息,容器的 IP 地址,机器的操作系统,原始的用户日志。

    后续监控报警配置可以参考运维日志分析 -- 日志搜索和关键字报警

    以上内容是否对您有帮助?
  • Close