docker搭建etcd集群方式 bitnami/etcd

 更新时间:2023年06月12日 10:15:09   作者:好大一个消失点  
这篇文章主要介绍了docker搭建etcd集群方式 bitnami/etcd,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

docker部署etcd集群

优秀的文章应该一来就先上代码(不接受杠精反驳)

注意这是sh代码,liunx批处理脚本

#!/bin/bash
#设置网络名
network_name=etcd_network
#创建网络
docker network create --driver bridge --subnet=10.3.36.0/16 --gateway=10.3.1.1 ${network_name}
#设置结点名
node1=etcd_node1
node1_ip=10.3.36.1
node2=etcd_node2
node2_ip=10.3.36.2
node3=etcd_node3
node3_ip=10.3.36.3
#设置集群口令
cluster_token=etcd_cluster
#创建节点1
docker run -d --name ${node1} \
	--network ${network_name} \
	--publish 12379:2379 \
	--publish 12380:2380 \
	--ip ${node1_ip} \
	--env ALLOW_NONE_AUTHENTICATION=yes \
	--env ETCD_NAME=${node1} \
	--env ETCD_ADVERTISE_CLIENT_URLS=http://${node1_ip}:2379 \
	--env ETCD_INITIAL_ADVERTISE_PEER_URLS=http://${node1_ip}:2380 \
	--env ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379 \
	--env ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380 \
	--env ETCD_INITIAL_CLUSTER_TOKEN=${cluster_token} \
	--env ETCD_INITIAL_CLUSTER=${node1}=http://${node1_ip}:2380,${node2}=http://${node2_ip}:2380,${node3}=http://${node3_ip}:2380 \
	--env ETCD_INITIAL_CLUSTER_STATE=new \
	bitnami/etcd:latest
#创建节点2
docker run -d --name ${node2} \
	--network ${network_name} \
	--publish 22379:2379 \
	--publish 22380:2380 \
	--ip ${node2_ip} \
	--env ALLOW_NONE_AUTHENTICATION=yes \
	--env ETCD_NAME=${node2} \
	--env ETCD_ADVERTISE_CLIENT_URLS=http://${node2_ip}:2379 \
	--env ETCD_INITIAL_ADVERTISE_PEER_URLS=http://${node2_ip}:2380 \
	--env ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379 \
	--env ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380 \
	--env ETCD_INITIAL_CLUSTER_TOKEN=${cluster_token} \
	--env ETCD_INITIAL_CLUSTER=${node1}=http://${node1_ip}:2380,${node2}=http://${node2_ip}:2380,${node3}=http://${node3_ip}:2380 \
	--env ETCD_INITIAL_CLUSTER_STATE=new \
	bitnami/etcd:latest
#创建节点3
docker run -d --name ${node3} \
	--network ${network_name} \
	--publish 32379:2379 \
	--publish 32380:2380 \
	--ip ${node3_ip} \
	--env ALLOW_NONE_AUTHENTICATION=yes \
	--env ETCD_NAME=${node3} \
	--env ETCD_ADVERTISE_CLIENT_URLS=http://${node3_ip}:2379 \
	--env ETCD_INITIAL_ADVERTISE_PEER_URLS=http://${node3_ip}:2380 \
	--env ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379 \
	--env ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380 \
	--env ETCD_INITIAL_CLUSTER_TOKEN=${cluster_token} \
	--env ETCD_INITIAL_CLUSTER=${node1}=http://${node1_ip}:2380,${node2}=http://${node2_ip}:2380,${node3}=http://${node3_ip}:2380 \
	--env ETCD_INITIAL_CLUSTER_STATE=new \
	bitnami/etcd:latest

如何执行

sh xxx.sh
# xxx填写你的shell文件名

注意

如果你在执行的时候遇到这个错误

line 2: $'\r': command not found

麻烦安装一下这个东西(不要问为什么?)

yum -y install dos2unix*
dos2unix *.*

这里说一下配置参数情况

#docker网络名
--network 
#端口号可以这样写-p
--publish
--env ALLOW_NONE_AUTHENTICATION
#设置成员节点的别名
--env ETCD_NAME
#广播到集群中本成员的监听客户端请求的地址
--env ETCD_ADVERTISE_CLIENT_URLS
#广播到集群中本成员的Peer监听通信地址
--env ETCD_INITIAL_ADVERTISE_PEER_URLS
#客户端请求的监听地址列表
--env ETCD_LISTEN_CLIENT_URLS
#Peer消息的监听服务地址列表
--env ETCD_LISTEN_PEER_URLS
#启动集群的时候指定集群口令,只有相同token的才能加入到同一集群
--env ETCD_INITIAL_CLUSTER_TOKEN
#所有集群节点的地址列表
--env ETCD_INITIAL_CLUSTER

测试一下成功没有

$docker ps
CONTAINER ID   IMAGE                 COMMAND                 CREATED          STATUS          PORTS                                              NAMES
13aad2124d35   bitnami/etcd:latest   "/entrypoint.sh etcd"   11 minutes ago   Up 11 minutes   0.0.0.0:32379->2379/tcp, 0.0.0.0:32380->2380/tcp   etcd_node3
03e368e9658e   bitnami/etcd:latest   "/entrypoint.sh etcd"   11 minutes ago   Up 11 minutes   0.0.0.0:22379->2379/tcp, 0.0.0.0:22380->2380/tcp   etcd_node2
2781e87d368d   bitnami/etcd:latest   "/entrypoint.sh etcd"   11 minutes ago   Up 11 minutes   0.0.0.0:12379->2379/tcp, 0.0.0.0:12380->2380/tcp   etcd_node1
#测试命令
$docker exec -it 2781e87d368d etcdctl member list

Etcd集群搭建实验

实验环境

实验环境非常简单,2 台服务器, etcd01 主 etcd02 从。

etcd01etcd02
192.168.1.103192.168.1.104

下载与安装 etcd

首先从 Yum 源上安装

[root@bogon ~]# yum -y install etcd

查看一下版本

[root@bogon ~]# etcd --version
etcd Version: 3.3.11
Git SHA: 2cf9e51
Go Version: go1.10.3
Go OS/Arch: linux/amd64

修改配置文件

编辑配置文件 /etc/etcd/etcd.conf ,可以通过如下命令查看文件内容,主节点如下。

[root@bogon ~]# egrep -v "^$|^#" /etc/etcd/etcd.conf
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.1.103:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_NAME="etcd01"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.103:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_INITIAL_CLUSTER="etcd01=http://192.168.1.103:2380,etcd02=http://192.168.1.104:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
[root@bogon ~]# 

从节点如下。

[root@bogon ~]# egrep -v "^$|^#" /etc/etcd/etcd.conf
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.1.104:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_NAME="etcd02"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.104:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_INITIAL_CLUSTER="etcd01=http://192.168.1.103:2380,etcd02=http://192.168.1.104:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"

服务启动与查看

分别在主从节点上执行如下命令启动服务。

[root@master etcd]# systemctl start etcd
[root@master etcd]# systemctl status etcd

使用如下命令查看网络进程。

[root@bogon ~]# netstat -ntlp | grep etcd
tcp        0      0 192.168.1.104:2380      0.0.0.0:*               LISTEN      22061/etcd          
tcp6       0      0 :::2379                 :::*                    LISTEN      22061/etcd     

查看集群节点

[root@bogon ~]# etcdctl member list
4490eae103912db6: name=etcd01 peerURLs=http://192.168.1.103:2380 clientURLs=http://0.0.0.0:2379 isLeader=false
5038ecd3b2f796d0: name=etcd02 peerURLs=http://192.168.1.104:2380 clientURLs=http://0.0.0.0:2379 isLeader=true

查看健康状态

[root@bogon ~]# etcdctl cluster-health
member 4490eae103912db6 is healthy: got healthy result from http://0.0.0.0:2379
member 5038ecd3b2f796d0 is healthy: got healthy result from http://0.0.0.0:2379
cluster is healthy

报错与解决

1.cluster ID mismatch

报错如下

request sent was ignored (cluster ID mismatch: remote[4xxx6]=6xxxb, local=9xxxb)

解决方法

需要把master和node节点的/var/lib/etcd/目录下的缓存都删除一遍,然后重启etcd

2.cannot understand the cluster version

报错如下

cannot understand the cluster version of member 4xxx6 (not_decided is not in dotted-tri format) incompatible with current running cluster

解决方法

可能是因为配置文件中的

ETCD_INITIAL_CLUSTER_STATE="exist"

将其改为

ETCD_INITIAL_CLUSTER_STATE="new"

3.permission denied

报错如下

etcdmain: cannot access data directory: open /var/lib/etcd/default.etcd/.touch: permission denied

解决方法

关掉SElinux安全,通过执行命令关闭,这样重启之后会恢复状态。

setenforce 0

或者在在 /etc/selinux/config 中将 SELINUX=enforcing 设置成 disabled ,然后 reboot

systemd 默认是以 etcd 用户执行的,这里需要修改 default.etcd 文件夹权限

chown etcd:etcd -R /var/lib/etcd/default.etcd

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Docker目录迁移的实现示例

    Docker目录迁移的实现示例

    Docker默认目录比较小,容器日志过多就会导致无法运行,本文主要介绍了Docker目录迁移的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • Rancher无法添加主机问题的解决方法

    Rancher无法添加主机问题的解决方法

    这篇文章主要给大家介绍了关于Rancher无法添加主机问题的解决方法,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-06-06
  • 详解Docker容器跨主机通信的方法

    详解Docker容器跨主机通信的方法

    本篇文章主要介绍了详解Docker容器跨主机通信的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • 在docker-compose.yml文件中配置容器的环境变量方式

    在docker-compose.yml文件中配置容器的环境变量方式

    本文介绍了在docker-compose.yml文件中设置和使用环境变量的方法,包括直接设置环境变量、从文件读取环境变量以及使用多个环境文件进行不同部署环境的配置
    2024-11-11
  • Docker以挂载方式安装RocketMQ的实现方式

    Docker以挂载方式安装RocketMQ的实现方式

    Docker中安装和使用RocketMQ有多种方式,本文主要介绍了Docker以挂载方式安装RocketMQ的实现方式,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • 关于docker部署fastapi项目以及日志挂载方式

    关于docker部署fastapi项目以及日志挂载方式

    这篇文章主要介绍了关于docker部署fastapi项目以及日志挂载方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • docker cgroup 资源监控的详解

    docker cgroup 资源监控的详解

    这篇文章主要介绍了docker cgroup 资源监控的详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
    2017-10-10
  • docker常用命令解读之volume篇

    docker常用命令解读之volume篇

    这篇文章主要介绍了docker常用命令解读之volume篇说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Docker 部署Mysql 服务和Redis 服务的方法

    Docker 部署Mysql 服务和Redis 服务的方法

    这篇文章主要介绍了Docker 部署Mysql 服务和Redis 服务的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Navicat 连接服务器端中的docker数据库的方法

    Navicat 连接服务器端中的docker数据库的方法

    这篇文章主要介绍了Navicat 连接服务器端中的docker数据库,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03

最新评论