Docker 部署三节点 ETCD

Docker 部署三节点 ETCD

Cocytus Elias 306 2023-05-22

单机 Docker Compose 部署

封装了启动命令的 sh 文件:

#!/bin/sh
/usr/local/bin/etcd --data-dir=${DATA_DIR} -name ${NAME} --initial-advertise-peer-urls http://${HOST}:2380 --listen-peer-urls http://0.0.0.0:2380 --advertise-client-urls http://${HOST}:2379 --listen-client-urls http://0.0.0.0:2379 --initial-cluster ${CLUSTER} --initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN}

下面是 Docker Compose 文件:

version: '3.2'
services:
  etcd-1:
    container_name: etcd-1
    image: quay.io/coreos/etcd:v3.5.0
    environment:
      - ETCD_AUTO_COMPACTION_MODE=revision
      - ETCD_QUOTA_BACKEND_BYTES=8589934592
      - ETCD_SNAPSHOT_COUNT=500
      - HOST_1=etcd-1
      - HOST_2=etcd-2
      - HOST_3=etcd-3
      - CLUSTER_STATE=new
      - DATA_DIR=/etcd
      - CLUSTER=etcd-1=http://etcd-1:2380,etcd-2=http://etcd-2:2380,etcd-3=http://etcd-3:2380
      - NAME=etcd-1
      - HOST=etcd-1
    ports:
      - 1379:2379
      - 1380:2380
    volumes:
      - ./etcd/data:/etcd
      - ./etcd/start.sh:/scripts/start.sh
    command: sh "/scripts/start.sh"

  etcd-2:
    container_name: etcd-2
    image: quay.io/coreos/etcd:v3.5.0
    environment:
      - ETCD_AUTO_COMPACTION_MODE=revision
      - ETCD_QUOTA_BACKEND_BYTES=8589934592
      - ETCD_SNAPSHOT_COUNT=500
      - HOST_1=etcd-1
      - HOST_2=etcd-2
      - HOST_3=etcd-3
      - CLUSTER_STATE=existing
      - DATA_DIR=/etcd
      - CLUSTER=etcd-1=http://etcd-1:2380,etcd-2=http://etcd-2:2380,etcd-3=http://etcd-3:2380
      - NAME=etcd-2
      - HOST=etcd-2
    ports:
      - 2379:2379
      - 2380:2380
    volumes:
      - ./etcd/data:/etcd
      - ./etcd/start.sh:/scripts/start.sh
    command: sh "/scripts/start.sh"

  etcd-3:
    container_name: etcd-3
    image: quay.io/coreos/etcd:v3.5.0
    environment:
      - ETCD_AUTO_COMPACTION_MODE=revision
      - ETCD_QUOTA_BACKEND_BYTES=8589934592
      - ETCD_SNAPSHOT_COUNT=500
      - HOST_1=etcd-1
      - HOST_2=etcd-2
      - HOST_3=etcd-3
      - CLUSTER_STATE=existing
      - DATA_DIR=/etcd
      - CLUSTER=etcd-1=http://etcd-1:2380,etcd-2=http://etcd-2:2380,etcd-3=http://etcd-3:2380
      - NAME=etcd-3
      - HOST=etcd-3
    ports:
      - 3379:2379
      - 3380:2380
    volumes:
      - ./etcd/data:/etcd
      - ./etcd/start.sh:/scripts/start.sh
    command: sh "/scripts/start.sh"

针对上面的文件解释一下:

  • etcd 启动的时候,执行的是第一个 sh 文件。sh 文件中的很多参数都是取得在 Docker Compose 中设置的环境变量。

  • ETCD_AUTO_COMPACTION_MODE: 自动压缩保留模式,可选:

    • periodic 基于时间的保留,如果未提供时间单位,则默认为小时。如果使用此参数,需要额外设置一个环境变量 ETCD_AUTO_COMPACTION_RETENTION
    • revision 基于修订号的保留。
  • ETCD_QUOTA_BACKEND_BYTES: 存储的配额限制。单位字节。

  • ETCD_SNAPSHOT_COUNT: 保留最新的快照数。

  • HOST_1HOST_2HOST_3: 用于设置 etcd 集群中每个节点的主机名或 IP 地址的环境变量。

  • CLUSTER_STATE: 初始化的 cluster 状态。new 代表新建集群, existing 代表集群已存在。

  • DATA_DIR: 数据存储路径。

  • CLUSTER: 集群地址列表。

  • NAME: 当前节点名称。

  • HOST: 当前节点地址。

启动时,先启动 etcd-1,再启动另外两个。

多机 Docker 部署

根据上面的 shDocker Compsose 编写。执行前替换相应的地址及端口。

docker run -d \
    --name etcd-1 \
    -p 2379:2379 \
    -p 2380:2380 \
    -v ./etcd/data:/etcd \
    -v ./etcd/start.sh:/scripts/start.sh \
    -e ETCD_AUTO_COMPACTION_MODE=revision \
    -e ETCD_QUOTA_BACKEND_BYTES=8589934592 \
    -e ETCD_SNAPSHOT_COUNT=500 \
    -e HOST_1=etcd-1 \
    -e HOST_2=etcd-2 \
    -e HOST_3=etcd-3 \
    -e CLUSTER_STATE=new \
    -e DATA_DIR=/etcd \
    -e CLUSTER=etcd-1=http://etcd-1:2380,etcd-2=http://etcd-2:2380,etcd-3=http://etcd-3:2380 \
    -e NAME=etcd-1 \
    -e HOST=etcd-1 \
    quay.io/coreos/etcd:v3.5.0 sh "/scripts/start.sh"