本文介绍如何安装Sidecar及使用CRD方式创建Logtail配置,完成容器文本日志的采集。
前提条件
- 已安装Logtail组件。具体操作,请参见安装Logtail组件(Kubernetes集群)。
- 目标容器持续产生日志。
重要 Logtail只采集增量日志。如果下发Logtail配置后,日志文件无更新,则Logtail不会采集该文件中的日志。更多信息,请参见 读取文件。
背景信息
通过Sidecar模式采集日志,依赖于Logtail容器和业务容器共享的日志目录。业务容器将日志写入到共享目录中,Logtail通过监控共享目录中日志文件的变化并采集日志。更多信息,请参见Sidecar日志采集介绍和Sidecar模式示例。
步骤一:安装Sidecar
- 登录Kubernetes集群。
- 创建一个YAML文件。
sidecar.yaml为文件名,请根据实际情况替换。
vim sidecar.yaml
- 在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: {}
- 执行如下命令使sidecar.yaml文件配置生效。
sidecar.yaml为文件名,请根据实际情况替换。
kubectl apply -f sidecar.yaml
步骤二:创建Logtail配置
只需要定义AliyunLogConfig CRD即可创建Logtail配置。创建完成后,系统自动应用该Logtail配置。如果您要删除Logtail配置只需删除对应的CRD资源即可。
- 登录Kubernetes集群。
- 执行如下命令创建一个YAML文件。
cube.yaml为文件名,请根据实际情况替换。
vim cube.yaml
- 在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不存在,日志服务会自动创建。 logstoreMode: standard # (可选)设置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不存在,日志服务会自动创建。
logstoreMode string 否 Logstore类型。更多信息,请参见管理Logstore。可选值: - query:查询型Logstore。
- standard:标准型Logstore。
重要- 该参数值仅在新建Logstore时生效,即您只能在创建Logstore时,指定Logstore类型。如果您在logstore参数中指定的Logstore已存在,则修改该参数值,不会生效。
- 针对alibaba-log-controller 0.3.3及以上版本,该设置才会生效。
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配置。 - 执行如下命令使Logtail配置生效。
cube.yaml为文件名,请根据实际情况替换。
kubectl apply -f cube.yaml
创建Logtail配置后,您可以通过CRD方式或控制台方式查看Logtail配置。具体操作,请参见 查看Logtail配置。重要 采集到日志后,您需要先创建索引,才能在Logstore中查询和分析日志。具体操作,请参见 创建索引。
配置示例
单目录
通过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
- 采集Nginx访问日志
多目录
通过Sidecar-CRD方式采集本地IDC上自建Kubernetes集群中nginx-log-demo容器的文本日志(存储在不同目录下的Nginx访问日志)。基本信息如下:
- 日志服务所在地域为华东1(杭州),需要通过公网采集。
- 待挂载的卷的名称为nginx-log和nginx-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"]
- 采集/var/log/nginx/access.log下的Nginx访问日志
问题排查
当您使用Logtail采集容器(标准容器、Kubernetes)日志遇到异常情况时,您可以参见如下内容进行排查。