Docker搭建etcd集群时遭遇ETCD_ACTIVE_ENDPOINTS: unbound variable的解决方案

837 阅读2分钟

背景

最近由于业务需要,需要部署一套etcd集群。而在使用docker compose在三台服务器上部署集群时,新的节点始终无法加入到已经创建好的节点中,使用 docker logs 查看后发现报错:

** Starting etcd setup **
Validating settings in ETCD_* env vars..
You set the environment variable ALLOW_NONE_AUTHENTICATION=yes. For safety reasons, do not use this flag in a production environment.
Initializing etcd
Generating etcd config file using env variables
There is no data from previous deployments
Adding new member to existing cluster
/opt/bitnami/scripts/libetcd.sh: line 427: ETCD_ACTIVE_ENDPOINTS: unbound variable
Error: etcdclient: no available endpoints
Failed to add self to cluster, keeping trying...
Error: etcdclient: no available endpoints

查找资料后,发现github上有一条相关的issue讨论:

github.com/bitnami/con…

根据上面分享的方法解决了这个问题,特此记录一下。

原因

etcd官方的文档上介绍了非容器环境时搭建etcd集群的方法,etcd中参数指定各个节点的endpoint就行。最早我也是用这个顺利搭建了etcd集群。
而使用docker部署时,他的入口并非直接使用etcd程序,而是使用了docker-entrypoint.sh。
这个脚本目前在docker环境下无法获取 ETCD_ACTIVE_ENDPOINTS 变量,只对k8s做了适配,这也是为什么日志上报错

/opt/bitnami/scripts/libetcd.sh: line 427: ETCD_ACTIVE_ENDPOINTS: unbound variable

关于这一块,issue上etcd的官方人员也说了,他们的etcd容器化重心主要是k8s,所以docker上的etcd的集群功能可能不完善。

解决方案

当我们使用docker compose创建etcd新节点,加入到etcd集群中时,显式指定ETCD_ACTIVE_ENDPOINTS环境变量为集群中可用的peer_endpoint即可。

version: "3.0"
services:
  etcd1:
    image: bitnami/etcd:3.5.11
    container_name: etcd1
    restart: always
    ports:
      - "2379:2379"
      - "2380:2380"
    environment:
      - ALLOW_NONE_AUTHENTICATION=yes
      - ETCD_NAME=etcd1
      - ETCD_ADVERTISE_CLIENT_URLS=http://192.168.85.128:2379 
      - ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
      - ETCD_INITIAL_ADVERTISE_PEER_URLS=http://192.168.85.128:2380
      - ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
      - ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
      -  ETCD_INITIAL_CLUSTER=etcd1=http://192.168.85.128:2380,etcd2=http://192.168.85.129:2380
      
      
       # 指定为集群中正在使用的节点的peer endpoint
      - ETCD_ACTIVE_ENDPOINTS=http://192.168.85.128:2380
      
      
      - ETCD_INITIAL_CLUSTER_STATE=new
    volumes:
      - etcd_data:/bitnami/etcd

volumes:
  etcd_data:
    driver: localsvr