前言:K8s 1.14版增加了对windows节点的生产级支持,从1.9就有了对windows的实验性支持,灵雀云在多个客户环境有过实践,去除平台相关的内容后整理成文档,分享给大家。Docker在windows上可以选择Linux模式和Windows模式,两者不能兼容共存:选择linux模式时,pull windows类型镜像会提示平台不兼容,反过来也一样(仓库端是可以同时存放两种镜像的)。

一、环境要求

9ca5dcd5c399162078afc5207121e501.png

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

07658ca8a5ad6627a91776425b25d02a.png

解压后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)。

7166326038161ab1d652da61dcd89eb0.png

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

268c49db2f6c2f4607898bdadfb46679.png

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

d7c4789a9c2499d4022e7296dbf8fb2f.png

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

303c84a29e57483fcb7c43050ceeb011.png

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

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

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

d4f346339bdabffdfe73f9368481b58d.png

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

197b51c8779f60ee2134cb552c2bba9b.png

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

0278cd38d4f419d24746cf33a9ed8cec.png

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

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

1.安装docker ee

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

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

92eadf8b6bc3ff6237434d459e328d02.png

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

ccd61ec227b4529d70d4ebbf429fd5d9.png

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;

ff2edd1aa1d0fc3c2c0813f65ea21953.png

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

d27e3aad4b431ee1591ef78f83c4b7fa.png

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

f1c31a519f7b821b623992fa2e7537a7.png

因为创建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。

6e6516416b0272da962b728ced5b3552.png

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

79a1cc32816e004b41483901fa001d3a.png

准备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主机。

4e2d81f672a479013279ddc14f7423ff.png

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐