Windows节点加入Kubernetes
原文链接:https://blog.csdn.net/gulang0309/article/details/124315543
Kubernetes官方从1.17版本开始,就具备了将Windows Server加入Kubernetes的能力,通过Kubernetes集群可以操作和纳管Windows Server机器上的容器,但是目前Kubernetes集群支持的Windows系统只有Windows Server。本文主要记录将Windows Server虚拟机加入到Kubernetes的详细过程。有参考大佬的文章,具体参考链接会在文末给出,本文做总结和补充(ps:过程比较漫长,步骤较多,还是有很多坑)
一、环境准备
Linux节点系统要求:
Centos7(2处理器2核,8G内存,50G硬盘)
Kubernetes版本:1.23.5
Docker版本:20.10.14
Windows Server节点系统要求:
Windows Server 2019(2处理器2核,8G内存,60G硬盘)
Kubernetes版本:1.23.5
Docker版本:20.10.9
注意:
1、Windows Server启动后先不要去主动升级系统(Windows Server加入集群的前提是需要安装一个指定的补丁KB4489899,主动升级可能会因为安装了别的补丁包带来冲突,导致不能安装该补丁,后续会说明为什么要安装该补丁)
2、Windows Server虚拟机需要开启虚拟化
或者,如果是实体服务器:
在Powershell中
Install-WindowsFeature -Name Hyper-V
Install-WindowsFeature -Name containers
Restart-computer
二、集群部署
1、集群搭建
通过kubeadm搭建集群,具体方法和步骤请查看[https://www.cnblogs.com/Principles/p/CloudComputing_001.html]
注意事项:
使用flannel需要为iptables开启IPv4流处理,所有Linux节点都需要开启(集群搭建过程中已开启则略过此步骤)
sudo sysctl net.bridge.bridge-nf-call-iptables=1
为docker配置镜像加速(可以在阿里云申请并开通免费的镜像加速服务)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"insecure-registries": [ "harbor.docker.com", "registry.access.redhat.com", "quay.io", "http://f1361db2.m.daocloud.io" ],
"registry-mirrors": [ "http://hub-mirror.c.163.com" ],
"exec-opts": [ "native.cgroupdriver=systemd" ]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2、master节点部署flannel网络插件
1、下载flannel
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
2、修改kube-flannel.yaml(只有将Linux上的VNI设置为4096,port设置为4789;才能与Windows上的flannel实现通信,进而实现互操作),修改后如下所示:
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan",
"VNI": 4096, # 新增
"Port": 4789 # 新增
}
}
3、部署kube-flannel
kubectl apply -f kube-flannel.yaml
4、部署后,docker会拉取镜像并启动,部署成功后如下:
kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-65c54cc984-jvb8k 1/1 Running 0 4h50m
coredns-65c54cc984-lqx5c 1/1 Running 0 4h50m
etcd-master01 1/1 Running 0 4h50m
kube-apiserver-master01 1/1 Running 7 4h50m
kube-controller-manager-master01 1/1 Running 0 4h50m
kube-flannel-ds-brk4n 1/1 Running 0 4h48m
kube-flannel-ds-f5jwv 1/1 Running 0 4h48m
kube-proxy-9f56s 1/1 Running 0 4h50m
kube-proxy-hrk5w 1/1 Running 0 4h49m
kube-scheduler-master01 1/1 Running 0 4h50m
3、master节点部署兼容Windows版本的proxy和flannel
3.1、部署proxy
# 1、下载kube-proxy.yaml
wget https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/kube-proxy.yml
# 2、修改Kubernetes版本
image: sigwindowstools/kube-proxy:VERSION-nanoserver
# 此处修改为Kubernetes版本一致即可,eg:把 VERSION 改成 v1.23.5
# 3、部署
kubectl apply -f kube-proxy.yaml
# 4、部署完成后如下所示,会创建一个名为kube-proxy-windows的daemonset,但是就绪节点为0,观察其对应pod状态,会发现其一直处于pending状态,是因为此时Windows节点还没启动,所以此状态为正常状态,勿慌
kubectl get daemonset -A
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
kube-system kube-flannel-ds 2 2 2 2 2 <none> 5h2m
kube-system kube-proxy 2 2 2 2 2 kubernetes.io/os=linux 5h4m
kube-system kube-proxy-windows 1 1 0 0 0 kubernetes.io/os=windows 4h51m
kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-65c54cc984-jvb8k 1/1 Running 0 5h6m
kube-system coredns-65c54cc984-lqx5c 1/1 Running 0 5h6m
kube-system etcd-master01 1/1 Running 0 5h6m
kube-system kube-apiserver-master01 1/1 Running 7 5h6m
kube-system kube-controller-manager-master01 1/1 Running 0 5h6m
kube-system kube-flannel-ds-brk4n 1/1 Running 0 5h4m
kube-system kube-flannel-ds-f5jwv 1/1 Running 0 5h4m
kube-system kube-proxy-9f56s 1/1 Running 0 5h6m
kube-system kube-proxy-hrk5w 1/1 Running 0 5h5m
kube-system kube-proxy-windows-hjrrj 0/0 Pending 0 4h51m
kube-system kube-scheduler-master01 1/1 Running 0 5h6m
3.2、部署flannel
1、下载flannel-overlay.yaml
wget https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/flannel-overlay.yml
2、修改Windows网卡名称(需要查看Windows网卡名称,默认是Ethernet以太网卡,如果不是,则需要修改)
wins cli process run --path /k/flannel/setup.exe --args "--mode=overlay --interface=Ethernet" # 如果不是,需要修改为Windows的默认网卡名称
wins cli route add --addresses 169.254.169.254
wins cli process run --path /k/flannel/flanneld.exe --args "--kube-subnet-mgr --kubeconfig-file /k/flannel/kubeconfig.yml" --envs "POD_NAME=$env:POD_NAME POD_NAMESPACE=$env:POD_NAMESPACE"
(这个在脚本里写了)
windows执行ipconfig,结果如下,则不需要修改:
以太网适配器 vEthernet (Ethernet0):
连接特定的 DNS 后缀 . . . . . . . : localdomain
本地链接 IPv6 地址. . . . . . . . : xxxx::xxxx:xxxx:xxxx:xxxxxxx
IPv4 地址 . . . . . . . . . . . . : xxx.xxx.xxx.xxx
子网掩码 . . . . . . . . . . . . : xxx.xxx.xxx.xxx
默认网关. . . . . . . . . . . . . : xxx.xxx.xxx.xxx
3、部署
kubectl apply -f flannel-overlay.yaml
4、部署完成后如下所示,会创建一个名为kube-flannel-ds-windows-amd64的daemonset,和kube-proxy一样,此时就绪节点还是0,观察pod状态,会发现其对应pod一直处于pending状态,原因与kube-proxy一致,勿慌
kubectl get daemonset -A
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
kube-system kube-flannel-ds 2 2 2 2 2 <none> 5h20m
kube-system kube-flannel-ds-windows-amd64 1 1 0 0 0 <none> 5h9m
kube-system kube-proxy 2 2 2 2 2 kubernetes.io/os=linux 5h22m
kube-system kube-proxy-windows 1 1 0 0 0 kubernetes.io/os=windows 5h9m
kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-65c54cc984-jvb8k 1/1 Running 0 5h25m
kube-system coredns-65c54cc984-lqx5c 1/1 Running 0 5h25m
kube-system etcd-master01 1/1 Running 0 5h26m
kube-system kube-apiserver-master01 1/1 Running 7 5h26m
kube-system kube-controller-manager-master01 1/1 Running 0 5h26m
kube-system kube-flannel-ds-brk4n 1/1 Running 0 5h24m
kube-system kube-flannel-ds-f5jwv 1/1 Running 0 5h24m
kube-system kube-flannel-ds-windows-amd64-dqmtm 0/0 Pending 0 5h10m
kube-system kube-proxy-9f56s 1/1 Running 0 5h25m
kube-system kube-proxy-hrk5w 1/1 Running 0 5h24m
kube-system kube-proxy-windows-hjrrj 0/0 Pending 0 5h10m
kube-system kube-scheduler-master01 1/1 Running 0 5h26m
三、配置Windows Server
3.1、安装补丁
直接双击补丁文件等待安装完成即可(补丁下载链接在文末)
3.2、安装docker
直接安装Docker Desktop也可以,但是需要将Docker切换到windows平台模式下,该过程可能会出现意料不到的小问题,所以此处直接通过PowerShell命令行安装Docker
# 1、安装docker
Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
Install-Package -Name docker -ProviderName DockerMsftProvider
Restart-Computer -Force
# 2、配置docker,在目录C:\ProgramData\docker\config创建文件daemon.json,并在该文件中添加镜像加速路径
# 3、重启Docker服务
Restart-Service docker
# 4、在Poweroff中查看docker信息
docker info
3.3、安装Kubernetes
3.3.1、下载文件
PrepareNode.ps1部署脚本文件下载:https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/PrepareNode.ps1
wins.exe下载地址:https://github.com/rancher/wins/releases/download/v0.0.4/wins.exe
hns.psm1脚本文件下载地址:https://github.com/Microsoft/SDN/raw/master/Kubernetes/windows/hns.psm1
nssm-2.24.zip下载地址:https://k8stestinfrabinaries.blob.core.windows.net/nssm-mirror/nssm-2.24.zip
Kubernetes二进制文件下载地址(版本需要与Linux集群一致,按照自己的版本修改URL即可):https://dl.k8s.io/v1.23.5/kubernetes-node-windows-amd64.tar.gz
3.3.2、文件处理
在C盘根目录下,创建名为k(部署脚本中指定了名称)的文件夹,并将上一步下载的所有文件拷贝致该目录(留有备份)
右键编辑部署脚本,将DownloadFile函数的调用代码全部用#注释掉
将nssm-2.24.zip文件重命名为nssm.zip
解压缩kubernetes-node-windows-amd64.tar.gz,从解压后的kubernetes\node\bin\目录下,取出kubeadm.exe和kubelet.exe文件到当前目录下
注意:如果是重装,要重新复制文件并按上述修改
3.4、部署Kubernetes
# 1、以管理员运行PowerShell,并将路径切换到C:\k
cd C:\k\
# 2、执行部署脚本(如果版本不同,需要修改版本参数)
.\PrepareNode.ps1 -KubernetesVersion v1.23.5
## 注意,PrepareNode.ps1是Powershell的一个执行脚本,Windows Server会对所有可执行脚本进行认证,这个脚本不是官方的,所以会提示"未对文件PrepareNode.ps1进行数字签名。无法在当前系统上运行该脚本。",如果出现该提示,需要执行以下命令为脚本赋予权限,如下:
Set-ExecutionPolicy -ExecutionPolicy UNRESTRICTED
## 执行该命令后,会出现提示,输入"A"(全是)后,重新执行第2步命令
# 如果执行过程中,出现错误,则需要按照文末的方式,重置Windows Server
注意:PrepareNode.ps1执行成功后,会在C盘根目录下生成几个文件夹,至此,Kubernetes已经安装完成
四、Windows加入集群
1、在master节点上获取加入集群的命令
kubeadm token create --print-join-command
直接拿输出结果在Windows节点的Powershell上执行(注意Powershell的执行方式)
.\kubeadm.exe join xxx.xxx.xxx.xxx:xxxx --token xxx --discovery-token-ca-cert-hash sha256:xxx
加入完成后如下所示
kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-65c54cc984-jvb8k 1/1 Running 0 9h
kube-system coredns-65c54cc984-lqx5c 1/1 Running 0 9h
kube-system etcd-master01 1/1 Running 0 9h
kube-system kube-apiserver-master01 1/1 Running 7 9h
kube-system kube-controller-manager-master01 1/1 Running 0 9h
kube-system kube-flannel-ds-brk4n 1/1 Running 0 9h
kube-system kube-flannel-ds-f5jwv 1/1 Running 0 9h
kube-system kube-flannel-ds-windows-amd64-dqmtm 1/1 Running 0 8h
kube-system kube-proxy-9f56s 1/1 Running 0 9h
kube-system kube-proxy-hrk5w 1/1 Running 0 9h
kube-system kube-proxy-windows-hjrrj 1/1 Running 0 8h
kube-system kube-scheduler-master01 1/1 Running 0 9h
kubectl get daemonset -A
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
kube-system kube-flannel-ds 2 2 2 2 2 <none> 9h
kube-system kube-flannel-ds-windows-amd64 1 1 1 1 1 <none> 8h
kube-system kube-proxy 2 2 2 2 2 kubernetes.io/os=linux 9h
kube-system kube-proxy-windows 1 1 1 1 1 kubernetes.io/os=windows 8h
2、在Windows节点上用docker下载镜像
docker pull sigwindowstools/kube-proxy:v1.23.5-nanoserver
docker pull sigwindowstools/flannel:v0.13.0-nanoserver
3、成功加入
五、Windows卸载Kubernetes
以下命令通过以管理员身份打开的Powershell中执行
5.1、Windows脱离集群
.\kubeadm.exe reset
5.2、删除docker network配置
# 1、查看docker network配置
docker network ls
# 2、删除名称为host的docker network配置
docker network rm host
5.3、停止并删除kubelet、rancher-wins服务
# 停止并删除kubelet
sc.exe stop kubelet
sc.exe delete kubelet
# 停止并删除rancher-wins
sc.exe stop rancher-wins
sc.exe delete rancher-wins
5.4、删除防火墙规则设置删除
依次打开:控制面板->系统和安全->Windows Defender 防火墙->允许的应用,在允许的应用界面。可以找到一条名称为kubelet的规则,点选后删除即可
5.5、重启电脑
通过命令行重启或者手动重启都可以,这一步主要是停止一些Kubernetes的进程,比如kube-proxy、rancher等,需要注意的是,电脑重启后,需要在任务管理器中查看这些进程是否还在,如果还在,手动停止即可
Restart-Computer -Force
5.6、删除脚本生成的文件
删除C盘根目录下etc、opt、run、share、var(这几个目录有就删掉), 重新复制nssm-2.24.zip到k文件夹下,并改名为nssm.zip,在删除过程中,如果出现被占用的提示,就是还存在Kubernetes相关的进程,关闭后重新删除即可。
六、参考文章
Kubernetes官方文档
Windows加入Kubernetes集群
https://kubernetes.io/zh/docs/tasks/administer-cluster/kubeadm/adding-windows-nodes/
Micfosoft官方文档
脚本执行策略文档
Windows容器相关
其他参考
https://www.cnblogs.com/Fengyinyong/p/14701996.html
https://blog.csdn.net/Mr_rsq/article/details/116803503
附:
kube-flannel:https://download.csdn.net/download/gulang0309/85189309
————————————————
版权声明:本文为CSDN博主「费益洲」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/gulang0309/article/details/124315543