EFK 测试文档
1.组件服务简介
1.1 Amazon Elasticsearch Service
是一项完全托管的服务,方便您部署、保护和运行大量 Elasticsearch 操作,且不用停机。该服务提供开源 Elasticsearch API、受托管的 Kibana 以及与 Logstash 和其他 AWS 服务的集成,支持您安全获取任何来源的数据,并开展实时搜索、分析和可视化。
1.2 Amazon Kinesis Firehose
Firehose 是将流数据可靠地加载到数据湖、数据存储和分析工具的最简单方式。它可以捕获、转换流数据并将其加载到 Amazon S3、Amazon Redshift、Amazon Elasticsearch Service 和 Splunk,让您可以借助正在使用的现有商业智能工具和控制面板进行近乎实时的分析。这是一项完全托管的服务,可以自动扩展以匹配数据吞吐量,并且无需持续管理。它还可以在加载数据前对其进行批处理、压缩和加密,从而最大程度地减少目的地使用的存储量,同时提高安全性。
本文中,Firehouse会获取并自动加载日志的流式数据到Amazon ES里,并在S3中还会再进行一次备份。
1.3 Amazon CloudWatch
Amazon CloudWatch 是一种面向开发运营工程师、开发人员、站点可靠性工程师 (SRE) 和 IT 经理的监控和可观测性服务。CloudWatch 为您提供相关数据和切实见解,以监控应用程序、响应系统范围的性能变化、优化资源利用率,并在统一视图中查看运营状况。CloudWatch 以日志、指标和事件的形式收集监控和运营数据,让您能够在统一查看在 AWS 和本地服务器上运行的资源、应用程序和服务。您可以使用 CloudWatch 检测环境中的异常行为、设置警报、并排显示日志和指标、执行自动化操作、排查问题,以及发现可确保应用程序正常运行的见解。
1.4 Fluentd
Fluentd是一个开源的通用日志采集和分发系统,可以从多个数据源采集日志,并将日志过滤和加工后分发到多种存储和处理系统。
1.5 架构图
2.Elasticsearch 搭建
• 创建Amazon Elasticsearch service
– 创建域名
– 选择ES版本
– 选择部署可用区,生产环境建议2个可用区或者3个可用区。
– 实力类型:根据业务需求选择实例类型
– 节点数,建议生产系统采用多节点
– 根据业务需求部署EBS存储大小
提高集群稳定性。专用主节点执行群集管理任务,但不保留数据也不响应数据上传请求
– 设置专用主节点:专用主节点提高集群稳定性。专用主节点执行群集管理任务,但不保留数据也不响应数据上传请求。
• 跟踪集群中的所有节点。
• 跟踪集群中的索引数量。
• 跟踪属于每个索引的分片数量。
• 维护集群中节点的路由信息。
• 在状态更新后更新集群状态,如在集群中创建索引和添加或移除节点。
• 在集群中的所有节点之间复制集群状态的更改。
• 通过发送心跳信号(用于监控集群中数据节点可用性的周期信号)来监控所有集群节点的运行状况。
– 网络:设置为公有访问权限
– 开启精细访问控制
– 设置登录用户密码
**
– 可以集成Amazon Cognito 身份验证和SAML身份验证(本次实验不涉及)
**
– 配置域级访问控制,添加允许的访问ES的IP(IP可以根据业务实际情况进行控制)
**
– 创建ES服务
– 等待创建成功
3.Amazon Kinesis firehose Service 创建
• 创建Kinesis firehose
– 创建传输流
– 选择传输源Direct PuT,目标OpenSearch(AWS OpenSearch是下一代Elasticsearch引擎,包含了社区版Elasticsearch
– 定义firehose名称(需要记录),后续需要使用
– 转换记录保持默认
– 目标选择刚刚创建的ES服务
– 开启索引轮换:索引轮换Kinesis Data Firehose 将在指定的索引名称后面附加相应的时间戳并轮换
– 类型ES7.x版本不需要设置
– 备份设置,根据实际业务需求选择将所需要的备份的数据备份到S3存储桶
– 创建一个IAM角色,并更新角色权限
3.1 授权允许Kinesis Firehose访问ES并执行操作
• 在ES的Kinbana中添加权限
– IAM界面找到上述创建的IAM角色
– 并且复制ARN
– 登录kinbana
– 输入用户名密码
– 进入kinbana选择菜单的Security
– 选择Roles-->all_access
– 选择Mapped User-->Manage mapping
– 将firehose的IAM角色 (arn:aws:iam::11111111111:role/service-role/KinesisFirehoseServiceRole-efk-log--ap-southeast-1-1666521230940) 映射到Kinbana中,这样firehouse就有了操作ES的权限
3.2 创建k8s Node权限
• 创建K8sNode节点权限,用于Node节点访问Kinesis forehose
– 创建策略arn:aws:firehose:ap-southeast-1:699568033502:deliverystream/* 根据实际的创建的firehose ARN修改需要
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"firehose:"
],
"Resource": "arn:aws:firehose:ap-southeast-1:11111111111:deliverystream/"
}
]
}
– 为新的策略命名(k8s-Fluentd-policy),创建策略
– 创建角色
– 选择AWS 服务--EC2
– 添加策略
– 命名并创建角色
– 为Node几点分配firehose权限
– 更新IAM角色
4.配置Fluentd
4.1 Fluentd介绍:
• 它可以从Apache/Nginx等广泛应用的系统、数据库、自定义系统中采集日志,数据进入Fluentd后可根据配置进行过滤、修改、缓存,最终分发到各种后端系统中。这些后端系统包括告警系统(Nagios)、分析系统(MongoDB、MySQL、Hadoop、ElasticSearch)、存储系统(Amazon S3)等。
4.2 Fluentd配置文件
1. source: 指定输入源
2. match: 指定输出目的地
3. filter指定事件处理管道
4. label: 指定对内部路由的输出和过滤器进行分组
5. @include: 指令包含其他文件
详见:Config File Syntax (YAML) - Fluentd
• 本次实验fluentd配置文件
containers.input.conf : |-\
@type tail
path /log/.log
pos_file /tmp/app.logs.pos
tag raw.kubernetes.
@type none
<match raw.kubernetes.**>
@id raw.kubernetes
@type detect_exceptions
remove_tag_prefix raw
message log
stream stream
max_bytes 500000
max_lines 1000
output.conf : |-
<match **>
@type kinesis_firehose
@log_level info
delivery_stream_name efk-log-kinesis-firehose
region ap-southeast-1
random_partition_key true
• input.conf:input插件可以让Fluentd以从外部源检索和提取事件日志。
– @type tail:采用Fluentd自带的input插件,当Fluentd第一次设置in_tail插件的时候,它会从日志尾部开始读取,而不是从最开始,一旦日志更新,Fluentd开始从头阅读新文件,它自己跟踪inode号,如果Fluentd重新启动,它会从最后一个位置开始阅读,这个位置记录在pos_file路径中。
– path:Fluentd读取日志路径,如果存在多个路径用 ',' 隔开
– pos_file:记录Fluentd最新读取的位置信息
– < parse> :在in_tail中解析日志格式
• # json\
@type json\
# regexp\
@type regexp
expression ^(?[^ ]) (?[^ ]) (?\d*)$\
– tag:为数据指定标记,通过标记分离数据管道
– @id:@id参数为配置指定一个唯一的名称。它被用作缓冲区、存储、日志记录和其他用途的路径。
– @type:@type参数指定插件的类型。
• output.conf
– @type kinesis_firehose:输出到kinesis_firehose
– @log_level:输出的日志等级
– delivery_stream_name:firehose流的名称,根据实际情况进行修改
– region:firehose部署的AWS region
4.3 部署k8s-sidecar模式获取日志
• Fluentd的configmap文件
apiVersion : v1
kind : ConfigMap
metadata :
name : fluentd-config
labels :
component : fluentd
data :
system.conf : |-
root_dir /tmp/fluentd-buffers/
containers.input.conf : |-
@type tail
path /log/.log
pos_file /tmp/app.logs.pos
tag raw.kubernetes.
@type none
<match raw.kubernetes.**>
@id raw.kubernetes
@type detect_exceptions
remove_tag_prefix raw
message log
stream stream
max_bytes 500000
max_lines 1000
output.conf : |-
<match **>
@type kinesis_firehose
@log_level info
delivery_stream_name efk-log-kinesis-firehose
region ap-southeast-1
random_partition_key true
• k8s Sidecart测试配置文件
– 注: 配置文件中,configmap通过volumes:调用,fluend的调用文件目录必须为/etc/fluent/config.d,否则configmap的配置文件不会生效。
apiVersion : apps/v1
kind : Deployment
metadata :
name : busybox-test
spec :
replicas : 1
selector :
matchLabels :
app : busybox-test
template :
metadata :
namespace : sidecar
labels :
app : busybox-test
spec :
containers :
- image : busybox:stable
name : busybox
command : [ "/bin/sh" ]
args : [ "-c" , "while true; do echo echo $(date -u) 'Hi I am from Sidecar container' >> /var/log/index.log; sleep 5;done" ]
volumeMounts :
- name : applog
mountPath : /var/log
- image : docker.io/rongxccc/fluentd-kinesis-firehose:v1
name : sidecar-fluentd
volumeMounts :
- name : applog
mountPath : /log
- name : fluentd-config
mountPath : /etc/fluent/config.d
readOnly : true
resources :
limits :
memory : 500Mi
requests :
cpu : 500m
memory : 100Mi
volumes :
- name : applog
emptyDir : {}
- name : fluentd-config
configMap :
name : fluentd-config
• 启动pod
• 查看容器日志
• 通过kinbana查看写入日志