0%

记一次失败的Windows下使用Docker UCP搭建容器集群

手头刚好有Windows容器的Docker UCP的License,所以想试着用Dockers UCP搭建一个Windows容器集群体验一下,没想到这是一个非常痛苦的经历,这也证明了玩容器主流还是Linux,折腾了很久终于成功了一次,但是当我在同样的环境想再重新来一次的时候,居然一直再也没有成功过💔,特将这次过程记录一下,哪位同学知道问题所在还望赐教🙏。

组网

我只有一台笔记本,只有充分利用现在有资源了,Windows容器集群的管理节点还是必须用Linux,因此采用虚拟机运行Linux管理节点,笔记本作为Windows工作节点,具体组网如下:

软件版本

  • Windows 10 Pro 1803
  • 管理节点使用Docker ce 18.09.06,工作节点Docker ee 18.09.06
  • Docker UCP 2.2.18
  • Vagrant 2.2.4

安装

安装准备

开启Hyper-V和容器支持,在“控制面板”→“程序”→“启用或关闭Windows功能”中选中Hyper-V和Containers,点确定。如果已经开启则跳过此步。

准备管理节点

  1. 安装vagrant,下载地址https://releases.hashicorp.com/vagrant/2.2.4/vagrant_2.2.4_x86_64.msi

  2. 使用官方的centos/7虚拟机模板建立虚拟机,注意这里选择Hyper-V驱动,因为Windows容器必须使用hyper-v虚拟化,而VirtualBox的虚拟化技术依赖vt-x,Hyper-V和vt-x是冲突的,开启Hyper-V后会自动关闭vt-x,因此无法使用VirtualBox虚拟机。

    1
    2
    vagrant init centos/7
    vagrant up --provider=hyperv

    运行vagrant up会先从官方下载虚拟机模板,此过程需要一定时间。使用Hyper-V后,vagrant也会有一些限制,例如无法通过Vagrantfile进行某些配置,包括网络,安装过程需要选择使用哪个虚拟交换机,选择nat,后续在Hyper-V管理其中还可以修改:

    default: to create a new virtual switch.
    default:
    default: 1) Default Switch
    default: 2) nat
    default:
    default: What switch would you like to use?

  3. 虚拟机配置成静态ip
    基础虚拟机没有安装ifconfig,安装一下ifconfig:

    1
    sudo yum install net-tools.x86_64

    前面虚拟机选择了默认的内部交换机nat,其中内置的DHCH分配的ip是172.16.0.0/16,为避免ip地址变化,最好配置成静态ip,后续安装Docker UCP需要这个ip:

    • 首先将虚拟交换机nat的ip改成静态192.168.10.1
    • 然后修改虚拟机的ip为192.168.10.10,网关为192.168.10.1
  4. 安装docker ce

    1
    2
    3
    4
    5
    6
    7
    $ sudo yum install -y yum-utils \
    device-mapper-persistent-data \
    lvm2
    $ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
    $ sudo yum install docker-ce docker-ce-cli containerd.io
  5. 启动docker

    1
    2
    $ sudo systemctl start docker
    $ sudo docker run hello-world

准备工作节点

  1. 下载docker,地址https://download.docker.com/components/engine/windows-server/18.09/docker-18.09.6.zip
  2. 解压到D:\docker,安装成Windows服务
    1
    2
    3
    dockerd --register-service
    Start-Service docker
    docker container run hello-world:nanoserver

安装Dockers UCP

  1. 安装管理节点
1
2
3
4
5
6
vagrant ssh
docker container run --rm -it --name ucp \
-v /var/run/docker.sock:/var/run/docker.sock \
docker/ucp:2.2.18 install \
--host-address 192.168.10.10 \
--interactive

上述过程会先拉取docker/ucp:2.2.18镜像,需要一定时间,然后根据交互提示一步步进行安装。

  1. 安装工作节点

    • 设置防火墙策略等
    1
    2
    3
    $script = [ScriptBlock]::Create((docker run --rm docker/ucp-agent-win:2.2.18 windows-script | Out-String))

    Invoke-Command $script

上述过程会先拉取docker/ucp-agent-win:2.2.18镜像,需要一定时间。

  • 修改daemon.json

    增加"labels": [“os=windows”]

  1. 验证Docker UCP前端界面:https://192.168.10.10
  2. 工作节点接入集群

    通过Dockers UCP界面上可以得到节点加入集群的命令,也可以登录到管理节点上通过命令行得到。在工作节点上运行上述命令,就加入到集群。再回到Dockers UCP界面上就可以看到工作节点加入进来。

问题

上述搭建过程还算顺利,问题出在最后一步,工作节点加入集群后,在节点列表中Windows工作节点状态总不正常,只成功过一次,工作节点CPU利用率等信息都显示出来了,后来再试就一直卡在如下错误:

可能的问题原因是工作节点容器网络中没有overlay网络,在成功的那一次中,在工作节点加入集群后通过docker network ls可以看到overlay网络,但是后来再试就没有同步到overlay网络。可能的原因是Default Switch导致,在成功的那一次我删除了Default Switch,但是后来再这样做,overlay网络仍然不存在。

工作节点加入集群还遇到如下一些问题:

  1. 工作节点虚拟内存设置太小

    {“level”:“error”,“msg”:“Failed to start proxy. Run “docker logs ucp-proxy” for more details”,“time”:“2019-05-12T17:18:49+08:00”}
    {“level”:“fatal”,“msg”:"unable to reconcile state of Docker Proxy component: Error response from daemon: CreateComputeSystem 1bbffaab2a7609e6b21cdeea0b3b0b11204d86e7629c2
    077646119141fcd8682: The paging file is too small for this operation to completen(extra info: {“SystemType”:“Container”,“Name”:"1bbffaab2a7609e6b21cdeea0b3b0b112

  2. 虚拟网卡设置为静态IP后虚拟,需要保留hyper-v网络内部ip,否则在节点列表中显示如下错误信息:

    This Windows node cannot connect to its local Docker daemon. Make
    sure the Docker daemon is set up correctly on that node. See
    https://www.docker.com/ddc-34 for more information.
    应该如下设置:

  3. MTU问题,在如下case中提到MTU问题,不确定是否在我遇到的问题中起到作用
    参考:https://success.docker.com/article/newly-added-windows-node-reports-awaiting-healthy-status-in-classic-node-inventory
  4. 经过多次折腾之后,windows启动dockerd报如下错误:

    Error starting daemon: Error initializing network controller: Error creating default network: hnsCall failed in Win32: A network with this name already exists. (0x803b0010)
    解决方法是执行了,已经没有心思细究根源了:

    1
    netcfg -d
-------------本文结束感谢您的阅读-------------