概
依托现有虚拟化资源引入docker容器机制
- scheduler
根据VM宿主机的负载或其他情况,决定容器运行在哪个VM上。 - monitor
监控VM宿主机和容器健康情况,当有容器或宿主机宕掉时,报告想过情况,其他模块根据monitor的报告做出相应的响应。 - controller
控制容器的启动停止、迁移、扩展等操作 - docker engine
…… - pipework
管理容器网络,目前pipework支持手动配置容器ip,网关及路由;对DHCP支持存在问题;(考虑将pipework以plugin方式加入docker engine) - xe-daemon
采集容器监控数据,并通过xenbus将数据发给xenserver
方案
网络
- 宿主机有两个网络,一个管理网,一个数据网,宿主机内的所有容器使用数据网络
- 利用linux自带的bridge将宿主机的数据网与容器的veth pair相连,由此二层网络联通
- 宿主机开通ip_forward,实现三层转发
- 容器通过
pipework
脚本完成ip地址、路由、网关的配置
网络操作流程
- 根据网段创建bridge
使用docker network create --gateway {宿主机IP} --subnet {宿主机子网} -d bridge -o com.docker.network.bridge.name="{网桥设备名称}" {DockerNetwork名称}
创建bridge。
eg:1
2
3
4
5docker network create --gateway 10.37.129.4 --subnet 10.37.129.0/24 -d bridge -o com.docker.network.bridge.name="xennet0" xennet
brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242df249633 no
xennet0 8000.0242688f16c2 no - 桥接出口网卡
使用brctl addif {bridge名称} {网卡名称}
将出口网卡添加到指定网桥中,此处应根据xscontainer使用用户的权限决定是否需要增加sudo
操作
eg:1
2
3
4
5sudo brctl addif xennet0 enp0s6
brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242df249633 no
xennet0 8000.0242688f16c2 no enp0s6 - 创建固定IP容器
创建容器需要分配固定IP,该IP需要业务层分配,并与bridge同网段。
eg:1
2
3
4
5
6
7
8docker run -d --name c1 --network xennet --ip 10.37.129.100 centos:7.3.1611 /usr/sbin/init
docker run -d --name c2 --network xennet --ip 10.37.129.200 centos:7.3.1611 /usr/sbin/init
brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242df249633 no
xennet0 8000.0242688f16c2 no enp0s6
veth990ee82
vethf1f6fcb
宿主机重启流程
*** 由于宿主机重启会导致bridge中记录的桥接出口网卡信息丢失,所以在宿主机重启后需要重新桥接出口网卡 ***
- 桥接出口网卡
同上 - 恢复原有容器
使用docker run
ordocker start
恢复容器
共享存储
通过虚拟机挂载共享存储
- 需要记录虚机挂载共享存储与容器的对应关系
- 在创建、迁移、删除容器时,需要对相关存储资源进行分配或回收
容器直接挂载共享存储
- 一般容器
使用RBD/NBD-RBD块设备存储,或NFS存储。对于RBD/NBD-RBD方式需要添加驱动;对于NFS方式docker原生支持。 - Registry容
使用RGW对象存储(S3/Swift),测试中。。。
监控
XenContainer
调度
接口
流
服务发现(DNS)、负载均衡、容器镜像库均已容器形式提供服务。
注
- scheduler、monitor、controller 从头写吧
- docker engine 需要修改一些api接口
- pipework 需要从shell改成golang,以plugin方式加入docker engine
- xe-daemon 需要增加ip地址采集
- DNS Container 从头写吧
*** 技术相关调研,请见下节“参” ***