我是靠谱客的博主 大气小刺猬,最近开发中收集的这篇文章主要介绍Kubernetes 日志查询分析实践,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本文来自于【阿里云官方镜像站:https://developer.aliyun.com/mirror/?utm_content=g_1000307095 】

原文链接:https://developer.aliyun.com/article/740746?spm=a2c6h.12873581.0.0.484f7e46JZ6t8J

准备工作

为了完成后续的相关操作,我们需要准备一个 K8s 集群,操作步骤如下:

登陆容器服务控制台。创建一个标准托管集群(杭州区域),在向导中勾选上【使用 EIP 暴露 API Server】 和【使用日志服务】。集群创建完毕后,回到集群列表页面,点击【更多->通过 CloudShell 管理集群】。在 CloudShell 中输入 kubectl get ds -n kube-system,结果中显示的 logtail-ds 即为了实现数据采集所安装的日志服务组件。打开日志服务控制台,可以看到和 K8s 集群 ID 所对应的 project 也已经创建完毕。

操作截图如下:

图:创建托管集群(步骤 2)

图:打开 CloudShell(步骤 3)

图:在 CloudShell 中查看日志服务组件(步骤 4)

图:打开日志服务控制台,查看 project(步骤 5)

1. 数据采集

在 K8s 环境下,容器日志数据从大体上分为两类:容器标准输出和容器内文本文件,前者是容器特有的一种日志存在形式,后者和传统的文本文件日志类似,只是文件存放在各个容器内部,相互之间隔离。下面我们将介绍如何对这两种类型的日志进行采集。

1.1. Mock 数据

我们将使用如下两个 YAML 文件分别生成标准输出和容器内文件两种形式的 mock 数据。
容器标准输出

# 创建两个 pod 来生成 mock 数据apiVersion: batch/v1kind: Jobmetadata:  name: nginx-stdout-log-demo-1  namespace: nginx-stdoutspec:  template:    metadata:      name: nginx-stdout-log-demo-1    spec:      containers:
     - name: nginx-stdout-log-demo-1        image: registry.cn-hangzhou.aliyuncs.com/log-service/docker-log-test:latest        command: ["/bin/mock_log"]        args: ["--stderr=false", "--stdout=true", "--log-type=nginx", "--total-count=100000000", "--logs-per-sec=5"]      restartPolicy: Never
---apiVersion: batch/v1kind: Jobmetadata:  name: nginx-stdout-log-demo-2  namespace: nginx-stdoutspec:  template:    metadata:      name: nginx-stdout-log-demo-2    spec:      containers:
     - name: nginx-stdout-log-demo-2        image: registry.cn-hangzhou.aliyuncs.com/log-service/docker-log-test:latest        command: ["/bin/mock_log"]        args: ["--stderr=false", "--stdout=true", "--log-type=nginx", "--total-count=100000000", "--logs-per-sec=5"]      restartPolicy: Never

容器内文本文件(/var/log/access.log)

apiVersion: batch/v1kind: Jobmetadata:  name: nginx-file-log-demo  namespace: nginx-filespec:  template:    metadata:      name: nginx-file-log-demo    spec:      restartPolicy: Never      containers:
     - name: nginx-file-log-demo        image: registry.cn-hangzhou.aliyuncs.com/log-service/docker-log-test:latest        command: ["/bin/mock_log"]        args: ["--log-type=nginx", "--stdout=false", "--stderr=false", "--path=/var/log/access.log", "--total-count=100000000", "--logs-per-sec=5"]

操作步骤:

打开 CloudShell,参考准备工作中的步骤 3。在集群中应用上面提及的两个 YAML(Github)。执行 kubectl get pods 查看负责生成日志的几个 Pod。

查看两个 Pod 生成日志的情况(根据实际情况替换命令中的 pod 名)

标准输出:执行 kubectl logs -n nginx-stdout --tail=10 nginx-stdout-log-demo-1-7kvwx。容器内文件:执行 kubectl exec -n nginx-file nginx-file-log-demo-7frsp -- bash -c "tail /var/log/access.log"。$ kubectl create namespace nginx-stdout$ kubectl create -f https://raw.githubusercontent.com/goclis/kubernetes-mock-log/master/pod_nginx_stdout.yaml
$ kubectl create namespace nginx-file$ kubectl create -f https://raw.githubusercontent.com/goclis/kubernetes-mock-log/master/pod_nginx_file.yaml

命令:生成 mock 数据(步骤 2)

$ kubectl get pods -A
NAMESPACE      NAME                                               READY   STATUS    RESTARTS   AGE
nginx-file     nginx-file-log-demo-7frsp                          1/1     Running   0          2m9s
nginx-stdout   nginx-stdout-log-demo-1-7kvwx                      1/1     Running   0          2m12s
nginx-stdout   nginx-stdout-log-demo-2-4x7vw                      1/1     Running   0          2m12s

命令:查看日志服务组件(步骤 3)

1.2. 采集标准输出

操作步骤:

登陆日志服务控制台,点击进入集群 ID 对应的 project。创建一个 logstore 用于存储标准输出日志,比如 k8s-stdout。在 logstore 中新增 Logtail 配置,类型为【Docker 标准输出】,选择现有机器组中前缀为 k8s-group 的机器组。在【数据源设置】页面,填写【配置名称】和【插件配置】。

操作截图如下:

图:创建 Logtail 采集配置

图:选择 Docker 标准输出配置

图:选择现有机器组

图:选择 k8s-group 开头的机器组

图:填写 Docker 标准输出采集配置内容
以下为两个可选的采集配置(使用 IncludeLabel 分别采集两个 namespace 下的数据,参考):
配置:采集 namespace nginx-stdout

{    "inputs": [
       {            "detail": {                "IncludeLabel": {                    "io.kubernetes.pod.namespace": "nginx-stdout"
               },                "ExcludeLabel": {}
           },            "type": "service_docker_stdout"
       }
   ]
}

配置:采集 namespace kube-system

{    "inputs": [
       {            "detail": {                "IncludeLabel": {                    "io.kubernetes.pod.namespace": "kube-system"
               },                "ExcludeLabel": {}
           },            "type": "service_docker_stdout"
       }
   ]
}

1.3. 采集容器内文件

操作步骤:

登陆日志服务控制台,点击进入集群 ID 对应的 project。创建一个 logstore 用于存储容器内文件日志,比如 nginx-file。在 logstore 中新增 Logtail 配置,类型为【Docker 文件】,选择现有机器组中前缀为 k8s-group 的机器组。在【数据源设置】页面,填写【配置名称】和具体的配置信息(采集文件的路径、Label 等),示例为采集 /var/log/access.log。

图:选择 Docker 文件配置

图:填写 Docker 文件采集配置内容

2. 日志查询

2.1. 设置字段索引 & 开启日志聚类

为了使用日志服务提供的查询、日志聚类等功能,首先需要对索引进行配置。操作步骤如下:

登陆日志服务控制台,进入集群 ID 对应的 project,从左侧导航栏的 logstore 中选择先前创建的 k8s-stdout,展开点击查询分析进行查询控制台。点击右上角的【查询分析属性 -> 设置索引】。在弹出窗口中勾选上【日志聚类】,然后点击【自动生成索引】。点击【确定】保存索引。

操作截图如下:

图:进入 logstore 查询分析界面

图:索引配置入口

图:开启日志聚类

图:自动生成字段索引

2.2. 基本查询

在配置完索引后,我们可以在查询输入框中使用查询语句可以快速地筛选日志,以下是一些示例:

查看命名空间 nginx-stdout 下的日志:_namespace_:nginx-stdout查看其他命名空间下的日志:not _namespace_: nginx-stdout查看命名空间 kube-system 下指定 pod 的日志:_namespace_: kube-system and _pod_name_: xxxxxx

在实际查询过程中,我们可以通过直接点击查询结果中的内容来快速填充查询语句,截图如下。

图:点击查询结果中的内容

图:查询语句快速填充

2.3. 日志聚类 & 上下文查询 & LiveTail

在排查问题时,我们一般会组合使用日志聚类、上下文查询以及 LiveTail 这三个功能来辅助问题排查。

首先,利用日志聚类来快速地查看日志模式,发现其中怀疑的问题日志。接着,利用上下文查询,来跟踪问题日志前后的日志,辅助我们定位问题。最后,在根据问题做出调整后,使用 LiveTail 来查看最新日志的变化情况,确认是否达到修改预期。

以下假设应用 pod 是 metrics-server,我们可以借助这套方法来对它进行分析:

查询输入框输入 metrics-server,点击查询分析,可以看到所有范围(默认为最近 15 分钟)的全部日志,一般来说会很多。由于日志较多,为了发现日志模式,我们切换到【日志聚类】标签页,可以看到这段时间内的日志在模式上分为有限的几类。我们可以拖动 pattern 进度条选择粒度,对于特定 pattern,点击【日志数量】来查看具体日志。悬停到日志时间左侧的图标,点击弹出菜单中的【上下文浏览】,在弹出页面中同样可以进行筛选,并点击【更早】、【更新】来查看指定日志的上文和下文。悬停到日志时间左侧的图标,点击弹出菜单中的【LiveTail】。

图:日志聚类结果

图:上下文查询入口

图:上下文查询

图:LiveTail

3. Ingress & Audit 方案

除了 K8s 环境下基本的日志采集、查询分析功能以外,我们还针对 K8s 环境下的 Ingress、审计(Audit)日志提供了方案。

3.1. Ingress

为了在集群中部署 Ingress 方案,只需要在集群已安装日志服务组件的基础上,应用如下的 YAML 文件即可:

apiVersion: log.alibabacloud.com/v1alpha1kind: AliyunLogConfigmetadata:
 # your config name, must be unique in you k8s cluster
 name: k8s-nginx-ingressspec:
 # logstore name to upload log
 logstore: nginx-ingress
 # product code, only for k8s nginx ingress
 productCode: k8s-nginx-ingress
 # logtail config detail
 logtailConfig:
   inputType: plugin
   # logtail config name, should be same with [metadata.name]
   configName: k8s-nginx-ingress
   inputDetail:
     plugin:
       inputs:
       - type: service_docker_stdout
         detail:
           IncludeLabel:
             io.kubernetes.container.name: nginx-ingress-controller
           Stderr: false
           Stdout: true
       processors:
       - type: processor_regex
         detail:
           KeepSource: false
           Keys:
           - client_ip
           - x_forward_for
           - remote_user
           - time
           - method
           - url
           - version
           - status
           - body_bytes_sent
           - http_referer
           - http_user_agent
           - request_length
           - request_time
           - proxy_upstream_name
           - upstream_addr
           - upstream_response_length
           - upstream_response_time
           - upstream_status
           - req_id
           - host
           NoKeyError: true
           NoMatchError: true
           Regex: ^(S+)s-s[([^]]+)]s-s(S+)s[(S+)sS+s"(w+)s(S+)s([^"]+)"s(d+)s(d+)s"([^"]*)"s"([^"]*)"s(S+)s(S+)+s[([^]]*)]s(S+)s(S+)s(S+)s(S+)s(S+)s*(S*).*
           SourceKey: content

该 YAML 会在集群对应的日志服务 project 中创建一个名为 nginx-ingress 的 logstore,存储相关的日志,并且会对应地创建一系列基于 Ingress 日志所构建的详细报表,辅助我们分析 Ingress 日志。

图:Ingress 概览
更多信息可以阅读《Kubernetes Ingress 日志分析入门》。

审计(Audit)

目前,审计方案会在集群创建时自动应用,相关的日志会存储在日志服务 project 下以 audit- 为前缀的 logstore 中,其中包含针对集群操作的详细日志,比如资源(Pod、Deploy)的创建与删除、集群的扩容记录等。类似地,审计方案同样提供了一系列详细报表。

图:审计中心概览
更多信息可以阅读《最全 Kubernetes 审计日志方案》。

参考文档

Kubernetes 日志采集流程容器文本日志采集容器标准输出

最后

以上就是大气小刺猬为你收集整理的Kubernetes 日志查询分析实践的全部内容,希望文章能够帮你解决Kubernetes 日志查询分析实践所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部