这篇文章已超过一年。较旧的文章可能包含过时的内容。请检查页面信息自发布以来是否仍准确无误。
使用 Sematext 进行 Kubernetes 容器日志和监控
通常使用集群管理器和编排工具来管理容器中的微服务。每个容器平台在集群节点上部署容器或调度任务的选项略有不同。由于我们在 Sematext 提供容器监控和日志记录服务,我们的一部分工作就是分享我们对这些工具的知识,特别是在容器可观测性和 devops 方面。今天我们将展示一个关于 Kubernetes 容器监控和日志收集的教程。
动态部署需要动态监控
容器和微服务生命周期的高度自动化使得对 Kubernetes 的监控比更传统、更静态的部署更具挑战性。任何针对特定应用程序容器的静态监控设置都无法工作,因为 Kubernetes 会根据定义的部署规则自行决策。需要监控的不仅仅是部署的微服务。同样重要的是要监控 Kubernetes 核心服务自身的指标和日志,例如运行 etcd、controller-manager、scheduler 和 apiserver 的 Kubernetes Master,以及运行 kubelet 和 proxy 服务的 Kubernetes Worker(原称 minions)。拥有一个集中位置来关注所有这些服务、它们的指标和日志有助于发现集群基础设施中的问题。Kubernetes 核心服务可以安装在裸金属、虚拟机或使用 Docker 作为容器运行。在容器中部署 Kubernetes 核心服务有助于部署和监控操作 - 容器监控工具可以同时覆盖核心服务和应用程序容器。那么,如何监控这样一个复杂且动态的环境呢?
Kubernetes 指标和日志代理
有许多开源的 Docker 监控和日志记录项目,可以将它们拼凑起来构建一个监控和日志收集系统(或多个系统)。优点是代码都是免费的。缺点是这需要时间——无论是最初的设置还是后期的维护。这就是为什么我们构建了Sematext Docker Agent——一个现代的、感知 Docker 的指标、事件和日志收集代理。它作为微小的容器运行在每个 Docker 主机上,收集所有集群节点和所有容器的日志、指标和事件。它会发现所有容器(一个 Pod 可能包含多个容器),包括 Kubernetes 核心服务的容器(如果核心服务部署在 Docker 容器中)。下面我们来看看如何部署这个代理。
将代理部署到所有 Kubernetes 节点
Kubernetes 提供了DaemonSet,它确保随着节点添加到集群,相应的 Pod 也会添加到这些节点。我们可以利用它轻松地将 Sematext Agent 部署到每个集群节点!
为 Kubernetes 配置 Sematext Docker Agent
假设您已经为您的 Kubernetes 指标和事件创建了一个 SPM 应用,并为您的 Kubernetes 日志创建了一个 Logsene 应用,每个应用都有自己的 token。Sematext Docker Agent 的README 文件列出了所有配置(例如,按特定的 Pod/镜像/容器进行过滤),但这里我们保持简单。
- 获取最新的 sematext-agent-daemonset.yml(纯文本)模板(如下所示)
- 将其保存到磁盘上的某个位置
- 用您的 SPM 和 Logsene App token 替换 SPM_TOKEN 和 LOGSENE_TOKEN 占位符
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 应用中,并在多个级别上聚合指标
- 集群 - 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 (Out-Of-Memory) 而被杀死。内存分配失败计数器反映了容器中失败的内存分配次数,在 OOM 杀死的情况下,会触发一个 Docker 事件。这个事件随后会在 SPM 中显示,因为 Sematext Docker Agent 会收集所有 Docker 事件。最佳实践是分几次迭代调整内存设置
- 监控应用程序容器的内存使用情况
- 根据观察设置内存限制
- 继续监控内存、内存分配失败计数器和 Out-Of-Memory 事件。如果发生 OOM 事件,可能需要增加容器内存限制,或者进行调试以找到高内存消耗的原因。
| | | 容器内存使用、限制和分配失败计数器 |
容器 CPU 使用率和被限制的 CPU 时间。CPU 使用率可以通过 CPU Shares 进行限制 - 与内存不同,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、proxy、api server)是通过 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 关注我们获取最新动态