0%

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 从头写吧

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