ELFK7.6.2_Centos7.6部署文档

系统环境

  • 操作系统:CentOS Linux release 7.6.1810 (Core) / 3.10.0-957.el7.x86_64
  • 主机角色

ip

部署内容

10.10.10.110

JDK,Nodejs,Elasticsearch,kafka,Logstash,Filebeat,Kibana

10.10.10.177

JDK,Elasticsearch,kafka,Filebeat

10.10.10.178

JDK,Elasticsearch,kafka,Filebeat

  • 系统优化
echo "vm.swappiness=0" >> /etc/sysctl.conf
echo "vm.max_map_count=655350" >> /etc/sysctl.conf
sysctl -p

cat >>/etc/security/limits.conf << EOF 
root    soft    nofile  65535
root    hard    nofile  65535
*       soft    nofile  65535
*       hard    nofile  65535
EOF

目录规划

  • 软件下载目录
mkdir -p /data/downloads
  • 安装目录(手动)
mkdir -p /data/software

软件下载

环境安装

Java8安装配置

#Java安装
yum install java-1.8.0-openjdk*

#配置Java环境变量
vim /etc/profile   
JAVA_HOME=/etc/alternatives/java_sdk_1.8.0
JRE_HOME=$JAVA_HOME/jre
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/rt.jar
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/bin
export CLASSPATH

Nodejs12.13安装配置

#解压
tar -vxf node-v12.13.0-linux-x64.tar.xz
#移动到安装目录
mv node-v12.13.0-linux-x64 /data/software/node12
#配置node环境变量
vim /etc/profile   
export NODEJS_PATH=/data/software/node12
export PATH=$NODEJS_PATH/bin:$PATH

软件安装

Elasticsearch安装配置

  • ES安装

#初始主节点,必须三个节点都启动,集群才能启动成功。

  • 主库配置
  • 从配置
  • ES启动
#解压
tar -zvxf elasticsearch-7.6.2.tar.gz 
#移动解压的目录到安装目录下
mv elasticsearch-7.6.2 /data/software/elk

#进入目录
cd /data/software/elk/elasticsearch-7.6.2
mkdir -p /data/software/elk/elasticsearch-7.6.2/{data,logs}

#创建ES用户(ES不允许root启动)
useradd -m elasticsearch

chown -R elasticsearch:elasticsearch /data/software/elk/elasticsearch-7.6.2
cluster.name: test_logcollect_essvr
#节点名称
node.name: node110
#是不是有资格竞选主节点
node.master: true
#是否存储数据
node.data: true
#最大集群节点数
#node.max_local_storage_nodes: 3
#网关地址
network.host: 10.10.10.110
#端口
http.port: 19200
#内部节点之间沟通端口
transport.tcp.port: 19300
# 设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4)
discovery.zen.minimum_master_nodes: 2
#es7.x 之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.seed_hosts: ["10.10.10.110:19300","10.10.10.177:19300","10.10.10.178:19300"]
#es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举master
cluster.initial_master_nodes: ["node110","node177","node178"]
#数据存储路径
path.data: /data/software/elk/elasticsearch-7.6.2/data
#日志存储路径
path.logs: /data/software/elk/elasticsearch-7.6.2/logs

#index.number_of_shards: 5
#index.number_of_replicas: 1

bootstrap.memory_lock: false
bootstrap.system_call_filter: false

http.cors.enabled: true
http.cors.allow-origin: "*"
cluster.name: test_logcollect_essvr
#节点名称
node.name: node177
#是不是有资格竞选主节点
node.master: true
#是否存储数据
node.data: true
#最大集群节点数
#node.max_local_storage_nodes: 3
#网关地址
network.host: 10.10.10.177
#端口
http.port: 19200
#内部节点之间沟通端口
transport.tcp.port: 19300
# 设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4)
discovery.zen.minimum_master_nodes: 2
#es7.x 之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.seed_hosts: ["10.10.10.110:19300","10.10.10.177:19300","10.10.10.178:19300"]
#es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举master
cluster.initial_master_nodes: ["node110","node177","node178"]
#数据存储路径
path.data: /data/software/elk/elasticsearch-7.6.2/data
#日志存储路径
path.logs: /data/software/elk/elasticsearch-7.6.2/logs

#index.number_of_shards: 5
#index.number_of_replicas: 1

bootstrap.memory_lock: false
bootstrap.system_call_filter: false

http.cors.enabled: true
http.cors.allow-origin: "*"
su elasticsearch # 切换到elasticsearch用户
./bin/elasticsearch -d

kafka 安装配置

  • 安装
  • 配置zk(/data/software/elk/kafka/config/zookeeper.properties)
    配置kafka(/data/software/elk/kafka/config/server.properties)
  • 服务启动
cd /data/downloads
tar -zvxf kafka_2.12-2.5.0.tgz
mv kafka_2.12-2.5.0 /data/software/elk/kafka
cd /data/software/elk/kafka
mkdir -p /data/software/elk/kafka/data/zookeeper
mkdir -p /data/software/elk/kafka/logs
#创建myid文件,集群各节点id不同
echo "1" > /data/software/elk/kafka/data/zookeeper/myid
# the directory where the snapshot is stored.
dataDir=/data/software/elk/kafka/data/zookeeper
# the port at which the clients will connect
clientPort=2181
# disable the per-ip limit on the number of connections since this is a non-production config
maxClientCnxns=0
# Disable the adminserver by default to avoid port conflicts.
# Set the port to something non-conflicting if choosing to enable this
admin.enableServer=false
# admin.serverPort=8080
tickTime=2000
initLimit=20
syncLimit=10
server.1=10.10.10.110:2888:3888
server.2=10.10.10.177:2888:3888
server.3=10.10.10.178:2888:3888
#唯一数字分别为1,2,3
broker.id=1
#这个broker监听的端口
prot=9092
#唯一填服务器IP
host.name=10.10.10.110
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
#kafka日志路径,不需要提前创建,启动kafka时创建
log.dirs=/data/software/elk/kafka/logs
#分片数,需要配置较大,分片影响读写速度
num.partitions=16
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
#zookpeer集群
zookeeper.connect=10.10.10.110:2181,10.10.10.177:2181,10.10.10.178:2181
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0
#按serverid顺启动zookeeper
nohup /data/software/elk/kafka/bin/zookeeper-server-start.sh /data/software/elk/kafka/config/zookeeper.properties >/tmp/zookeeper.log &

netstat -nlpt | grep -E "2181|2888|3888"  #哪台是leader,那么他就拥有2888端口

#按serverid顺启动kafka
nohup /data/software/elk/kafka/bin/kafka-server-start.sh /data/software/elk/kafka/config/server.properties >/tmp/kafka.log &

Logstash 安装配置

  • 安装
  • 配置kafka传数据到es(/data/software/elk/logstash-7.6.2/config/kafka-es.conf)
  • 服务启动
tar -zvxf logstash-7.6.2.tar.gz 
mv logstash-7.6.2 /data/software/elk
cd /data/software/elk/logstash-7.6.2
makdir -p /data/software/elk/logstash-7.6.2/logs
input {
  kafka {
    bootstrap_servers => "10.10.10.110:9092,10.10.10.177:9092,10.10.10.178:9092"  #kafka集群地址
    topics_pattern => ".*" #正则匹配topic
    #topics => ["ng_cardapi_access","ng_cardapi_error"] #数组形式表示多个topic
    codec => "json"  #解析格式
    consumer_threads => 5   #最大线程
    decorate_events => true  #将当前topic、offset、group、partition等信息也带到message中
    auto_offset_reset => "latest" #从最新的偏移量开始消费
  }
}

output {
  elasticsearch {
    hosts => ["10.10.10.110:19200","10.10.10.177:19200","10.10.10.178:19200"] #ES集群信息
    index => "%{[log_topic]}_%{+YYYY.MM.dd}"  #索引格式建议按天切割
    #index => "%{[@metadata][kafka][topic]}_%{+YYYY.MM.dd}" #也可以在metadata字段中获取topic变量
  }

#条件判断的写法
#  if [log_topic] == "ng_cardapi_access" {
#      elasticsearch {
#        hosts => ["10.10.10.110:19200","10.10.10.177:19200","10.10.10.178:19200"] #ES集群信息
#        index => "ng_cardapi_access_%{+YYYY.MM.dd}"  #索引格式建议按天切割
#      }
#    }
#
#    if [log_topic] == "ng_cardapi_error" {
#      elasticsearch {
#        hosts => ["10.10.10.110:19200","10.10.10.177:19200","10.10.10.178:19200"] #ES集群信息
#        index => "ng_cardapi_error_%{+YYYY.MM.dd}"  #索引格式建议按天切割
#      }
#    }

  stdout {
    codec => rubydebug {metadata => true}  #控制台输出日志包含@metadata信息,便于查看并引用其中的变量
  }
}
nohup /data/software/elk/logstash-7.6.2/bin/logstash -f /data/software/elk/logstash-7.6.2/config/kafka-es.conf > /tmp/logstach.log &

#测试配置文件
/data/software/elk/logstash-7.6.2/bin/logstash -t -f /data/software/elk/logstash-7.6.2/config/kafka-es.conf

filebeat 安装配置

  • 安装
  • 配置
  • 服务启动
cd /data/downloads/ 
tar -zxvf filebeat-7.6.2-linux-x86_64.tar.gz
mv filebeat-7.6.2-linux-x86_64/ /data/software/elk/filebeat-7.6.2
filebeat.inputs:
- type: log   #日志类型
  enabled: true
  json.keys_under_root: true #可以让字段位于根节点
  json.overwrite_keys: true #对于同名的key,覆盖原有key值
  json.add_error_key: true #解析失败,把错误放出来
  fields_under_root: true #可以让字段位于根节点
  paths:
    - /data/logs/nginx/card/card-api.access_log  #日志文件路径
  fields:
    log_topic: ng_cardapi_access  #指定日志topic名称

- type: log   #日志类型
  enabled: true
  json.keys_under_root: true #可以让字段位于根节点
  json.overwrite_keys: true #对于同名的key,覆盖原有key值
  json.add_error_key: true #解析失败,把错误放出来
  fields_under_root: true #可以让字段位于根节点
  paths:
    - /data/logs/nginx/card/card-api.error_log  #日志文件路径
  fields:
    log_topic: ng_cardapi_error  #指定日志topic名称

output.kafka:
   enabled: true
   hosts: [10.10.10.110:9092,10.10.10.177:9092,10.10.10.178:9092] #kafka集群地址
   topic: '%{[log_topic]}' #fileds.log_topic 定义的值
nohup /data/software/elk/filebeat-7.6.2/filebeat -e -c /data/software/elk/filebeat-7.6.2/filebeat.yml > /tmp/filebeat.log &

Kibana 安装配置

  • 安装(依赖node)
  • 配置(/data/software/elk/kibana-7.6.2/config)
  • 服务启动
cd /data/downloads/ 
tar -zxvf kibana-7.6.2-linux-x86_64.tar.gz
mv kibana-7.6.2-linux-x86_64 /data/software/elk/kibana-7.6.2
i18n.locale: "zh-CN"
server.port: 5601  #服务器端口,默认5601
server.host: "10.10.10.110"   #主机IP地址
elasticsearch.hosts: ["http://10.10.10.110:19200","http://10.10.10.177:19200","http://10.10.10.178:19200"]  #ES地址
logging.dest: /data/software/elk/kibana-7.6.2/logs/kibana.log
kibana.index: ".kibana"     
xpack.reporting.encryptionKey: "a_random_string"        #随机密钥
xpack.security.encryptionKey: "something_at_least_32_characters"   #最少32位随机字符
 nohup /data/software/elk/kibana-7.6.2/bin/kibana --allow-root & > /tmp/kibana.log  2>&1 &

<think>好的,我现在需要帮助用户在Kubernetes上部署ELFK栈,也就是包含Elasticsearch、Logstash、Fluentd(或者Filebeat)、Kibana的日志系统。根据用户提供的引用内容,用户可能更倾向于使用Filebeat而不是Logstash,因为引用中提到了EFK架构,其中Filebeat或Fluentd取代Logstash。不过用户明确提到了ELFK,所以可能需要确认是否需要Logstash。不过根据引用[4],ELK现在常被扩展为EFK,用Filebeat或Fluentd替代Logstash。但用户的问题明确是ELFK,所以可能需要包含Logstash,或者可能是打字错误,实际需要EFK?需要进一步分析。 根据引用内容,用户之前的引用提到ELK转变为EFK,使用Filebeat或Fluentd。而用户现在的问题是想部署ELFK,可能是指Elasticsearch、Logstash、Fluentd、Kibana?但不太常见。或者可能是ELK + Filebeat,即EFK?需要明确。根据用户的问题描述,“ELFK”可能是Elasticsearch、Logstash、Filebeat、Kibana的组合,但通常ELK中的L是Logstash,如果替换成Filebeat的话,可能变成EFK。但用户的问题里同时提到了ELK Stack和Filebeat,所以可能用户希望ELK加上Filebeat,即使用Filebeat作为日志收集器,然后发送到Logstash处理,再存储到Elasticsearch,最后由Kibana展示。这种情况下,部署的组件包括Filebeat、Logstash、Elasticsearch、Kibana,即ELFK中的F是Filebeat。 接下来,根据引用中的内容,用户提供的引用[1]、[2]、[3]、[4]都是关于在k8s中部署ELK并集成Filebeat的。例如,引用[1]详细说明了如何通过创建Namespace、ServiceAccount、RBAC、ConfigMap、DaemonSet等资源来部署Filebeat。引用[4]则提到使用StatefulSet部署Elasticsearch,并创建相关的服务和配置。 所以,用户的问题是如何在k8s上部署ELK Stack和Filebeat。结合引用中的信息,部署步骤大致如下: 1. 创建命名空间:例如kube-logging,用于集中管理日志相关资源。 2. 部署Elasticsearch:通常使用StatefulSet,因为ES是有状态应用,需要持久化存储。 3. 部署Kibana:作为前端展示,需要连接到Elasticsearch。 4. 部署Logstash(如果需要):如果使用Logstash处理日志,则需要部署其Deployment和Service,但根据引用[4],可能更倾向于用Filebeat直接发送到ES,或者用Fluentd。 5. 部署Filebeat:作为DaemonSet在每个节点上运行,收集容器日志,并发送到Logstash或Elasticsearch。 6. 配置RBAC:因为Filebeat需要访问集群中的日志,需要相应的ServiceAccount和权限。 7. 验证各组件状态,确保日志正常收集和展示。 需要注意的几点: - Filebeat需要以DaemonSet形式部署,确保每个节点都有一个Pod收集日志。 - Elasticsearch可能需要配置持久卷(PV)和持久卷声明(PVC)。 - Kibana需要正确指向Elasticsearch的服务地址。 - 根据引用[1],Filebeat的配置通过ConfigMap来管理,包括输出到Elasticsearch或Logstash的设置。 - 可能需要调整资源限制(如CPU和内存)以确保各组件稳定运行。 现在,用户可能需要详细的步骤说明,包括YAML文件的示例和配置要点。需要参考引用中的示例,例如创建Namespace、ServiceAccount、RBAC角色绑定、ConfigMap、DaemonSet等。 同时,用户可能需要了解如何验证部署是否成功,例如检查Pod状态,查看Elasticsearch中是否有索引生成,或者通过Kibana界面查看日志数据。 另外,潜在的问题可能包括网络策略导致组件间无法通信,持久化存储配置错误,或者资源不足导致Pod无法启动。需要提醒用户注意这些方面。 最后,根据用户的要求,生成相关问题,可能涉及性能优化、高可用配置、日志处理流程的调整等。</think>### Kubernetes部署ELFK栈(Elasticsearch/Logstash/Filebeat/Kibana)步骤 #### 一、核心组件说明 - **Elasticsearch**:日志存储与检索 - **Filebeat**:轻量级日志收集器(DaemonSet模式部署,采集节点/容器日志)[^2] - **Logstash**(可选):日志过滤与转发(若无需复杂处理,Filebeat可直接输出到Elasticsearch) - **Kibana**:数据可视化界面 #### 二、详细部署流程 ##### 1. 创建专用命名空间 ```yaml # elk-namespace.yaml apiVersion: v1 kind: Namespace metadata: name: kube-logging ``` 执行命令:`kubectl apply -f elk-namespace.yaml` ##### 2. 部署Elasticsearch集群(StatefulSet) ```yaml # elasticsearch-statefulset.yaml apiVersion: apps/v1 kind: StatefulSet metadata: name: elasticsearch namespace: kube-logging spec: serviceName: elasticsearch replicas: 3 selector: matchLabels: app: elasticsearch template: metadata: labels: app: elasticsearch spec: containers: - name: elasticsearch image: docker.elastic.co/elasticsearch/elasticsearch:7.16.2 resources: limits: memory: 4Gi requests: memory: 2Gi volumeMounts: - name: data mountPath: /usr/share/elasticsearch/data volumes: - name: data persistentVolumeClaim: claimName: elasticsearch-pvc --- # 创建Headless Service apiVersion: v1 kind: Service metadata: name: elasticsearch namespace: kube-logging spec: clusterIP: None ports: - port: 9200 name: http selector: app: elasticsearch ``` ##### 3. 部署Kibana ```yaml # kibana-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: kibana namespace: kube-logging spec: replicas: 1 selector: matchLabels: app: kibana template: metadata: labels: app: kibana spec: containers: - name: kibana image: docker.elastic.co/kibana/kibana:7.16.2 env: - name: ELASTICSEARCH_HOSTS value: "http://elasticsearch.kube-logging.svc.cluster.local:9200" --- # 创建Kibana Service apiVersion: v1 kind: Service metadata: name: kibana namespace: kube-logging spec: type: NodePort ports: - port: 5601 nodePort: 30601 selector: app: kibana ``` ##### 4. 配置Filebeat DaemonSet ```yaml # filebeat-configmap.yaml(日志采集规则) apiVersion: v1 kind: ConfigMap metadata: name: filebeat-config namespace: kube-logging data: filebeat.yml: | filebeat.inputs: - type: container paths: - /var/log/containers/*.log processors: - add_kubernetes_metadata: host: ${NODE_NAME} matchers: - logs_path: logs_path: "/var/log/containers/" output.elasticsearch: hosts: ["elasticsearch.kube-logging.svc.cluster.local:9200"] --- # filebeat-daemonset.yaml apiVersion: apps/v1 kind: DaemonSet metadata: name: filebeat namespace: kube-logging spec: selector: matchLabels: app: filebeat template: metadata: labels: app: filebeat spec: serviceAccountName: filebeat containers: - name: filebeat image: docker.elastic.co/beats/filebeat:7.16.2 args: ["-c", "/etc/filebeat.yml", "-e"] volumeMounts: - name: config mountPath: /etc/filebeat.yml subPath: filebeat.yml - name: varlog mountPath: /var/log - name: varlibdockercontainers mountPath: /var/lib/docker/containers readOnly: true volumes: - name: config configMap: name: filebeat-config - name: varlog hostPath: path: /var/log - name: varlibdockercontainers hostPath: path: /var/lib/docker/containers ``` ##### 5. 配置RBAC权限 ```yaml # filebeat-serviceaccount.yaml apiVersion: v1 kind: ServiceAccount metadata: name: filebeat namespace: kube-logging --- # filebeat-rbac.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: filebeat subjects: - kind: ServiceAccount name: filebeat namespace: kube-logging roleRef: kind: ClusterRole name: view apiGroup: rbac.authorization.k8s.io ``` #### 三、验证部署 1. 检查Pod状态: ```bash kubectl get pods -n kube-logging # 预期输出包含Elasticsearch、Kibana、Filebeat相关Running状态的Pod ``` 2. 访问Kibana界面: - 通过NodePort `http://<NodeIP>:30601` 进入Kibana - 在Management > Index Patterns 中创建`filebeat-*`索引模式[^3] #### 四、关键优化点 - **Elasticsearch持久化**:使用StorageClass动态供应PV,确保数据持久性 - **资源限制**:为Elasticsearch配置合适的内存/CPU请求与限制,避免OOM - **高可用**:通过`replicas: 3`实现Elasticsearch节点冗余[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值