设为首页 收藏本站
查看: 888|回复: 0

[经验分享] Docker Swarm群集

[复制链接]

尚未签到

发表于 2018-5-27 09:55:10 | 显示全部楼层 |阅读模式
Docker Swarm 是什么?
Docker Swarm是一个用于创建Docker主机(运行Docker守护进程的服务器)集群的工具,使用Swarm操作集群,会使用户感觉就像是在一台主机上进行操作
docker1.12集成了swarmkit, 使你可以不用安装额外的软件包, 使用简单的命令启动创建docker swarm集群。
如果你在运行 Docker 1.12时,你就可以原生创建一个 Swarm 集群 .
集成了swarm集群的安全特性, 集成了K-V存储, 你现在不需要额外部署etcd或者consul
在Docker1.12版本中,一个大的功能点是swarm集群(基于swarmkit项目),通过Docker命令可以直接实现docker-engine相互发现,并组建成为一个容器集群
SwarmKit将节点分为两类:
工作节点(Worker):负责通过执行器运行任务。SwarmKit的默认执行器为Docker容器执行器(Docker Container Executor)。
  (1)内建分布式存储,不要额外的数据库
  (2)支持Rolling update
  (3容器高可用
  (4)通过TLS保证了节点之间通讯的安全
管理节点(Manager):负责接收和响应用户请求,将集群状态调节到最终状态。在SwarmKit中,用户可以动态调整节点的角色,即在ManagerWorker之间转换。
如下图所示,这是一个典型的master-slave的架构。每个节点都是运行着Docker EngineDocker主机。一些节点有更高的权限,被称为Manager。下面的节点是worker节点,接收来自manager组的任务指示。
DSC0000.png


部署docker1.12 Swarm
实验环境:
这里选择三台主机运行Swarm,依次为:
node1   192.168.100.5
node2  192.168.100.6
node3  192.168.100.7

基本环境配置
3台主机确保时间一致 ntp
3台主机均关闭selinux,开启路由转发。 /ect/sysctl.conf
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 14关闭selinux
[root@localhost ~]# setenforce 05 3台主机修改/etc/hosts文件
DSC0001.png
Ping  连通性
DSC0002.png
开启宿主机之间的端口
TCP端口2377集群管理端口
TCP与UDP端口7946节点之间通讯端口
TCP与UDP端口4789 overlay网络通讯端口
DSC0003.png
配置所有节点密钥登录.
配置所下节点密钥互信, 在node1可以免密码登录各节点,只在node1上执行:
生成sshkey
[root@localhost ~]# ssh-keygen发布sshkey到各个节点  ssh-copy-id node2  3 1
DSC0004.png
测试密钥登录
DSC0005.png
安装docker 1.12  如yum报错 rm -rf  /var/rum/yum.pid 删除pid  3台都需要安装
[root@localhost /]# yum -y install docker
[root@localhost /]# systemctl start dockerdocker1.12 Swarm 模式简介
Docker Engine 1.12 集成了Swarm集群工具.
主要使用三个新的命令行工具创建一个swarm集群:
docker swarm 开启swarm模式; 加入Swarm集群; 配置集群参数
docker node 查询集群节点信息; 提升/移除一个管理节点; 管理swarm节点主机
docker service 创建管理 service
可以查看docker  --help
创建 Swarm集群
node1上初始化swram集群:
注意 你只需要在一个node1上初始化swarm集群, 其他node加入这个集群就行了, 所以以下命令只需要在node1上运行.
[root@localhost /]# docker swarm init --advertise-addr 192.168.100.5 DSC0006.png
1) 查看swarm集群node列表

[root@localhost /]# docker node ls DSC0007.png
我们的其他节点服务器,以worker角色加入swarm集群需要登录到服务器运行如下命令:
[root@localhost /]# docker swarm  join-token  worker
1) 其他节点以worker加入集群使用上面查看到的命令加入集群(node2、node3上)

DSC0008.png
1) 查看集群节点情况,验证加入与否

DSC0009.png
1) 提升node2为管理

[root@node1 /]# docker node promote node2 DSC00010.png
docker swarm:集群管理,子命令主要有下面几个。
docker swarm init命令用于初始化一个集群
dockerswarm join命令用于加入一个现有集群
dockerswarm leave命令由于离开集群
有了Docker Swarm集群我们如何把我们的应用跑在Swarm集群上呢?
很简单, 基本上原来我们使用docker run的命令创建容器, 把前面替换成docker service create就行了.
建议搭建一个registry,为所的docker主机提供镜像下载,否则你需要在每个docker主机本地存在容器镜像。
所以搭建一个私有仓库,由私有仓库提供所需要的镜像,
本实验环境中用node1同时作为registry
拉取本地私有仓库registry查看registry镜像 DSC00011.png
上传registry2.tar

DSC00012.png
运行容器(端口映射、随docker启动时容器亦启动、路径映射、名字)

[root@node1 src]# mkdir -p /opt/data/registry
[root@node1 src]# docker run -d -p 5000:5000 --restart=always -v /opt/data/registry/:/var/lib/registry --name registry2 registry:2 DSC00013.png
查看私有仓库(可以看到仓库为空)

[root@node1 src]# curl 192.168.100.5:5000/v2/_catalog
1. 所有节点指向registry服务器:

停止docker服务

[root@node1 src]# vim /usr/lib/systemd/system/docker.service DSC00014.png
[root@node1 src]# systemctl daemon-reload
[root@node1 src]# systemctl start docker
1. 推送镜像并验证

node2上传镜像

[root@node2 src]# docker load < centos7.tar
node2配置Dockerfile

[root@node2 apache]# vim dockerfile
FROM docker.io/centos:latest
RUN yum -y install httpd net-tools
RUN sed 's/#ServerName /ServerName /g' -i /etc/httpd/conf/httpd.conf
EXPOSE 80
CMD  ["/usr/sbin/httpd","-DFOREGROUND"]
node2构建

[root@node2 apache]# docker build -t 192.168.100.5:5000/centos:httpd .
node2上传镜像到registry

查看registry中镜像

[root@node2 apache]# curl 192.168.100.5:5000/v2/_catalog
node3、node1测试从registry下载镜像  在nond3 测试

DSC00015.png

DSC00016.png

overlay网络
解决了镜像构建问题, 为了让应用跑在swram集群上,我们还需要解决容器间的网络访问问题.
单台服务器的时候我们应用所有的容器都跑在一台主机上, 所以容器之间的网络是互通的. 现在我们的集群有3台主机, 所以docker应用的服务会分布在这3台主机上.
如何保证不同主机上的容器网络互通呢?
swarm集群已经帮我们解决了这个问题了,就是只用overlay network.
docker 1.12以前, swarm集群需要一个额外的key-value存储(consul, etcd). 来同步网络配置, 保证所有容器在同一个网段中.

docker 1.12已经内置了这个存储, 集成了overlay networks的支持.
下面我们演示下如何创建一个 overlay network:
注:swarm上默认已有一个名为ingressoverlay 网络, 可以直接使用, 但本文会创建一个新的
为我们的docker应用创建一个名为dockercoinsoverlay network
1. node2上创建overlay network

[root@node2 apache]# docker network create --driver overlay dockercoins
[root@node2 apache]# docker network ls DSC00017.png
1. node1上查看(worker节点看不到)

DSC00018.png
注:一旦新的任务被指定给这个节点,Overlay网络就会被按需创建。
在swarm集群上运行docker应用
概念解释:service
Docker1.12 swarm引入了服务的概念,一个服务由多个任务组成,一个任务即一个运行的容器。
服务包括两种类型:
复制服务(replicated services):类似 k8s 中复制集的概念,保持一定数量的相同任务在集群中运行;
全局服务(global services):类似 k8s daemon 的概念,每个工作节点上运行一个。

发布服务
在manager上执行如下命令:
下面我们可以使用之前push到本地镜像仓库的镜像启动服务, centos:http为例:
复制服务类型运行服务
在manager上执行如下命令:
[root@node1 src]# docker service create --replicas 1 --network dockercoins --name web1 -p 8000:80 192.168.100.5:5000/centos:httpd
efd1jxmt3pthvwscgkt1n1hj6 DSC00019.png
浏览器验证:(三个节点ip:8000都可以访问)

DSC00020.png
如运行web2,俩个容器运行服务:

[root@node1 src]# docker service create --replicas 2 --network dockercoins --name web2 -p 8080:80 192.168.100.5:5000/centos:httpd
f2wh08sgy2q2wp5s63oczxk1t DSC00021.png
从上图可以看到web2名称的service2个副本分别运行在node2node3节点上
1. 以全局服务类型运行服务:

DSC00022.png
从下图可以看到服务web4在每个节点上都运行一个
DSC00023.png
下面我们扩展旧的服务,从下图可以看到web1  service目前只有一个副本
[root@node1 /]# docker service scale web1=3 DSC00024.png
DSC00025.png
可以看到web1服务扩展到3个副本数。

3 缩减已有的服务副本数:

[root@node1 /]# docker service scale web1=2 DSC00026.png
可以看到web1服务缩减到2个副本数。

Swarm节点是自组织(self-organizing)和自修复(self-healing)的,什么意思?只要有节点或容器宕掉,swarm engine就会尝试修复,下面我们来具体看一下
自修复(self-healing)
DSC00027.png
可以看到:3个节点,运行8个任务(容器)。包含一个registry容器。

DSC00028.png
我们模拟让node3上的容器都宕掉或部分宕掉
[root@node3 /]# docker stop $(docker ps -aq) DSC00029.png
结果:

DSC00030.png
可以看到docker会在相同节点上启动1个不同ID的容器。

Self-Organizing
现在我们让node3整个宕掉,node3上的容器会自动在其它节点上启动。
在manager节点上执行docker  server ps服务名
[root@node3 /]# systemctl stop docker
结果: node1 上

DSC00031.png
node2
DSC00032.png
可以看到node3上的web2.2在node2上启动了;至于node3上的web4.0则因为是全局服务类型,故而node3停止服务后,会停掉。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-481670-1-1.html 上篇帖子: 手动搭建Kubernetes1.8高可用集群(1)Docker配置 下篇帖子: 如何使用 Weave 网络?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表