Windows
Kubernetes 从 v1.5 开始支持 alpha 版的 Windows 节点,并从 v1.9 开始升级为 beta 版。Windows 容器的主要特性包括
  • Windows 容器支持 Pod(isolation=process)
  • 基于 Virtual Filtering Platform (VFP) Hyper-v Switch Extension 的内核负载均衡
  • 基于 Container Runtime Interface (CRI) 管理 Windows 容器
  • 支持 kubeadm 命令将 Windows 节点加入到已有集群中
  • 推荐使用 Windows Server Version 1803+ 和 Docker Version 17.06+
注意:
  1. 1.
    控制平面的服务依然运行在 Linux 服务器中,而 Windows 节点上只运行 Kubelet、Kube-proxy、Docker 以及网络插件等服务。
  2. 2.
    推荐使用 Windows Server 1803(修复了 Windows 容器软链接的问题,从而 ServiceAccount 和 ConfigMap 可以正常使用)

下载

可以从 https://github.com/kubernetes/kubernetes/releases 下载已发布的用于 Windows 服务器的二进制文件,如
1
wget https://dl.k8s.io/v1.15.0/kubernetes-node-windows-amd64.tar.gz
Copied!
或者从 Kubernetes 源码编译
1
go get -u k8s.io/kubernetes
2
cd $GOPATH/src/k8s.io/kubernetes
3
4
# Build the kubelet
5
KUBE_BUILD_PLATFORMS=windows/amd64 make WHAT=cmd/kubelet
6
7
# Build the kube-proxy
8
KUBE_BUILD_PLATFORMS=windows/amd64 make WHAT=cmd/kube-proxy
9
10
# You will find the output binaries under the folder _output/local/bin/windows/
Copied!

网络插件

Windows Server 中支持以下几种网络插件(注意 Windows 节点上的网络插件要与 Linux 节点相同)
  1. 1.
    wincni 等 L3 路由网络插件,路由配置在 TOR 交换机、路由器或者云服务中
  2. 4.
    Flannel v0.10.0+
  3. 5.
    Calico v3.0.1+
  4. 6.
  5. 7.
更多网络拓扑模式请参考 Windows container network drivers

L3 路由拓扑

wincni 网络插件配置示例
1
{
2
"cniVersion": "0.2.0",
3
"name": "l2bridge",
4
"type": "wincni.exe",
5
"master": "Ethernet",
6
"ipam": {
7
"environment": "azure",
8
"subnet": "10.10.187.64/26",
9
"routes": [{
10
"GW": "10.10.187.66"
11
}]
12
},
13
"dns": {
14
"Nameservers": [
15
"11.0.0.10"
16
]
17
},
18
"AdditionalArgs": [{
19
"Name": "EndpointPolicy",
20
"Value": {
21
"Type": "OutBoundNAT",
22
"ExceptionList": [
23
"11.0.0.0/8",
24
"10.10.0.0/16",
25
"10.127.132.128/25"
26
]
27
}
28
},
29
{
30
"Name": "EndpointPolicy",
31
"Value": {
32
"Type": "ROUTE",
33
"DestinationPrefix": "11.0.0.0/8",
34
"NeedEncap": true
35
}
36
},
37
{
38
"Name": "EndpointPolicy",
39
"Value": {
40
"Type": "ROUTE",
41
"DestinationPrefix": "10.127.132.213/32",
42
"NeedEncap": true
43
}
44
}
45
]
46
}
Copied!

OVS 网络拓扑

部署

kubeadm

如果 Master 是通过 kubeadm 来部署的,那 Windows 节点也可以使用 kubeadm 来部署:
1
kubeadm.exe join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>
Copied!

Azure

在 Azure 上面推荐使用 acs-engine 自动部署 Master 和 Windows 节点。
首先创建一个包含 Windows 的 Kubernetes 集群配置文件 windows.json
1
{
2
"apiVersion": "vlabs",
3
"properties": {
4
"orchestratorProfile": {
5
"orchestratorType": "Kubernetes",
6
"orchestratorVersion": "1.11.1",
7
"kubernetesConfig": {
8
"networkPolicy": "none",
9
"enableAggregatedAPIs": true,
10
"enableRbac": true
11
}
12
},
13
"masterProfile": {
14
"count": 3,
15
"dnsPrefix": "kubernetes-windows",
16
"vmSize": "Standard_D2_v3"
17
},
18
"agentPoolProfiles": [
19
{
20
"name": "windowspool1",
21
"count": 3,
22
"vmSize": "Standard_D2_v3",
23
"availabilityProfile": "AvailabilitySet",
24
"osType": "Windows"
25
}
26
],
27
"windowsProfile": {
28
"adminUsername": "<your-username>",
29
"adminPassword": "<your-password>"
30
},
31
"linuxProfile": {
32
"adminUsername": "azure",
33
"ssh": {
34
"publicKeys": [
35
{
36
"keyData": "<your-ssh-public-key>"
37
}
38
]
39
}
40
},
41
"servicePrincipalProfile": {
42
"clientId": "",
43
"secret": ""
44
}
45
}
46
}
Copied!
然后使用 acs-engine 部署:
1
# create a new resource group.
2
az group create --name myResourceGroup --location "centralus"
3
4
# start deploy the kubernetes
5
acs-engine deploy --resource-group myResourceGroup --subscription-id <subscription-id> --auto-suffix --api-model windows.json --location centralus --dns-prefix <dns-prefix>
6
7
# setup kubectl
8
export KUBECONFIG="$(pwd)/_output/<name-with-suffix>/kubeconfig/kubeconfig.centralus.json"
9
kubectl get node
Copied!

手动部署

(1) 在 Windows Server 中 安装 Docker
1
Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
2
Install-Package -Name Docker -ProviderName DockerMsftProvider
3
Restart-Computer -Force
Copied!
(2) 根据前面的下载部分下载 kubelet.exe 和 kube-proxy.exe
(3) 从 Master 节点上面拷贝 Node spec file (kube config)
(4) 配置 CNI 网络插件和基础镜像
1
wget https://github.com/Microsoft/SDN/archive/master.zip -o master.zip
2
Expand-Archive master.zip -DestinationPath master
3
mkdir C:/k/
4
mv master/SDN-master/Kubernetes/windows/* C:/k/
5
rm -recurse -force master,master.zip
Copied!
1
docker pull microsoft/windowsservercore:1709
2
docker tag microsoft/windowsservercore:1709 microsoft/windowsservercore:latest
3
cd C:/k/
4
docker build -t kubeletwin/pause .
Copied!
(5) 使用 start-kubelet.ps1 启动 kubelet.exe,并使用 start-kubeproxy.ps1 启动 kube-proxy.exe
1
./start-kubelet.ps1 -ClusterCidr 192.168.0.0/16
2
./start-kubeproxy.ps1
Copied!
(6) 如果使用 Host-Gateway 网络插件,还需要使用 AddRoutes.ps1 添加静态路由
详细的操作步骤可以参考 这里

运行 Windows 容器

使用 NodeSelector beta.kubernetes.io/os: windows 将容器调度到 Windows 节点上,比如
1
apiVersion: extensions/v1beta1
2
kind: Deployment
3
metadata:
4
name: iis
5
spec:
6
replicas: 1
7
template:
8
metadata:
9
labels:
10
app: iis
11
spec:
12
nodeSelector:
13
beta.kubernetes.io/os: windows
14
containers:
15
- name: iis
16
image: microsoft/iis
17
resources:
18
limits:
19
memory: "128Mi"
20
cpu: 2
21
ports:
22
- containerPort: 80
23
---
24
apiVersion: v1
25
kind: Service
26
metadata:
27
labels:
28
app: iis
29
name: iis
30
namespace: default
31
spec:
32
ports:
33
- port: 80
34
protocol: TCP
35
targetPort: 80
36
selector:
37
app: iis
38
type: NodePort
Copied!
运行 DaemonSet
1
apiVersion: extensions/v1beta1
2
kind: DaemonSet
3
metadata:
4
name: my-DaemonSet
5
labels:
6
app: foo
7
spec:
8
template:
9
metadata:
10
labels:
11
app: foo
12
spec:
13
containers:
14
- name: foo
15
image: microsoft/windowsservercore:1709
16
nodeSelector:
17
beta.kubernetes.io/os: windows
Copied!

已知问题

Secrets 和 ConfigMaps 只能以环境变量的方式使用

1709和更早版本有这个问题,升级到 1803 即可解决。

Volume 支持情况

Windows 容器暂时只支持 local、emptyDir、hostPath、AzureDisk、AzureFile 以及 flexvolume。注意 Volume 的路径格式需要为 mountPath: "C:\\etc\\foo" 或者 mountPath: "C:/etc/foo"
1
apiVersion: v1
2
kind: Pod
3
metadata:
4
name: hostpath-pod
5
spec:
6
containers:
7
- name: hostpath-nano
8
image: microsoft/nanoserver:1709
9
stdin: true
10
tty: true
11
volumeMounts:
12
- name: blah
13
mountPath: "C:\\etc\\foo"
14
readOnly: true
15
nodeSelector:
16
beta.kubernetes.io/os: windows
17
volumes:
18
- name: blah
19
hostPath:
20
path: "C:\\AzureData"
Copied!
1
apiVersion: v1
2
kind: Pod
3
metadata:
4
name: empty-dir-pod
5
spec:
6
containers:
7
- image: microsoft/nanoserver:1709
8
name: empty-dir-nano
9
stdin: true
10
tty: true
11
volumeMounts:
12
- mountPath: /cache
13
name: cache-volume
14
- mountPath: C:/scratch
15
name: scratch-volume
16
volumes:
17
- name: cache-volume
18
emptyDir: {}
19
- name: scratch-volume
20
emptyDir: {}
21
nodeSelector:
22
beta.kubernetes.io/os: windows
Copied!

镜像版本匹配问题

Windows Server version 1709 中必须使用带有 1709 标签的镜像,如
  • microsoft/aspnet:4.7.1-windowsservercore-1709
  • microsoft/windowsservercore:1709
  • microsoft/iis:windowsservercore-1709
同样,在 Windows Server version 1803 中必须使用带有 1803 标签的镜像。而在 Windows Server 2016 上需要使用带有 ltsc2016 标签的镜像,如 microsoft/windowsservercore:ltsc2016

设置 CPU 和内存

从 v1.10 开始,Kubernetes 支持给 Windows 容器设置 CPU 和内存:
1
apiVersion: apps/v1
2
kind: Deployment
3
metadata:
4
name: iis
5
spec:
6
replicas: 3
7
template:
8
metadata:
9
labels:
10
app: iis
11
spec:
12
containers:
13
- name: iis
14
image: microsoft/iis
15
resources:
16
limits:
17
memory: "128Mi"
18
cpu: 2
19
ports:
20
- containerPort: 80
Copied!

Hyper-V 容器

从 v1.10 开始支持 Hyper-V 隔离的容器(Alpha)。 在使用之前,需要配置 kubelet 开启 HyperVContainer 特性开关。然后使用 Annotation experimental.windows.kubernetes.io/isolation-type=hyperv 来指定容器使用 Hyper-V 隔离:
1
apiVersion: apps/v1
2
kind: Deployment
3
metadata:
4
name: iis
5
spec:
6
replicas: 3
7
template:
8
metadata:
9
labels:
10
app: iis
11
annotations:
12
experimental.windows.kubernetes.io/isolation-type: hyperv
13
spec:
14
containers:
15
- name: iis
16
image: microsoft/iis
17
ports:
18
- containerPort: 80
Copied!

其他已知问题

  • 仅 Windows Server 1709 或更新的版本才支持在 Pod 内运行多个容器(仅支持 Process 隔离)
  • 暂不支持 StatefulSet
  • 暂不支持 Windows Server Container Pods 的自动扩展(Horizontal Pod Autoscaling)
  • Windows 容器的 OS 版本需要与 Host OS 版本匹配,否则容器无法启动
  • 使用 L3 或者 Host GW 网络时,无法从 Windows Node 中直接访问 Kubernetes Services(使用 OVS/OVN 时没有这个问题)
  • 在 VMWare Fusion 的 Window Server 中 kubelet.exe 可能会无法启动(已在 #57124 中修复)
  • 暂不支持 Weave 网络插件
  • Calico 网络插件仅支持 Policy-Only 模式
  • 对于需要使用 : 作为环境变量的 .NET 容器,可以将环境变量中的 : 替换为 __(参考 这里

附录:Docker EE 安装方法

安装 Docker EE 稳定版本
1
Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
2
Install-Package -Name docker -ProviderName DockerMsftProvider
3
Restart-Computer -Force
Copied!
安装 Docker EE 预览版本
1
Install-Module DockerProvider
2
Install-Package -Name Docker -ProviderName DockerProvider -RequiredVersion preview
Copied!
升级 Docker EE 版本
1
# Check the installed version
2
Get-Package -Name Docker -ProviderName DockerMsftProvider
3
4
# Find the current version
5
Find-Package -Name Docker -ProviderName DockerMsftProvider
6
7
# Upgrade Docker EE
8
Install-Package -Name Docker -ProviderName DockerMsftProvider -Update -Force
9
Start-Service Docker
Copied!

参考文档

最近更新 2yr ago