Hello Flocker
Flocker安装部署
安装flocker-deploy:
1 | $ pyenv virtualenv flocker |
安装flocker-node,本地安装方式官方目前只支持fedora 20的linux,暂时选择用最简单的vagrant来测试。
准备第三方库:
1 | $ cd /etc/yum.repos.d |
安装VirtualBox:
1 | $ cd ~/dev # 工作目录 |
安装Vagrant:
1 | $ wget https://dl.bintray.com/mitchellh/vagrant/vagrant_1.7.2_x86_64.rpm |
使用官方的flocker box:
1 | Vagrant.require_version ">= 1.6.2" |
Flocker使用SSH通道:
1 | $ eval $(ssh-agent) # 启用一个SSH Agent,可以用ssh-add测试是否启用 |
在虚拟机中下载docker比如官方的MySQL案例:
1 | $ ssh -t root@172.16.255.250 docker pull mysql:5.6.17 |
Flocker部署MySQL:
配置mysql-application.yml
:
1 | "version": 1 "applications": "mysql-volume-example": "image": "mysql:5.6.17" "environment": "MYSQL_ROOT_PASSWORD": "clusterhq" "ports": - "internal": 3306 "external": 3306 "volume": "mountpoint": "/var/lib/mysql" |
配置mysql-deployment.yml
:
1 | "version": 1 "nodes": "172.16.255.250": ["mysql-volume-example"] "172.16.255.251": [] |
检查docker服务端镜像及容器启用情况:
1 | $ ssh -t root@172.16.255.250 docker images |
通过Flocker-deploy部署应用:
1 | $ pyenv activate flocker # 确保进入隔离python环境,之前安装的flocker-cli在该环境内 |
使用MySQL服务:
1 | $ mysql -uroot -pclusterhq -h172.16.255.250 |
通过Flocker-deploy迁移应用:
新增mysql-deployment-moved.yml
:
1 | "version": 1 "nodes": "172.16.255.250": [] "172.16.255.251": ["mysql-volume-example"] |
执行迁移:
1 | $ flocker-deploy mysql-deployment-moved.yml mysql-application.yml |
迁移过程中可以发现,mysql客户端连接的172.16.255.250服务端并没有断开。通过登录虚拟机可以找到原因(有兴趣的可以用tcpdump、ss来追踪):
1 | $ ssh root@172.16.255.250 |
可以看到flocker是通过Linux Netfilter的NAT表进行了默认的转发:
1 | Chain PREROUTING (policy ACCEPT) target prot opt source destination DOCKER all -- anywhere anywhere ADDRTYPE match dst-type LOCAL DNAT tcp -- anywhere anywhere tcp dpt:mysql ADDRTYPE match dst-type LOCAL /* flocker create_proxy_to */ to:172.16.255.251 Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination DOCKER all -- anywhere !loopback/8 ADDRTYPE match dst-type LOCAL DNAT tcp -- anywhere anywhere tcp dpt:mysql ADDRTYPE match dst-type LOCAL to:172.16.255.251 Chain POSTROUTING (policy ACCEPT) target prot opt source destination MASQUERADE all -- 172.17.0.0/16 anywhere MASQUERADE tcp -- anywhere anywhere tcp dpt:mysql |
由此实现了应用的无缝迁移。
小结
Flocker实现的功能很有诱惑力,让docker具备了自动化的应用迁移能力,他俩关系有点像openstack和hypervisor的关系。但是,它目前还非常不成熟(0.4版在开发中),经常会遇到一些bug,就连官方也不推荐在生产环境使用,继续观望。
参考:
- Flocker Doc
- Web开发环境搭建
- CentOS下安装VirtualBox
- CentOS6.5菜鸟之旅:安装VirtualBox4.3
- 在验证应用无缝迁移过程中用到的工具:ss、tcpdump。