• 1. 根据您机器的操作系统版本下载logkit
  • 2. 运行 logkit
  • 3. 访问 logkit 配置页面
  • 4. 下载配置文件
  • 5. 修改配置文件
  • 6. 部署到Kubernetes

    容器日志收集与处理 — Kubernetes 容器云平台日志分析案例

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

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

    Kubernetes容器云平台运维视角

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

    此处输入图片的描述

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

    1. 根据您机器的操作系统版本下载logkit

    https://github.com/qiniu/logkit/wiki/Download

    解压后您可以看到

    1. logkit
    2. logkit.conf
    3. public/
    4. confs/

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

    • bind_host 是设置绑定的端口,启动后可以根据这个页面配置 logkit。
    • static_root_path 是 logkit 页面的静态资源路径,就是填写 public 文件夹所在路径,强烈建议写成 绝对路径

    2. 运行 logkit

    1. nohup ./logkit -f logkit.conf > logkit.log 2>&1

    3. 访问 logkit 配置页面

    假设我们bind_host填写的页面内容为:”localhost:3000”,那么我们可以在浏览器打开这个页面http://localhost:3000

    点击【增加 Runner】,第一步 【配置数据源】

    此处输入图片的描述

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

    然后配置解析方式,选择 【raw】方式解析
    此处输入图片的描述

    然后依次点击,知道配置发送方式时填写您的七牛账户”ak”,”sk”。

    此时 logkit 部分您就配置完毕了,下面让我们来看看,作为 Kubernetes 平台的用户,我们该如何使用 logkit 。

    Kubernetes 容器云平台用户视角

    当你作为 Kubernetes 用户时,你无法将 logkit 安装在服务器上收集日志,但是你可以利用 Kubernetes 的 Daemonset 功能, 将 logkit 以 daemonset 的形式运行在 Kubernetes 的每一个机器上,此时 logkit 容器与您的实际容器通过共享 volume 的方式收集日志数据。

    Docker 的日志统一放置在宿主机的 /var/lib/docker/containers 目录上,作为 daemonset 的 logkit 会自动探测该目录中新生成的日志并将之收集。

    4. 下载配置文件

    您可以通过如下命令获取部署到 Kubernetes 的配置文件。

    1. curl -L -O https://raw.githubusercontent.com/qiniu/logkit/develop/deploy/logkit_on_k8s.yaml

    执行后生成的配置文件为 logkit_on_k8s.yaml,具体的配置如下(可能随版本变动下载到的会有所不同):

    1. ---
    2. apiVersion: v1
    3. kind: ConfigMap
    4. metadata:
    5. name: logkit-config
    6. namespace: kube-system
    7. labels:
    8. k8s-app: logkit
    9. data:
    10. k8s.conf: |-
    11. {
    12. "name": "k8s_runner",
    13. "batch_interval": 60,
    14. "reader": {
    15. "mode": "tailx",
    16. "log_path": "/var/log/containers/*.log",
    17. "read_from": "oldest",
    18. "datasource_tag": "source_file",
    19. "expire": "240h",
    20. "stat_interval": "3m"
    21. },
    22. "parser": {
    23. "type": "raw",
    24. "timestamp": "true"
    25. },
    26. "senders": [
    27. {
    28. "sender_type": "pandora",
    29. "pandora_repo_name": "k8s_log",
    30. "pandora_ak": "${QINIU_ACCESS_KEY}",
    31. "pandora_sk": "${QINIU_SECRET_KEY}",
    32. "pandora_host": "https://pipeline.qiniu.com",
    33. "pandora_region": "nb",
    34. "pandora_schema_free": "true",
    35. "pandora_enable_logdb": "true",
    36. "pandora_logdb_host": "https://logdb.qiniu.com",
    37. "pandora_gzip": "true",
    38. "pandora_uuid": "false",
    39. "pandora_withip": "true",
    40. "ft_strategy": "backup_only",
    41. "ignore_invalid_field": "true",
    42. "pandora_auto_convert_date": "true"
    43. }
    44. ]
    45. }
    46. ---
    47. apiVersion: extensions/v1beta1
    48. kind: DaemonSet
    49. metadata:
    50. name: logkit
    51. namespace: kube-system
    52. labels:
    53. k8s-app: logkit
    54. spec:
    55. template:
    56. metadata:
    57. labels:
    58. k8s-app: logkit
    59. spec:
    60. terminationGracePeriodSeconds: 30
    61. containers:
    62. - name: logkit
    63. image: wonderflow/logkit:v1.3.6
    64. env:
    65. - name: QINIU_ACCESS_KEY
    66. value: change_me_to_your_qiniu_access_key
    67. - name: QINIU_SECRET_KEY
    68. value: change_me_to_your_qiniu_secret_key
    69. - name: POD_NAMESPACE
    70. valueFrom:
    71. fieldRef:
    72. fieldPath: metadata.namespace
    73. securityContext:
    74. runAsUser: 0
    75. resources:
    76. limits:
    77. memory: 200Mi
    78. requests:
    79. cpu: 100m
    80. memory: 100Mi
    81. volumeMounts:
    82. - name: config
    83. mountPath: /app/confs/k8s.conf
    84. readOnly: true
    85. subPath: k8s.conf
    86. - name: varlibdockercontainers
    87. mountPath: /var/lib/docker/containers
    88. readOnly: true
    89. - name: varlogcontainers
    90. mountPath: /var/log/containers
    91. readOnly: true
    92. - name: varlogpods
    93. mountPath: /var/log/pods
    94. readOnly: true
    95. volumes:
    96. - name: config
    97. configMap:
    98. defaultMode: 0600
    99. name: logkit-config
    100. - name: varlibdockercontainers
    101. hostPath:
    102. path: /var/lib/docker/containers
    103. - name: varlogcontainers
    104. hostPath:
    105. path: /var/log/containers
    106. - name: varlogpods
    107. hostPath:
    108. path: /var/log/pods
    109. - name: data
    110. emptyDir: {}

    5. 修改配置文件

    默认情况下,我们的配置文件会使用 kube-system 这个 Kubernetes 的 namespace ,所有的部署仅针对该 namespace 生效。如果你想要使用别的 namespace ,只需要修改配置文件的 namespace 部分,将之改为你的 namespace 名称。

    另外,这份默认的配置文件,你只需要修改2个基本参数,就可以运行。

    1. - name: QINIU_ACCESS_KEY
    2. value: change_me_to_your_qiniu_access_key
    3. - name: QINIU_SECRET_KEY
    4. 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)。

    6. 部署到Kubernetes

    部署到 Kubernetes 非常简单,只需要运行一行命令即可。

    1. kubectl create -f logkit_on_k8s.yaml

    通过以下命令查看部署是否成功:

    1. $ kubectl --namespace=kube-system get ds/logkit

    此时日志就源源不断的流向您的数据源啦,可以在 Pandora 日志检索中查看。如 图4 所示。

    此处输入图片的描述

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

    后续配置可以参考【运维日志分析 — 日志搜索和关键字报警】