本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。
使用 Sematext 进行 Kubernetes 容器日志记录和监控
容器中的微服务管理通常通过集群管理器和编排工具完成。每个容器平台都有略微不同的选项集来部署容器或在每个集群节点上调度任务。由于我们在 Sematext 进行容器监控和日志记录,我们的工作一部分是分享我们对这些工具的知识,尤其是在容器可观察性和 DevOps 方面。今天我们将展示一个关于 Kubernetes 容器监控和日志收集的教程。
动态部署需要动态监控
容器和微服务生命周期的高度自动化使得 Kubernetes 的监控比传统的、更静态的部署更具挑战性。任何用于监控特定应用容器的静态设置都无法工作,因为 Kubernetes 会根据定义的部署规则做出自己的决策。不仅需要监控已部署的微服务,监控 Kubernetes 核心服务(例如运行 etcd、controller-manager、scheduler 和 apiserver 的 Kubernetes Master 以及运行 kubelet 和代理服务的 Kubernetes Worker(以前称为 minion))的指标和日志同样重要。拥有一个集中式位置来关注所有这些服务、它们的指标和日志有助于发现集群基础设施中的问题。Kubernetes 核心服务可以安装在裸机、虚拟机中,或者使用 Docker 作为容器。在容器中部署 Kubernetes 核心服务可能有助于部署和监控操作——容器监控工具将同时涵盖核心服务和应用容器。那么,如何监控这样一个复杂且动态的环境呢?
Kubernetes 指标和日志代理
有许多开源 Docker 监控和日志项目可以拼凑起来构建一个监控和日志收集系统(或多个系统)。优点是代码都是免费的。缺点是这需要时间——无论是最初的设置还是后来的维护。这就是我们构建Sematext Docker Agent的原因——一个现代化的、Docker 感知的指标、事件和日志收集代理。它作为一个微型容器运行在每个 Docker 主机上,并收集所有集群节点和所有容器的日志、指标和事件。它发现所有容器(一个 pod 可能包含多个容器),包括 Kubernetes 核心服务的容器,如果核心服务部署在 Docker 容器中。让我们看看如何部署这个代理。
**将代理部署到所有 Kubernetes 节点**
Kubernetes 提供DaemonSets,它确保在节点添加到集群时将 Pod 添加到节点。我们可以使用它轻松地将 Sematext Agent 部署到每个集群节点!
为 Kubernetes 配置 Sematext Docker Agent
假设您已经为 Kubernetes 指标和事件创建了一个 SPM 应用程序,并为 Kubernetes 日志创建了一个 Logsene 应用程序,每个应用程序都有自己的令牌。Sematext Docker Agent README列出了所有配置(例如,过滤特定 pod/镜像/容器),但我们在这里将保持简单。
- 获取最新的 sematext-agent-daemonset.yml(原始纯文本)模板(如下所示)
- 将其保存在磁盘上的某个位置
- 将 SPM_TOKEN 和 LOGSENE_TOKEN 占位符替换为您的 SPM 和 Logsene App 令牌
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: sematext-agent
spec:
template:
metadata:
labels:
app: sematext-agent
spec:
selector: {}
dnsPolicy: "ClusterFirst"
restartPolicy: "Always"
containers:
- name: sematext-agent
image: sematext/sematext-agent-docker:latest
imagePullPolicy: "Always"
env:
- name: SPM\_TOKEN
value: "REPLACE THIS WITH YOUR SPM TOKEN"
- name: LOGSENE\_TOKEN
value: "REPLACE THIS WITH YOUR LOGSENE TOKEN"
- name: KUBERNETES
value: "1"
volumeMounts:
- mountPath: /var/run/docker.sock
name: docker-sock
- mountPath: /etc/localtime
name: localtime
volumes:
- name: docker-sock
hostPath:
path: /var/run/docker.sock
- name: localtime
hostPath:
path: /etc/localtime
以 DaemonSet 运行 Agent
使用 _kubectl_ 激活 Sematext Agent Docker
\> kubectl create -f sematext-agent-daemonset.yml
daemonset "sematext-agent-daemonset" created
现在让我们检查代理是否已部署到所有节点
\> kubectl get pods
NAME READY STATUS RESTARTS AGE
sematext-agent-nh4ez 0/1 ContainerCreating 0 6s
sematext-agent-s47vz 0/1 ImageNotReady 0 6s
“ImageNotReady”或“ContainerCreating”状态可能会短暂出现,因为 Kubernetes 必须首先下载 sematext/sematext-agent-docker 镜像。在 sematext-agent-daemonset.yml 中指定的 imagePullPolicy: "Always" 设置确保 Sematext Agent 使用 Docker-Hub 中的镜像自动更新。
如果我们再次检查,我们会看到 Sematext Docker Agent 已部署到(所有)集群节点
\> kubectl get pods -l sematext-agent
NAME READY STATUS RESTARTS AGE
sematext-agent-nh4ez 1/1 Running 0 8s
sematext-agent-s47vz 1/1 Running 0 8s
部署后不到一分钟,您应该会看到您的 Kubernetes 指标和日志!下面是各种开箱即用报告的截图以及各种指标含义的解释。
Kubernetes 指标解释
所有 Kubernetes 节点的指标都收集在一个 SPM App 中,该 App 在多个级别聚合指标
- 集群 - 在 SPM 概览中显示所有节点聚合的指标
- 主机/节点级别 - 每个节点聚合的指标
- Docker 镜像级别 - 按镜像名称聚合的指标,例如所有 nginx Web 服务器容器
- Docker 容器级别 - 单个容器聚合的指标
| | | Kubernetes 集群中的主机和容器指标 |
每个详细图表都有节点、Docker 镜像和 Docker 容器的过滤选项。由于 Kubernetes 在 Docker 容器名称中使用 pod 名称,通过 Docker 容器过滤器中的 pod 名称进行搜索可以轻松选择特定 pod 的所有容器。
让我们看看 SPM 提供的几个 Kubernetes(和 Docker)关键指标。
主机指标,例如 CPU、内存和磁盘空间使用情况。Docker 镜像和容器比安装在主机上的常规进程消耗更多的磁盘空间。例如,一个应用程序镜像可能包含一个 Linux 操作系统,并且根据基础镜像的大小和容器中安装的工具,其大小可能为 150-700 MB。数据容器也占用主机上的磁盘空间。根据我们的经验,监控磁盘空间和使用清理工具对于 Docker 主机的持续运行至关重要。
容器计数 - 表示每个主机上运行的容器数量
| | | Kubernetes 节点上的容器计数器随时间变化 |
容器内存和内存失败计数器。这些指标对于监控和调整应用程序非常重要。内存限制应适合已部署的 pod(应用程序)的内存占用,以避免 Kubernetes 使用默认限制(例如为命名空间定义的限制)的情况,这可能导致容器 OOM 杀死。内存失败计数器反映了容器中内存分配失败的次数,如果发生 OOM 杀死,将触发 Docker 事件。此事件随后在 SPM 中显示,因为Sematext Docker Agents收集所有 Docker 事件。最佳实践是分几次迭代调整内存设置
- 监控应用容器的内存使用情况
- 根据观察设置内存限制
- 继续监控内存、内存失败计数器和内存不足事件。如果发生 OOM 事件,可能需要增加容器内存限制,或者需要调试以找出高内存消耗的原因。
| | | 容器内存使用、限制和失败计数器 |
容器 CPU 使用率和受限 CPU 时间。CPU 使用率可以通过 CPU 份额限制——与内存不同,CPU 使用率不是硬限制。只要资源可用,容器可以使用更多的 CPU,但在其他容器需要 CPU 的情况下,限制会生效,并且 CPU 会被限制到上限。
还有更多要监控的 Docker 指标,例如磁盘 I/O 吞吐量、网络吞吐量和容器的网络错误,但接下来我们继续查看 Kubernetes 日志。
了解 Kubernetes 日志
Kubernetes 容器的日志与 Docker 容器日志没有太大区别。但是,Kubernetes 用户需要查看已部署 pod 的日志。因此,拥有 Kubernetes 特定的信息可用于日志搜索非常有用,例如
- Kubernetes 命名空间
- Kubernetes pod 名称
- Kubernetes 容器名称
- Docker 镜像名称
- Kubernetes UID
Sematext Docker Agent 从 Docker 容器名称中提取这些信息,并使用上述信息标记所有日志。将这些数据提取到单独的字段中,可以非常轻松地监控已部署 pod 的日志、从日志构建报告、在故障排除时快速缩小问题 pod 的范围等等!如果 Kubernetes 核心组件(例如 kubelet、代理、API 服务器)通过 Docker 部署,Sematext Docker Agent 也会收集 Kubernetes 核心组件的日志。
| | | Logsene 中所有 Kubernetes 容器的日志 |
Logsene 和 Sematext Docker Agent 还为您提供了许多其他开箱即用的有用功能,例如
自动格式检测和日志解析
- Sematext Docker Agent 包含识别和解析许多日志格式的模式
特定镜像和应用程序类型的自定义模式定义
过滤日志,例如排除嘈杂的服务
特定日志字段中的敏感数据掩码(电话号码、支付信息、身份验证令牌)
基于日志的警报和定期报告
Kibana 或 Grafana 等工具中结构化日志的分析
这些主题中的大部分都已在我们的Docker 日志管理文章中描述,并且也与 Kubernetes 日志管理相关。如果您想了解更多关于Docker 监控的信息,请阅读我们的博客。
- 下载 Kubernetes
- 在 GitHub 上参与 Kubernetes 项目
- 在 Stack Overflow 上提问(或回答问题)
- 在 Slack 上与社区联系
- 在 Twitter 上关注我们 @Kubernetesio 获取最新更新