本文介绍如何安装Sidecar及使用CRD方式创建Logtail配置,完成容器文本日志的采集。

前提条件

已安装Logtail组件。更多信息,请参见安装Logtail组件

背景信息

通过Sidecar模式采集日志,依赖于Logtail容器和业务容器共享的日志目录。业务容器将日志写入到共享目录中,Logtail通过监控共享目录中日志文件的变化并采集日志。更多信息,请参见Sidecar日志采集介绍Sidecar模式示例

步骤一:安装Sidecar

  1. 登录您的Kubernetes集群。
  2. 创建一个YAML文件。

    sidecar.yaml为文件名,请根据实际情况替换。

    vim sidecar.yaml
  3. 在YAML文件输入如下脚本,并根据实际情况设置其中的参数。
    注意 请确保配置文件中的env中的TZ(Time Zone)配置正确,否则原始日志与处理日志的时区不一致,可能会导致采集到的日志写入过去或未来的情况。例如如果是中国大陆,您可以设置时区为Asia/Shanghai。
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: nginx-log-sidecar-demo
      namespace: default
    spec:
      template:
        metadata:
          name: nginx-log-sidecar-demo
        spec:
          restartPolicy: Never
          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/nginx
          ##### logtail sidecar container
          - name: logtail
            # more info: https://cr.console.aliyun.com/repository/cn-hangzhou/log-service/logtail/detail
            # this images is released for every region
            image: registry.cn-hangzhou.aliyuncs.com/log-service/logtail:latest
            # when recevie sigterm, logtail will delay 10 seconds and then stop
            command:
            - sh
            - -c
            - /usr/local/ilogtail/run_logtail.sh 10
            livenessProbe:
              exec:
                command:
                - /etc/init.d/ilogtaild
                - status
              initialDelaySeconds: 30
              periodSeconds: 30
            resources:
              limits:
                memory: 512Mi
              requests:
                cpu: 10m
                memory: 30Mi
            env:
              ##### base config
              # user id
              - name: "ALIYUN_LOGTAIL_USER_ID"
                value: "${your_aliyun_user_id}"
              # user defined id
              - name: "ALIYUN_LOGTAIL_USER_DEFINED_ID"
                value: "${your_machine_group_user_defined_id}"
              # config file path in logtail's container
              - name: "ALIYUN_LOGTAIL_CONFIG"
                value: "/etc/ilogtail/conf/${your_region_config}/ilogtail_config.json"
              ##### env tags config
              - name: "ALIYUN_LOG_ENV_TAGS"
                value: "_pod_name_|_pod_ip_|_namespace_|_node_name_|_node_ip_"
              - name: "_pod_name_"
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.name
              - name: "_pod_ip_"
                valueFrom:
                  fieldRef:
                    fieldPath: status.podIP
              - name: "_namespace_"
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.namespace
              - name: "_node_name_"
                valueFrom:
                  fieldRef:
                    fieldPath: spec.nodeName
              - name: "_node_ip_"
                valueFrom:
                  fieldRef:
                    fieldPath: status.hostIP
            volumeMounts:
            - name: nginx-log
              mountPath: /var/log/nginx
          ##### share this volume
          volumes:
          - name: nginx-log
            emptyDir: {}
    1. 在配置脚本中找到如下内容,完成基础配置。
      ##### base config
                # user id
                - name: "ALIYUN_LOGTAIL_USER_ID"
                  value: "${your_aliyun_user_id}"
                # user defined id
                - name: "ALIYUN_LOGTAIL_USER_DEFINED_ID"
                  value: "${your_machine_group_user_defined_id}"
                # config file path in logtail's container
                - name: "ALIYUN_LOGTAIL_CONFIG"
                  value: "/etc/ilogtail/conf/${your_region_config}/ilogtail_config.json"
      变量 说明
      ${your_aliyun_user_id} 配置为您的阿里云账号ID。更多信息,请参见步骤一:获取日志服务所在的阿里云账号ID
      ${your_machine_group_user_defined_id} 配置机器组的自定义标识,请确保该标识在您的Project所在地域内唯一,例如nginx-log-sidecar。更多信息,请参见创建用户自定义标识机器组
      ${your_region_config} 请根据日志服务Project所在地域和访问的网络类型填写。其中,地域信息请参见表 1
      • 如果使用公网采集日志,格式为region-internet,例如:华东 1(杭州)cn-hangzhou-internet
      • 如果使用阿里云内网采集日志,格式为region。例如:华东 1(杭州)cn-hangzhou
    2. 在配置脚本中找到如下内容,设置挂载路径。
      说明 建议使用emptyDir挂载方式。
              volumeMounts:
              - name: nginx-log
                mountPath: /var/log/nginx
            ##### share this volume
            volumes:
            - name: nginx-log
              emptyDir: {}
      参数 说明
      name 自定义设置卷的名称。
      注意 volumeMounts节点下的name参数与volumes节点下的name参数需设置为一致,即确保Logtail容器和业务容器挂载相同的卷上。
      mountPath 设置挂载路径,即容器文本日志所在文件的路径。
    3. 在配置脚本中找到如下内容,设置延迟停止采集的时间。
      通常情况下,延迟停止采集的时间为10秒,即Logtail容器在接收到外部停止信号后会等待10秒再退出,防止有部分数据没有采集完毕。
      command:        
      - sh        
      - -c        
      - /usr/local/ilogtail/run_logtail.sh 10
  4. 执行如下命令使sidecar.yaml文件配置生效。

    sidecar.yaml为文件名,请根据实际情况替换。

    kubectl apply -f sidecar.yaml

步骤二:创建Logtail采集配置

只需要定义AliyunLogConfig CRD即可创建Logtail采集配置。创建完成后,系统自动应用该Logtail采集配置。如果您要删除Logtail采集配置只需删除对应的CRD资源即可。

  1. 登录Kubernetes集群。
  2. 执行如下命令创建一个YAML文件。

    cube.yaml为文件名,请根据实际情况替换。

    vim cube.yaml
  3. 在YAML文件输入如下脚本,并根据实际情况设置其中的参数。
    注意
    • 请确保configName参数值在日志服务Project中唯一存在。
    • 如果多个CRD关联同一个Logtail采集配置,则删除或修改任意一个CRD均会影响到该Logtail采集配置,导致其他关联该Logtail采集配置的CRD状态与服务端不一致。
    • 通过Sidecar模式只能采集文本日志,需将dockerFile参数设置为false。
    apiVersion: log.alibabacloud.com/v1alpha1      # 使用默认值,无需修改。
    kind: AliyunLogConfig                          # 使用默认值,无需修改。
    metadata:
      name: simple-stdout-example                  # 设置资源名,在当前Kubernetes集群内唯一。
    spec:
      project: k8s-my-project                      # (可选)设置Project名称。默认值为安装Logtail组件时设置的Project。
      logstore: k8s-stdout                         # 设置Logstore名称。如果您所指定的Logstore不存在,日志服务会自动创建。
      machineGroups:                               # 设置机器组的名称,需与您在安装Sidecar时设置的${your_machine_group_user_defined_id}的值一致。Sidecar与CRD通过此处配置的机器组建立关联。
      - nginx-log-sidecar
      shardCount: 2                                # (可选)设置Shard数量。默认值为2,取值范围1~10。
      lifeCycle: 90                                # (可选)设置Logstore中数据的存储时间。默认值为90,取值范围为1~3650。其中,3650天为永久存储。
      logtailConfig:                               # 设置Logtail采集配置。
        inputType: file                            # 设置采集的数据源类型,通过Sidecar-CRD方式只支持采集文本日志,即需要设置为file。
        configName: simple-stdout-example          # 设置Logtail配置名称,与资源名(metadata.name)保持一致。
        inputDetail:                               # 设置Logtail采集配置的详细信息,具体配置请参见本文下方的示例。
        ...
    参数 数据类型 是否必填 说明
    project string Project名称。默认值为安装Logtail组件时所设置的Project。
    logstore string Logstore名称。

    如果您所指定的Logstore不存在,日志服务会自动创建。

    shardCount int Shard数量。默认值为2,取值范围为1~10。
    lifeCycle int Logstore中数据的存储时间。默认值为90,取值范围为1~3650。其中,3650天为永久存储。
    machineGroups array 设置机器组名称,需与您在安装Sidecar时设置的${your_machine_group_user_defined_id}的值一致,例如nginx-log-sidecar。
    日志服务将根据您设置的名称自动创建机器组,建立Sidecar与CRD之间的关联。
    注意

    机器组自定义标识的配置格式如下所示,请严格按照此格式配置。

      machineGroups:      
      - nginx-log-sidecar
    logtailConfig object Logtail采集配置的详细定义,一般只需要定义其中的inputType参数、configName参数和inputDetail参数。详细参数说明,请参见Logtail配置

    相关示例,请参见配置示例(单目录)配置示例(多目录)

  4. 执行如下命令使Logtail采集配置生效。

    cube.yaml为文件名,请根据实际情况替换。

    kubectl apply -f cube.yaml
    创建Logtail采集配置后,您可以通过CRD方式或控制台方式查看Logtail采集配置。具体操作,请参见查看Logtail采集配置

配置示例(单目录)

通过Sidecar-CRD方式采集本地IDC上自建Kubernetes集群中nginx-log-demo容器的文本日志(包括Nginx访问日志和Nginx错误日志)。基本信息如下:
  • 日志服务所在地域为华东1(杭州),需要通过公网采集。
  • 待挂载的卷的名称为nginx-log,挂载方式为emptyDir,将nginx-log卷分别挂载到nginx-log-demo容器和Logtail容器的/var/log/nginx目录下。
  • Nginx访问日志所在文件的路径为/var/log/nginx/access.log ,用于存储Nginx访问日志的目标Logstore为nginx-access
  • Nginx错误日志所在文件的路径为/var/log/nginx/error.log ,用于存储Nginx错误日志的目标Logstore为nginx-error
  • Sidecar示例
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: nginx-log-sidecar-demo
      namespace: default
    spec:
      template:
        metadata:
          name: nginx-log-sidecar-demo
        spec:
          restartPolicy: Never
          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/nginx
          ##### logtail sidecar container
          - name: logtail
            # more info: https://cr.console.aliyun.com/repository/cn-hangzhou/log-service/logtail/detail
            # this images is released for every region
            image: registry.cn-hangzhou.aliyuncs.com/log-service/logtail:latest
            # when recevie sigterm, logtail will delay 10 seconds and then stop
            command:
            - sh
            - -c
            - /usr/local/ilogtail/run_logtail.sh 10
            livenessProbe:
              exec:
                command:
                - /etc/init.d/ilogtaild
                - status
              initialDelaySeconds: 30
              periodSeconds: 30
            env:
              ##### base config
              # user id
              - name: "ALIYUN_LOGTAIL_USER_ID"
                value: "1023****3423"
              # user defined id
              - name: "ALIYUN_LOGTAIL_USER_DEFINED_ID"
                value: "nginx-log-sidecar"
              # config file path in logtail's container
              - name: "ALIYUN_LOGTAIL_CONFIG"
                value: "/etc/ilogtail/conf/cn-hangzhou-internet/ilogtail_config.json"
              ##### env tags config
              - name: "ALIYUN_LOG_ENV_TAGS"
                value: "_pod_name_|_pod_ip_|_namespace_|_node_name_|_node_ip_"
              - name: "_pod_name_"
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.name
              - name: "_pod_ip_"
                valueFrom:
                  fieldRef:
                    fieldPath: status.podIP
              - name: "_namespace_"
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.namespace
              - name: "_node_name_"
                valueFrom:
                  fieldRef:
                    fieldPath: spec.nodeName
              - name: "_node_ip_"
                valueFrom:
                  fieldRef:
                    fieldPath: status.hostIP
            volumeMounts:
            - name: nginx-log
              mountPath: /var/log/nginx
          ##### share this volume
          volumes:
          - name: nginx-log
            emptyDir: {}
  • CRD示例

    创建两个Logtail采集配置用于采集Nginx访问日志和Nginx错误日志。

    • 采集Nginx访问日志
      注意 Sidecar模式下,需将dockerFile参数设置为false。
      apiVersion: log.alibabacloud.com/v1alpha1
      kind: AliyunLogConfig
      metadata:
        # 资源名称,在您的K8s集群中必须唯一。
        name: nginx-log-access-example
      spec:
        # 设置Project名称。默认值为安装Logtail时所设置的Project。
        project: k8s-nginx-sidecar-demo
        # 设置Logstore名称。如果您所指定的Logstore不存在,日志服务会自动创建。
        logstore: nginx-access
        # 设置机器组名称,需与您在安装Sidecar时设置的${your_machine_group_user_defined_id}的值一致。
        machineGroups:
        - nginx-log-sidecar
        # 设置Logtail采集配置。
        logtailConfig:
          # 设置采集的数据源类型,通过Sidecar-CRD方式只支持采集文本日志,即需要设置为file。
          inputType: file
          # 设置Logtail采集配置的名称,必须与资源名(metadata.name)相同。
          configName: nginx-log-access-example
          inputDetail:
            # 指定通过完整正则模式采集容器文本日志。
            logType: common_reg_log
            # 设置日志文件所在路径。
            logPath: /var/log/nginx
            # 设置日志文件的名称。支持通配符星号(*)和半角问号(?),例如log_*.log。
            filePattern: access.log
            # sidecar模式下,需设置dockerFile为false。
            dockerFile: false
            # 设置用于匹配日志行首的行首正则表达式。如果为单行模式,设置成'.*'。
            logBeginRegex: '.*'
            # 设置正则表达式,用于提取日志内容。请根据实际情况设置。
            regex: '(\S+)\s(\S+)\s\S+\s\S+\s"(\S+)\s(\S+)\s+([^"]+)"\s+(\S+)\s(\S+)\s(\d+)\s(\d+)\s(\S+)\s"([^"]+)"\s.*'
            # 设置提取的字段列表。
            key : ["time", "ip", "method", "url", "protocol", "latency", "payload", "status", "response-size",user-agent"]
    • 采集Nginx错误日志
      注意 Sidecar模式下,需将dockerFile参数设置为false。
      # config for error log
      apiVersion: log.alibabacloud.com/v1alpha1
      kind: AliyunLogConfig
      metadata:
        # 设置资源名,在当前Kubernetes集群内唯一。
        name: nginx-log-error-example
      spec:
        # 设置Project名称。默认值为安装Logtail时所设置的Project。
        project: k8s-nginx-sidecar-demo
        # 设置Logstore名称。如果您所指定的Logstore不存在,日志服务会自动创建。
        logstore: nginx-error
        # 设置机器组名称,需与您在安装Sidecar时设置的${your_machine_group_user_defined_id}的值一致。
        machineGroups:
        - nginx-log-sidecar
        # 设置Logtail采集配置。
        logtailConfig:
          # 设置采集的数据源类型,通过Sidecar-CRD方式只支持采集文本日志,即需要设置为file。
          inputType: file
          # 设置Logtail配置名称,必须与资源名(metadata.name)相同。
          configName: nginx-log-error-example
          inputDetail:
            # 指定通过完整正则模式采集容器文本日志。
            logType: common_reg_log
            # 设置日志文件的路径。
            logPath: /var/log/nginx
            # 设置日志文件的名称。支持通配符星号(*)和半角问号(?),例如log_*.log。
            filePattern: error.log
            # sidecar模式下,需设置dockerFile为false。
            dockerFile: false

配置示例(多目录)

通过Sidecar-CRD方式采集本地IDC上自建Kubernetes集群中nginx-log-demo容器的文本日志(存储在不同目录下的Nginx访问日志)。基本信息如下:

  • 日志服务所在地域为华东1(杭州),需要通过公网采集。
  • 待挂载的卷的名称为nginx-lognginx-logs,挂载方式为emptyDir。将nginx-log卷分别挂载到nginx-log-demo容器和Logtail容器的/var/log/nginx目录下。将nginx-logs卷分别挂载到nginx-log-demo容器和Logtail容器的/var/log/nginxs目录下。
  • 一个日志文件的路径为/var/log/nginx/access.log ,另一个日志文件的路径为/var/log/nginxs/access.log
  • 用于存储Nginx访问日志的目标Logstore为nginx-access
  • Sidecar示例
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: nginx-log-sidecar-demo
      namespace: default
    spec:
      template:
        metadata:
          name: nginx-log-sidecar-demo
        spec:
          restartPolicy: Never
          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"]
            lifecycle:
            volumeMounts:
            - name: nginx-log
              mountPath: /var/log/nginx
            - name: nginx-logs
              mountPath: /var/log/nginxs
          ##### logtail sidecar container
          - name: logtail
            # more info: https://cr.console.aliyun.com/repository/cn-hangzhou/log-service/logtail/detail
            # this images is released for every region
            image: registry.cn-hangzhou.aliyuncs.com/log-service/logtail:latest
            # when recevie sigterm, logtail will delay 10 seconds and then stop
            lifecycle:
            command:
            - sh
            - -c
            - /usr/local/ilogtail/run_logtail.sh 10
            livenessProbe:
              exec:
                command:
                - /etc/init.d/ilogtaild
                - status
              initialDelaySeconds: 30
              periodSeconds: 30
            resources:
              limits:
                memory: 512Mi
              requests:
                cpu: 10m
                memory: 30Mi
            env:
              ##### base config
              # user id
              - name: "ALIYUN_LOGTAIL_USER_ID"
                value: "1023****3423"
              # user defined id
              - name: "ALIYUN_LOGTAIL_USER_DEFINED_ID"
                value: "nginx-log-sidecar"
              # config file path in logtail's container
              - name: "ALIYUN_LOGTAIL_CONFIG"
                value: "/etc/ilogtail/conf/cn-hangzhou-internet/ilogtail_config.json"
              ##### env tags config
              - name: "ALIYUN_LOG_ENV_TAGS"
                value: "_pod_name_|_pod_ip_|_namespace_|_node_name_|_node_ip_"
              - name: "_pod_name_"
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.name
              - name: "_pod_ip_"
                valueFrom:
                  fieldRef:
                    fieldPath: status.podIP
              - name: "_namespace_"
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.namespace
              - name: "_node_name_"
                valueFrom:
                  fieldRef:
                    fieldPath: spec.nodeName
              - name: "_node_ip_"
                valueFrom:
                  fieldRef:
                    fieldPath: status.hostIP
            volumeMounts:
            - name: nginx-log
              mountPath: /var/log/nginx
            - name: nginx-logs
              mountPath: /var/log/nginxs
          ##### share this volume
          volumes:
          - name: nginx-log
            emptyDir: {}
          - name: nginx-logs
            emptyDir: {}
  • CRD示例

    创建两个Logtail采集配置用于采集不同目录下的Nginx访问日志。

    • 采集/var/log/nginx/access.log下的Nginx访问日志
      注意 Sidecar模式下,需将dockerFile参数设置为false。
      apiVersion: log.alibabacloud.com/v1alpha1
      kind: AliyunLogConfig
      metadata:
        # 设置资源名,在当前Kubernetes集群内唯一。
        name: nginx-log-access-example
      spec:
        # 设置Project名称。默认值为安装Logtail时所设置的Project。
        project: k8s-nginx-sidecar-demo
        # 设置Logstore名称。如果您所指定的Logstore不存在,日志服务会自动创建。
        logstore: nginx-access
        # 设置机器组名称,需与您在安装Sidecar时设置的${your_machine_group_user_defined_id}的值一致。
        machineGroups:
        - nginx-log-sidecar
        # 设置Logtail采集配置。
        logtailConfig:
          # 设置采集的数据源类型,通过Sidecar-CRD方式只支持采集文本日志,即需要设置为file。
          inputType: file
          # 设置Logtail采集配置的名称,必须与资源名(metadata.name)相同。
          configName: nginx-log-access-example
          inputDetail:
            # 指定通过完整正则模式采集文本日志。
            logType: common_reg_log
            # 设置日志文件的路径。
            logPath: /var/log/nginx
            # 设置日志文件的名称。支持通配符星号(*)和半角问号(?),例如log_*.log。
            filePattern: access.log
            # sidecar模式下,需设置dockerFile为false。
            dockerFile: false
            # 设置用于匹配日志行首的行首正则表达式。如果为单行模式,设置成 '.*'。
            logBeginRegex: '.*'
            # 设置正则表达式,用于提取日志内容。
            regex: '(\S+)\s(\S+)\s\S+\s\S+\s"(\S+)\s(\S+)\s+([^"]+)"\s+(\S+)\s(\S+)\s(\d+)\s(\d+)\s(\S+)\s"([^"]+)"\s.*'
            # 提取的字段列表。
            key : ["time", "ip", "method", "url", "protocol", "latency", "payload", "status", "response-size",user-agent"]
    • 采集/var/log/nginxs/access.log下的Nginx访问日志
      注意 Sidecar模式下,需将dockerFile参数设置为false。
      apiVersion: log.alibabacloud.com/v1alpha1
      kind: AliyunLogConfig
      metadata:
        # 设置资源名,在当前Kubernetes集群内唯一。
        name: nginxs-log-access-example
      spec:
        # 设置Project名称。默认值为安装Logtail时所设置的Project。
        project: k8s-nginx-sidecar-demo
        # 设置Logstore名称。如果您所指定的Logstore不存在,日志服务会自动创建。
        logstore: nginxs-access
        # 设置机器组名称,需与您在安装Sidecar时设置的${your_machine_group_user_defined_id}的值一致。
        machineGroups:
        - nginx-log-sidecar
        # Logtail采集配置。
        logtailConfig:
          # 设置采集的数据源类型,通过Sidecar-CRD方式只支持采集文本日志,即需要设置为file。
          inputType: file
          # 设置Logtail采集配置的名称,必须与资源名(metadata.name)相同。
          configName: nginxs-log-access-example
          inputDetail:
            # 指定通过完整正则模式采集文本日志。
            logType: common_reg_log
            # 设置日志文件的路径。
            logPath: /var/log/nginxs
            # 设置日志文件的名称。支持通配符星号(*)和半角问号(?),例如log_*.log。
            filePattern: access.log
            # 在sidecar模式下,需设置dockerFile为false。
            dockerFile: false
            # 设置用于匹配日志行首的行首正则表达式。如果为单行模式,设置成 .*。
            logBeginRegex: '.*'
            # 设置正则表达式,用于提取日志内容。
            regex: '(\S+)\s(\S+)\s\S+\s\S+\s"(\S+)\s(\S+)\s+([^"]+)"\s+(\S+)\s(\S+)\s(\d+)\s(\d+)\s(\S+)\s"([^"]+)"\s.*'
            # 提取的字段列表。
            key : ["time", "ip", "method", "url", "protocol", "latency", "payload", "status", "response-size",user-agent"]
      # config for error log