前言:
K8s 1.14版增加了对windows节点的生产级支持,从1.9就有了对windows的实验性支持,灵雀云在多个客户环境有过实践,去除平台相关的内容后整理成文档,分享给大家。

Docker在windows上可以选择Linux模式和Windows模式,两者不能兼容共存:选择linux模式时,pull windows类型镜像会提示平台不兼容,反过来也一样(仓库端是可以同时存放两种镜像的)。

一、环境要求
 

1.服务器要求:Windows server2016 datacenter版,内核版本10.0.14393.1944,(或者更高版本,如:windows server 1709系统)要求开启服务器的Hyper-v功能,需要两块网卡,两块网口连接相同的vlan下(在相同的局域网下);

2.Docker版本:docker-17-06-2-ee-7(ee和ce都可以,ee可以自行google下载)

3.K8s集群版本:我们这里使用1.9.8版本,网络用flannel(host-gw),CIDR为10.2.0.0/16,master节点分配的地址池为10.2.0.0/24。github上下载相应的windows客户端包,
https://github.com/kubernetes/ ... ndows  

解压后windows的可执行文件在node/bin下面,共有4个文件,我们只需要kubelet.exe和kube-proxy.exe即可。

二、服务器基础环境配置

1.开启Hyper-v和RRAS功能,要求服务器启动硬件虚拟化功能,如Intel的VT,否则docker无法安装,注意:大部分云主机不支持这个功能,云主机是虚拟机,这里要求虚拟机开启硬件虚拟化。可按照此文档开启Windows server 2016的RRAS功能http://youritsource.org/msft/h ... 2016/,注意下面这项必须勾选,不勾选会导致pod跨主机无法通信(routing)。
 

如果在部署的时候提示下面的错误信息:
 

按住win+r键,输入gpedit.msc:
 

修改左侧菜单路径 计算机配置>管理模板>windows组件>windows远程shell>允许远程shell访问,设置为启用:
 

再次执行上面的步骤即可添加RRAS成功。

Hyper-v功能开启方法类似。

2.确认Hyper-v和RRAS服务已启动
 

如何确认服务的Hyper-v开启成功,在powershell或者cmd窗口执行systeminfo:
 

确认RRAS服务已经启动,在powershell窗口或者按住win+R中输入services.msc:
 

在服务窗口中确认RRAS服务状态为运行中,如果是其它状态点击“启动”按钮,将启动类型设置为“自动”。

三、安装docker并将节点加入k8s集群

1.安装docker ee

将docker包上传到服务器上,将docker安装包解压到c:\ProgramFiles目录下,在环境变量PATH下增加c:\ProgramFiles\Docker,将dockerd服务设置为系统自启动服务,启动docker即可。

或者使用下图的命令来完成上面的步骤,注意这边docker安装包放在桌面的k8s目录下:
 

在c:\ProgramData\docker\config\daemon.json(如果没有这个文件请添加)中增加insecure-registrys,重启docker,在powershell中执行restart-service docker:
 

2.将节点以node角色添加到k8s平台中

首先将第一目第3条中获取的 kubelet.exe 和 kube-proxy.exe 上传到C:\Windows\路径下,(也可以修改系统PATH,添加kube* 所在文件夹,但需要重启,这样我们不需要绝对路径就可以在cmd里执行kube*)然后从 master 节点复制 /etc/kubernetes/kubelet.conf 文件到C:\Users\Administrator

在Powershell中执行

docker network create -dtransparent --gateway 10.2.1.1 --subnet 10.2.1.0/24 alaudanet

创建一个docker的透明网络,名称为alaudanet,地址池设置为windows节点的地址池10.2.1.0/24,网关为10.2.1.1;

这时windows会创建一个Hyper-v的外部虚拟交换机,名称为Layerd_xxx,其中xxx是物理网卡的名称,这边是Ethernet0;
 

同时会增加一个虚拟网口,名称为HNSTransparent:
 

同时我们发现XXX网卡(这边是Ethernet0网卡)的网络配置传递给HNSTransparent网卡,且使用ifconfig看不到那块网卡信息了,查看这块网卡信息如下:
 

因为创建docker网络是随机选择一块物理网卡,因此有可能这块网卡就是设置ipv4地址的网卡,如果存在这种情况,请自行将ipv4地址设置到另一块网卡上(设置方法不在本文档讨论范围内),将HNSTransparent网卡地址设置为10.2.1.1,掩码设置为255.255.255.0,即将HNSTransparent网卡当成alaudanet网络的网关,负责pod中路由转发。

在master节点增加路由:

ip route add 10.2.1.0/24 via<windows节点IP>

在windows节点增加路由:

route add 10.2.0.0 mask255.255.255.0 10.2.0.1 if <设置IP地址的物理网卡接口ID> -p

获取网卡的接口ID,可以在powershell中执行route print|more。
 

增加一个环境变量CONTAINER_NETWORK,值为alaudanet。
 

准备pause镜像(Windows的镜像都特别特别大)

docker pull microsoft/windowsservercore

docker pull apprenda/pause

在powershell中执行,此处master节点IP为168.63.124.71,windows节点的ip为168.63.124.72,注意根据实际环境替换相应的值:

kubelet.exe --hostname-override=168.63.124.72--pod-infra-container-image="apprenda/pause"--resolv-conf=""  --kubeconfig=.\kubelet.conf

kube-proxy.exe --v=3 --proxy-mode=userspace--hostname-override=168.63.124.72 --master=168.63.124.71:6443--bind-address=168.63.124.72

这时在k8s集群中就能看到该节点,部署Windows的应用时需要通过标签选择Win主机。