手头刚好有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,点确定。如果已经开启则跳过此步。
准备管理节点
-
安装vagrant,下载地址https://releases.hashicorp.com/vagrant/2.2.4/vagrant_2.2.4_x86_64.msi
-
使用官方的centos/7虚拟机模板建立虚拟机,注意这里选择Hyper-V驱动,因为Windows容器必须使用hyper-v虚拟化,而VirtualBox的虚拟化技术依赖vt-x,Hyper-V和vt-x是冲突的,开启Hyper-V后会自动关闭vt-x,因此无法使用VirtualBox虚拟机。
1
2vagrant 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? -
虚拟机配置成静态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
-
安装docker ce
1
2
3
4
5
6
7sudo 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 -
启动docker
1
2sudo systemctl start docker
sudo docker run hello-world
准备工作节点
- 下载docker,地址https://download.docker.com/components/engine/windows-server/18.09/docker-18.09.6.zip
- 解压到D:\docker,安装成Windows服务
1
2
3dockerd --register-service
Start-Service docker
docker container run hello-world:nanoserver
安装Dockers UCP
- 安装管理节点
1 | vagrant ssh |
上述过程会先拉取docker/ucp:2.2.18镜像,需要一定时间,然后根据交互提示一步步进行安装。
-
安装工作节点
- 设置防火墙策略等
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”]
- 验证Docker UCP前端界面:https://192.168.10.10
- 工作节点接入集群
通过Dockers UCP界面上可以得到节点加入集群的命令,也可以登录到管理节点上通过命令行得到。在工作节点上运行上述命令,就加入到集群。再回到Dockers UCP界面上就可以看到工作节点加入进来。
问题
上述搭建过程还算顺利,问题出在最后一步,工作节点加入集群后,在节点列表中Windows工作节点状态总不正常,只成功过一次,工作节点CPU利用率等信息都显示出来了,后来再试就一直卡在如下错误:
可能的问题原因是工作节点容器网络中没有overlay网络,在成功的那一次中,在工作节点加入集群后通过docker network ls可以看到overlay网络,但是后来再试就没有同步到overlay网络。可能的原因是Default Switch导致,在成功的那一次我删除了Default Switch,但是后来再这样做,overlay网络仍然不存在。
工作节点加入集群还遇到如下一些问题:
- 工作节点虚拟内存设置太小
{“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 - 虚拟网卡设置为静态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.
应该如下设置:
- MTU问题,在如下case中提到MTU问题,不确定是否在我遇到的问题中起到作用
参考:https://success.docker.com/article/newly-added-windows-node-reports-awaiting-healthy-status-in-classic-node-inventory - 经过多次折腾之后,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