前言: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/kubernetes/blob/master/CHANGELOG-1.9.md#windows
解压后windows的可执行文件在node/bin下面,共有4个文件,我们只需要kubelet.exe和kube-proxy.exe即可。
二、服务器基础环境配置
1.开启Hyper-v和RRAS功能,要求服务器启动硬件虚拟化功能,如Intel的VT,否则docker无法安装,注意:大部分云主机不支持这个功能,云主机是虚拟机,这里要求虚拟机开启硬件虚拟化。可按照此文档开启Windows server 2016的RRAS功能http://youritsource.org/msft/how-to-install-and-configure-rras-routing-and-remote-access-vpn-in-windows-server-2012-and-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:ProgramFilesDocker,将dockerd服务设置为系统自启动服务,启动docker即可。
或者使用下图的命令来完成上面的步骤,注意这边docker安装包放在桌面的k8s目录下:
在c:ProgramDatadockerconfigdaemon.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:UsersAdministrator
在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节点增加路由:
route add 10.2.0.0 mask255.255.255.0 10.2.0.1 if -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主机。