首页 > 其他分享 >Kubernetes日志采集Sidecar模式介绍

Kubernetes日志采集Sidecar模式介绍

时间:2023-11-09 18:16:14浏览次数:37  
标签:容器 log Kubernetes 配置 采集 日志 Logtail Sidecar

Kubernetes(K8S)作为CNCF(cloud native computing foundation)的一个核心项目,背靠Google和Redhat的强大社区,近两年发展十分迅速,在成为容器编排领域中领导者的同时,也正在朝着PAAS底座标配的方向发展。

日志采集方式

日志作为任一系统不可或缺的部分,在K8S的官方文档中也介绍了多种的日志采集形式,总结起来主要有下述3种:原生方式、DaemonSet方式和Sidecar方式。

  1. 原生方式:使用 kubectl logs 直接在查看本地保留的日志,或者通过docker engine的 log driver 把日志重定向到文件、syslog、fluentd等系统中。
  2. DaemonSet方式:在K8S的每个node上部署日志agent,由agent采集所有容器的日志到服务端。
  3. Sidecar方式:一个POD中运行一个sidecar的日志agent容器,用于采集该POD主容器产生的日志。

image.png | left

采集方式对比

每种采集方式都有一定的优劣势,这里我们进行简单的对比:

 

  原生方式 DaemonSet方式 Sidecar方式
采集日志类型 标准输出 标准输出+部分文件 文件
部署运维 低,原生支持 一般,需维护DaemonSet 较高,每个需要采集日志的POD都需要部署sidecar容器
日志分类存储 无法实现 一般,可通过容器/路径等映射 每个POD可单独配置,灵活性高
多租户隔离 一般,只能通过配置间隔离 强,通过容器进行隔离,可单独分配资源
支持集群规模 本地存储无限制,若使用syslog、fluentd会有单点限制 中小型规模,业务数最多支持百级别 无限制
资源占用 低,docker engine提供 较低,每个节点运行一个容器 较高,每个POD运行一个容器
查询便捷性 较高,可进行自定义的查询、统计 高,可根据业务特点进行定制
可定制性 高,每个POD单独配置
适用场景 测试、POC等非生产场景 功能单一型的集群 大型、混合型、PAAS型集群

 

从上述表格中可以看出:

  1. 原生方式相对功能太弱,一般不建议在生产系统中使用,否则问题调查、数据统计等工作很难完成;
  2. DaemonSet方式在每个节点只允许一个日志agent,相对资源占用要小很多,但扩展性、租户隔离性受限,比较适用于功能单一或业务不是很多的集群;
  3. Sidecar方式为每个POD单独部署日志agent,相对资源占用较多,但灵活性以及多租户隔离性较强,建议大型的K8S集群或作为PAAS平台为多个业务方服务的集群使用该方式。

日志服务K8S采集方式

DaemonSet和Sidecar模式各有优缺点,目前没有哪种方式可以适用于所有场景。因此我们阿里云日志服务同时支持了DaemonSet以及Sidecar两种方式,并对每种方式进行了一些额外的改进,更加适用于K8S下的动态场景。

这两种模式均基于Logtail实现,日志服务客户端Logtail目前已有百万级部署,每天采集上万应用、数PB的数据,历经多次双11、双12考验。相关技术分享可以参见文章:多租户隔离技术+双十一实战效果Polling + Inotify 组合下的日志保序采集方案

DaemonSet采集方式

DaemonSet方式下Logtail做了非常多的适配工作,包括:

  • 一条命令一个参数即可实现部署,资源自动初始化
  • 支持CRD方式配置,支持K8S控制台、kubectl、kube api等,与K8S发布、部署无缝集成
  • K8S RBAC鉴权,日志服务STS鉴权管理

image.png | left | 827x430

详细的介绍文章可以参考:
再次升级!阿里云Kubernetes日志解决方案
LC3视角:Kubernetes下日志采集、存储与处理技术实践

Sidecar采集方式

sidecar方式的配置以及使用相对在虚拟机/物理机上采集数据区别不大,从Logtail容器视角来看:Logtail工作在一个“虚拟机”上,需要采集这个机器上某个/某些日志文件。

image.png | center | 435x341

但在容器场景下还需解决两个问题:

  1. 配置:使用编排的方式配置agent容器
  2. 动态性:需适应POD的IP地址和hostname的变化
    目前Logtail的容器支持通过环境变量配置相关参数,并支持自定义标识的机器组进行工作,可以完美解决上述两个问题。

Sidecar配置示例

Sidecar模式下日志组件安装、配置方式如下:

步骤一: 部署Logtail容器

  1. 在部署POD时将日志路径挂载到本地,并将对应的volume也挂载到Logtail容器。
  2. Logtail容器需配置 ALIYUN_LOGTAIL_USER_IDALIYUN_LOGTAIL_CONFIGALIYUN_LOGTAIL_USER_DEFINED_ID ,参数含义以及值的选取参见:标准Docker日志采集

tips:

  1. Logtail容器建议配置健康检查,在运行环境、内核等出现异常时可自动恢复。
  2. 示例中使用的Logtail镜像访问的是阿里云hangzhou公网镜像仓库,您可根据需求替换成本Region的镜像,并使用内网方式。
  dts 复制代码
apiVersion: batch/v1
kind: Job
metadata:
  name: nginx-log-sidecar-demo
  namespace: kube-system
spec:
  template:
    metadata:
      name: nginx-log-sidecar-demo
    spec:
      # volumes配置
      volumes:
      - name: nginx-log
        emptyDir: {}
      containers:
      # 主容器配置
      - name: nginx-log-demo
        image: registry.cn-hangzhou.aliyuncs.com/log-service/docker-log-test:latest
        command: ["/bin/mock_log"]
        args: ["--log-type=nginx", "--stdout=false", "--stderr=true", "--path=/var/log/nginx/access.log", "--total-count=1000000000", "--logs-per-sec=100"]
        volumeMounts:
        - name: nginx-log
          mountPath: /var/log/ngin
      # Logtail的Sidecar容器配置
      - name: logtail
        image: registry.cn-hangzhou.aliyuncs.com/log-service/logtail:latest
        env:
          # aliuid
          - name: "ALIYUN_LOGTAIL_USER_ID"
            value: "165421******3050"
          # 自定义标识机器组配置
          - name: "ALIYUN_LOGTAIL_USER_DEFINED_ID"
            value: "nginx-log-sidecar"
          # 启动配置(用于选择Logtail所在Region)
          - name: "ALIYUN_LOGTAIL_CONFIG"
            value: "/etc/ilogtail/conf/cn-hangzhou/ilogtail_config.json"
        # 和主容器共享volume
        volumeMounts:
        - name: nginx-log
          mountPath: /var/log/nginx
        # 健康检查
        livenessProbe:
          exec:
            command:
            - /etc/init.d/ilogtaild
            - status
          initialDelaySeconds: 30
          periodSeconds: 30      

步骤二: 配置机器组

如下图所示,在日志服务控制台创建一个Logtail的机器组,机器组选择自定义标识,可以动态适应POD ip地址的改变。具体操作步骤如下:

  1. 开通日志服务并创建Project、Logstore,详细步骤请参考准备流程
  2. 在日志服务控制台的机器组列表页面单击创建机器组
  3. 选择用户自定义标识,将您上一步配置的 ALIYUN_LOGTAIL_USER_DEFINED_ID填入用户自定义标识内容框中。

image.png | center

步骤三:配置采集方式

机器组创建完成后,即可配置对应文件的采集配置,目前支持极简、Nginx访问日志、分隔符日志、JSON日志、正则日志等格式,具体可参考:文本日志配置方式。本示例中配置如下:

image.png | center | 776x717

步骤四:查询日志

采集配置完成并应用到机器组后,1分钟内日志即可采集上来,进入对应logstore的查询页面即可查询到采集上来的日志。

image.png | left | 827x441

日志进阶

阿里云日志服务针对日志提供了完整的解决方案,日志采集只是其中的第一步,以下相关功能是日志进阶的必备良药:

  1. 日志上下文查询:help.aliyun.com/document_de…
  2. 快速查询:help.aliyun.com/document_de…
  3. 实时分析:help.aliyun.com/document_de…
  4. 快速分析:help.aliyun.com/document_de…
  5. 基于日志设置告警:help.aliyun.com/document_de…
  6. 配置大盘:help.aliyun.com/document_de…
    更多日志进阶内容可以参考:日志服务学习路径

作者:Mr_zebra
链接:https://juejin.cn/post/6844903712566018055
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

标签:容器,log,Kubernetes,配置,采集,日志,Logtail,Sidecar
From: https://www.cnblogs.com/gaoyanbing/p/17822446.html

相关文章

  • Kubernetes(v1.21)简介
    Kubernetes(v1.21)简介第一章:背景1.1部署方式的演变传统部署时代:①在物理机服务器上运行应用程序。②无法为应用程序定义资源边界。③导致资源分配问题。如果在物理服务器上运行多个应用程序,则可能会出现一个应用程序占用大部分资源的情况下,会导致其它应用程序的......
  • python的日志模块logging
    logging模块是系统自带的无需安装直接导入使用在日志配置中,stream=sys.stdout为控制台输出日志,filename="devops.log"为日志写入到文件,filemode="w"为每次执行代码覆盖写,filemode='a'为追加日志,format="%(asctime)s-%(name)s-%(levelname)s-%(message)s"为在每条日志之前加上......
  • linux文件系统与日志分析
    Linux文件系统inode表结构每一个inode表记录对应的保存了以下信息:inodenumber节点号文件类型权限UIDGID链接数(指向这个文件名路径名称个数)该文件的大小和不同的时间戳指向磁盘上文件的数据块指针有关文件的其他数据 ls -i:查看inode号 sta......
  • ELK日志收集&&日志收集方案
    31.ELK日志收集日志分析系统-k8s部署ElasticSearch集群-帝都攻城狮-博客园(cnblogs.com)https://blog.csdn.net/miss1181248983/article/details/11377394331.1日志收集方式 1.node节点收集,基于daemonset部署日志收集进程,实现json-file类型(标准输出/dev/stdou......
  • loki采集k8s日志
    前言loki是轻量、易用的日志聚合系统。如果你的k8s集群规模并不大,推荐使用grafana+loki的方案来做微服务日志的采集;Loki组成loki架构很简单,主要由3部分组成:loki:服务端,负责存储日志和处理查询;promtail:采集端,负责采集日志发送给loki;grafana:负责采集日志的展示;promtail.ymlkubectl......
  • k8s通过sidecar模式收集pod的容器日志至ELK
    架构:已完成的部署1、ES集群及kibana部署 https://blog.51cto.com/yht1990/60809812、kafaka+zookeeper集群 https://blog.51cto.com/yht1990/6081518准备sidecar镜像(filebeat)找一台服务器打镜像[root@yw-testfilebeat]#catDockerfileFROMdocker.elastic.co/beats/f......
  • salt自定义模块内使用日志例子
    如果你想要在你的SaltMinion中使用自定义的Salt模块并且记录日志,你可以创建一个自定义Salt模块,并在模块中使用Python的标准`logging`库来记录日志。以下是一个示例:首先,在SaltMaster上创建一个自定义模块的目录,例如`/srv/salt/_modules/`。然后在该目录中创建一个Python文件,例......
  • 通过日志恢复SQL Server的历史数据
    通过日志还原方案一:前提条件1.必须有一个完整的备份,且这个备份必须是在修改、删除数据之前做的。2.在更新、删除数据之后,做日志备份,该log备份将用于还原之前的数据建议使用备份数据库进行还原操作,确认无误再对原库进行操作,或同步数据开始还原操作:此处使用SQLmanagement界......
  • mysql8.x通过备份文件及binlog日志恢复数据
    问题简述记一次mysql数据库被误删(是整个库被删了)后的还原前提条件数据库版本为mysql8.x以上具有库被删除前的完整备份数据库开启binlog还原步骤第一步:通过完整备份还原被删的库注意事项:还原后切勿让其他用户连接,操作数据库。待使用binlog日志恢复数据后再对库进行操作,否......
  • 209-logback-spring.xml,指定日志输出到指定文件
    logback-spring.xml,指定日志输出到指定文件<configuration><!--定义日志输出路径--><propertyname="LOG_HOME"value="/path/to/log/directory"/><!--定义日志格式--><propertyname="LOG_PATTERN"value=......