引言
Rancher v1.2更新了之前对Swarm的支持,与Docker一样抛弃了就有的Swarm,选择支持Swarmkit。Swarmkit引擎非常轻量级,由于其内置早Docker Engine中,所以部署起来会非常方便。虽然目前Swarmkit引擎还在不断发展,而且bug也很多,但是它也有其擅长的使用场景,比如简单的CI/CD场景,它会非常灵活简洁。本文将带大家体验一下,Rancher v1.2对Swarmkit的支持。
部署与使用
部署方面秉承Rancher一贯的原则,非常简单,只需要在创建Env时选择Sawrm即可。
Env创建完毕后,会看到多个Infra Service需要创建,这时候和其他引擎一样,我们需要向Env中添加Host。我们知道Swarm的node有两种:Manager和Worker。Rancher创建的Swarm集群默认是3个Manager,多个Manager内有一个是Leader,另外两个备用。这样单个Host出问题,新的Leader会很快选举出来,保证集群的稳定性。比如我添加了两个Host,默认是先添加Manager角色,所以2个Host都会以Manager方式添加,如下图所示:
进入其中一台Host内,查看swarm集群状态,可以看到一个是Leader,另外一个Reachable做备用。
尝试创建一个简单的程序,查看与UI上的联动效果,如图所示:
如果使用Swarmkit的自定义网络方式,情况如何?虽然在UI上显示无IP,但是进入容器内部可以看到overlay对应的网卡,如图所示:
实现原理
那么Rancher是如何来完成Swarmkit的部署和联动呢?Rancher中Swarmkit也是基于Cattle来部署的,根据之前的文章分析,我们可以知道Rancher的基础设施编排的定义都是通过catalog中的infra-templates实现的,Swarmkit比较特殊它是在community-catalog中定义的,如果一直在rancher-catalog中寻找肯定找不到。compose文件中定义了一个service swarmkit-mon,如图所示:
如果探究原理,我们就需要知道swarmkit-mon对应的镜像是如何定义的。rancher/swarmkit这个dockerfile并没有在https://github.com/rancher下面的项目中,这个需要顺藤摸瓜,找到该Dockerfile的维护者(其实也是Rancher的一名员工),最终地址是https://github.com/LLParse/sw...。如图所示:
swarmkit-mon中内置了docker,并映射了Host上的docker.sock,这样可以在swarmkit-mon容器中控制docker创建swarmkit集群。swarmkit-mon的实现比较简单,主要包括两个shell脚本:run.sh负责swarmkit集群的管理和Rancher的联动,agent节点信息需要通过rancher-metadata读取,设置Host Label则直接调用Rancher API;health.sh负责监控swarmkit节点的状态(通过与docker.sock通信读取Swarm.LocalNodeState的状态),并与giddyup协作暴露健康检查端口,这样可以利用Rancher Cattle的healthcheck来保证swarmkit-mon服务的高可用性,每个Host的swarmkit-mon出问题时可以进行自动重建恢复。原理如图:
总结
目前来看,由于Kubernetes的发展的确迅猛,所以Rancher的更多精力都放在K8s上。针对Swarmkit的支持显得略显单薄,但是Swarmkit本身的问题也很多,目前也难以应对复杂场景,所以目前的支持力度应该是足够了。后续对docker1.13版本的Swarmkit支持也在持续迭代中。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。