在 Kubernetes 集群中,容器是应用的基本单位。由于容器的轻量级特性,它们可以快速启动和停止,因此容器化的应用已经成为现代化应用的标准方式之一。然而,由于容器的特性,日志的收集和分析变得更加困难。在这篇文章中,我们将介绍 Kubernetes 中容器日志收集和分析的方案,并提供相关的指导和示例代码。
容器日志收集
在 Kubernetes 集群中,每个容器都有一个标准的输出流,也就是标准输出流和标准错误流。这些输出流中的信息可以用于诊断和调试容器中的问题。但是,这些信息仅在容器运行时可用,如果容器关闭或者重新启动,之前的日志信息将无法再次访问。
为了解决这个问题,我们需要将容器日志输出流导入到一个持久化的日志收集器中。Kubernetes 中有多个日志收集方案可供选择,例如:
在这里,我们将介绍通过 Fluentd 进行容器日志收集的方案。
安装 Fluentd
运行以下命令安装 Fluentd:
kubectl apply -f https://raw.githubusercontent.com/fluent/fluentd-kubernetes-daemonset/v1.12.0/fluentd-daemonset-elasticsearch.yaml
这个命令将下载 Fluentd 的 YAML 文件,并在 Kubernetes 集群中创建一个名为 fluentd 的 DaemonSet。DaemonSet 将在每个 Kubernetes 节点上启动一个 Fluentd 容器,用于收集本地节点上的容器日志。
Fluentd 配置
在 Fluentd 中,配置文件指定了如何收集和处理日志。下面是一个简单的 Fluentd 配置文件示例:
-- -------------------- ---- ------- -------- ----- ---- ---- ------------------------- -------- ----------------------------------- --- ------------ ------ ---- -------------- ---- --------- ------ -------------- ----- ------------- ----- -------------------------------------------- ---------- ---------- --------------- ---- --------------- ---- -------------- -- -------- ----- ------ -------------- -- ---------------- --- --------- --------
这个配置文件中的 source
部分指定了 Fluentd 要监视的容器日志文件。在 Kubernetes 中,容器日志文件通常存储在 /var/log/containers
目录中,并且每个容器都有一个对应的日志文件。因此,我们使用 path /var/log/containers/*.log
模式来指定要监视的所有容器日志文件。
Fluentd 将容器日志文件中的每行日志作为一个事件处理。在这个配置文件中,我们使用 format json
模块来解析 JSON 格式的日志。如果日志没有按照 JSON 格式输出,可以使用其他格式模块来解析日志,例如 format apache
或者 format csv
。
在 match
部分中,我们将容器日志发送到 Elasticsearch 中。我们使用 hosts
指定了 Elasticsearch 的地址和端口。在 Kubernetes 中,可以通过 elasticsearch.default.svc.cluster.local
对 Elasticsearch 进行访问。我们指定了一个名为 kubernetes
的索引名称来存储容器日志。这个索引名称可以根据实际需要进行修改。
测试 Fluentd 配置
运行以下命令创建一个测试 Pod,输出一些日志信息:
kubectl run test --image=busybox --restart=Never -- /bin/sh -c 'echo "Hello world" && sleep 3600'
等待 Pod 运行,并检查 Fluentd 是否收集到了相关日志:
kubectl logs fluentd-<pod_id>
如果 Fluentd 配置正确,你应该能够看到类似于以下内容的日志信息:
-- -------------------- ---- ------- - ------------ --------- ------------------ ---------------------------------------- -------------- --------------------------- ------------------ ----------------------- - -
Fluentd 部署
在 Fluentd 配置结束后,可以使用以下命令部署 Fluentd:
kubectl apply -f fluentd.yml
这个命令将根据 YAML 文件中的配置部署 Fluentd。如果 Fluentd 部署成功,你应该能够看到以下输出:
daemonset.apps/fluentd created
容器日志分析
在 Kubernetes 集群中,容器日志分析通常包括以下几个方面:
- 诊断和调试容器中的问题
- 监视容器的运行状态
- 分析容器的性能和行为
- 检测容器中的安全问题
在这里,我们将以 Elasticsearch 为例介绍容器日志分析。
安装和配置 Elasticsearch
运行以下命令在 Kubernetes 中安装 Elasticsearch:
kubectl apply -f https://download.elastic.co/downloads/eck/2.0.0/all-in-one.yaml
这个命令将下载 Elasticsearch 的 YAML 文件,并创建一个 Elasticsearch 节点,用于存储和分析容器日志。
Kibana 访问
安装和配置 Elasticsearch 后,可以使用 Kibana 进行容器日志的可视化和查询。
在 Kibana 中,点击 Discover
工具栏按钮,可以打开日志查询页面。默认情况下,Kibana 显示所有索引中的全部日志。可以使用过滤器来限定查询的范围。
例如,可以使用以下过滤器来查询特定容器的日志:
kubernetes.namespace_name: "default" AND kubernetes.container_name: "test"
日志报警
在实际应用中,我们通常需要对容器日志进行实时监控,并在出现异常时发送警报。Elasticsearch 中可以使用 Alerting 模块来实现这个功能。Alerting 模块可以监视索引中的数据,并根据特定条件和阈值触发警报。
例如,以下示例将在容器日志中检测所有 HTTP 500 错误,并向 Slack 发送一个警报:
-- -------------------- ---- ------- - ---------- - ----------- - ----------- ---- - -- -------- - --------- - ---------- - ---------- ---------------- ------- - -------- - -------- - ------------------- ----- - - - - - -- ---------- - -------- - -------- - ---------- ------------ ---------- - ----- ------- ------- ----- --- ----- -------- -- ---------- ------ - - - - -
结论
容器日志的收集和分析是 Kubernetes 中重要的一部分。通过使用上面介绍的方案,可以轻松地将容器日志从本地节点导入到 Elasticsearch 中,并使用 Kibana 进行查询和可视化。在此基础上,可以进一步实现日志报警和监控的功能,以确保应用的稳定和安全。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/674acb34da05147dd021cda7