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"
}
}
}
网友评论