XenServer中Docker容器实施方案(Preview)

依托现有虚拟化资源引入docker容器机制

xen_container_plan.png

  • scheduler
    根据VM宿主机的负载或其他情况,决定容器运行在哪个VM上。
  • monitor
    监控VM宿主机和容器健康情况,当有容器或宿主机宕掉时,报告想过情况,其他模块根据monitor的报告做出相应的响应。
  • controller
    控制容器的启动停止、迁移、扩展等操作
  • docker engine
    ……
  • pipework
    管理容器网络,目前pipework支持手动配置容器ip,网关及路由;对DHCP支持存在问题;(考虑将pipework以plugin方式加入docker engine)
  • xe-daemon
    采集容器监控数据,并通过xenbus将数据发给xenserver

方案

网络

xen_container_network_plan.png

  • 宿主机有两个网络,一个管理网,一个数据网,宿主机内的所有容器使用数据网络
  • 利用linux自带的bridge将宿主机的数据网与容器的veth pair相连,由此二层网络联通
  • 宿主机开通ip_forward,实现三层转发
  • 容器通过pipework脚本完成ip地址、路由、网关的配置

网络操作流程

  1. 根据网段创建bridge
    使用docker network create --gateway {宿主机IP} --subnet {宿主机子网} -d bridge -o com.docker.network.bridge.name="{网桥设备名称}" {DockerNetwork名称}创建bridge。
    eg:

    1
    2
    3
    4
    5
    $ docker 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
  2. 桥接出口网卡
    使用brctl addif {bridge名称} {网卡名称}将出口网卡添加到指定网桥中,此处应根据xscontainer使用用户的权限决定是否需要增加sudo操作
    eg:

    1
    2
    3
    4
    5
    $ sudo brctl addif xennet0 enp0s6
    $ brctl show
    bridge name bridge id STP enabled interfaces
    docker0 8000.0242df249633 no
    xennet0 8000.0242688f16c2 no enp0s6
  3. 创建固定IP容器
    创建容器需要分配固定IP,该IP需要业务层分配,并与bridge同网段。
    eg:

    1
    2
    3
    4
    5
    6
    7
    8
    $ docker 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中记录的桥接出口网卡信息丢失,所以在宿主机重启后需要重新桥接出口网卡

  1. 桥接出口网卡
    同上
  2. 恢复原有容器
    使用docker run or docker start恢复容器

共享存储

通过虚拟机挂载共享存储

  • 需要记录虚机挂载共享存储与容器的对应关系
  • 在创建、迁移、删除容器时,需要对相关存储资源进行分配或回收

容器直接挂载共享存储

  • 一般容器
    使用RBD/NBD-RBD块设备存储,或NFS存储。对于RBD/NBD-RBD方式需要添加驱动;对于NFS方式docker原生支持。
  • Registry容
    使用RGW对象存储(S3/Swift),测试中。。。

监控

XenContainer

调度

接口

服务发现(DNS)、负载均衡、容器镜像库均已容器形式提供服务。

xen_container_flow.png

  • scheduler、monitor、controller 从头写吧
  • docker engine 需要修改一些api接口
  • pipework 需要从shell改成golang,以plugin方式加入docker engine
  • xe-daemon 需要增加ip地址采集
  • DNS Container 从头写吧

技术相关调研,请见下节“参”