You need to enable JavaScript to run this app.
导航
采集容器日志(DaemonSet-Pod 环境变量方式)
最近更新时间:2024.11.11 17:24:35首次发布时间:2024.07.16 16:07:13

通过 DaemonSet 方式采集容器文本日志或容器标准输出时,您可以通过 Pod 环境变量方式创建采集配置。本文档演示通过 DaemonSet-Pod 环境变量方式创建日志采集配置的操作步骤。

背景信息

日志服务支持通过 DaemonSet 方式采集容器日志,同时支持通过 Pod 环境变量方式创建采集配置。

  • 通过 DaemonSet 方式采集容器日志时,支持采集容器的标准输出和容器文本日志,资源占用相对较少,配置灵活。
  • 通过 Pod 环境变量方式创建采集配置的操作简单便捷。

此外,LogCollector 采集容器日志时,支持单行、多行等多种采集配置,除各种采集配置默认附加的预留字段之外,日志服务还会对 LogCollector 采集到的容器日志添加以下预留字段,并默认为其创建索引。
容器文本日志的预留字段:

预留字段

说明

__image_name__

镜像名称。

__container_name__

容器名称。

__container_ip__

容器或 Pod 的 IP 地址。

__pod_name__

Pod 名称。

__pod_uid__

Pod 的唯一标识。

__namespace__

Pod 所属的 Namespace。

容器标准输出的预留字段:

预留字段

说明

__container_source__

数据源类型,即 stdout 或 stderr。

__image_name__

镜像名称。

__container_name__

容器名称。

__container_ip__

容器或 Pod 的 IP 地址。

__pod_name__

Pod 名称。

__pod_uid__

Pod 的唯一标识。

__namespace__

Pod 所属的 Namespace。

前提条件

限制说明

  • 采集容器标准输出时:
    • Docker 容器引擎仅支持 JSON 类型的日志驱动。
    • 如果某些容器匹配了多个采集配置,那么在该容器上仅最新的采集配置生效。
  • 采集容器内日志文件时:
    • 容器内日志文件的采集路径目前仅支持不挂载、emptyDir 挂载和 hostPath 挂载 3 种方式。
    • 采集路径不支持设置为软链接,因为 LogCollector 无法访问容器内日志文件的软链接,请按照容器内日志文件的真实路径配置采集路径。
  • 在容器停止之后,LogCollector 会收到该容器的 stop 事件,并随即停止采集该容器的日志。如果 LogCollector 采集该容器的日志有一定延迟,则容器停止之前产生的部分日志可能未被采集。
  • LogCollector 支持的容器引擎包括 Docker 和 Containerd。不同类型容器引擎的访问路径限制如下:
    • Docker:LogCollector 通过宿主机的 /run/docker.sock 访问 Docker 容器引擎,请确保该路径存在且 LogCollector 具备访问权限。
    • Containerd:LogCollector 通过宿主机的 /run/containerd/containerd.sock 访问 Containerd 容器引擎,请确保该路径存在且 LogCollector 具备访问权限。

Pod 环境变量说明

您可以在创建应用时,通过配置 Pod 环境变量来创建日志服务资源,然后采集容器标准输出或者容器文本日志。
其中,Pod 环境变量的参数需要根据业务需求自行制定,参数说明如下:

说明

如下环境变量名称中的 {rule_name} 应替换为实际的采集配置名称,且该名称中不支持包含下划线(_)。

环境变量 Name
数据类型
是否必填
说明
**示例**

volc_logs_{rule_name}

String

采集的日志类型,说明如下:

  • 采集容器标准输出时,需设置 valuestdout
  • 采集容器内日志文件中的文本日志时,需设置 value 为容器内日志文件的具体路径。
  • 容器标准输出。

    - name: volc_logs_demo
       value: stdout
    
  • 容器内日志文件。

    - name: volc_logs_demo
       value: /var/log/nginx/access.log
    

volc_logs_{rule_name}_project

String

日志项目名称。如果指定的日志项目不存在,日志服务会自动创建日志项目。

- name: volc_logs_demo_project
   value: doc-demo

volc_logs_{rule_name}_topic

String

日志主题名称。如果指定的日志主题不存在,日志服务会自动创建日志主题,日志主题名称和 {rule_name} 变量值相同。

- name: volc_logs_demo_topic
   value: pod-log

volc_logs_{rule_name}_ttl

Integer

创建日志主题时,指定日志在该日志主题中的存储时长,超过存储时长的过期日志会被自动清除。单位为天,默认为 30 天。取值范围为 1~3650,指定为 3650 天表示永久存储。

- name: volc_logs_demo_ttl
   value: 90

volc_logs_{rule_name}_shard

Integer

创建日志主题时,指定日志分区的数量,取值范围为 1~10,默认创建 1 个分区。 每个分区提供的写入能力为 5MiB/s、500 次/s,读取能力为 20 MiB/s、100 次/s。请在创建日志主题时合理规划分区,创建后暂不支持修改分区数量。

- name: volc_logs_demo_shard
   value: 4

volc_logs_{rule_name}_shardautosplit

Boolean

创建日志主题时,指定是否开启分区的自动分裂功能。

  • True(默认值):当写入的数据量连续 5 分钟超过已有分区服务能力时,日志服务会根据数据量自动分裂分区以满足业务需求,但分裂后的分区数量不可超出最大分裂数。最近 15 分钟内分裂出来的新分区不会自动分裂。
  • False:不开启分区的自动分裂。
- name: volc_logs_demo_shardautosplit
   value: True

volc_logs_{rule_name}_maxshard

Integer

创建日志主题时,指定分区的最大分裂数,即分区分裂后,所有分区的最大数量。取值范围为 1~10,默认为 10。

- name: volc_logs_demo_maxshard
   value: 5

volc_logs_{rule_name}_tags

String

为每条日志添加的常量字段。

- name: volc_logs_demo_tags
   value: app=demo

配置示例

采集容器标准输出

您可以在创建应用时,通过配置 Pod 环境变量来采集容器标准输出。
以创建无状态负载为例,Pod 环境变量配置示例如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: log-app-demo
  namespace: default
spec: 
  replicas: 1
  selector: 
    matchLabels: 
      app: nginx
  template: 
    metadata: 
      labels: 
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80
          env: 
            - name: volc_logs_demo # 采集规则的名字是demo,并且采集容器标准输出
              value: stdout
            - name: volc_logs_demo_project # 日志项目的名字是doc-demo
              value: doc-demo
            - name: volc_logs_demo_topic # 日志主题的名字是pod-log
              value: pod-log

采集容器内日志文件

您可以在创建应用时,通过配置 Pod 环境变量来采集容器内日志文件。
以创建无状态负载为例,Pod 环境变量配置示例如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: log-app-demo
  namespace: default
spec: 
  replicas: 1
  selector: 
    matchLabels: 
      app: nginx
  template: 
    metadata: 
      labels: 
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80
          env: 
            - name: volc_logs_demo # 采集规则名称为demo,并且采集容器内日志文件。
              value: /var/log/nginx/access.log
            - name: volc_logs_demo_project # 日志项目名称为 doc-demo。
              value: doc-demo
            - name: volc_logs_demo_topic # 日志主题名称为 pod-log。
              value: pod-log

Pod 环境变量支持来自 ConfigMap 或者 Secret 挂载

Pod 环境变量来自 ConfigMap 挂载

  • 当 Pod 环境变量来自 ConfigMap 挂载时,如果 Pod 环境变量设置了 prefix,那么 Pod 环境变量配置示例如下:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: log-app-demo
      namespace: default
    spec: 
      replicas: 1
      selector: 
        matchLabels: 
          app: nginx
      template: 
        metadata: 
          labels: 
            app: nginx
        spec:
          containers:
            - name: nginx
              image: nginx:latest
              ports:
                - containerPort: 80
              envFrom:
                - configMapRef:
                    name: nginx-deployment-configmap
                    optional: false
                  prefix: volc_logs_           
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: nginx-deployment-configmap
      namespace: default
    data:
      logs-demo: stdout
      logs-demo_project: doc-demo
      logs-demo_topic: pod-log
    
  • 当 Pod 环境变量来自 ConfigMap 挂载,如果 Pod 环境变量没有设置 prefix,那么 Pod 环境变量配置示例如下:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: log-app-demo
      namespace: default
    spec: 
      replicas: 1
      selector: 
        matchLabels: 
          app: nginx
      template: 
        metadata: 
          labels: 
            app: nginx
        spec:
          containers:
            - name: nginx
              image: nginx:latest
              ports:
                - containerPort: 80
              envFrom:
                - configMapRef:
                    name: nginx-deployment-configmap
                    optional: false          
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: nginx-deployment-configmap
      namespace: default
    data:
      volc_logs_logs-demo: stdout
      volc_logs_logs-demo_project: doc-demo
      volc_logs_logs-demo_topic: pod-log
    

Pod 环境变量来自 Secret 挂载

  • 当 Pod 环境变量来自 Secret 挂载,如果 Pod 环境变量设置了 prefix,那么 Pod 环境变量配置示例如下:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: log-app-demo
      namespace: default
    spec: 
      replicas: 1
      selector: 
        matchLabels: 
          app: nginx
      template: 
        metadata: 
          labels: 
            app: nginx
        spec: 
          containers:
            - name: nginx
              image: nginx:latest
              ports:
                - containerPort: 80
              envFrom:
                - secretRef:
                    name: nginx-deployment-secret
                    optional: false
                  prefix: volc_logs_   
         
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: nginx-deployment-secret
      namespace: default
    type: Opaque
    data:
      logs-demo: c3Rkb3V0 // base64编码的stdout
      logs-demo_project: ZG9jLWRlbW8= // base64编码的doc-demo
      logs-demo_topic: cG9kLWxvZw== // base64编码的pod-log
    
  • 当 Pod 环境变量来自 Secret 挂载,如果 Pod 环境变量没有设置 prefix,那么 Pod 环境变量配置示例如下:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: log-app-demo
      namespace: default
    spec: 
      replicas: 1
      selector: 
        matchLabels: 
          app: nginx
      template: 
        metadata: 
          labels: 
            app: nginx
        spec:
          containers:
            - name: nginx
              image: nginx:latest
              ports:
                - containerPort: 80
              envFrom:
                - secretRef:
                    name: nginx-deployment-secret
                    optional: false        
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: nginx-deployment-secret
      namespace: default
    type: Opaque
    data:
      volc_logs_logs-demo: c3Rkb3V0 // base64编码的stdout
      volc_logs_logs-demo_project: ZG9jLWRlbW8= // base64编码的doc-demo
      volc_logs_logs-demo_topic: cG9kLWxvZw== // base64编码的pod-log
    

后续步骤

  • 创建采集配置之后,LogCollector 会根据指定规则开始监听容器内日志文件或容器标准输出并采集日志,日志数据将保存在指定的日志主题中。
  • 日志索引默认为关闭状态,您需要为日志主题开启索引功能,并配置索引,才能在控制台中对采集到的日志数据进行查询分析。