一、ETCD 概述

ETCD 是一个分布式一致性k-v存储系统,可用于服务注册发现与共享配置。具有一下优点:

  • 简单: 相比于晦涩难懂的paxos算法,etcd基于相对简单且易实现的raft算法实现一致性,并通过gRPC提供接口调用
  • 安全:支持TLS通信,并可以针对不同的用户进行对key的读写控制
  • 高性能:10,000/秒的写性能

二、overlay网络模式

容器在两个跨主机通信的时候,是使用overlay network这个网络模式进行通信,如果使用host也可以实现跨主机进行通信,直接使用这个物理的ip地址就可以进行通信。overlay它会虚拟出一个网络比如10.0.9.3 这个ip地址,在这个overlay网络模式里面,有一个类似于服务网关的地址,然后这个包转发到物理服务器这个地址,最终通过路由和交换,到达另一个服务器的ip地址。

在docker容器里面overlay是怎么实现的呢?

我们会有一个服务发现,比如说consul,会定义一个ip地址池,比如10.0.9.0/24 之类的,上面会有容器,容器ip地址会从上面去获取,获取完了后,会通过eth1进行通信,贼这实现跨主机的东西。

三、部署ETCD集群

node1部署

  1. [root@node1 ~]# wget https://github.com/coreos/etcd/releases/download/v3.0.12/etcd-v3.0.12-linux-amd64.tar.gz
  2. [root@node1 ~]# tar zxf etcd-v3.0.12-linux-amd64.tar.gz
  3. [root@node1 ~]# cd etcd-v3.0.12-linux-amd64/
  4. [root@node1 etcd-v3.0.12-linux-amd64]# nohup ./etcd --name docker-node1 --initial-advertise-peer-urls http://10.211.55.12:2380 \
  5. > --listen-peer-urls http://10.211.55.12:2380 \
  6. > --listen-client-urls http://10.211.55.12:2379,http://127.0.0.1:2379 \
  7. > --advertise-client-urls http://10.211.55.12:2379 \
  8. > --initial-cluster-token etcd-cluster \
  9. > --initial-cluster docker-node1=http://10.211.55.12:2380,docker-node2=http://10.211.55.13:2380 \
  10. > --initial-cluster-state new&
  11. [1] 32505

node2部署

  1. [root@node2 ~]# wget https://github.com/coreos/etcd/releases/download/v3.0.12/etcd-v3.0.12-linux-amd64.tar.gz
  2. [root@node2 ~]# tar zxf etcd-v3.0.12-linux-amd64.tar.gz
  3. [root@node2 ~]# cd etcd-v3.0.12-linux-amd64/
  4. [root@node2 etcd-v3.0.12-linux-amd64]# nohup ./etcd --name docker-node2 --initial-advertise-peer-urls http://10.211.55.13:2380 \
  5. > --listen-peer-urls http://10.211.55.13:2380 \
  6. > --listen-client-urls http://10.211.55.13:2379,http://127.0.0.1:2379 \
  7. > --advertise-client-urls http://10.211.55.13:2379 \
  8. > --initial-cluster-token etcd-cluster \
  9. > --initial-cluster docker-node1=http://10.211.55.12:2380,docker-node2=http://10.211.55.13:2380 \
  10. > --initial-cluster-state new&
  11. [1] 19240

检查cluster状态

  1. [root@node2 etcd-v3.0.12-linux-amd64]# ./etcdctl cluster-health
  2. member 98da03f1eca9d9d is healthy: got healthy result from http://10.211.55.12:2379
  3. member 63a987e985acb514 is healthy: got healthy result from http://10.211.55.13:2379
  4. cluster is healthy

参数说明

  1. 参数说明:
  2. data-dir 指定节点的数据存储目录,若不指定,则默认是当前目录。这些数据包括节点ID,集群ID,集群初始化配置,Snapshot文件,若未指 定–wal-dir,还会存储WAL文件
  3. wal-dir 指定节点的was文件存储目录,若指定了该参数,wal文件会和其他数据文件分开存储
  4. name 节点名称
  5. initial-advertise-peer-urls 告知集群其他节点的URLtcp2380端口用于集群通信
  6. listen-peer-urls 监听URL,用于与其他节点通讯
  7. advertise-client-urls 告知客户端的URL, 也就是服务的URLtcp2379端口用于监听客户端请求
  8. initial-cluster-token 集群的ID
  9. initial-cluster 集群中所有节点
  10. initial-cluster-state 集群状态,new为新创建集群,existing为已存在的集群

四、管理etcd集群

  1. 1.查看集群版本
  2. # etcdctl --version
  3. # etcdctl --help
  4. 1
  5. 2
  6. 2.查看集群健康状态
  7. # etcdctl cluster-health
  8. 1
  9. 3.查看集群成员
  10. # etcdctl member list
  11. 1
  12. 在任一节点上执行,可以看到集群的节点情况,并能看出哪个是leader节点
  13. 4.更新一个节点
  14. 如果你想更新一个节点的IP(peerURLS),首先你需要知道那个节点的ID
  15. # etcdctl member list
  16. # etcdctl member update memberID http://ip:2380
  17. 1
  18. 2
  19. 5.删除一个节点(Etcd集群成员的缩)
  20. # etcdctl member list
  21. # etcdctl member remove memberID
  22. # etcdctl member list
  23. # ps -ef|grep etcd //在相关节点上kill掉etcd进程
  24. 1
  25. 2
  26. 3
  27. 4
  28. 6.增加一个新节点(Etcd集群成员的伸)
  29. 注意:步骤很重要,不然会报集群ID不匹配
  30. # etcdctl member add --help
  31. 1
  32. a. 将目标节点添加到集群
  33. # etcdctl member add etcd3 http://10.1.2.174:2380
  34. Addedmember named etcd3 with ID 28e0d98e7ec15cd4 to cluster
  35. ETCD_NAME="etcd3"
  36. ETCD_INITIAL_CLUSTER="etcd0=http://10.1.2.61:2380,etcd1=http://10.1.2.172:2380,etcd2=http://10.1.2.173:2380,etcd3=http://10.1.2.174:2380"
  37. ETCD_INITIAL_CLUSTER_STATE="existing"
  38. 1
  39. 2
  40. 3
  41. 4
  42. 5
  43. 6
  44. b. 查看新增成员列表,etcd3状态为unstarted
  45. # etcdctl member list
  46. d4f257d2b5f99b64[unstarted]:peerURLs=http://10.1.2.174:2380
  47. 1
  48. 2
  49. c. 清空目标节点etcd3data-dir
  50. 节点删除后,集群中的成员信息会更新,新节点是作为一个全新的节点加入集群,如果data-dir有数据,etcd启动时会读取己经存在的数据,仍然用老的memberID会造成无法加入集群,所以一定要清空新节点的data-dir
  51. # rm -rf /path/to/etcd/data
  52. 1
  53. d. 在目标节点上启动新增加的成员
  54. 这里的initial标记一定要指定为existing,如果为new,则会自动生成一个新的memberID,这和前面添加节点时生成的ID不一致,故日志中会报节点ID不匹配的错。
  55. # vim etcd3.sh
  56. 1
  57. 修改etcd3.sh,脚本中–advertise-client-urls initial-advertis-peer-urls 参数修改为etcd3的,–initial-cluster-state改为existing
  58. # nohup ./etcd3.sh &
  59. # etcdctl member list

五、Docker使用ETCD分布式存储

node1

  1. [root@node1 ~]#service docker stop
  2. [root@node1 ~]# /usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://10.211.55.12:2379 --cluster-advertise=10.211.55.12:2375&

node2

  1. [root@node2 ~]#service docker stop
  2. [root@node2 ~]# /usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://10.211.55.13:2379 --cluster-advertise=10.211.55.13:2375&

六、创建overlay network

在node1上创建一个demo的overlay network

  1. [root@node1 ~]# docker network ls
  2. NETWORK ID NAME DRIVER SCOPE
  3. 550d5b450fe3 bridge bridge local
  4. cca92be73cc6 host host local
  5. d21360748bfc none null local
  6. [root@node1 ~]# docker network create -d overlay demo
  7. 97e959031044ec634d61d2e721cb0348d7ff852af3f575d75d2988c07e0f9846
  8. [root@node1 ~]# docker network ls
  9. NETWORK ID NAME DRIVER SCOPE
  10. 550d5b450fe3 bridge bridge local
  11. 97e959031044 demo overlay global
  12. cca92be73cc6 host host local
  13. d21360748bfc none null local
  14. [root@node1 ~]# docker network inspect demo
  15. [
  16. {
  17. "Name": "demo",
  18. "Id": "97e959031044ec634d61d2e721cb0348d7ff852af3f575d75d2988c07e0f9846",
  19. "Created": "2018-08-01T22:22:01.958142468+08:00",
  20. "Scope": "global",
  21. "Driver": "overlay",
  22. "EnableIPv6": false,
  23. "IPAM": {
  24. "Driver": "default",
  25. "Options": {},
  26. "Config": [
  27. {
  28. "Subnet": "10.0.0.0/24",
  29. "Gateway": "10.0.0.1"
  30. }
  31. ]
  32. },
  33. "Internal": false,
  34. "Attachable": false,
  35. "Ingress": false,
  36. "ConfigFrom": {
  37. "Network": ""
  38. },
  39. "ConfigOnly": false,
  40. "Containers": {},
  41. "Options": {},
  42. "Labels": {}
  43. }
  44. ]

我们会看到在node2上,这个demo的overlay network会被同步创建

  1. [root@node2 etcd-v3.0.12-linux-amd64]# cd
  2. [root@node2 ~]# docker network ls
  3. NETWORK ID NAME DRIVER SCOPE
  4. c6af37ef6765 bridge bridge local
  5. 97e959031044 demo overlay global
  6. de15cdab46b0 host host local
  7. cc3ec612fd29 none null local
  8. # 说明etcd分布式存储已经起作用,两个节点数据已同步

通过查看etcd的key-value, 我们获取到,这个demo的network是通过etcd从node1同步到node2的

  1. [root@node2 etcd-v3.0.12-linux-amd64]# ./etcdctl ls /docker
  2. /docker/nodes
  3. /docker/network
  4. [root@node2 etcd-v3.0.12-linux-amd64]# ./etcdctl ls /docker/nodes
  5. /docker/nodes/10.211.55.12:2375
  6. /docker/nodes/10.211.55.13:2375
  7. [root@node2 etcd-v3.0.12-linux-amd64]# ./etcdctl ls /docker/network/v1.0/network
  8. /docker/network/v1.0/network/97e959031044ec634d61d2e721cb0348d7ff852af3f575d75d2988c07e0f9846
  9. [root@node2 etcd-v3.0.12-linux-amd64]# ./etcdctl get /docker/network/v1.0/network/97e959031044ec634d61d2e721cb0348d7ff852af3f575d75d2988c07e0f9846
  10. {"addrSpace":"GlobalDefault","attachable":false,"configFrom":"","configOnly":false,"created":"2018-08-01T22:22:01.958142468+08:00","enableIPv6":false,"generic":{"com.docker.network.enable_ipv6":false,"com.docker.network.generic":{}},"id":"97e959031044ec634d61d2e721cb0348d7ff852af3f575d75d2988c07e0f9846","inDelete":false,"ingress":false,"internal":false,"ipamOptions":{},"ipamType":"default","ipamV4Config":"[{\"PreferredPool\":\"\",\"SubPool\":\"\",\"Gateway\":\"\",\"AuxAddresses\":null}]","ipamV4Info":"[{\"IPAMData\":\"{\\\"AddressSpace\\\":\\\"GlobalDefault\\\",\\\"Gateway\\\":\\\"10.0.0.1/24\\\",\\\"Pool\\\":\\\"10.0.0.0/24\\\"}\",\"PoolID\":\"GlobalDefault/10.0.0.0/24\"}]","labels":{},"loadBalancerIP":"","name":"demo","networkType":"overlay","persist":true,"postIPv6":false,"scope":"global"}

七、创建连接demo网络的容器

node1

  1. [root@node1 ~]# docker run -d --name test1 --net demo busybox sh -c "while true; do sleep 3600; done"
  2. Unable to find image 'busybox:latest' locally
  3. latest: Pulling from library/busybox
  4. 8c5a7da1afbc: Pull complete
  5. Digest: sha256:cb63aa0641a885f54de20f61d152187419e8f6b159ed11a251a09d115fdff9bd
  6. Status: Downloaded newer image for busybox:latest
  7. 4bc3ab1cb7d838e8ef314618e6d3d878e744ef7842196a00b3999e6b6fe8402f
  8. ERRO[2018-08-01T22:26:33.105124642+08:00] Failed to deserialize netlink ndmsg: invalid argument
  9. INFO[0379] shim docker-containerd-shim started address="/containerd-shim/moby/4bc3ab1cb7d838e8ef314618e6d3d878e744ef7842196a00b3999e6b6fe8402f/shim.sock" debug=false pid=6630
  10. [root@node1 ~]# docker ps
  11. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  12. 4bc3ab1cb7d8 busybox "sh -c 'while true; …" 26 seconds ago Up 24 seconds test1
  13. [root@node1 ~]# docker exec test1 ifconfig
  14. eth0 Link encap:Ethernet HWaddr 02:42:0A:00:00:02
  15. inet addr:10.0.0.2 Bcast:10.0.0.255 Mask:255.255.255.0
  16. UP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1
  17. RX packets:0 errors:0 dropped:0 overruns:0 frame:0
  18. TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
  19. collisions:0 txqueuelen:0
  20. RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
  21. eth1 Link encap:Ethernet HWaddr 02:42:AC:12:00:02
  22. inet addr:172.18.0.2 Bcast:172.18.255.255 Mask:255.255.0.0
  23. UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
  24. RX packets:31 errors:0 dropped:0 overruns:0 frame:0
  25. TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
  26. collisions:0 txqueuelen:0
  27. RX bytes:4045 (3.9 KiB) TX bytes:0 (0.0 B)
  28. lo Link encap:Local Loopback
  29. inet addr:127.0.0.1 Mask:255.0.0.0
  30. UP LOOPBACK RUNNING MTU:65536 Metric:1
  31. RX packets:0 errors:0 dropped:0 overruns:0 frame:0
  32. TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
  33. collisions:0 txqueuelen:0
  34. RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

node2

  1. [root@node2 ~]# docker run -d --name test1 --net demo busybox sh -c "while true; do sleep 3600; done"
  2. Unable to find image 'busybox:latest' locally
  3. latest: Pulling from library/busybox
  4. 56bec22e3559: Pull complete
  5. Digest: sha256:29f5d56d12684887bdfa50dcd29fc31eea4aaf4ad3bec43daf19026a7ce69912
  6. Status: Downloaded newer image for busybox:latest
  7. fad6dc6538a85d3dcc958e8ed7b1ec3810feee3e454c1d3f4e53ba25429b290b
  8. docker: Error response from daemon: service endpoint with name test1 already exists. # 容器已存在
  9. [root@node2 ~]# docker run -d --name test2 --net demo busybox sh -c "while true; do sleep 3600; done"
  10. 9d494a2f66a69e6b861961d0c6af2446265bec9b1d273d7e70d0e46eb2e98d20

验证连通性

  1. [root@node2 etcd-v3.0.12-linux-amd64]# docker exec -it test2 ifconfig
  2. eth0 Link encap:Ethernet HWaddr 02:42:0A:00:00:03
  3. inet addr:10.0.0.3 Bcast:10.0.0.255 Mask:255.255.255.0
  4. UP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1
  5. RX packets:0 errors:0 dropped:0 overruns:0 frame:0
  6. TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
  7. collisions:0 txqueuelen:0
  8. RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
  9. eth1 Link encap:Ethernet HWaddr 02:42:AC:12:00:02
  10. inet addr:172.18.0.2 Bcast:172.18.255.255 Mask:255.255.0.0
  11. UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
  12. RX packets:32 errors:0 dropped:0 overruns:0 frame:0
  13. TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
  14. collisions:0 txqueuelen:0
  15. RX bytes:4110 (4.0 KiB) TX bytes:0 (0.0 B)
  16. lo Link encap:Local Loopback
  17. inet addr:127.0.0.1 Mask:255.0.0.0
  18. UP LOOPBACK RUNNING MTU:65536 Metric:1
  19. RX packets:0 errors:0 dropped:0 overruns:0 frame:0
  20. TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
  21. collisions:0 txqueuelen:0
  22. RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
  23. [root@node1 ~]# docker exec test1 sh -c "ping 10.0.0.3"
  24. PING 10.0.0.3 (10.0.0.3): 56 data bytes
  25. 64 bytes from 10.0.0.3: seq=0 ttl=64 time=0.698 ms
  26. 64 bytes from 10.0.0.3: seq=1 ttl=64 time=1.034 ms
  27. 64 bytes from 10.0.0.3: seq=2 ttl=64 time=1.177 ms
  28. 64 bytes from 10.0.0.3: seq=3 ttl=64 time=0.708 ms
  29. 64 bytes from 10.0.0.3: seq=4 ttl=64 time=0.651 ms

ETCD分布式存储部署的更多相关文章

  1. 007.基于Docker的Etcd分布式部署

    一 环境准备 1.1 基础环境 ntp配置:略 #建议配置ntp服务,保证时间一致性 etcd版本:v3.3.9 防火墙及SELinux:关闭防火墙和SELinux 名称 地址 主机名 备注 etcd ...

  2. 008.Docker Flannel+Etcd分布式网络部署

    一 环境准备 1.1 Flannel概述 Flannel是一种基于overlay网络的跨主机容器网络解决方案,即将TCP数据包封装在另一种网络包里面进行路由转发和通信,Flannel是CoreOS开发 ...

  3. Ceph分布式存储部署过程

    前言: 环境介绍:此次部署系统为Cenots 7 MON.OSD 10.110.180.112 Admin MON.OSD 10.110.180.113 Node1 MON.OSD 10.110.18 ...

  4. etcd安装部署步骤

    我是通过yum直接安装的(yum install etcd -y),其生成的配置文件在/etc/etcd/etcd.conf. 这里分单机版和集群版来介绍配置项 单机配置 ETCD_DATA_DIR: ...

  5. etcd+https部署

    关闭防火墙 关闭selinux 下载所需的包(cfssl,生成证书工具) mkdir /usr/local/src/etcd/ cd /usr/local/src/etcd/ wget https:/ ...

  6. etcd 安装部署

    etcd 是coreos团队开发的分布式服务发现键值存储仓库. github地址: https://github.com/coreos/etcd 安装: 1.下载etcd最新版本 https://gi ...

  7. glusterFS分布式存储部署流程

    转自:http://bangbangba.blog.51cto.com/3180873/1712061 GlusterFS是一款非常易于使用的分布式文件存储系统,实现了全部标准POSIX接口,并用fu ...

  8. Glusterfs 分布式存储安装部署

    Glusterfs 分布式存储部署 是存储当中可以选择的一种 现在很多虚拟化 云计算都在用软件存储 例如 ceph Glusterfs 等等 今天我们部署一下Glusterfs环境 GlusterFs ...

  9. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之自签TLS证书及Etcd集群部署(二)

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.服务器设置 1.把每一 ...

随机推荐

  1. 【教程】【FLEX】#004 反射机制

    总结: 目前用到反射的主要有两个方法 1.  getDefinitionByName    //根据类名,返回对象(反射实例化对象) 2.  describeType                 ...

  2. python3 装饰器全解

    本章结构: 1.理解装饰器的前提准备 2.装饰器:无参/带参的被装饰函数,无参/带参的装饰函数 3.装饰器的缺点 4.python3的内置装饰器 5.本文参考 理解装饰器的前提:1.所有东西都是对象( ...

  3. Scala学习——Scala By Example——to be continued

    这一篇是来自官网的Scala By Example 即Tutorial后更详细地对Scala怎么用给了示例 该文一开始给了一个快速排序的示例 版本一: def sort(xs: Array[Int]) ...

  4. python第二十课——math模块中常用的函数

    属性: e:自然数 pi:圆周率 函数: ceil():向上取整 floor():向下取整 sqrt():开平方根 radians():角度转弧度 degrees():弧度转角度 import mat ...

  5. iOS 开源库系列 Aspects核心源码分析---面向切面编程之疯狂的 Aspects

    Aspects的源码学习,我学到的有几下几点 Objective-C Runtime 理解OC的消息分发机制 KVO中的指针交换技术 Block 在内存中的数据结构 const 的修饰区别 block ...

  6. 4196. [NOI2015]软件包管理器【树链剖分】

    Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖( ...

  7. C# HttpWebRequest请求超时解决办法

    request.GetResponse();超时问题的解决,和HttpWebRequest多线程性能问题,请求超时的错误, 解决办法 1.将http的request的keepAlive设置为false ...

  8. 《Java程序设计》第15周课堂实践总结

    <Java程序设计>第15周课堂实践总结 实践一 教材代码检查-p242 要求 在IDEA中或命令行中运行P242 StackTraceDemo2.java 代码运行结果和教材一致吗?为什 ...

  9. pandas数据结构:Series/DataFrame;python函数:range/arange

    1. Series Series 是一个类数组的数据结构,同时带有标签(lable)或者说索引(index). 1.1 下边生成一个最简单的Series对象,因为没有给Series指定索引,所以此时会 ...

  10. 访问 IIS 元数据库失败解决问题的方法

    近日调试一Asp.net程序,出现了“访问 IIS 元数据库失败”的错误信息,最后经过搜索发现了解决问题的方法. 解决方法如下: 1.依次点击“开始”-“运行”. 2.在“运行”栏内输入 “C:\WI ...