Docker swarm mode初探
< 返回列表时间: 2018-07-05来源:OSCHINA
Docker从1.12引入了swarm模式,swarm mode用来管理集群化的docker engines,被称作swarm。可以使用docker CLI来创建swarm,给swarm上部署应用,管理swarm的行为等等。。你可以创建一个集群包含一个或者多个docker engines,这个被叫做swarm mode。一个swarm包含了多个node,node可以是物理机、虚拟机等等。node包含了两个角色:managers、workers
manager node: 维护集群状态 调度服务 服务swarm模式下的HTTP API
manager之间采用raft协议通讯,所以可以通过部署多台managers建立manager的高可用,但是manager必须是奇数个
worker node: work nodes就是docker engine实例,唯一的用途就是执行容器。你可以创建一个只有一个manager的swarm,但是不能创建一个只有一个node,确没有manager的swarm集群。
在部署一个app容器镜像到docker的swarm模式的时候,一般是创建一个service。当你创建一个service的时候,你要指定那个镜像会被使用,并且要在镜像里面执行上面命令,你也可以指定这个服务的一些其他选项: 在swarm模式下,这个service对外暴露的端口 一个overlay网络用来连接到swarm下的其他service cpu和mem的使用配额限制 一个滚动升级策略 这个镜像在运行时的副本个数
有两种类型的service部署模式:replicated和global 在replicated service模式下,你可以指定该service你想有多少个task在运行,比如,你可以指定一个http服务有三个replicas,每个都提供相同的内容 在global service模式下,该service在每一个node上运行一个task,这里不需要预先设定task的数量,任何时候只要你在集群里面加入新的node,调度系统都会在该新node上自动部署该服务,这种场景适合在机器上部署监控客户端等等。
docker允许你创建service,service可以运行tasks,一个service是一个描述的最终状态,task是工作的work,work通过swarm来调度到node节点上,服务创建使用的是下面的流程: 使用docker service create创建服务 请求到达Docker manager节点上 Docker manager节点调度该请求运行到一个workers node上 每个service可以启动多个tasks实例 每个tasks实例都有自己的生命周期
一个task会一直运行到它的任务完成,如果一个task停止了,该task是不会再次运行的。task会通过一系列状态最终完成或者失败,task一般有以下状态: NEW 初始化task PENDING 阻塞状态 ASSIGNED 分配到node状态 ACCEPTED 被node接收状态 PREPARING 准备状态 STARTING 启动状态 RUNNING 运行状态 COMPLETE 正常运行完毕状态 FAILED 运行失败状态 SHUTDOWN docker关闭该task状态 REJECTED work node拒绝该task状态 ORPHANED node节点宕机太长状态 REMOVE
当你第一次安装并启动docker engine时,swarm模式是默认被禁止的。当swarm模式打开后,你可以通过swarm service来管理services,有两种方式可以运行在swarm模式: 创建一个新的swarm 加入现有的swarm
docker engine创建swarm的流程: 交换当前node到swarm模式 创建一个名为default的swarm 指定当前node为当前swarm的leader manager 命名该node的名称为该主机名 配置manager监听在本机的2377端口 设置当前node为active状态,这意味这该node可以接收集群调度来的tasks 启动一个内部的分布式数据存储系统 默认生成一个自签名的CA证书 生成一个tokens,为后面的worker和manager加入到该swarm 创建一个名为ingress的overlay网络,对外暴露swarm上的服务
manager node使用advertise地址来接受其他node访问Swarmkit API and overlay networking的请求,其他在swarm集群中的node,必须可以访问manager的advertise地址 ,如果你不指定advertise地址,docker会自动检查系统是否有一个单ip地址,如果有,则监听在该地址的2377端口。如果该系统有多个ip地址,你必须通过--advertise-addr来指定一个地址。
新的node需要一个token才能加入现有swarm集群,worker node使用的token不同于manager node使用的token,node只有使用join-token才能加入swarm,当Rotating join token的时候,是不会影响已经加入swarm集群的node的,rotation token可以确保老的token不能被所有的新node使用来加入swarm集群。
下面是swarm的一些关键点: 一个swarm包含了多个运行在swarm mode下的docker host,分别由manager和workers组成。manager来管理成员和授权,worker来运行swarm service。一个docker host可以是一个manager,也可以是一个worker,或者即是manager也是worker。还有一个大的优势是,如果swarm service中的容器是standalone模式的,你可以在修改service的配置后(networks、volumes) 不用重启service。docker会自动处理这些。 当一个docker host运行在swarm模式,你照样可以运行standalone模式的容器,但是swarm只能管理swarm service。 node 一个docer engine就是一个node,当你需要部署应用到swarm的时候,需要在manager node上提交部署作业,manager node会派遣task到worker node上。manager node也有编排功能。worker nodes接收并执行task。 service 一个service是定义好的在worker node上执行的task,swarm系统是一个中心结构的系统,当你定义好一个service的时候,你需要制定使用的镜像以及在镜像里面执行的命令。 在replicated services模式下,swarm manager分配定义好的replica task的副本数量的task在worker node上 在global services模式下,swarm service只运行一个task在worker node上 tasks 一个task包括一个docker容器和在容器里面运行的命令。task会被swarm自动调度。manager分配task到worker上。一旦task被分配到一个node上,该task就不能移动到其他node上了,除非该node fail。 Load balancing swarm使用 ingress load balancing,swarm manager可以设置一个PublishedPort给service,如果不指定PublishedPort,则是在30000-32767这个范围内自动选择。外部的请求,例如LB,可以通过PublishedPort来访问服务,但是这个LB的服务必须在node集群上,swarm集群中的所有节点都会连接到正在运行的service上,而不论该node上是不是有运行该service服务。在swarm内部有一个DNS,可以自动的分片在swarm中每个service的entry,swarm manager使用内部LB来分发请求到集群内部的service上


热门排行