美文网首页
阿里云ASK 业务日志收集

阿里云ASK 业务日志收集

作者: 国服最坑开发 | 来源:发表于2022-06-16 19:58 被阅读0次

    0x00 TLDR;

    阿里云ASK 集群环境为虚拟Node节点, 所以无法以DaemonSet 方式安装Fluentd .
    本文记录了, 通过 SLS(阿里云日志服务) 收集Pod的stdout日志, 然后被Logstash消费并上传到 ES实例.
    在此方案中, 全部使用阿里云现有服务, 无需手动部署.
    
    数据流

    0x00 准备工作

    • ASK集群环境
    • Logstash 实例
    • ElasticSearch 实例启用 logstash-input-sls 插件
    • SLS 只读访问RAM账号, 准备好 API_ACCESS_KEY

    相关信息:

    • 区域: 杭州
    • 账号数字ID: ACCOUNT_ID
    • SLS日志工程: PRJ_NAME
    • SLS日志库(logstore): LOGSTORE_NAME

    0x01 ASK开启日志功能

    ASK默认已经支持SLS日志收集能力, 但需要打开这个配置:

    kubectl -n kube-system edit configmap eci-profile
    
    # 添加配置
    apiVersion: v1
    data:
      enableLogController: "true"
    

    0x02 配置Pod上报日志功能

    进行Deployment部署时, 增加两个环境变量:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    spec:
      template:
        spec:
          containers:
            - name: alpine
              image: alpine
              env:
                - name: aliyun_logs_$LOGSTORE_NAME_project
                  value: $PRJ_NAME
                - name: aliyun_logs_$LOGSTORE_NAME
                  value: stdout
                - name: aliyun_logs_$LOGSTORE_NAME_ttl
                  value: "2"
    

    这里补充一个知识点: 笔者试过使用 envFrom 的方式尝试把ConfigMap的内容传递给Pod
    但是那样做的话, 无法上报日志. 所以, 目前还是老实的把参数给到每一个需要上报日志的Container

    正常情况下, 此时, 我们就可以在SLS网页下, 看到这个日志输出了.
    上面的参数表示: 在SLS中数据文件保持 2 天, 然后自动删除.

    0x03 RAM账号权限配置

    添加自定义策略, 然后绑定到上文提及的RAM账号.
    在下面的Logstash 配置中, 会用到此账号.

    {
        "Version": "1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "log:GetCursorOrData",
                "Resource": "acs:log:cn-hangzhou:$ACCOUNT_ID:project/$PRJ_NAME/logstore/*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "log:CreateConsumerGroup",
                    "log:ListConsumerGroup"
                ],
                "Resource": "acs:log:cn-hangzhou:$ACCOUNT_ID:project/$PRJ_NAME/logstore/*/consumergroup/*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "log:ConsumerGroupUpdateCheckPoint",
                    "log:ConsumerGroupHeartBeat",
                    "log:UpdateConsumerGroup",
                    "log:GetConsumerGroupCheckPoint"
                ],
                "Resource": "acs:log:cn-hangzhou:$ACCOUNT_ID:project/$PRJ_NAME/logstore/*/consumergroup/*"
            }
        ]
    }
    

    0x04 配置Logstash 消费 SLS日志

    # input插件需要监听Logstash进程所在节点的端口,请使用8000~9000范围内的端口。
    input {
      logservice{
        endpoint => "cn-hangzhou-intranet.log.aliyuncs.com"
        access_id => "$your_id"
        access_key => "$your_key"
        project => "$PRJ_NAME"
        logstore => "$LOGSTORE_NAME"
        consumer_group => "default_group"
        consumer_name => "default"
        position => "end"
        checkpoint_second => 30
        include_meta => false
        consumer_name_with_ip => false
      }
    }
    
    filter {
      mutate{
          remove_field => ["_id"]
          remove_field => ["_index"]
          remove_field => ["_score"]
          remove_field => ["_type"]
          remove_field => ["caller_file_name"]
          remove_field => ["@version"]
          remove_field => ["caller_method_name"]
          remove_field => ["host"]
          remove_field => ["level_value"]
          remove_field => ["port"]
      }
    }
    output { 
      elasticsearch {
        hosts => ["http://xxxxxx.elasticsearch.aliyuncs.com:9200"]
        index => "test-log-%{+YYYY.MM.dd}"
        user => "elastic"
        password => "$yourpass"
      }
    }
    

    0x05 通过 Kibana查看ES数据

    这个跳过吧, 没啥好写的.

    0x06 Json格式转换

    主要思路, 是在SLS LogStore 配置里增加下面信息:

    {
       "input" :[ xxxx],
        "processors": [
            {
                "detail" : {
                    "SourceKey": "content",
                    "KeepSource": false,
                    "ExpandConnector": ""
                },
                "type": "processor_json"
            }
        ]
    }
    

    0x07 业务KEY做为Kibana 时间戳

    在logstash filter 参数中,使用 date 插件:

    match : 提取源日志中 @timestamp 字段,
    target: 覆盖 es 中的 @timestamp 字段

    {
      filter {
        date {
          match => [ "@timestamp", ISO8601]
          target => "@timestamp"
        }
      }
    }
    

    相关文章

      网友评论

          本文标题:阿里云ASK 业务日志收集

          本文链接:https://www.haomeiwen.com/subject/nbyqvrtx.html