Note: Note: 这些说明最近基于 Windows Server 平台增强和 Kubernetes v1.9 版本进行了更新
Kubernetes 1.5 版本基于 Windows Server 2016 操作系统引入了对 Windows Server 容器 的 Alpha 支持。随着 Windows Server 版本 1709 的发布和使用 Kubernetes v1.9,用户可以使用许多不同的 网络拓扑和 CNI 插件在本地或私有/公共云中部署 Kubernetes 集群。Kubernetes 上的 Windows Server 容器的一些 关键功能改进包括:
Kubernetes 控制平面(API服务器,调度程序,控制器管理器等)继续在 Linux 上运行,而 kubelet 和 kube-proxy 可以在 Windows Server 2016 或更高版本上运行
Note: Note: Kubernetes 上的 Windows Server 容器是 Kubernetes v1.9 中的一个 Beta 特性
我们建议使用可以在 https://github.com/kubernetes/kubernetes/releases/latest 上找到的发布的二进制文件。在更新日志下您可以找到 Windows-amd64 的节点二进制文件链接,其中包括 kubeadm,kubectl,kubelet 和 kube-proxy。
如果您希望自己构建代码,请参阅此处的详细构建说明。
在 Kubernetes 1.9 或更高版本中,使用以下内容支持 Kubernetes 的 Windows Server 容器:
Windows 上有几种支持 Kubernetes v1.9 的网络配置,包括使用第三方网络插件的第三层路由和覆盖拓扑。
选择要部署的网络配置和拓扑取决于物理网络拓扑和用户配置路由的能力,封装的性能问题以及与第三方网络插件集成的要求。
另外两个 CNI 插件 [win-l2bridge(主机网关)和 win-overlay(vxlan)] 正在进行 PR 审核。这两个 CNI 插件准备好后,既可以直接使用,也可以与 Flannel 一起使用。
Linux 上已经使用桥接接口支持上述网络方法,桥接接口基本上创建了节点本地的专用网络。与 Windows 端类似,必须创建到所有其他 pod CIDR 的路由才能通过”公共” NIC 发送数据包。
Windows 支持 CNI 网络模型,并使用插件与 Windows 主机网络服务(HNS)连接以配置主机网络和策略。在撰写本文时,Microsoft 唯一公开提供的 CNI 插件是从私人存储库构建的,可在此处获得wincni.exe。它使用由管理员在每个节点上使用 HNS PowerShell 命令通过 Windows 主机网络服务(HNS)创建的 l2bridge 网络,如下面的 Windows 主机设置部分所述。未来CNI插件的源代码将公开发布
在这种拓扑结构中,通过在机架 (ToR)交换机/路由器的上游顶部配置静态 IP 路由,使用L3路由实现网络连接。每个群集节点都通过主机 IP 连接到管理网络。此外,每个节点使用本地’l2bridge’网络,并分配了一个 pod CIDR。给定工作节点上的所有 pod 将连接到 pod CIDR 子网(‘l2bridge’网络)。为了在不同节点上运行的 pod 之间实现网络通信,上游路由器配置了静态路由 pod CIDR 前缀 => 主机 IP。
以下示例图说明了使用上游 L3 路由设置的 Kubernetes 的 Windows Server 网络设置:
这种拓扑与上游 L3 路由拓扑相似,惟一的区别是静态 IP 路由是直接在每个集群节点上配置的,而不是在上游 ToR 中配置的。每个节点使用本地的 ‘l2bridge’ 网络,并像以前一样分配 pod CIDR,并为分配给远程集群节点的所有其他 pod CIDR 子网提供路由表条目。
下图概述了组件之间的体系结构和交互:
(上图来自 https://github.com/openvswitch/ovn-kubernetes#overlay-mode-architecture-diagram)
由于它的体系结构,OVN 有一个中央组件,它将您的网络意图存储在数据库中。其他组件如 kube-apiserver、kube-controller-manager、kube-scheduler 等也可以部署在该中心节点上。
要在 Kubernetes 上运行 Windows Server 容器,您需要为 Windows 设置主机和 Kubernetes 节点组件。根据您的网络拓扑,可能需要为不同节点上的 pod 通信设置路由。
Windows CNI 配置示例
Windows CNI 插件基于 wincni.exe 的,配置文件,是基于上面显示的 ToR 示例图,指定了应用于 Windows node-1 的配置。特别有趣的是 Windows node-1 pod CIDR(10.10.187.64/26) 和 cbr0(10.10.187.66)的关联网关。异常列表指定服务 CIDR(11.0.0.0/8),集群 CIDR(10.10.0.0/16) 和管理(或主机) CIDR(10.127.132.128/25)。
注意:此文件假设用户以前使用
{
"cniVersion": "0.2.0",
"name": "l2bridge",
"type": "wincni.exe",
"master": "Ethernet",
"ipam": {
"environment": "azure",
"subnet": "10.10.187.64/26",
"routes": [{
"GW": "10.10.187.66"
}]
},
"dns": {
"Nameservers": [
"11.0.0.10"
]
},
"AdditionalArgs": [{
"Name": "EndpointPolicy",
"Value": {
"Type": "OutBoundNAT",
"ExceptionList": [
"11.0.0.0/8",
"10.10.0.0/16",
"10.127.132.128/25"
]
}
},
{
"Name": "EndpointPolicy",
"Value": {
"Type": "ROUTE",
"DestinationPrefix": "11.0.0.0/8",
"NeedEncap": true
}
},
{
"Name": "EndpointPolicy",
"Value": {
"Type": "ROUTE",
"DestinationPrefix": "10.127.132.213/32",
"NeedEncap": true
}
}
]
}
Note: Note: 通过 Ansible 剧本的全自动设置是可用的。
对于手动设置,请继续以下步骤。
设置中心节点和所需组件超出了本文档的范围。您可以阅读这些说明。
添加 Linux minion 也超出了范围,你可以在这里阅读:Linux minion。
添加 Windows minion 需要您安装 OVS 和 OVN 二进制文件。运行所需 Windows Server 和 Docker 版本的 Windows Server 容器主机。请按照此帮助主题概述的设置说明进行操作。从 Windows Server 2016 RTM 开始支持此类部署。
编译 OVS 并生成安装程序不在本文中讨论。请访问此链接。对于预构建的认证安装程序,请访问此链接并下载最新版本
以下指南使用预构建的认证安装程序。
安装 OVS 既可以通过 GUI 对话框完成,也可以在无人看管的情况下完成。将 Windows 主机添加到您的设置需要您拥有OVN主机
和默认安装特性。下面是需要安装的对话框图像:
对于无人看管情况下的安装,请使用以下命令:
cmd /c 'msiexec /i openvswitch.msi ADDLOCAL="OpenvSwitchCLI,OpenvSwitchDriver,OVNHost" /qn'
安装程序设置新的环境变量。请使用命令打开一个新的 shell 或注销/登录,以确保刷新了环境变量。
对于叠加,Windows 上的 OVS 需要透明的 docker 网络才能正常运行。请使用以下命令创建一个透明的 docker 网络,OVS 将使用该网络。powershell:
docker network create -d transparent --gateway $GATEWAY_IP --subnet $SUBNET `
-o com.docker.network.windowsshim.interface="$INTERFACE_ALIAS" external
$SUBNET 是用于产生 pods 的 minion 子网(将由 kubernetes 使用的子网),$GATEWAY_IP 是 $SUBNET 的第一个 IP,$INTERFACE_ALIAS 是用于创建覆盖隧道的接口(必须与 OVN 主机的 rests 连接)。 例:
docker network create -d transparent --gateway 10.0.1.1 --subnet 10.0.1.0/24 `
-o com.docker.network.windowsshim.interface="Ethernet0" external
创建 docker 网络后,请从 powershell 运行下面的命令。(创建OVS桥接器,在桥接器下添加接口,并启用OVS转发交换机扩展名)
$a = Get-NetAdapter | where Name -Match HNSTransparent
Rename-NetAdapter $a[0].Name -NewName HNSTransparent
Stop-Service ovs-vswitchd -force; Disable-VMSwitchExtension "Cloudbase Open vSwitch Extension";
ovs-vsctl --no-wait del-br br-ex
ovs-vsctl --no-wait --may-exist add-br br-ex
ovs-vsctl --no-wait add-port br-ex HNSTransparent -- set interface HNSTransparent type=internal
ovs-vsctl --no-wait add-port br-ex $INTERFACE_ALIAS
Enable-VMSwitchExtension "Cloudbase Open vSwitch Extension"; sleep 2; Restart-Service ovs-vswitchd
除此之外,Windows主机的设置与Linux主机相同。从这里开始执行以下步骤。
Windows CNI 设置
现在,Windows OVN&OVS CNI 插件是基于 ovn_cni.exe 可以从此处下载。CNI 配置文件示例如下:
{
"name": "net",
"type": "ovn_cni.exe",
"bridge": "br-int",
"isGateway": "true",
"ipMasq": "false",
"ipam": {
"type": "host-local",
"subnet": "$SUBNET"
}
}
$SUBNET 是上一个 docker network create
命令中使用的子网。
有关谷歌云平台(GCP),即谷歌计算引擎(GCE)的完整指南,请访问这里。
有关亚马逊网络服务(AWS),请访问这里。
要启动集群,您需要启动基于 Linux 的 Kubernetes 控制平面和基于 Windows Server 的 Kubernetes 节点组件(kubelet 和 kube-proxy)。对于 OVS 和 OVN,仅需要 kubelet。
使用您喜欢的方法在 Linux 上启动 Kubernetes 集群。请注意,集群 CIDR 可能需要更新。
如果您的群集是由kubeadm,创建的 使用上面列出的方法之一正确地设置网络(网络是在 kubeadm 之外设置的),您可以使用 kubeadm 向集群添加 Windows 节点。在较高的级别上,首先必须使用 kubeadm(Linux) 初始化主节点,然后设置基于 CNI 的网络(在 kubeadm 之外),最后开始将 Windows 或 Linux 工作节点连接到集群。如需其他文件和参考资料,请访问上文的 kubeadm 链接。
kubeadm 二进制文件可以在 Kubernetes 版本的节点二进制文件归档中找到。添加 Windows 节点与添加 Linux 节点没有任何不同:
kubeadm.exe join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>
有关更多详细信息请参阅加入您的节点。
下面列出的示例假设在 Windows Server 1709 上运行 Windows 节点。如果您正在运行 Windows Server 2016,示例将需要更新镜像以指定 image: microsoft/windowsservercore:ltsc2016
。这是因为在使用进程隔离时,需要容器镜像匹配主机操作系统版本。不指定标记将隐式地使用 :latest
标记,这可能导致令人惊讶的行为。有关 Windows Service Core 镜像标记的更多信息,请与https://hub.docker.com/r/microsoft/windowsservercore/联系。
由于您的群集同时具有 Linux 和 Windows 节点,因此必须明确设置 nodeSelector 约束以便能够将 pod 安排到 Windows 节点。必须将 nodeSelector 的标签 beta.kubernetes.io/os 设置为值 windows; 请参阅以下示例:
windows/simple-pod.yaml
|
---|
|
Note: Note: 本例假设您在 Windows Server 1709 上运行,因此使用镜像标记来支持它。如果使用不同的版本,则需要更新标记。例如,如果在 Windows Server 2016 上,更新为使用"image": "microsoft/iis"
,默认为该操作系统版本。
secret和configmap可以在Windows Service 容器中使用,但是必须作为环境变量使用。有关更多细节,请参见下面的限制部分。
例子:
Windows pod 与 secrets 映射到环境变量
windows/secret-pod.yaml
|
---|
|
具有 configMap 值的 Windows Pod 映射到环境变量
windows/configmap-pod.yaml
|
---|
|
一些受支持的卷挂载可以是本地卷,emptyDir 卷和主机路径卷。需要记住的一点是,路径必须转义,或者使用前斜杠,例如:mountPath: "C:\\etc\\foo"
or mountPath: "C:/etc/foo"
。
对于受支持的卷类型,支持持久卷的声明。
例子:
带有主机路径卷的 Windows pod
windows/hostpath-volume-pod.yaml
|
---|
|
具有多个 emptyDir 卷的 Windows pod
windows/emptydir-pod.yaml
|
---|
|
支持守护线程集
windows/daemonset.yaml
|
---|
|
Windows Stats 使用混合模型:pod 和容器级别的统计数据来自 CRI(通过 dockershim),而节点级别的统计数据来自“winstats”包,该包使用特定于 Windows 的 perf 计数器导出 cadvisor 之类的数据结构。
现在可以为 v1.10 中的 windows 容器设置容器资源(CPU和内存)。
windows/deploy-resource.yaml
|
---|
|
Hyper-V 容器在 v1.10 中作为实验支持。要创建 Hyper-V 容器,kubelet 应该从特性 gates HyperVContainer=true
开始,Pod 应该包含注释 experimental.windows.kubernetes.io/isolation-type=hyperv
。
windows/deploy-hyperv.yaml
|
---|
|
从 kubernetes v1.11 开始,kubelet 和 kube-proxy 可以作为 Windows 服务运行。
这意味着您现在可以通过 sc
命令将它们注册为 Windows 服务。有关如何使用 sc
创建 Windows 服务的更多细节,请参阅此处。
例子:
创建服务
PS > sc.exe create <component_name> binPath= "<path_to_binary> --service <other_args>"
CMD > sc create <component_name> binPath= "<path_to_binary> --service <other_args>"
请注意,如果参数包含空格,则必须对其进行转义。例:
PS > sc.exe create kubelet binPath= "C:\kubelet.exe --service --hostname-override 'minion' <other_args>"
CMD > sc create kubelet binPath= "C:\kubelet.exe --service --hostname-override 'minion' <other_args>"
启动服务:
PS > Start-Service kubelet; Start-Service kube-proxy
CMD > net start kubelet && net start kube-proxy
停止服务
PS > Stop-Service kubelet (-Force); Stop-Service kube-proxy (-Force)
CMD > net stop kubelet && net stop kube-proxy
查询服务
PS > Get-Service kubelet; Get-Service kube-proxy;
CMD > sc.exe queryex kubelet && sc qc kubelet && sc.exe queryex kube-proxy && sc.exe qc kube-proxy
在未来的Kubernetes版本中,社区将解决其中一些限制:
:
)。Kubernetes 目前不允许这样做。根据此处所述,用双下划线 (__
) 替换冒号 (’:‘)--cgroups-per-qos=false --enforce-node-allocatable=""
issue 61716此页是否对您有帮助?
Thanks for the feedback. If you have a specific, answerable question about how to use Kubernetes, ask it on Stack Overflow. Open an issue in the GitHub repo if you want to report a problem or suggest an improvement.