在TKE中LogListener是以DaemonSet模式运行,可通过CRD方式创建采集配置采集TKE集群日志。本文介绍如何通过CRD方式创建采集配置。
前提条件
需要开启日志采集功能,详情请参考开启日志采集
创建采集配置
您只需要定义 LogConfig CRD 即可创建采集配置,LogListener 根据 LogConfig CRD 的变化修改相应的日志服务 CLS 日志主题,并设置绑定的机器组。CRD 的格式如下:
apiVersion: cls.cloud.tencent.com/v1 kind: LogConfig ## 默认值 metadata: name: test ## CRD资源名,在集群内唯一 spec: clsDetail: topicId: xxxxxx-xx-xx-xx-xxxxxxxx ## CLS日志主题的ID,日志主题需要在CLS中提前创建,且没有被其它采集配置占用 logType: minimalist_log ## 日志采集格式,json_log代表 json 格式,delimiter_log代表分隔符格式,minimalist_log代表单行全文格式,multiline_log代表多行全文格式,fullregex_log代表完全正则格式 extractRule: ## 提取、过滤规则 ... inputDetail: type: container_stdout ## 采集日志的类型,包括container_stdout(容器标准输出)、container_file(容器文件)、host_file(主机文件) containerStdout: ## 容器标准输出 namespace: default ## 采集容器的kubernetes命名空间,如果不指定,代表所有命名空间 allContainers: false ## 是否采集指定命名空间中的所有容器的标准输出 container: xxx ## 满足includeLabels的Pod中的容器名,只有在指定includeLabels时使用 includeLabels: ## 采集包含指定label的Pod k8s-app: xxx ## 只采pod标签中配置"k8s-app=xxx"的pod产生的日志,与workloads、allContainers=true不能同时指定 workloads: ## 要采集的容器的Pod所属的kubernetes workload - namespace: prod ## workload的命名空间 name: sample-app ## workload的名字 kind: deployment ## workload类型,支持deployment、daemonset、statefulset、job、cronjob container: xxx ## 要采集的容器名,如果不指定,代表workload Pod中的所有容器 containerFile: ## 容器内文件 namespace: default ## 采集容器的kubernetes命名空间 container: xxx ## 采集容器名 includeLabels: ## 采集包含指定label的Pod k8s-app: xxx ## 只采pod标签中配置"k8s-app=xxx"的pod产生的日志,与workload不能同时指定 workload: ## 要采集的容器的Pod所属的kubernetes workload name: sample-app ## workload的名字 kind: deployment ## workload类型,支持deployment、daemonset、statefulset、job、cronjob logPath: /opt/logs ## 日志文件夹,不支持通配符 filePattern: app_*.log ## 日志文件名,支持通配符 * 和 ? ,* 表示匹配多个任意字符,? 表示匹配单个任意字符 hostFile: ## 主机文件 logPath: /opt/logs ## 日志文件夹,支持通配符 filePattern: app_*.log ## 日志文件名,支持通配符 * 和 ? ,* 表示匹配多个任意字符,? 表示匹配单个任意字符 customLablels k1: v1
查看采集配置
- 查看所有采集配置
[root@VM-1-24-centos ~]# kubectl get logconfigs NAME AGE cls-delimiter 48m stdout-lgs 4h21m www-nginx 75m
- 查看采集配置的详细信息和状态
- 其中stdout-lgs 为配置的名称,可以根据实际情况进行替换;
- status字段值为Synced表示应用配置成功,否则表示应用配置失败。
[root@VM-1-24-centos ~]# kubectl get logconfigs stdout-lgs -o yaml apiVersion: cls.cloud.tencent.com/v1 kind: LogConfig metadata: creationTimestamp: "2021-04-07T09:33:42Z" generation: 2 managedFields: - apiVersion: cls.cloud.tencent.com/v1 ...... name: stdout-lgs spec: clsDetail: extractRule: beginningRegex: (\S+)\s-[^-]+(\S+)\s\[([^\]]+)\]\s"(\w+)\s(\S+)\s([^"]+)"\s(\d+)\s(\d+)\s(\S+)[^-]+([^"]+)"\s"([^"]+)[^-]+([^"]+)"\s"([^"]+).* keys: - client_ip - remote_user - request_time - request_method - request_url - http_protocol - status_code - body_bytes_sent - handle_time - http_referer - http_user_agent - real_ip - log_time logRegex: (\S+)\s-[^-]+(\S+)\s\[([^\]]+)\]\s"(\w+)\s(\S+)\s([^"]+)"\s(\d+)\s(\d+)\s(\S+)[^-]+([^"]+)"\s"([^"]+)[^-]+([^"]+)"\s"([^"]+).* logType: fullregex_log topicId: 4511efaa-2cad-4c3c-8c7c-d3bb5a58d903 inputDetail: containerStdout: includeLabels: k8s-app: tke-cls-nginx-std namespace: cls-wk type: container_stdout status: status: Synced
采集示例
标准输出
- 采集一个namespace是cls-wk,标签是tke-cls-nginx的所有容器的标准输出的配置
apiVersion: cls.cloud.tencent.com/v1 kind: LogConfig metadata: # 配置名称,集群唯一 name: test123 spec: # 消费端配置 clsDetail: # 消费的topic id topicId: 4224b4f3-9ee8-46e3-822a-xxxxxxxxx # 提取模式 logType: minimalist_log inputDetail: # 采集类型 type: container_stdout containerStdout: # 所属namespace namespace: cls-wk # 对应容器的标签 includeLabels: k8s-app: tke-cls-nginx
- 正则表达提取模式
apiVersion: cls.cloud.tencent.com/v1 kind: LogConfig metadata: # 配置名称,集群唯一 name: stdout-lgs spec: clsDetail: extractRule: beginningRegex: (\S+)\s-[^-]+(\S+)\s\[([^\]]+)\]\s"(\w+)\s(\S+)\s([^"]+)"\s(\d+)\s(\d+)\s(\S+)[^-]+([^"]+)"\s"([^"]+)[^-]+([^"]+)"\s"([^"]+).* # 提起的键值 keys: - client_ip - remote_user - request_time - request_method - request_url - http_protocol - status_code - body_bytes_sent - handle_time - http_referer - http_user_agent - real_ip - log_time # 正则表达式,会根据()捕获组提取对应的value logRegex: (\S+)\s-[^-]+(\S+)\s\[([^\]]+)\]\s"(\w+)\s(\S+)\s([^"]+)"\s(\d+)\s(\d+)\s(\S+)[^-]+([^"]+)"\s"([^"]+)[^-]+([^"]+)"\s"([^"]+).* # 日志采集格式:完全正则提取模式 logType: fullregex_log topicId: 4511efaa-2cad-4c3c-8c7c-xxxxxxxxx inputDetail: containerStdout: # pod 标签 includeLabels: k8s-app: tke-cls-nginx-std namespace: cls-wk # 采集类型 type: container_stdout
应用配置后,日志服务的数据格式如下:
容器文件
- 采集deployment为nginx-logfile,容器名为nginx-logfile的日志文件,其中日志文件路径为/data/log/nginx,*.log结尾的文件。
apiVersion: cls.cloud.tencent.com/v1 kind: LogConfig metadata: # 配置名称,集群唯一 name: www-nginx spec: clsDetail: # 日志采集格式 logType: minimalist_log topicId: 56a32d6f-77da-4c4a-a7d1-xxxxxxxxx inputDetail: containerFile: container: nginx-logfile # 文件名,支持通配符*和? filePattern: '*.log' logPath: /data/log/nginx namespace: cls-wk workload: kind: deployment name: nginx-logfile # 采集类型为容器文件 type: container_file
- 分隔符模式的日志文件
apiVersion: cls.cloud.tencent.com/v1 kind: LogConfig metadata: # 配置名称,集群唯一 name: cls-delimiter spec: clsDetail: # 分隔符 delimiter: '::' # 提取的key keys: - remote_addr - remote_user - time_local - request - status - body_bytes_sent - request_time - http_referer - http_user_agent - http_x_forwarded_for - msec # 日志时间使用日志中字段时间 timeFormat: '%d/%b/%Y %H:%M:%S' timeKey: time_local # 日志采集格式为分隔符模式 logType: delimiter_log topicId: e850733e-f32b-4a8e-a246-xxxxxxxx inputDetail: containerFile: container: nginxdelimiter filePattern: '*.log' logPath: /data/log/nginx namespace: cls-wk workload: kind: deployment name: nginxdelimiter # 采集类型为容器文件 type: container_file
应用配置后,日志服务的数据格式如下:
更多CLS和TKE日志采集相关请参考如下链接:
友情提醒:
- 通过CRD的方式采集配置TKE日志,索引需要在日志控制台打开和相关配置;
- 建议通过TKE控制台的方式配置,默认全文索引和部分键值索引打开的状态。