这篇文章已超过一年。较旧的文章可能包含过时的内容。请检查页面信息自发布以来是否仍准确无误。

使用 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 包含用于识别和解析许多日志格式的模式
  • 针对特定镜像和应用程序类型的自定义模式定义

  • 对容器日志进行自动 Geo-IP 丰富

  • 过滤日志,例如排除产生大量日志的服务

  • 屏蔽特定日志字段中的敏感数据(电话号码、支付信息、认证令牌)

  • 基于日志的告警和计划报告

  • 结构化日志分析,例如在 Kibana 或 Grafana 中

这些主题大部分都描述在我们的Docker 日志管理文章中,并且也与 Kubernetes 日志管理相关。如果您想了解更多关于Docker 监控的信息,请访问我们的博客