栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Windows加入Kubernetes集群

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Windows加入Kubernetes集群

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

注意:

  • Windows Server虚拟机需要开启虚拟化,如下所示:

  • Windows Server启动后先不要去主动升级系统(Windows Server加入集群的前提是需要安装一个指定的补丁KB4489899,主动升级可能会因为安装了别的补丁包带来冲突,导致不能安装该补丁,后续会说明为什么要安装该补丁)

名称类型系统Kubernetes组件
mastermaster nodecentoskubeadm、kubectl、kubelet
node01worker nodecentoskubeadm、kubelet
win-g5fin5u6eodworker nodeWindows Serverkubeadm.exe、kubelet.exe
二、集群部署 1、集群搭建

通过kubeadm搭建集群,具体方法和步骤请查看之前的文章

注意事项:

  • 使用flannel需要为iptables开启IPv4流处理,所有Linux节点都需要开启

    # 1、为iptables开启IPv4流处理(集群搭建过程中已开启则略过此步骤)
    sudo sysctl net.bridge.bridge-nf-call-iptables=1
    
  • 为docker配置镜像加速(可以在阿里云申请并开通免费的镜像加速服务)

    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"] # 替换为自己的镜像加速地址
    }
    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: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                                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                                5h20m
kube-system   kube-flannel-ds-windows-amd64   1         1         0       0            0                                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:ProgramDatadockerconfig创建文件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、文件处理
  1. 在C盘根目录下,创建名为k(部署脚本中指定了名称)的文件夹,并将上一步下载的所有文件拷贝致该目录(留有备份)
  2. 右键编辑部署脚本,将DownloadFile函数的调用代码全部用#注释掉
  3. 将nssm-2.24.zip文件重命名为nssm.zip
  4. 解压缩kubernetes-node-windows-amd64.tar.gz,从解压后的kubernetesnodebin目录下,取出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                                9h
kube-system   kube-flannel-ds-windows-amd64   1         1         1       1            1                                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
五、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官方文档

  • 脚本执行策略文档

    https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.1

  • Windows容器相关

    https://docs.microsoft.com/zh-cn/virtualization/windowscontainers/quick-start/run-your-first-container

    https://docs.microsoft.com/zh-cn/virtualization/windowscontainers/manage-docker/manage-windows-dockerfile

其他参考

  • 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

补丁KB4489488:https://www.tenforums.com/windows-10-news/128745-cumulative-update-kb4489899-windows-10-v1809-build-17763-379-mar-12-a.html

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/831111.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号