Docker容器化高可用架构部署方案(十八)

17-EFK-Zabbix部署脚本

本文档包含EFK日志收集和Zabbix监控系统的完整部署脚本,作为13-快速部署.md的补充。


EFK部署脚本

在所有节点执行EFK部署脚本。

Node1 EFK部署

复制代码
#!/bin/bash
# Node1 EFK部署脚本
​
set -e
​
echo "============================================"
echo "        Node1 EFK 部署脚本"
echo "============================================"
​
# 1. 创建目录
echo "[1/3] 创建配置目录..."
mkdir -p /opt/cluster-deploy/{config/fluentd,logs/elasticsearch}
​
# 2. 创建Fluentd配置
echo "[2/3] 创建Fluentd配置..."
cat > /opt/cluster-deploy/config/fluentd/fluentd-node1.conf << 'EOF'
<source>
  @type tail
  path /var/lib/docker/containers/*/*-json.log
  pos_file /var/log/fluentd-containers.log.pos
  tag docker.*
  read_from_head true
  <parse>
    @type json
    time_type float
    time_format %Y-%m-%dT%H:%M:%S.%NZ
  </parse>
</source>
​
<filter docker.**>
  @type record_transformer
  <record>
    node_name Node1
  </record>
</filter>
​
<match docker.**>
  @type elasticsearch
  host 172.20.5.21
  port 9200
  logstash_format true
  logstash_prefix docker
  logstash_dateformat %Y.%m.%d
  flush_interval 10s
  buffer_type file
  buffer_path /var/log/fluentd-buffers/elasticsearch.buffer
  buffer_chunk_limit 2M
  buffer_queue_limit 256
</match>
EOF
​
# 3. 创建Docker Compose文件
echo "[3/3] 创建docker-compose-efk-node1.yml..."
cat > /opt/cluster-deploy/docker-compose-efk-node1.yml << 'EOF'
services:
  fluentd:
    image: fluent/fluentd:v1.16-1
    container_name: fluentd
    networks:
      manage-net:
        ipv4_address: 172.20.5.11
    volumes:
      - ./config/fluentd/fluentd-node1.conf:/fluentd/etc/fluent.conf:ro
      - /var/lib/docker/containers:/var/lib/docker/containers:ro
      - fluentd-buffer:/var/log/fluentd-buffers
    environment:
      - FLUENTD_CONF=fluent.conf
    restart: unless-stopped
    logging:
      driver: none
​
networks:
  manage-net:
    external: true
​
volumes:
  fluentd-buffer:
EOF
​
# 4. 启动服务
echo ""
echo "启动Fluentd..."
cd /opt/cluster-deploy
docker compose -f docker-compose-efk-node1.yml up -d
​
echo ""
echo "Node1 EFK部署完成!"

Node2 EFK部署

复制代码
#!/bin/bash
# Node2 EFK部署脚本
​
set -e
​
echo "============================================"
echo "        Node2 EFK 部署脚本"
echo "============================================"
​
# 1. 创建目录
mkdir -p /opt/cluster-deploy/{config/fluentd,logs/elasticsearch}
​
# 2. 创建Fluentd配置
cat > /opt/cluster-deploy/config/fluentd/fluentd-node2.conf << 'EOF'
<source>
  @type tail
  path /var/lib/docker/containers/*/*-json.log
  pos_file /var/log/fluentd-containers.log.pos
  tag docker.*
  read_from_head true
  <parse>
    @type json
    time_type float
    time_format %Y-%m-%dT%H:%M:%S.%NZ
  </parse>
</source>
​
<filter docker.**>
  @type record_transformer
  <record>
    node_name Node2
  </record>
</filter>
​
<match docker.**>
  @type elasticsearch
  host 172.20.5.21
  port 9200
  logstash_format true
  logstash_prefix docker
  logstash_dateformat %Y.%m.%d
  flush_interval 10s
  buffer_type file
  buffer_path /var/log/fluentd-buffers/elasticsearch.buffer
  buffer_chunk_limit 2M
  buffer_queue_limit 256
</match>
EOF
​
# 3. 创建Docker Compose文件
cat > /opt/cluster-deploy/docker-compose-efk-node2.yml << 'EOF'
services:
  fluentd:
    image: fluent/fluentd:v1.16-1
    container_name: fluentd
    networks:
      manage-net:
        ipv4_address: 172.20.5.12
    volumes:
      - ./config/fluentd/fluentd-node2.conf:/fluentd/etc/fluent.conf:ro
      - /var/lib/docker/containers:/var/lib/docker/containers:ro
      - fluentd-buffer:/var/log/fluentd-buffers
    environment:
      - FLUENTD_CONF=fluent.conf
    restart: unless-stopped
    logging:
      driver: none
​
networks:
  manage-net:
    external: true
​
volumes:
  fluentd-buffer:
EOF
​
# 4. 启动服务
cd /opt/cluster-deploy
docker compose -f docker-compose-efk-node2.yml up -d
​
echo "Node2 EFK部署完成!"

Node3 EFK部署

复制代码
#!/bin/bash
# Node3 EFK部署脚本
​
set -e
​
echo "============================================"
echo "        Node3 EFK 部署脚本"
echo "============================================"
​
# 1. 创建目录
mkdir -p /opt/cluster-deploy/{config/{elasticsearch,fluentd,kibana},logs/elasticsearch}
​
# 2. 创建Elasticsearch配置
cat > /opt/cluster-deploy/config/elasticsearch/elasticsearch.yml << 'EOF'
cluster.name: docker-cluster
node.name: elasticsearch-node1
discovery.type: single-node
network.host: 0.0.0.0
http.port: 9200
xpack.security.enabled: false
http.cors.enabled: true
http.cors.allow-origin: "*"
EOF
​
# 3. 创建Fluentd配置
cat > /opt/cluster-deploy/config/fluentd/fluentd-node3.conf << 'EOF'
<source>
  @type tail
  path /var/lib/docker/containers/*/*-json.log
  pos_file /var/log/fluentd-containers.log.pos
  tag docker.*
  read_from_head true
  <parse>
    @type json
    time_type float
    time_format %Y-%m-%dT%H:%M:%S.%NZ
  </parse>
</source>
​
<filter docker.**>
  @type record_transformer
  <record>
    node_name Node3
  </record>
</filter>
​
<match docker.**>
  @type elasticsearch
  host 172.20.5.21
  port 9200
  logstash_format true
  logstash_prefix docker
  logstash_dateformat %Y.%m.%d
  flush_interval 10s
  buffer_type file
  buffer_path /var/log/fluentd-buffers/elasticsearch.buffer
  buffer_chunk_limit 2M
  buffer_queue_limit 256
</match>
EOF
​
# 4. 创建Docker Compose文件
cat > /opt/cluster-deploy/docker-compose-efk-node3.yml << 'EOF'
services:
  fluentd:
    image: fluent/fluentd:v1.16-1
    container_name: fluentd
    networks:
      manage-net:
        ipv4_address: 172.20.5.22
    volumes:
      - ./config/fluentd/fluentd-node3.conf:/fluentd/etc/fluent.conf:ro
      - /var/lib/docker/containers:/var/lib/docker/containers:ro
      - fluentd-buffer:/var/log/fluentd-buffers
    environment:
      - FLUENTD_CONF=fluent.conf
    restart: unless-stopped
    logging:
      driver: none
​
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
    container_name: elasticsearch
    hostname: elasticsearch
    networks:
      manage-net:
        ipv4_address: 172.20.5.21
    environment:
      - discovery.type=single-node
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
      - xpack.security.enabled=false
    volumes:
      - elasticsearch-data:/usr/share/elasticsearch/data
      - ./config/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro
    ulimits:
      memlock:
        soft: -1
        hard: -1
    restart: unless-stopped
​
  kibana:
    image: docker.elastic.co/kibana/kibana:8.11.0
    container_name: kibana
    networks:
      manage-net:
        ipv4_address: 172.20.5.23
    environment:
      - ELASTICSEARCH_HOSTS=http://172.20.5.21:9200
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch
    restart: unless-stopped
​
networks:
  manage-net:
    external: true
​
volumes:
  elasticsearch-data:
  fluentd-buffer:
EOF
​
# 5. 启动服务
cd /opt/cluster-deploy
docker compose -f docker-compose-efk-node3.yml up -d
​
echo "Node3 EFK部署完成!"
echo "Kibana访问地址: http://192.168.64.130:5601"

Zabbix部署脚本

在所有节点执行Zabbix部署脚本。

Node1 Zabbix Agent部署

复制代码
#!/bin/bash
# Node1 Zabbix Agent部署
​
set -e
​
echo "============================================"
echo "        Node1 Zabbix Agent 部署"
echo "============================================"
​
# 1. 创建目录
mkdir -p /opt/cluster-deploy/config/zabbix
​
# 2. 创建Agent配置
cat > /opt/cluster-deploy/config/zabbix/zabbix_agentd-node1.conf << 'EOF'
Server=172.20.5.31
ServerActive=172.20.5.31
Hostname=Node1-Agent
BufferSend=5
BufferSize=100
Timeout=10
LogType=console
EOF
​
# 3. 创建Docker Compose文件
cat > /opt/cluster-deploy/docker-compose-zabbix-node1.yml << 'EOF'
services:
  zabbix-agent:
    image: zabbix/zabbix-agent2:alpine-7.0-latest
    container_name: zabbix-agent
    networks:
      manage-net:
        ipv4_address: 172.20.5.41
    volumes:
      - ./config/zabbix/zabbix_agentd-node1.conf:/etc/zabbix/zabbix_agent2.conf:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      - ZABBIX_SERVER_HOST=172.20.5.31
    restart: unless-stopped
​
networks:
  manage-net:
    external: true
EOF
​
# 4. 启动服务
cd /opt/cluster-deploy
docker compose -f docker-compose-zabbix-node1.yml up -d
​
echo "Node1 Zabbix Agent部署完成!"

Node2 Zabbix Agent部署

复制代码
#!/bin/bash
# Node2 Zabbix Agent部署
​
set -e
​
echo "============================================"
echo "        Node2 Zabbix Agent 部署"
echo "============================================"
​
# 1. 创建目录
mkdir -p /opt/cluster-deploy/config/zabbix
​
# 2. 创建Agent配置
cat > /opt/cluster-deploy/config/zabbix/zabbix_agentd-node2.conf << 'EOF'
Server=172.20.5.31
ServerActive=172.20.5.31
Hostname=Node2-Agent
BufferSend=5
BufferSize=100
Timeout=10
LogType=console
EOF
​
# 3. 创建Docker Compose文件
cat > /opt/cluster-deploy/docker-compose-zabbix-node2.yml << 'EOF'
services:
  zabbix-agent:
    image: zabbix/zabbix-agent2:alpine-7.0-latest
    container_name: zabbix-agent
    networks:
      manage-net:
        ipv4_address: 172.20.5.42
    volumes:
      - ./config/zabbix/zabbix_agentd-node2.conf:/etc/zabbix/zabbix_agent2.conf:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      - ZABBIX_SERVER_HOST=172.20.5.31
    restart: unless-stopped
​
networks:
  manage-net:
    external: true
EOF
​
# 4. 启动服务
cd /opt/cluster-deploy
docker compose -f docker-compose-zabbix-node2.yml up -d
​
echo "Node2 Zabbix Agent部署完成!"

Node3 Zabbix Server + Web + Agent部署

复制代码
#!/bin/bash
# Node3 Zabbix Server + Web + Agent部署
​
set -e
​
echo "============================================"
echo "        Node3 Zabbix 部署脚本"
echo "============================================"
​
# 1. 创建目录
mkdir -p /opt/cluster-deploy/config/{zabbix,zabbix-mysql}
​
# 2. 创建Zabbix MySQL配置
cat > /opt/cluster-deploy/config/zabbix-mysql/my.cnf << 'EOF'
[mysqld]
server-id = 100
bind-address = 0.0.0.0
port = 3306
character-set-server = utf8mb4
max_connections = 200
innodb_buffer_pool_size = 256M
EOF
​
# 3. 创建Zabbix Server配置
cat > /opt/cluster-deploy/config/zabbix/zabbix_server.conf << 'EOF'
LogType=console
EOF
​
# 4. 创建Agent配置
cat > /opt/cluster-deploy/config/zabbix/zabbix_agentd-node3.conf << 'EOF'
Server=172.20.5.31
ServerActive=172.20.5.31
Hostname=Node3-Agent
BufferSend=5
BufferSize=100
Timeout=10
LogType=console
EOF
​
# 5. 创建Docker Compose文件
cat > /opt/cluster-deploy/docker-compose-zabbix-node3.yml << 'EOF'
services:
  zabbix-agent:
    image: zabbix/zabbix-agent2:alpine-7.0-latest
    container_name: zabbix-agent
    networks:
      manage-net:
        ipv4_address: 172.20.5.43
    volumes:
      - ./config/zabbix/zabbix_agentd-node3.conf:/etc/zabbix/zabbix_agent2.conf:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      - ZABBIX_SERVER_HOST=172.20.5.31
    restart: unless-stopped
​
  zabbix-mysql:
    image: mysql:8.0
    container_name: zabbix-mysql
    hostname: zabbix-mysql
    networks:
      manage-net:
        ipv4_address: 172.20.5.33
    volumes:
      - zabbix-mysql-data:/var/lib/mysql
      - ./config/zabbix-mysql/my.cnf:/etc/mysql/conf.d/my.cnf:ro
    environment:
      - MYSQL_ROOT_PASSWORD=RootStr0ng!Pass
      - MYSQL_DATABASE=zabbix
      - MYSQL_USER=zabbix
      - MYSQL_PASSWORD=ZabbixStr0ng!Pass
    command:
      - --default-authentication-plugin=mysql_native_password
    restart: unless-stopped
​
  zabbix-server:
    image: zabbix/zabbix-server-mysql:alpine-7.0-latest
    container_name: zabbix-server
    hostname: zabbix-server
    networks:
      manage-net:
        ipv4_address: 172.20.5.31
    volumes:
      - zabbix-server-data:/var/lib/zabbix
    environment:
      - DB_SERVER_HOST=zabbix-mysql
      - MYSQL_DATABASE=zabbix
      - MYSQL_USER=zabbix
      - MYSQL_PASSWORD=ZabbixStr0ng!Pass
      - ZBX_CACHESIZE=128M
    ports:
      - "10051:10051"
    depends_on:
      - zabbix-mysql
    restart: unless-stopped
​
  zabbix-web:
    image: zabbix/zabbix-web-apache-mysql:alpine-7.0-latest
    container_name: zabbix-web
    hostname: zabbix-web
    networks:
      manage-net:
        ipv4_address: 172.20.5.32
    volumes:
      - zabbix-web-data:/etc/zabbix/web
    environment:
      - DB_SERVER_HOST=zabbix-mysql
      - MYSQL_DATABASE=zabbix
      - MYSQL_USER=zabbix
      - MYSQL_PASSWORD=ZabbixStr0ng!Pass
      - ZBX_SERVER_HOST=172.20.5.31
      - PHP_TZ=Asia/Shanghai
    ports:
      - "8080:8080"
    depends_on:
      - zabbix-mysql
      - zabbix-server
    restart: unless-stopped
​
networks:
  manage-net:
    external: true
​
volumes:
  zabbix-mysql-data:
  zabbix-server-data:
  zabbix-web-data:
EOF
​
# 6. 启动服务
cd /opt/cluster-deploy
docker compose -f docker-compose-zabbix-node3.yml up -d
​
echo ""
echo "============================================"
echo "        Zabbix 部署完成!"
echo "============================================"
echo ""
echo "Zabbix Web访问地址: http://192.168.64.130:8080"
echo "默认用户名: Admin"
echo "默认密码: zabbix"
echo ""
echo "请在Web界面添加主机监控:"
echo "  - Node1: 172.20.5.41"
echo "  - Node2: 172.20.5.42"
echo "  - Node3: 172.20.5.43"

一键部署完整脚本

将以下内容保存为 deploy-all.sh,在Node3上执行:

复制代码
#!/bin/bash
# 完整集群部署脚本
​
set -e
​
echo "============================================"
echo "    Docker容器化集群 完整部署脚本"
echo "============================================"
​
# 等待用户确认
echo ""
read -p "是否开始部署?(y/n): " confirm
if [ "$confirm" != "y" ]; then
    echo "部署已取消"
    exit 0
fi
​
echo ""
echo "步骤1: 等待业务服务部署完成..."
echo "请确保已在各节点执行基础服务部署"
read -p "基础服务已部署完成?(y/n): " base_ready
if [ "$base_ready" != "y" ]; then
    echo "请先完成基础服务部署"
    exit 1
fi
​
echo ""
echo "步骤2: 部署EFK日志收集系统..."
echo "  - 请在各节点执行 EFK 部署脚本"
​
echo ""
echo "步骤3: 部署Zabbix监控系统..."
echo "  - 请在各节点执行 Zabbix 部署脚本"
​
echo ""
echo "============================================"
echo "    部署完成!访问地址汇总"
echo "============================================"
echo ""
echo "| 服务 | 地址 | 凭据 |"
echo "|------|------|------|"
echo "| Web应用 | http://172.20.1.100 | - |"
echo "| Kibana | http://192.168.64.130:5601 | - |"
echo "| Zabbix | http://192.168.64.130:8080 | Admin/zabbix |"
echo ""

相关推荐
木雷坞1 小时前
Open WebUI 连不上 Ollama:Docker Compose 排查记录
人工智能·docker·ai编程
蜀道山老天师1 小时前
Docker 部署 Nginx Proxy Manager:可视化反向代理 + SSL 证书一键配置
nginx·docker·ssl
Shiy_1 小时前
前端模块化设计实战:从 Vue3 Composition API 到 Monorepo 工程化
架构·前端工程化
2601_957418801 小时前
Android相机有线连接全链路优化:PTP/MTP协议栈实现与商业级性能调优
android·数码相机·智能手机·架构
宇明一不急1 小时前
K8S-中nodePort、port、targetPort和containerPort
云原生·容器·kubernetes
大迪deblog1 小时前
从分布式到中央计算:深度拆解下一代 Zonal 车载 EEA 架构变革
分布式·架构
AugustRed1 小时前
Docker原理和使用指南、常用命令、Compose多容器部署
运维·docker·容器
无心水1 小时前
【Harness:落地实战】16、从“只会说”到“能干活”:OpenClaw落地,手动Harness的架构与实现深度解析
人工智能·架构·设计规范·openclaw·养龙虾·hermes·honcho
搜佛说1 小时前
sfsDb 和 SQLite、InfluxDB “硬碰硬”的底层性能与技术架构对比
jvm·架构·sqlite