1+X中级E卷:部署Swarm集群

来自CloudWiki
Chuliu讨论 | 贡献2020年12月1日 (二) 00:47的版本
跳转至: 导航搜索

部署Swarm集群

1.配置主机映射
修改所有节点 /etc/hosts 
192.168.0.10 mster
192.168.0.11 node
2.配置时间同步
所有节点安装chrony 服务
#yum install -y chrony 
Master节点修改/etc/chrony.conf文件,注释默认NTP服务器,指定上游公共NTP服务器,并允许其他节点同步时间。 [root@master ~]# sed -i 's/^server/#&/' /etc/chrony.conf 
[root@master~]# cat >>/etc/chrony.conf<<EOF 
local stratum 10 
server master iburst 
allow all 
EOF 
Master节点重启chronyd服务并设为开机启动,开启网络时间同步功能。 
[root@master~]# systemctl enable chronyd && systemctl restart chronyd 
[root@master~]# timedatectl set-ntp true
Node节点修改letc/chrony.conf文件,指定内网Master节点为上游NTP服务器,重启服务并设为开机启动。 
[root@node~]# sed -i 's/^server/&/' /etc/chrony.conf 
[root@node ~]# echo server 192.168.0.10 iburst >>/etc/chrony.conf//IP为master节点地址 
[root@node~]# systemctl enable chronyd && systemctl restart chronyd
所有节点执行chronyc sources命令,查询结果中如果存在以“^*”开头的行,即说明己经同步成功。
3.配置Docker API
所有节点开启Docker API。
vi /lib/systemd/system/docker.service
将 
ExecStart=/usr/bin/dockerd -H fd://--containerd=/run/containerd/containerd.sock 
修改为
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
#systemctl daemon-reload
 #systemctl restart docker
./image.sh
4初始化集群
在Master节点创建Swarm集群。 [root@master ~]# docker swarm init --advertise-addr 10.18.4.39初始化命令中“--advertise-addr”选项表示管理节点公布它的IP是多少。其 它节点必须能通过这个IP找到管理节点。 输出结果中包含3个步骤: 1Swarm创建成功,swarm-manager成为manager node。 2添加worker node需要执行的命令。 3添加manager node需要执行的命令。
5 Node节点加入集群
复制前面的docker swarm join命令,在Node节点执行以加入 Swarm集群。 
[root@node~]# docker swarm join --tokenSWMTKN-1-2oyrpgkp41z40zg0z6l0yppv6420vz18rr171kqvOmfsbiufii-c3ficc1qh782wo567uavl6n3n 10.18.4.39:2377 This node joined a swarm as a worker.
查找指令集 [root@master~]# docker swarm join-token worker
6验证集群
登录Master节点,查看各节点状态。 [root@master~]# docker node ls
7安装Portainer
Portainer是Docker 的图形化管理工具,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传和下载镜像、创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型企业对容器管理的全部需求。 登录Master节点,安装Portainer。  [root@swarm~]# docker volume create portainer_data
[root@swarm ~]#docker service create --name portainer --publish 9000:9000 --replicas=1 --constraint 'node.role == manager' --mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock --mount type=volume,src=portainer_data,dst=/data portainer/portainer -H unix://var/run/docker.sock
8登录Portainer
打开浏览器,输入地址http://master_IP:9000访问Portainer主页,
http://192.168.0.10:9000/#/init/admin


运行service

1运行Service
现在已经创建好了Swarm集群,执行如下命令部署一个运行httpd镜像的Service。 
[root@master~]# docker service create --name web_server httpd 部署Service的命令形式与运行容器的docker run很相似,--name为Service命名,httpd为镜像的名字。

通过docker service ls命令可以查看当前Swarm中的Service。

[root@master~]# docker service ls
REPLICAS显示当前副本信息,1/1意思是web_server这个Service期望的容器副本数量为1,目前已经启动的副本数量为1,即当前ervice已经部署完成。命令docker service ps可以查看Service每个副本的状态。 [root@master ~]# docker service ps web_server
2 Service伸缩
刚刚仅部署了只有一个副本的Service,不过对于Web服务,通常会运行多个实例。这样可以负载均衡,同时也能提供高可用。 Swarm要实现这个目标非常简单,增加Service的副本数就可以了。在 Master节点上执行如下命令。
[root@master~]# docker service scale web_server=5 副本数增加到5,通过docker service ls和docker service ps命令查看副本的详细信息。
[root@master~]# docker service ls [root@master~]# docker service ps web_server
既然可以通过scale up扩容服务,当然也可以通过scale down减少副本数,运行下面的命令。 [root@master ~]# docker service scale web_server=2
3访问Service
要访问http服务,首先得保证网络通畅,其次需要知道服务的IP。查看容器的网络配置。 [root@master~]# docker ps
在Master上运行了一个容器,是web_server 的一个副本,容器监听了80端口,但并没有映射到Docker Host,所以只能通过容器的正访问。但是服务并没有暴露给外部网络,只能在Docker主机上访问,外部无法访问。要将Service暴露到外部,方法其实很简单,执行下面的命令即可。 
[root@master ~]# docker service update --publish-add 8080:80 web_server --publish-add 8080:80将容器的80映射到主机的8080端口,这样外部网络就能访问到Service了。通过http://任意节点IP:8080即可访问Service
4 Service存储数据
Service的容器副本可能会伸缩,甚至失败,会在不同的主机上创建和销毁,这就引出一个问题,如果Service有需要管理的数据,那么这些数据应该如何存放呢?如果把数据打包在容器里,这显然不行,除非数据不会发生变化,否则,如何在多个副本之间保持同步呢?volume是将宿主级的目录映射到容器中,以实现数据持久化。可以用两种方式来实现:
volume默认模式:工作节点宿主机数据同步到容器内。
volume NFS共享存储模式:管理节点宿主同步到工作节点宿主,工作节点宿主同步到容器。
登录Master节点,安装NFS服务端、配置NFS主配置文件、添加权限并启动。
[root@master~]# yum install nfs-utils -y
[root@master ~]# yum install nfs-utils -y 添加目录让相应网段可以访问并添加读写权限。 
[root@master~]# vi /etc/exports /root/share 192.168.200.110(rw,async,insecure,anonuid=1000,anongid=1000,no_root_squash) 创建共享目录,添加权限。 
[root@master~]# mkdir -p /root/share
[root@master~]# chmod 777 /root/share /root/share为共享目录,生效配置。 
[root@master~]# exportfs -rv exporting 10.18.4.39/24:/root/share 开启RPC服务并设置开机自启。 [root@master~]# systemctl start rpcbind 
[root@master ~]# systemctl enable rpcbind 启动NFS服务并设置开机自启。
[root@master~]# systemctl start nfs [root@master ~]# systemctl enable nfs 查看NFS是否挂载成功。
[root@master~]# cat /var/lib/nfs/etab
/root/share 10.18.4.39/24(rw,async,wdelay,hide,nocrossmnt,insecure,no_root_squash,no_al_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=1000,anongid=1000,sec=sys,rw,insecure,no_root_squash,no_all_squash)
登录Node节点,安装NFS客户端并启动服务。 
[root@node~]# yum install nfs-utils -y 
[root@node~] systemctl start rpcbind 
[root@node~]# systemctl enable rpcbind 
[root@node~]# systemctl start nfs 
[root@node~]# systemctl enable nfs
部署的服务可能分不到各个节点上,在所有节点创建docker volume。 
[root@master~]# docker volume create --driver local --opt type=nfs --opt o=addr=10.18.4.39,rw --opt device=:/root/share foo33 --opt device=:/root/share用于指向共享目录,也可以是共享目录下的子目录。查看volume。
docker volume ls
可以查看到docker volume列表中有foo33,查看volume详细信息。
[root@node~]# docker volume inspect foo33
可以看出 NFS 的/root/share被挂载到了/var/lib/docker/volumes/foo33/_data目录。
创建并发布服务。 
[root@master~]# doc ker service create --name test-nginx-nfs --publish 80:80 --mount type=volume,source=foo33,destination=/app/share --replicas 3 nginx
查看服务分布的节点。 
[root@master~]# docker service ps test-nginx-nfs
在Master节点/root/share目录中生成一个index.html文件。 
[root@master~]#cd /root/share/ 
[root@master share]# touch index.html 
[root@master share]# 1l
查看宿主机目录挂载情况。 
[root@master share ]# docker volume inspect foo33 
[root@master share]# ls /var/lib/docker/volumes/foo33/_data
查看容器目录。 
[root@master~]# docker ps
[root@master~]# docker exec -it albce967830e bash
5调度节点
默认配置下Master也是worker node,所以Master上也运行了副本。如果不希望在Master上运行Service,可以执行如下命令。 
[root@master~]# docker node update --availability drain master
通过docker node ls命令查看各节点现在的状态。 
[root@master~]# docker node ls
Drain表示Master已经不负责运行Service,之前Master运行的那1个副本会如何处理呢?
使用docker service ps命令来查看。
例[root@master~]# docker service ps test-nginx-nfs