docker部署elk+kafka

安装所需包
docker pull elasticsearch:7.17.0
docker pull kibana:7.17.0
docker pull logstash:7.17.0
docker pull elastic/filebeat:7.17.0

docker pull wurstmeister/kafka
docker pull wurstmeister/zookeeper


步骤一、优化系统参数

vi /etc/security/limits.conf    
---在文件最后面添加如下内容
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096

# vi /etc/sysctl.conf
vm.max_map_count=655360
# sysctl -p
vm.max_map_count = 655360

步骤二、Docker搭建es,kibana(详情请看之前文案)

docker run --restart=always --name es01 \
-p 9200:9200 -p 9300:9300 \
--net mynetwork --ip 172.18.0.4 \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
-v /kdata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /kdata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /kdata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-v /kdata/elasticsearch/logs:/usr/share/elasticsearch/logs \
-d elasticsearch:7.17.0

docker run --restart=always  --name kibana  \
-p 5601:5601 \
-e TZ="Asia/Shanghai" -e "I18N_LOCALE=zh-CN"  \
--net mynetwork --ip 172.18.0.5 \
-v /kdata/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml  \
-d kibana:7.17.0

步骤三、Docker运行Kafka、Zookeeper
1、拉取镜像
# docker pull wurstmeister/kafka
# docker search zookeeper
2、启动容器
首先启动zookeeper
# 
docker run  --restart=always  --name zookeeper \
--net mynetwork --ip 172.18.0.2 \
-p 2181:2181 \
-v /etc/localtime:/etc/localtime \
-d wurstmeister/zookeeper 

然后再启动Kafka
#
docker run --restart=always  -d --name kafka \
--net mynetwork --ip 172.18.0.3 \
-p 9092:9092 \
-e KAFKA_BROKER_ID=0 \
-e KAFKA_ZOOKEEPER_CONNECT=192.168.20.100:2181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.20.100:9092 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
-v /etc/localtime:/etc/localtime \
-t wurstmeister/kafka

docker run --restart=always  -d --name kafka \
--net mynetwork --ip 172.18.0.3 \
-p 9092:9092 \
-e KAFKA_BROKER_ID=0 \
-e KAFKA_ZOOKEEPER_CONNECT=192.168.20.101:2181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.20.101:9092 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
-v /etc/localtime:/etc/localtime \
-t wurstmeister/kafka

docker run --restart=always  -d --name kafka \
--net mynetwork --ip 172.18.0.3 \
-p 9092:9092 \
-e KAFKA_BROKER_ID=0 \
-e KAFKA_ZOOKEEPER_CONNECT=192.168.20.102:2181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.20.102:9092 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
-v /etc/localtime:/etc/localtime \
-t wurstmeister/kafka

# -e KAFKA_BROKER_ID=0 在kafka集群中,每个kafka都有一个BROKER_ID来区分自己
# -e KAFKA_ZOOKEEPER_CONNECT=1192.168.20.100:2181/kafka 配置zookeeper管理kafka的路径
# -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.20.100:9092 把kafka的地址端口注册给zookeeper
# -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 配置kafka的监听端口
# -v /etc/localtime:/etc/localtime 容器时间同步虚拟机的时间

docker logs -f --tail=1000 kafka

cd /opt/kafka_2.13-2.8.1/bin

可为集群之外的客户端链接
–env KAFKA_ADVERTISED_HOST_NAME=kafka所在宿主机的IP (一定要是公网ip,否则远程是无法操作kafka的,kaka tools也是无法使用的,如果仅仅紧紧集群服务器间通信可以 设置 内网IP),中间的kafka所在宿主机的IP,如果不这么设置,可能会导致在别的机器上访问不到kafka。

3、验证kafka是否可以使用

# docker exec -it kafka bash
cd /opt/kafka_2.13-2.8.1/bin

运行kafka生产者发送消息
./kafka-console-producer.sh --broker-list localhost:9092 --topic sun                                    
>cc                                    #手动输入
>kk
>{"datas":[{"channel":"","metric":"temperature","producer":"ijinus","sn":"IJA0101-00002245","time":"1543207156000","va

运行kafka消费者接收消息
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic sun --from-beginning                 
kk
cc
kk
{"datas":[{"channel":"","metric":"temperature","producer":"ijinus","sn":"IJA0101-00002245","time":"1543207156000","va

kafka可视化工具kafka tool:https://www.kafkatool.com/download.html

步骤四、安装filebeat
cd /kdata/filebeat/

vi filebeat.yml
#添加信息:
- type: log
  enabled: true
  paths:
    - /root/a.log                                   #测试日志文件
    - /var/path2/*.log
#output.elasticsearch:                              #添加注释
  # Array of hosts to connect to.
 # hosts: ["localhost:9200"]
 
output.kafka:
  enabled: true
  hosts: ["192.168.20.100:9092"]
  topic: "kk_consumer"
  compression: gzip
  max_message_bytes: 100000000
# nohup ./filebeat -e -c filebeat.yml &

#执行
docker run --name filebeat --user=root 
--net elasticsearch_default 
-v /var/log/nginx/:/var/log/nginx/ 
-v /kdata/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro 
-v /var/lib/docker/containers:/var/lib/docker/containers:ro 
-v /var/run/docker.sock:/var/run/docker.sock:ro 
-d elastic/filebeat:7.17.0

步骤五、运行logstash
cd /kdata/logstash
vi logstash.yml    ##新建文件,添加如下两行:
##注意这行是表示容器里面配置文件的路径,照写就行,不要写成自己本地新建的路径,这里博主踩坑花了很长时间 path.config: /usr/share/logstash/conf.d/*.conf    
path.logs: /var/log/logstash

cd /kdata/logstash/conf.d
vi mylogstash.conf
#测试内容如下:
input {
    beats {
    port => 5044
    codec => "json"
}
}
output {
  elasticsearch {
        hosts => ["192.168.20.100:9200","http://192.168.20.101:9200","http://192.168.20.102:9200"]
        index => "nginx-access-log-%{+YYYY.MM.dd}"
}
  stdout { codec => rubydebug }
}

#执行

docker run --restart=always -it  --name logstash \ 
-p 5044:5044 \ 
--net mynetwork --ip 172.18.0.3 \
-v /kdata/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml \ 
-v /kdata/logstash/conf.d/:/usr/share/logstash/conf.d/ \ 
-d logstash:7.17.0

#查看日志
docker logs -f logstash

#进入logstash容器
docker exec -it logstash bash

####################################################
filebeat.yml 配置文件的编写
filebeat.inputs:
- type: log
  # 是否启动
  enabled: true
  encoding: "utf-8"
  # 从那个路径收集日志,如果存在多个 input ,则这个 paths 中的收集的日志最好不要重复,否则会出现问题
  # 日志路径可以写通配符
  paths:
    - "/Users/huan/soft/elastic-stack/filebeat/filebeat/springboot-admin.log"
  # 如果日志中出现了 DEBUG 的字样,则排除这个日志
  exclude_lines:
    - "DEBUG"
  # 添加自定义字段
  fields:
    "application-servic-name": "admin"
  # fields 中的字段不放在根级别 ,true表示放在根级别
  fields_under_root: false
  # 添加一个自定义标签
  tags:
    - "application-admin"
  # 多行日志的处理,比如java中的异常堆栈
  multiline:
    # 正则表达式
    pattern: "^\\[+"
    # 是否开启正则匹配,true:开启,false:不开启
    negate: true
    # 不匹配正则的行是放到匹配到正则的行的after(后面)还是before(前面)
    match: after
    # 多行日志结束的时间,多长时间没接收到日志,如果上一个是多行日志,则认为上一个结束了
    timeout: 2s
  # 使用es的ignes node 的pipeline处理数据,这个理论上要配置到output.elasticsearch下方,但是测试的时候发现配置在output.elasticsearch下方不生效。
  pipeline: pipeline-filebeat-springboot-admin
  
# 配置索引模板的名字和索引模式的格式
setup.template.enabled: false
setup.template.name: "template-springboot-admin"
setup.template.pattern: "springboot-admin-*"

# 索引的生命周期,需要禁用,否则可能无法使用自定义的索引名字
setup.ilm.enabled: false

# 数据处理,如果我们的数据不存在唯一主键,则使用fingerprint否则可以使用add_id来实现
processors:
  # 指纹,防止同一条数据在output的es中存在多次。(此处为了演示使用message字段做指纹,实际情况应该根据不用的业务来选择不同的字段)
  - fingerprint:
      fields: ["message"]
      ignore_missing: false
      target_field: "@metadata._id"
      method: "sha256"

# 输出到es中
output.elasticsearch:
  # es 的地址
  hosts: 
    - "http://localhost:9200"
    - "http://localhost:9201"
    - "http://localhost:9202"
  username: "elastic"
  password: "123456"
  # 输出到那个索引,因为我们这个地方自定义了索引的名字,所以需要下方的 setup.template.[name|pattern]的配置
  index: "springboot-admin-%{[agent.version]}-%{+yyyy.MM.dd}"
  # 是否启动
  enabled: true

你可能感兴趣的:(kafka,docker,elk)