Masli 2020-05-11
Swarm 是 Docker 公司在 2014 年 12 月初发布的一套较为简单的工具,用来管理Docker 集群,它将一群 Docker 宿主机变成一个单一的虚拟的主机。 Swarm 使用标准的Docker API 接口作为其前端访问入口,换言之,各种形式的 Docker Client(dockerclient in Go, docker_py, docker 等)均可以直接与 Swarm 通信。 Swarm 几乎全部用 Go语言来完成开发,Swarm0.2 版本增加了一个新的策略来调度集群中的容器,使得在可用的节点上传播它们,以及支持更多的 Docker 命令以及集群驱动。 Swarm deamon 只是一个调度器(Scheduler)加路由器(router),Swarm 自己不运行容器,它只是接受docker 客户端发送过来的请求,调度适合的节点来运行容器,这意味着,即使 Swarm 由于某些原因挂掉了,集群中的节点也会照常运行,当 Swarm 重新恢复运行之后,它会收集重建集群信息。
Docker 的 Swarm(集群)模式,集成很多工具和特性,比如:跨主机上快速部署服务,服务的快速扩展,集群的管理整合到 docker 引擎,这意味着可以不可以不使用第三方管理工具。
分散设计,声明式的服务模型,可扩展,状态协调处理,多主机网络,分布式的服务发现,负载均衡,滚动更新,安全(通信的加密)等等。
运行 Docker 的主机可以主动初始化一个Swarm集群或者加入一个已存在的Swarm集群,这样这个运行 Docker 的主机就成为一个 Swarm集群的节点(node)。
节点分为管理(manager)节点和工作(worker)节点。
管理节点用于Swarm集群的管理,docker swarm命令基本只能在管理节点执行(节点退出集群命令docker swarm leave可以在工作节点执行)。一个Swarm集群可以有多个管理节点,但只有一个管理节点可以成为leader,leader通过raft协议实现。
工作节点是任务执行节点,管理节点将服务(service)下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点
任务(Task)是Swarm中的最小的调度单位,目前来说就是一个单一的容器。
服务(Services)是指一组任务的集合,服务定义了任务的属性。服务有两种模式:
replicated services 按照一定规则在各个工作节点上运行指定个数的任务。
global services 每个工作节点上运行一个任务
两种模式通过docker service create的--mode参数指定。
docker swarm:集群管理,子命令有 init, join, leave, update。(docker swarm --help 查看帮助) docker service:服务创建,子命令有 create, inspect, update, remove, tasks。 (docker service--help 查看帮助) docker node:节点管理,子命令有 accept, promote, demote, inspect, update,tasks, ls, rm。(docker node --help 查看帮助)
两个节点:
1.关闭防火强 关闭selinux
systemctl stop firewalld systemctl enable firewalld iptables -F sed -i ‘s#^SELINUX=.*#SELINUX=disabled#g‘ /etc/selinux/config reboot
2.开启内核转发
cat > /etc/sysctl.conf <<EOF net.ipv4.ip_forward = 1 net.ipv4.conf.default.rp_filter = 0 net.ipv4.conf.all.rp_filter = 0 EOF
3.配置yum 源(1+x安装docker的yum源) 安装docker
[ ~]# cat /etc/yum.repos.d/local.repo [centos] name=centos baseurl=file:///opt/centos gpgcheck=0 enabled=1 [docker] name=docker baseurl=file:///root/Docker gpgcheck=0 enabled=1 yum clean all yum -y install docker-ce systemctl start docker systemctl enable docker
4.开启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 ##导入镜像
说明:docker 1.13之后有了daemon.json 可以直接在里面配置开启api 注意需要删除启动文件的-H参数
cat > /etc/docker/daemon.json <<EOF { "hosts":["tcp://0.0.0.0:2375","unix:///var/run/docker.sock"] } EOF 删除/lib/systemd/system/docker.service 内的-H参数 ExecStart 把这里的-H去掉(和前面的host冲突 )
5.初始化集群
docker swarm init --advertise-addr 192.168.100.137 ##--advertise-addr:添加地址 这个地址会作为manager Swarm initialized: current node (jit2j1itocmsynhecj905vfwp) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-2oyrpgkp41z40zg0z6l0yppv6420vz18rr171kqv0mfsbiufii-c3ficc1qh782wo567uav1 6n3n 192.168.100.137:2377 To add a manager to this swarm, run ‘docker swarm join-token manager‘ and follow the instructions.
6.node节点加入集群
docker swarm join --token SWMTKN-1-2oyrpgkp41z40zg0z6l0yppv6420vz18rr171kqv0mfsbiufii-c3ficc1qh782wo567uav1 6n3n 192.168.100.137:2377 ##如果token没了 可以用一下命令显示 docker swarm join-token worker
7.验证集群
[ ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION l4clx6z2x7vsdpb8d938o1lch * master Ready Active Leader 18.09.6 o7rdxxax4fvwo7e78xloh3x2d node1 Ready Active 18.09.6
Portainer 是 Docker 的图形化管理工具,提供状态显示面板、应用模板快速部署、容器
镜像网络数据卷的基本操作(包括上传和下载镜像、创建容器等操作)、事件日志显示、容
器控制台操作、Swarm 集群和服务等集中管理和操作、登录用户管理和控制等功能。功能
十分全面,基本能满足中小型企业对容器管理的全部需求
1.创建卷
docker volume create portainer_data
2.运行
docker service create --name portainer --publish 9000:9000 --replicas=1 --constraint ‘node.role == manager‘ ##将task启动在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 nfgx3xci88rdcdka9j9cowv8g overall progress: 1 out of 1 tasks 1/1: running verify: Service converged
页面的登入 192.168.100.137:9000 需要创建新密码
1+x文档里出现的命令
docker init docker node ls docker service create ##创建服务 docker service ls ##列出服务 docker service ps ##查看服务详细信息 docker service scale ##调节服务副本数(task) docker service update ##更新容器 --publish-add 端口映射(暴露)
1+x用的是NFS数据持久化 这样可以保证不同节点调度数据不丢失
1.所有节点安装nfs node节点启动nfs和rpcbind就行
[ ~]#yum -y install nfs [ ~]# vi /etc/exports /goose 192.168.100.0/24(rw,sync,no_root_squash) [ ~]# mkdir /goose [ ~]# exportfs -rv ##这步一定需要打 不然后面service起不来(好像是 也可能是镜像调度策略问题) exporting 192.168.100.0/24:/goose [ ~]# systemctl start rpcbbind [ ~]# systemctl start nfs [ ~]# systemctl enable nfs [ ~]# systemctl enable rpcbbind
说明:
exportfs -r 重新挂载 -v 显示共享目录
2.创建nfs类型的卷(所有节点)
docker volume create --driver local --opt type=nfs --opt o=addr=192.168.100.137,rw --opt device=:/goose goose
3.创建服务
[ ~]# docker service create --name nfsnginx --publish 81:80 --mount type=volume,source=goose,destination=/app/share --replicas 2 nginx oresw28pzvekoqzmlvgl2pr9y overall progress: 2 out of 2 tasks 1/2: running [==================================================>] 2/2: running [==================================================>] verify: Service converged
说明:好像这里存在镜像调度策略 latese(不存在镜像策略 如果失败 可以改下tag )
默认配置下 master 也是 worker node,所以 master 上也运行了副本
取消master运行服务
[ ~]# docker node update --availability drain master master [ ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION l4clx6z2x7vsdpb8d938o1lch * master Ready Drain Leader 18.09.6 o7rdxxax4fvwo7e78xloh3x2d node1 Ready Active 18.09.6
尾记
swarm已经末路了 亲爸爸都已经全力适配k8s了