使用Sematext进行Kubernetes容器日志记录和监视

编者注:今天的帖子是Sematext的开发人员传播者Stefan Thies撰写的,其中显示了关键的Kubernetes指标和日志元素,可帮助您解决和调试Docker和Kubernetes。

容器中的微服务管理通常是通过Cluster Managers和Orchestration工具完成的。每个容器平台都有一些稍微不同的选项集,用于在每个群集节点上部署容器或安排任务。因为我们 容器监控和记录 在Sematext,我们的工作之一就是分享我们对这些工具的知识,尤其是与容器可观察性和开发有关的知识。今天,我们将展示Kubernetes上的容器监控和日志收集教程。

动态部署需要动态监控

与更传统,更静态的部署相比,容器和微服务生命周期的高度自动化使对Kubernetes的监视更具挑战性。监视特定应用程序容器的任何静态设置都将不起作用,因为Kubernetes会根据定义的部署规则自行做出决定。不仅需要监视已部署的微服务。同样重要的是,观察Kubernetes核心服务本身的指标和日志,例如运行etcd的Kubernetes Master,运行kubelet和代理服务的Controller-manager,调度程序和apiserver以及Kubernetes Worker(fka minions)。集中管理所有这些服务,它们的指标和日志有助于解决群集基础结构中的一个问题。 Kubernetes核心服务可以使用Docker安装在裸机上,虚拟机中或作为容器安装。在容器中部署Kubernetes核心服务可能对部署和监视操作有所帮助-容器监视工具将涵盖核心服务和应用程序容器。那么,如何监视这样一个复杂而动态的环境呢?

Kubernetes指标和日志的代理

有一些 开源Docker监控和日志记录项目 一个人可以凑在一起建立一个监视和一个或多个日志收集系统。好处是代码都是免费的。缺点是,这很费时间-最初是在设置时,后来是在维护时。这就是为什么我们建造 Sematext Docker代理 -一种现代的,可感知Docker的指标,事件和日志收集代理。它作为每个Docker主机上的微型容器运行,并收集所有集群节点和所有容器的日志,指标和事件。如果将核心服务部署在Docker容器中,它将发现所有容器(一个容器可能包含多个容器),包括用于Kubernetes核心服务的容器。让我们看看如何部署该代理。

**将代理部署到所有Kubernetes节点**

Kubernetes提供 守护程序集,以确保在将节点添加到集群时将pod添加到节点。我们可以使用它轻松地将Sematext Agent部署到每个群集节点!
为Kubernetes配置Sematext Docker代理
假设您已经为Kubernetes指标和事件创建了一个SPM应用程序,并且为Kubernetes日志创建了一个Logsene应用程序,每个都有自己的令牌。 Sematext Docker代理 自述文件 列出了所有配置(例如,用于特定窗格/图片/容器的过滤器),但是我们在这里将其简化。

  • 抓取最新的sematext-agent-daemonset.yml(原始纯文本)模板(也如下所示)
  • 将其保存在磁盘上的某个位置
  • 将SPM_TOKEN和LOGSENE_TOKEN占位符替换为您的SPM和Logsene应用令牌
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身份运行代理

通过以下方式激活Sematext Agent Docker Kubectl:

\> 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”确保使用来自Docker-Hub的映像自动更新Sematext Agent。

如果再次检查,将看到Sematext Docker代理已部署到(所有)群集节点:

\> 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在多个级别上汇总指标:

  • 群集-在SPM概述中显示的所有节点上聚合的指标
  • 主机/节点级别-每个节点汇总的指标
  • Docker映像级别-通过映像名称聚合的指标,例如所有Nginx Web服务器容器
  • Docker容器级别-为单个容器聚合的指标

| | | Kubernetes集群中的主机和容器指标

每个详细的图表都有针对Node,Docker Image和Docker Container的过滤器选项。由于Kubernetes在Docker容器的名称中使用容器名称,因此在Docker容器过滤器中按容器名称进行搜索可以轻松选择特定容器的所有容器。

让我们看一下SPM提供的一些Kubernetes(和Docker)关键指标。

主机指标,例如CPU,内存和磁盘空间使用情况。 Docker映像和容器比主机上安装的常规进程占用更多的磁盘空间。例如,应用程序映像可能包括Linux操作系统,并且大小可能在150-700 MB之间,具体取决于基础映像和容器中安装的工具的大小。数据容器也会占用主机上的磁盘空间。根据我们的经验,观察磁盘空间和使用清理工具对于Docker主机的连续运行至关重要。

容器数-表示每个主机上正在运行的容器数

| | |随着时间的推移,每个Kubernetes节点的容器计数器|

容器内存和内存故障计数器。这些指标对于监视非常重要,对调整应用程序也非常重要。内存限制应适合已部署的Pod(应用程序)的占用空间,以避免Kubernetes使用默认限制(例如为名称空间定义)的情况,这可能导致OOM杀死容器。内存故障计数器反映了容器中失败的内存分配数量,万一OOM被杀死,则会触发Docker事件。然后,此事件在SPM中显示,因为 Sematext Docker代理 收集所有Docker事件。最佳实践是在几次迭代中调整内存设置:

  • 监视应用程序容器的内存使用情况
  • 根据观察结果设置内存限制
  • 继续监视内存,内存故障计数器和内存不足事件。如果发生OOM事件,则可能需要增加容器的内存限制,或者需要进行调试才能找到导致内存高消耗的原因。

| | |容器内存使用情况,限制和故障计数器|

容器CPU使用率和限制的CPU时间。 CPU使用率可以受CPU份额的限制-与内存不同,CPU使用率不是硬性限制。只要资源可用,容器可能会使用更多的CPU,但是在其他容器需要使用CPU限制并且CPU受到限制的情况下。

还有更多 要观察的docker指标,例如磁盘I / O吞吐量,网络吞吐量和容器的网络错误,但让我们继续看下一个Kubernetes日志。

了解Kubernetes日志

Kubernetes容器的日志与Docker容器日志没有太大区别。但是,Kubernetes用户需要查看已部署的Pod的日志。这就是为什么将Kubernetes特定信息用于日志搜索非常有用的原因,例如:

  • Kubernetes命名空间
  • Kubernetes荚名称
  • Kubernetes容器名称
  • Docker映像名称
  • Kubernetes UID

Sematext Docker代理从Docker容器名称中提取此信息,并使用上述信息标记所有日志。将这些数据提取到各个字段中后,可以非常轻松地查看已部署的Pod的日志,从日志中生成报告,在进行故障排除时迅速缩小到有问题的Pod等等!如果通过Docker部署Kubernetes核心组件(例如kubelet,代理,api服务器),则Sematext Docker代理也将收集Kubernetes核心组件日志。

| | | Logsene中来自Kubernetes容器的所有日志|

Logsene和Sematext Docker代理还提供许多其他有用的功能,例如:

  • 自动格式检测和日志解析

    • Sematext Docker代理包含可识别和解析许多日志格式的模式
  • 针对特定图像和应用程序类型的自定义模式定义

  • 容器日志的自动Geo-IP扩充

  • 过滤日志,例如排除嘈杂的服务

  • 屏蔽特定日志字段中的敏感数据(电话号码,付款信息,身份验证令牌)

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

  • 分析结构化日志,例如在基巴纳州或格拉法纳州

这些主题大部分在我们的 Docker日志管理 帖子,也与Kubernetes日志管理相关。如果您想了解更多有关 Docker监控,详细了解我们 博客.

-Sematext开发人员布道者Stefan Thies