美文网首页
阿里云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