windows节点加入一个Linux集群组成的kubernetes集群

背景描述

我有一个kubernetes集群,其中有一个master节点跟两个node节点,这三个节点都是Ubuntu系统的,也就是Linux系统,但是我现在希望将一台Windows的机器加入到这个集群里面来统一管理,应该如何实现呢?

一.准备环境搭建

windows加入Linux的kubernetes集群,有很多坑,中间很容易出错,所以在执行前,要先确保自己的环境没问题,可以检查一下以下几点是否都满足了:
1.Linux的kubernetes集群中的环境是干净的,原始情况下该有的configmap之类的都存在并且未被更改过
2.windows的版本最好是windows server2019或者windows server2016,并且最好不要使用容器启动windows,建议使用真实的机器
3.windows server2019上保证网络通信是正常的,并且以非administrator用户登录到windows上

1.1 以非administrator的用户身份登录到windows上,然后进行windows更新,保证windows最新版本
在这里插入图片描述
1.2 修改hostname,先用hostname获取到本机名称,再修改

#下面命令在Windows的powershell中执行
hostname
#这里我通过hostname命令获取到的本机名称为WIN-7A3B7N76KMH,我希望修改的名称为node3-win
netdom renamecomputer WIN-7A3B7N76KMH /newname:node3-win

1.3 配置静态IP,虚拟机要先将网卡模式调为桥接模式,然后再手工配置静态IP(命令行配置,或者也可以通过鼠标点点的方式配置静态ip)

#下面命令在Windows的powershell中执行
netsh interface ipv4 set address name="Ethernet0" source=static addr=172.16.10.124 mask=255.255.255.0 gateway=172.16.10.1
netsh interface ipv4 set dns name="Ethernet0" source=static addr=114.114.114.114 register=primary

1.4 关闭防火墙

#下面命令在Windows的powershell中执行
netsh advfirewall set allprofiles state off
Uninstall-WindowsFeature Windows-Defender

1.5 更改powershell中脚本的执行策略

#下面命令在Windows的powershell中执行
Set-ExecutionPolicy Unrestricted

1.6 安装git
安装git,并将git的路径添加到环境变量中,git一般是安装在C:\Program Files\Git\bin

添加到环境变量步骤:控制面板—系统—高级系统设置—环境变量—path—编辑

Windows下安装git的方法

1.7 # 开启远程调用,这个命令在cmd中执行

#下面命令在Windows的cmd中执行
cscript %windir%\system32\scregedit.wsf /ar 0
cscript %windir%\system32\scregedit.wsf /cs 0

二.Windows上docker安装

docker安装有两种方式,可以通过命令行方式安装,也可以通过desktop的方式安装

安装docker之前,需要开启windows server2019上的hyper-v和nfs的功能,具体实现方式:服务器管理–管理–添加角色和功能–在服务器角色里面选择hyper-v,在功能里面选择nfs客户端,然后一直下一步选择安装

命令行安装方式:

#下面命令在Windows的powershell中执行
# 安装docker,命令行安装方式,第二步很可能失败
Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
Install-Package -Name docker -ProviderName DockerMsftProvider

# 指定到第二步的时候会抛出一个错误提示,这个错误能够解决,有些错误很难解决,说警告: C:\Users\DELL\AppData\Local\Temp\DockerMsftProvider\Docker-20-10-9.zip does not exist,也就是这个压缩包不存在,但是这个目录下会存在一个json文件,里面记录了各个docker版本的下载地址,我们可以手动下载好zip的压缩包,然后再放到C:\Users\DELL\AppData\Local\Temp\DockerMsftProvider\目录下去,再执行第二个命令

docker info  
Restart-Computer -Force        #这个地方是让你重启电脑

# 这条命令会打开这个文件,然后如果不存在你就新建
notepad.exe C:\ProgramData\docker\config\daemon.json

# 文件具体内容如下
{
  "debug": false,
  "experimental": false,
  "features": {
    "buildkit": true
  },
  "insecure-registries": [],
  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}

# 修改完后再重启docker
Restart-Service docker

desktop的安装方式:docker desktop安装地址

# 如果命令行安装方式失败了,可以直接安装docker desktop,但是注意安装的版本,因为我希望的docker engine 是20.10的版本,所以我安装的docker desktop版本是4.18  
# 安装完成后需要配置镜像加速,在设置的docker engine里面配置如下内容
{
  "experimental": true,
  "features": {
    "buildkit": true
  },
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "http://hub-mirror.c.163.com",
    "https://registry.docker-cn.com"
  ]
}  

# 在powershell里面执行docker version的命令,输出可能会有一个error
error during connect: In the default daemon configuration on Windows, 
the docker client must be run with elevated privileges to connect.: 
Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/containers/json: 
open //./pipe/docker_engine: The system cannot find the file specified.

# 解决方法
cd "C:\Program Files\Docker\Docker"
DockerCli.exe -SwitchDaemon    #重启docker
    

# 记得将docker desktop的docker模式更改为windows模式(右下角小图标--docker desktop --- Switch to windows container...)     

三.配置Windows server2019

执行这里的前提是前面两个大点的工作均已完成

方法一:自动配置安装

安装windows的wins、kubelet、kubeadm,可以根据自己的需要选择对应的版本

  1. powershell 可执行文件PrepareNode.ps1下载:
curl.exe -LO https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/PrepareNode.ps1
  1. 执行命令,运行PrepareNode.ps1文件,下载并安装 wins,kubelet,kubeadm
.\PrepareNode.ps1 -KubernetesVersion v1.23.6

注意:执行上面第一条命令下载PrepareNode.ps1文件,可能会非常慢;即使下载文件后,根据文件下载wins、kubelet、kubeadm 可能会非常卡顿。由于上述情况的存在,大概率导致安装不成功,建议采用手动安装

方法二:手动配置安装

  1. PrepareNode.ps1 文件下载:
    打开浏览器,输入网址 https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/PrepareNode.ps1下载文件,文件下载后,将DownloadFile 函数调用的代码全部用“#”注释

  2. wins,kubelet,kubeadm 安装文件下载:根据下载的PrepareNode.ps1文件中的DownloadFile 函数,下载安装文件
    2.1 浏览器输入 https://dl.k8s.io/v1.23.6/kubernetes-node-windows-amd64.tar.gz,解压下载后的文件,从kubernetes\node\bin\ 中取出 kubeadm.exe 和 kubelet.exe(根据自己需要的版本下载)
    2.2 浏览器输入 https://k8stestinfrabinaries.blob.core.windows.net/nssm-mirror/nssm-2.24.zip,下载zip 文件,并重命名为 nssm.zip,要在powershell中确认该文件的名称为nssm.zip而不是重命名为了nssm.zip.zip
    2.3 浏览器输入 https://github.com/Microsoft/SDN/raw/master/Kubernetes/windows/hns.psm1 ,下载psm1文件
    2.4 浏览器输入 https://github.com/rancher/wins/releases/download/v0.0.4/wins.exe,下载wins.exe 文件

  3. 安装windows下的kubernetes。
    1.在c盘根目录创建文件夹k,并将第一步,第二步的文件 hns.psm1、kubeadm.exe、kubelet.exe、nssm.zip、wins.exe和PrepareNode.ps1 全部放进文件夹k中。
    2.在目录k中,管理员权限 powershell 执行命令初始化windows 下的kubernetes:根据自己的版本来执行。

.\PrepareNode.ps1 -KubernetesVersion v1.23.6

失败处理过程

不管自动安装还是手动安装,都有可能执行失败,如果执行失败:

  1. 删除C盘根目录下etc、run、var、opt(这几个目录有就删掉),删除C盘k目录下除了hns.psm1、kubeadm.exe、kubelet.exe、nssm.zip、wins.exe和PrepareNode.ps1文件以外的其他文件
  2. 重新复制nssm-2.24.zip改为nssm.zip
  3. 在计算机服务中找到kubelet服务和rancher-wins服务,将其停止
  4. 管理员在powershell中删除kubelet和rancher-wins服务 、
  5. 重启docker服务
  6. 检查执行的错误并解决,再重新执行

四.Windows的node加入Linux的kubernetes集群

首先在Linux的master上查看加入集群的指令

kubeadm token create --print-join-command

在windows上,执行master的回显指令,指令类似于

kubeadm join 172.16.22.101:6443 --token lzxi5w.qizoch3pqcbc3ozc     --discovery-token-ca-cert-hash sha256:02d821acf1b0595943cb046a44356b68a85feb74e920b635713afc1fb732183f

此处也可能会遇到错误,windows执行这个步骤可能不成功,无法加入集群

[preflight] Reading configuration from the cluster... 
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml' error execution phase preflight: unable to fetch the kubeadm-config ConfigMap: failed 

这个问题是由于Linux上的kubernetes集群环境不够纯净导致的,很可能上面的一些原始configmap被删除了或者被更改了,可能将原有的kubernetes给kubeadm reset,然后再重新执行加入集群的命令,应该就会成功了

此时在master上kubectl get nodes应该是可以看到windows的node,但是他的状态会处于notready状态

五.配置Linux的master

建议在使用 Flannel 时为 iptables 链启用桥接方式的 IPv4 流处理, 必须在所有 Linux 节点上执行如下命令:

sudo sysctl net.bridge.bridge-nf-call-iptables=1

下载和配置Linux的flannel

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 修改kube-flannel.yml文件中的net-conf.json 部分,将 VNI 设置为 4096,并将 Port 设置为 4789
net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
         "Type": "vxlan",
         "VNI": 4096,
         "Port": 4789
    }
}
# 确保kube-flannel.yml文件中定义的namespace为kube-system,如果不是,就将其改为kube-system,然后再应用Linux的flannel配置
kubectl apply -f kube-flannel.yml

添加 Windows Flannel 和 kube-proxy

#现在可以添加 Windows 兼容版本的 Flannel 和 kube-proxy。为了确保你能获得兼容版本的 kube-proxy,你需要替换镜像中的标签
wget https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/kube-proxy.yml
sed -i 's/VERSION/v1.23.6/g' kube-proxy.yml
kubectl apply -f kube-proxy.yml

# windows的node状态是否出于ready状态,主要取决于windows上的flannel是否部署成功。为了确保部署成功,可以现在windows节点上docker pull flannel需要的sigwindowstools/flannel:v0.13.0-nanoserver镜像以及proxy需要的sigwindowstools/kube-proxy:v1.23.6-nanoserver镜像
wget  https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/flannel-overlay.yml
kubectl apply -f flannel-overlay.yml
# apply flannel的时候可能会出现各种报错,需要一一解决,执行这个的前提是保证windows上的kubelet服务正常启动,docker服务正常启动,以及之前的所有步骤没有问题

完成上面所有的配置后,此时在Linux的集群上查看windows的node的状态应该是ready状态,并且会有两个windows的pod处于running状态

root@master:/# kubectl get nodes
NAME        STATUS   ROLES                  AGE   VERSION
master      Ready    control-plane,master   22h   v1.23.6
node1       Ready    <none>                 22h   v1.23.6
node2       Ready    <none>                 22h   v1.23.6
node3-win   Ready    <none>                 22h   v1.23.6

root@master:/# kubectl get pod -n kube-system
NAME                                  READY   STATUS    RESTARTS   AGE
coredns-6d8c4cb4d-cd9g2               1/1     Running   0          22h
coredns-6d8c4cb4d-x6n9s               1/1     Running   0          22h
etcd-master                           1/1     Running   5          22h
kube-apiserver-master                 1/1     Running   0          22h
kube-controller-manager-master        1/1     Running   8          22h
kube-flannel-ds-8lwxc                 1/1     Running   0          22h
kube-flannel-ds-fbw42                 1/1     Running   0          22h
kube-flannel-ds-js7kw                 1/1     Running   0          22h
kube-flannel-ds-windows-amd64-h6jhw   1/1     Running   3          5h56m
kube-proxy-bz6l8                      1/1     Running   0          22h
kube-proxy-hvhld                      1/1     Running   0          22h
kube-proxy-spprt                      1/1     Running   0          22h
kube-scheduler-master                 1/1     Running   7          22h

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值