背景
最近由于业务需要,需要部署一套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讨论:
根据上面分享的方法解决了这个问题,特此记录一下。
原因
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