Kubernetes 日志查询分析实践

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
日志服务 SLS,月写入数据量 50GB 1个月
简介: 本文将介绍如何基于日志服务实现对 Kubernetes(以下简称 K8s)日志的采集以及查询分析,此外,还附带了对 Ingress、Audit 方案的简要介绍。为了方便大家通过操作来加深理解,本文提供了详细的操作步骤以及对应截图和配置代码。

本文将介绍如何基于日志服务实现对 Kubernetes(以下简称 K8s)日志的采集以及查询分析,此外,还附带了对 Ingress、Audit 方案的简要介绍。为了方便大家通过操作来加深理解,本文提供了详细的操作步骤以及对应截图和配置代码。

准备工作

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

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

操作截图如下:

006y8mN6ly1g8dqitv0wdj30gd0amdgr.jpg


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

006y8mN6ly1g8dql3p6irj327y0ogjur.jpg


图:打开 CloudShell(步骤 3)

006y8mN6ly1g8dqlkm9atj32io09wdk9.jpg


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

006y8mN6ly1g8dqlphq88j31v80c8ad6.jpg


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

1. 数据采集

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

1.1. Mock 数据

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

容器标准输出

# 创建两个 pod 来生成 mock 数据
apiVersion: batch/v1
kind: Job
metadata:
  name: nginx-stdout-log-demo-1
  namespace: nginx-stdout
spec:
  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/v1
kind: Job
metadata:
  name: nginx-stdout-log-demo-2
  namespace: nginx-stdout
spec:
  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/v1
kind: Job
metadata:
  name: nginx-file-log-demo
  namespace: nginx-file
spec:
  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"]

操作步骤:

  1. 打开 CloudShell,参考准备工作中的步骤 3。
  2. 在集群中应用上面提及的两个 YAML(Github)。
  3. 执行 kubectl get pods 查看负责生成日志的几个 Pod。
  4. 查看两个 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. 采集标准输出

操作步骤:

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

操作截图如下:

006y8mN6ly1g8dqxdnnm4j30ha0vmdhs.jpg


图:创建 Logtail 采集配置

006y8mN6ly1g8dqxitramj320g0gygq0.jpg


图:选择 Docker 标准输出配置

006y8mN6ly1g8dqysqak6j31vs0g4428.jpg


图:选择现有机器组

006y8mN6ly1g8dqyoazwmj312k0u0go4.jpg


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

006y8mN6ly1g8dqz9d11xj31br0u0dmr.jpg


图:填写 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. 采集容器内文件

操作步骤:

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

006y8mN6ly1g8dr24hr7oj320k0gun1d.jpg


图:选择 Docker 文件配置

006y8mN6ly1g8dr2jvxmtj319u0nagqg.jpg


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

2. 日志查询

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

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

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

操作截图如下:

006y8mN6ly1g8dreoeleaj30ly0ziwhq.jpg


图:进入 logstore 查询分析界面

006y8mN6ly1g8drbdqjq4j30ic03uq36.jpg


图:索引配置入口

006y8mN6ly1g8drdlvoedj30ug09ydga.jpg


图:开启日志聚类

006y8mN6ly1g8dretm38tj314r0u046g.jpg


图:自动生成字段索引

2.2. 基本查询

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

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

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

006y8mN6ly1g8drgur795j322m0to7c0.jpg


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

006y8mN6ly1g8drgxu3d5j31z50u0thr.jpg


图:查询语句快速填充

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

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

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

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

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

006y8mN6ly1g8drny6u7ij32220lyguu.jpg


图:日志聚类结果

006y8mN6ly1g8dro8ouq0j32300q4jxv.jpg


图:上下文查询入口

006y8mN6ly1g8drodxuozj314n0u07mo.jpg


图:上下文查询

006y8mN6ly1g8drok2mcmj321w0lwjyb.jpg


图:LiveTail

3. Ingress & Audit 方案

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

3.1. Ingress

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

apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
  # your config name, must be unique in you k8s cluster
  name: k8s-nginx-ingress
spec:
  # 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+)\s\S+\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 日志。

006y8mN6ly1g8dt2sc61jj31yj0u0k4t.jpg


图:Ingress 概览

更多信息可以阅读《Kubernetes Ingress 日志分析入门》

审计(Audit)

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

006y8mN6ly1g8dt71j88dj31n90u0k6k.jpg


图:审计中心概览

更多信息可以阅读《最全 Kubernetes 审计日志方案》

参考文档

qrCode


扫码加入钉钉群

目录
相关文章
|
14天前
|
Cloud Native 持续交付 Docker
云原生技术实践:Docker容器化部署教程
【9月更文挑战第4天】本文将引导你了解如何利用Docker这一云原生技术的核心工具,实现应用的容器化部署。文章不仅提供了详细的步骤和代码示例,还深入探讨了云原生技术背后的哲学,帮助你理解为何容器化在现代软件开发中变得如此重要,并指导你如何在实际操作中运用这些知识。
|
16天前
|
运维 Kubernetes 监控
Loki+Promtail+Grafana监控K8s日志
综上,Loki+Promtail+Grafana 监控组合对于在 K8s 环境中优化日志管理至关重要,它不仅提供了强大且易于扩展的日志收集与汇总工具,还有可视化这些日志的能力。通过有效地使用这套工具,可以显著地提高对应用的运维监控能力和故障诊断效率。
33 0
|
19天前
|
运维 Kubernetes 监控
自动化运维:使用Python脚本实现系统监控云原生技术实践:Kubernetes在现代应用部署中的角色
【8月更文挑战第31天】在现代IT运维管理中,自动化已成为提高效率和准确性的关键。本文将通过一个Python脚本示例,展示如何实现对服务器的自动监控,包括CPU使用率、内存占用以及磁盘空间的实时监测。这不仅帮助运维人员快速定位问题,也减轻了日常监控工作的负担。文章以通俗易懂的语言,逐步引导读者理解并实践自动化监控的设置过程。 【8月更文挑战第31天】本文旨在探索云原生技术的核心—Kubernetes,如何革新现代应用的开发与部署。通过浅显易懂的语言和实例,我们将一窥Kubernetes的强大功能及其对DevOps文化的影响。你将学会如何利用Kubernetes进行容器编排,以及它如何帮助你的
|
19天前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
53 0
|
19天前
|
运维 Kubernetes Cloud Native
拥抱云原生:Kubernetes 在现代应用部署中的实践
【8月更文挑战第31天】在数字化转型的浪潮中,云原生技术成为推动企业创新和效率提升的关键力量。本文将深入探讨如何利用 Kubernetes,这一强大的容器编排工具,来部署和管理现代应用。我们将从基础架构搭建开始,一步步引导您配置集群,并通过实际代码示例演示如何部署一个简单的应用。无论您是云原生新手还是希望深化理解,这篇文章都将为您提供实操经验和理论知识的融合之旅。
|
19天前
|
Kubernetes Cloud Native 应用服务中间件
云原生技术入门与实践:Kubernetes的简易部署
【8月更文挑战第31天】云原生技术已成为现代软件部署的黄金标准,而Kubernetes作为其核心组件之一,在容器编排领域独领风骚。本文将引导您通过简单的步骤,快速部署一个Kubernetes集群,并运行一个简单的应用,让您轻松迈入云原生的世界。
|
19天前
|
Kubernetes Cloud Native 应用服务中间件
云原生入门:Kubernetes 和容器化技术的实践之旅
【8月更文挑战第31天】 在这篇文章中,我们将踏上一场探索云原生世界的旅程。我们将从基础的容器化技术讲起,逐步深入到Kubernetes这个强大的容器编排工具。文章会通过一个实际的例子,带领大家了解如何将一个简单的应用容器化并在Kubernetes集群上运行起来。无论你是云原生领域的新手,还是希望巩固知识的开发者,这篇文章都会为你提供一次实操的机会,让你对云原生有一个更加直观的认识。
|
19天前
|
Cloud Native 云计算 开发者
云原生技术实践:Docker容器化部署示例
【8月更文挑战第31天】本文通过深入浅出的方式,介绍了如何在云计算时代利用Docker容器技术实现应用的快速部署和高效管理。文章不仅解释了Docker的基本概念和优势,还提供了详细的操作步骤和代码示例,帮助初学者轻松入门。让我们一起探索云原生的世界,解锁应用部署的新姿势!
|
19天前
|
Kubernetes Cloud Native JavaScript
云原生之旅:Kubernetes 集群搭建与应用部署实践
【8月更文挑战第31天】云原生技术正在改变软件开发和运维的方式,而Kubernetes作为其核心组件之一,提供了一个强大的平台来编排容器化的应用。本文将引导你了解如何搭建一个基本的Kubernetes集群,并通过一个简单的Node.js应用示例,展示如何在集群中部署和管理应用。我们将从零开始,逐步构建起对Kubernetes的直观理解,并在实践中学习其核心概念。
|
19天前
|
Kubernetes Cloud Native 开发者
探索云原生技术:Kubernetes入门与实践探索Windows操作系统的隐藏功能
【8月更文挑战第31天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性、效率和可靠性的关键。本文将带你了解云原生的核心组件之一——Kubernetes(K8s),通过浅显易懂的语言和实际代码示例,引导你步入这一强大工具的世界。无论你是初学者还是有经验的开发者,本篇都将为你打开一扇通向高效资源管理与自动化部署的大门。