k8s使用阿里云日志服务sls收集日志

2021-05-24

需求背景

需求:
k8s的应用日志解决方案,不同项目组的日志要采集到不同的logstore,并且只采集指定环境的日志(dev/test/prd)

方案:

  1. logtail使用daemonset方式
  2. 通过crd来自定义日志采集

1. 部署helm v3

helm: https://github.com/helm/helm/releases

wget https://get.helm.sh/helm-v3.3.4-linux-amd64.tar.gz \
&& tar xf helm-v3.3.4-linux-amd64.tar.gz \
&& \cp -a linux-amd64/helm /usr/local/bin/helm \
&& helm version

2. 部署logtail-daemonset

安装Logtail日志组件:https://help.aliyun.com/document_detail/157317.html

开通一个子账号专门用于管理日志服务,并创建project k8s-log-custom-logtail,官方推荐"k8s-log-custom-"开头,咨询客服得知这个其实是可以随便自定义的

wget http://logtail-release-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/kubernetes/alicloud-log-k8s-custom-install.sh; \
&& chmod 744 ./alicloud-log-k8s-custom-install.sh; \
&& sh ./alicloud-log-k8s-custom-install.sh {your-project-suffix} {region-id} {aliuid} {access-key-id} {access-key-secret}

查看

helm status alibaba-log-controller

3. 配置aliyunlog-crd

file极简采集方式,配置多个crd来支持不同项目组使用不同logstore,容器的环境变量需要包含 ENVGROUP,用于筛选需要采集日志的容器

log-crd-dev-demo.yml

apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
  # 资源名,在集群内唯一
  name: log-demo
  namespace: log-crd
spec:
  # [可选]Project名称,默认为安装时设置的Project,若指定Project请确保该Project未被使用
  # project: k8s-log-custom-logtail
  # Logstore名称,不存在时自动创建
  logstore: k8s-demo
  # [可选]Shard数量,默认为2,支持1-10
  shardCount: 2
  # 详细配置
  logtailConfig:
    # 采集的数据源类型,file(文本文件)或plugin(标准输出)
    inputType: file
    # 采集配置的名称,与资源名(metadata.name)保持一致
    configName: log-demo
    inputDetail:
      # 极简模式日志,logType设置为"common_reg_log"
      logType: common_reg_log
      # 日志文件夹
      logPath: /var/log/app
      # 文件名, 支持通配符,例如log_*.log
      filePattern: "*.log"
      # 行首正则表达式
      logBeginRegex: '\d+-\d+-\d+\s\d+:\d+:\d+\.\d+\s.*'
      # 解析正则
      regex: '(.*)'
      # 提取出的key列表
      key: ["content"]
      # 采集容器内的文件,dockerFile设置为true
      dockerFile: true
      # 只采集包含指定环境变量的容器日志,多个变量时,只要满足其中一个就会被采集
      dockerIncludeEnv:
        GROUP: demo
      # 排除包含指定变量
      dockerExcludeEnv:
        ENV: "^test|prd$"

查看

kubectl -n log-crd get aliyunlogconfigs

其他

行首正则可以在页面上选择简单多行模式,贴入一段日志自动生成,再复制出来(极简模式-多行 是特殊的完整正则 crd里面没有设置的参数)
noteattach.png

crd和sls控制台配置最终生成的是logtail客户端的采集配置 /usr/local/ilogtail/user_log_config.json

"##1.0##k8s-log-custom-logtail$log-test-product" : {
         "advanced" : {
            "force_multiconfig" : false
         },
         "aliuid" : "1778178830505945",
         "category" : "k8s-test-product",
         "create_time" : 1621580904,
         "defaultEndpoint" : "cn-shanghai-intranet.log.aliyuncs.com",
         "delay_alarm_bytes" : 0,
         "delay_skip_bytes" : 0,
         "discard_none_utf8" : false,
         "discard_unmatch" : true,
         "docker_exclude_env" : {
            "ENV" : "^dev|prd$"
         },
         "docker_exclude_label" : {},
         "docker_file" : true,
         "docker_include_env" : {
            "GROUP" : "product"
         },
         "docker_include_label" : {},
         "enable" : true,
         "enable_tag" : true,
         "file_encoding" : "utf8",
         "file_pattern" : "*.log",
         "filter_keys" : [],
         "filter_regs" : [],
         "group_topic" : "",
         "keys" : [ "content" ],
         "local_storage" : true,
         "log_begin_reg" : "\\d+-\\d+-\\d+\\s\\d+:\\d+:\\d+\\.\\d+\\s.*",
         "log_path" : "/var/log/intramirror",
         "log_type" : "common_reg_log",
         "log_tz" : "",
         "max_depth" : 100,
         "max_send_rate" : -1,
         "merge_type" : "topic",
         "preserve" : true,
         "preserve_depth" : 0,
         "priority" : 0,
         "project_name" : "k8s-log-custom-logtail",
         "raw_log" : false,
         "regex" : [ "(.*)" ],
         "region" : "cn-shanghai",
         "send_rate_expire" : 0,
         "sensitive_keys" : [],
         "shard_hash_key" : [],
         "tail_existed" : false,
         "timeformat" : "",
         "topic_format" : "none",
         "tz_adjust" : false,
         "version" : 2
      }
   },
   "region_list" : [
      {
         "endpoint_list" : [
            "cn-shanghai-intranet.log.aliyuncs.com",
            "cn-shanghai.log.aliyuncs.com"
         ],
         "name" : "cn-shanghai",
         "primary" : true,
         "profile_project" : "ali-cn-shanghai-sls-admin"
      },
      {
         "endpoint_list" : [
            "cn-shanghai-b-intranet.log.aliyuncs.com",
            "cn-shanghai-b.log.aliyuncs.com"
         ],
         "name" : "cn-shanghai-b",
         "primary" : false,
         "profile_project" : "ali-cn-shanghai-b-sls-admin"
      }
   ]
}

查看配置可以看到控制台的配置为logtail自动生成了

"keys" : [ "content" ],
"regex" : [ "(.*)" ]

所以如果没有特殊需要,我们在配置crd时这2个参数也可以直接配置成这样

还需要注意的是,同一个文件只会被logtail采集一次,例如:按照配置,一个文件既会被A采集,也会被B采集,那么它只会被采集到其中一个里面去(比如只会被采集到A的logstore)。这时只有A排除了这个采集时,才会跑到B的logstore里。

除了通过容器ENV来筛选,还可以通过LABLE,参数 dockerIncludeLabel dockerExcludeLabel,用法和 dockerIncludeEnv dockerExcludeEnv差不多,要以 docker inspect 中的为准

参考链接

K8S 日志采集最佳实操
https://www.cnblogs.com/lihanlin/p/12657680.html
Kubernetes中Logtail日志采集CRD配置详解
https://blog.csdn.net/weixin_34406061/article/details/89700948
安装Logtail日志组件
https://help.aliyun.com/document_detail/157317.html
通过DaemonSet-CRD方式采集日志
https://help.aliyun.com/document_detail/74878.html
Logtail配置 详细参数
https://help.aliyun.com/document_detail/29058.html


标题:k8s使用阿里云日志服务sls收集日志
作者:fish2018
地址:http://devopser.org/articles/2020/10/10/1602324992778.html