在容器内运行etcd集群

    下列指南展示如何使用 来用rkt和docker运行 etcd 。

    下列 rkt 运行命令将在端口 2379 上暴露 etcd 客户端API,而在端口 2380上暴露伙伴API。

    当配置 etcd 时使用 host IP地址。

    1. # gpg key fingerprint is: 18AD 5014 C99E F7E3 BA5F 6CE9 50BD D3E0 FC8A 365E

    运行 v3.0.6 版本的 etcd or 或者指定其他发布版本。

    1. sudo rkt run --net=default:IP=${NODE1} coreos.com/etcd:v3.0.6 -- -name=node1 -advertise-client-urls=http://${NODE1}:2379 -initial-advertise-peer-urls=http://${NODE1}:2380 -listen-client-urls=http://0.0.0.0:2379 -listen-peer-urls=http://${NODE1}:2380 -initial-cluster=node1=http://${NODE1}:2380

    列出集群成员。

    使用 rkt 本地搭建 3 节点的集群, 使用-initial-cluster 标记.

    1. export NODE1=172.16.28.21
    2. export NODE2=172.16.28.22
    3. export NODE3=172.16.28.23
    1. # node 1
    2. sudo rkt run --net=default:IP=${NODE1} coreos.com/etcd:v3.0.6 -- -name=node1 -advertise-client-urls=http://${NODE1}:2379 -initial-advertise-peer-urls=http://${NODE1}:2380 -listen-client-urls=http://0.0.0.0:2379 -listen-peer-urls=http://${NODE1}:2380 -initial-cluster=node1=http://${NODE1}:2380,node2=http://${NODE2}:2380,node3=http://${NODE3}:2380
    3. # node 2
    4. sudo rkt run --net=default:IP=${NODE2} coreos.com/etcd:v3.0.6 -- -name=node2 -advertise-client-urls=http://${NODE2}:2379 -initial-advertise-peer-urls=http://${NODE2}:2380 -listen-client-urls=http://0.0.0.0:2379 -listen-peer-urls=http://${NODE2}:2380 -initial-cluster=node1=http://${NODE1}:2380,node2=http://${NODE2}:2380,node3=http://${NODE3}:2380
    5. # node 3
    6. sudo rkt run --net=default:IP=${NODE3} coreos.com/etcd:v3.0.6 -- -name=node3 -advertise-client-urls=http://${NODE3}:2379 -initial-advertise-peer-urls=http://${NODE3}:2380 -listen-client-urls=http://0.0.0.0:2379 -listen-peer-urls=http://${NODE3}:2380 -initial-cluster=node1=http://${NODE1}:2380,node2=http://${NODE2}:2380,node3=http://${NODE3}:2380

    通过被本地解析器已知的 DNS 名称指向伙伴的产品集群必须挂载 主机的 DNS 配置.

    为了暴露 etcd API 到 docker host 之外的客户端, 使用容器的 host IP 地址。请见 来获取关于如何得到IP地址的更多细节. 或者, 为 docker run 命令指定 --net=host 标记来跳过放置容器在分隔的网络栈中。

    1. # For each machine
    2. CLUSTER_STATE=new
    3. NAME_1=etcd-node-0
    4. NAME_2=etcd-node-1
    5. NAME_3=etcd-node-2
    6. HOST_1=10.20.30.1
    7. HOST_2=10.20.30.2
    8. HOST_3=10.20.30.3
    9. CLUSTER=${NAME_1}=http://${HOST_1}:2380,${NAME_2}=http://${HOST_2}:2380,${NAME_3}=http://${HOST_3}:2380
    10. # For node 1
    11. THIS_NAME=${NAME_1}
    12. THIS_IP=${HOST_1}
    13. sudo docker run --net=host --name etcd quay.io/coreos/etcd:${ETCD_VERSION} \
    14. /usr/local/bin/etcd \
    15. --data-dir=data.etcd --name ${THIS_NAME} \
    16. --initial-advertise-peer-urls http://${THIS_IP}:2380 --listen-peer-urls http://${THIS_IP}:2380 \
    17. --advertise-client-urls http://${THIS_IP}:2379 --listen-client-urls http://${THIS_IP}:2379 \
    18. --initial-cluster ${CLUSTER} \
    19. --initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN}
    20. THIS_NAME=${NAME_2}
    21. THIS_IP=${HOST_2}
    22. sudo docker run --net=host --name etcd quay.io/coreos/etcd:${ETCD_VERSION} \
    23. /usr/local/bin/etcd \
    24. --data-dir=data.etcd --name ${THIS_NAME} \
    25. --initial-advertise-peer-urls http://${THIS_IP}:2380 --listen-peer-urls http://${THIS_IP}:2380 \
    26. --advertise-client-urls http://${THIS_IP}:2379 --listen-client-urls http://${THIS_IP}:2379 \
    27. --initial-cluster ${CLUSTER} \
    28. --initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN}
    29. # For node 3
    30. THIS_NAME=${NAME_3}
    31. THIS_IP=${HOST_3}
    32. sudo docker run --net=host --name etcd quay.io/coreos/etcd:${ETCD_VERSION} \
    33. /usr/local/bin/etcd \
    34. --data-dir=data.etcd --name ${THIS_NAME} \
    35. --initial-advertise-peer-urls http://${THIS_IP}:2380 --listen-peer-urls http://${THIS_IP}:2380 \
    36. --advertise-client-urls http://${THIS_IP}:2379 --listen-client-urls http://${THIS_IP}:2379 \
    37. --initial-cluster ${CLUSTER} \
    38. --initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN}

    为了使用 API 版本3 来运行 :

    1. docker exec etcd /bin/sh -c "export ETCDCTL_API=3 && /usr/local/bin/etcdctl put foo bar"