windows节点加入一个Linux集群组成的kubernetes集群
- 背景描述
- 一.准备环境搭建
- 二.Windows上docker安装
- 三.配置Windows server2019
- 方法一:自动配置安装
- 方法二:手动配置安装
- 失败处理过程
- 四.Windows的node加入Linux的kubernetes集群
- 五.配置Linux的master
背景描述
我有一个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,可以根据自己的需要选择对应的版本
- powershell 可执行文件PrepareNode.ps1下载:
curl.exe -LO https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/PrepareNode.ps1
- 执行命令,运行PrepareNode.ps1文件,下载并安装 wins,kubelet,kubeadm
.\PrepareNode.ps1 -KubernetesVersion v1.23.6
注意:执行上面第一条命令下载PrepareNode.ps1文件,可能会非常慢;即使下载文件后,根据文件下载wins、kubelet、kubeadm 可能会非常卡顿。由于上述情况的存在,大概率导致安装不成功,建议采用手动安装
方法二:手动配置安装
-
PrepareNode.ps1 文件下载:
打开浏览器,输入网址 https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/PrepareNode.ps1下载文件,文件下载后,将DownloadFile 函数调用的代码全部用“#”注释 -
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 文件 -
安装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
失败处理过程
不管自动安装还是手动安装,都有可能执行失败,如果执行失败:
- 删除C盘根目录下etc、run、var、opt(这几个目录有就删掉),删除C盘k目录下除了hns.psm1、kubeadm.exe、kubelet.exe、nssm.zip、wins.exe和PrepareNode.ps1文件以外的其他文件
- 重新复制nssm-2.24.zip改为nssm.zip
- 在计算机服务中找到kubelet服务和rancher-wins服务,将其停止
- 管理员在powershell中删除kubelet和rancher-wins服务 、
- 重启docker服务
- 检查执行的错误并解决,再重新执行
四.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