简介: 本文将介绍如何基于日志服务实现对 Kubernetes(以下简称 K8s)日志的采集以及查询分析,此外,还附带了对 Ingress、Audit 方案的简要介绍。为了方便大家通过操作来加深理解,本文提供了详细的操作步骤以及对应截图和配置代码。
作者:抱泽
镜像下载、域名解析、时间同步请点击 阿里巴巴开源镜像站
为了完成后续的相关操作,我们需要准备一个 K8s 集群,操作步骤如下:
kubectl get ds -n kube-system
,结果中显示的 logtail-ds
即为了实现数据采集所安装的日志服务组件。操作截图如下:
图:创建托管集群(步骤 2)
图:打开 CloudShell(步骤 3)
图:在 CloudShell 中查看日志服务组件(步骤 4)
图:打开日志服务控制台,查看 project(步骤 5)
在 K8s 环境下,容器日志数据从大体上分为两类:容器标准输出和容器内文本文件,前者是容器特有的一种日志存在形式,后者和传统的文本文件日志类似,只是文件存放在各个容器内部,相互之间隔离。下面我们将介绍如何对这两种类型的日志进行采集。
我们将使用如下两个 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"]
操作步骤:
查看两个 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)
操作步骤:
操作截图如下:
图:创建 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" } ] }
操作步骤:
/var/log/access.log
。图:选择 Docker 文件配置
图:填写 Docker 文件采集配置内容
为了使用日志服务提供的查询、日志聚类等功能,首先需要对索引进行配置。操作步骤如下:
操作截图如下:
图:进入 logstore 查询分析界面
图:索引配置入口
图:开启日志聚类
图:自动生成字段索引
在配置完索引后,我们可以在查询输入框中使用查询语句可以快速地筛选日志,以下是一些示例:
_namespace_:nginx-stdout
not _namespace_: nginx-stdout
_namespace_: kube-system and _pod_name_: xxxxxx
在实际查询过程中,我们可以通过直接点击查询结果中的内容来快速填充查询语句,截图如下。
图:点击查询结果中的内容
图:查询语句快速填充
在排查问题时,我们一般会组合使用日志聚类、上下文查询以及 LiveTail 这三个功能来辅助问题排查。
以下假设应用 pod 是 metrics-server,我们可以借助这套方法来对它进行分析:
图:日志聚类结果
图:上下文查询入口
图:上下文查询
图:LiveTail
除了 K8s 环境下基本的日志采集、查询分析功能以外,我们还针对 K8s 环境下的 Ingress、审计(Audit)日志提供了方案。
为了在集群中部署 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 日志。
图:Ingress 概览
更多信息可以阅读《Kubernetes Ingress 日志分析入门》。
目前,审计方案会在集群创建时自动应用,相关的日志会存储在日志服务 project 下以 audit-
为前缀的 logstore 中,其中包含针对集群操作的详细日志,比如资源(Pod、Deploy)的创建与删除、集群的扩容记录等。类似地,审计方案同样提供了一系列详细报表。
图:审计中心概览
更多信息可以阅读《最全 Kubernetes 审计日志方案》。
本文转自: Kubernetes 日志查询分析实践-阿里云开发者社区