特性状态

你可以使用 Kubernetes 来混合运行 Linux 和 Windows 节点,这样你就可以 混合使用运行于 Linux 上的 Pod 和运行于 Windows 上的 Pod。 本页面展示如何将 Windows 节点注册到你的集群。

准备开始

该文档是以k8s 1.24.0 和 windowserver 2019 示例
windowserver2019前期配置:
1:开启的应用:
Hyper-V、远程访问

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jHscqFHY-1667471831912)(/uploads/web001/images/m_2db33b5131fdebb4febd7e0082b9fa4f_r.png)]

2:系统更新到最新版本
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EdI0cv78-1667471831913)(/uploads/web001/images/m_a7fb3d6fe2579697b1b5d827ca1228a8_r.png)]

3:修改计算机名称
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TgHH6E3B-1667471831914)(/uploads/web001/images/m_89bf1cc503fe4ac33a850986e0bcd0be_r.png)]


配置 Flannel

注:以下内容是在 k8s-master节点进行配置

为 Flannel 准备 Kubernetes 的控制面

在我们的集群中,建议对 Kubernetes 的控制面进行少许准备处理。 建议在使用 Flannel 时为 iptables 链启用桥接方式的 IPv4 流处理, 必须在所有 Linux 节点上执行如下命令:

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

下载并配置 Linux 版本的 Flannel

下载最新的 Flannel 清单文件:

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

修改 Flannel 清单中的 net-conf.json 部分,将 VNI 设置为 4096,并将 Port 设置为 4789。 结果看起来像下面这样:

net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
         "Type": "vxlan",
         "VNI": 4096,
         "Port": 4789
    }
}

说明: 在 Linux 节点上 VNI 必须设置为 4096,端口必须设置为 4789,这样才能令其与 Windows 上的 Flannel 互操作。关于这些字段的详细说明,请参见 VXLAN 文档。

说明: 如要使用 L2Bridge/Host-gateway 模式,则可将 Type 值设置为 “host-gw”,并忽略 VNI 和 Port 的设置。

应用 Flannel 清单并验证

首先应用 Flannel 配置:

kubectl apply -f kube-flannel.yml

几分钟之后,如果 Flannel Pod 网络被正确部署,你应该会看到所有 Pods 都处于运行中状态。

kubectl get pods -n kube-system

输出中应该包含处于运行中状态的 Linux Flannel DaemonSet:

NAMESPACE     NAME                                      READY        STATUS    RESTARTS   AGE
...
kube-system   kube-flannel-ds-54954                     1/1          Running   0          1m

添加 Windows Flannel 和 kube-proxy DaemonSet

现在你可以添加 Windows 兼容版本的 Flannel 和 kube-proxy。为了确保你能获得兼容 版本的 kube-proxy,你需要替换镜像中的标签。 下面的例子中展示的是针对 Kubernetes v1.24.0 版本的用法, 不过你应该根据你自己的集群部署调整其中的版本号。

curl -L https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/kube-proxy.yml | sed 's/VERSION/v1.24.0/g' | kubectl apply -f -
kubectl apply -f https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/flannel-overlay.yml

说明: 如果你在使用 host-gateway 模式,则应该使用 https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/flannel-host-gw.yml 这一清单。

说明:

如果你在 Windows 节点上使用的不是以太网(即,”Ethernet0 2”)接口,你需要 修改
flannel-host-gw.yml 或 flannel-overlay.yml 文件中的下面这行:

wins cli process run --path /k/flannel/setup.exe --args "--mode=overlay --interface=Ethernet"

注:通过 widnows PowerShell 命令查看网络适配器

ipconfig

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4MfUIrXJ-1667471831914)(/uploads/web001/images/m_fc31de8b570457e2cf87358dc3c31796_r.png)]

在其中根据情况设置要使用的网络接口。

# Example
curl -L https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/flannel-overlay.yml | sed 's/Ethernet/Ethernet0/g' | kubectl apply -f -

2:加入 Windows 工作节点

安装 containerD

下载脚本

curl.exe -LO https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/Install-Containerd.ps1

执行脚本

# 自定containerd的版本以及 网路名称
.\Install-Containerd.ps1 -ContainerDVersion 1.6.8 netAdapterName "Ethernet0"

注:网络名称可通过ipconfig获取
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5cxsHpJw-1667471831915)(/uploads/web001/images/m_fc31de8b570457e2cf87358dc3c31796_r.png)]

配置 containerD

安装完Containerd后需要手动配置
文件路径:C:\Program Files\containerd\config
1:修改sandbox_image

sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6"

2: 修改registry.mirrors

 [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
       endpoint = ["https://docker.mirrors.ustc.edu.cn"]
 [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
       endpoint = ["https://registry.cn-hangzhou.aliyuncs.com/google_containers"]

如图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7tGvqKRI-1667471831916)(/uploads/web001/images/m_b4ebbb617a118e2e95520173a9139f52_r.png)]

3:重启containerd服务

restart-service -name containerd
安装 crictl

cri-tools 项目安装 crtctl。 crictl 是必需的,kubeadm 使用它与 CRI 端点通信。

安装 wins、kubelet 和 kubeadm
#下载安装脚本
curl.exe -LO https://raw.githubusercontent.com/kubernetes-sigs/sig-windows-tools/master/kubeadm/scripts/PrepareNode.ps1
#执行安装
.\PrepareNode.ps1 -KubernetesVersion v1.24.0 -ContainerRuntime containerD
运行 kubeadm 添加节点

使用当你在控制面主机上运行 kubeadm init 时得到的命令。 如果你找不到这个命令,或者命令中对应的令牌已经过期,你可以(在一个控制面主机上)运行 kubeadm token create --print-join-command 来生成新的令牌和 join 命令。

示例:

kubeadm join xxxx:6443 --token  xxxxx --discovery-token-ca-cert-hash sha256:xxxxxxxx--cri-socket  "npipe:./pipe/containerd-containerd"

注:因为是通过containerd进行安装的,添加节点的时候需要配置参数

--cri-socket  "npipe:./pipe/containerd-containerd"
主节点查看window节点状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l9zfalJb-1667471831917)(/uploads/web001/images/m_080a46d5d6bf2944680c6b13476c21ea_r.png)]


加入节点后遇到的一些问题

1:节点的 kube-flannel-ds-windows-amd64 pod创建不了
原因:可能是网络没有创建出来
解决方法:在window节点手动执行一下命令创建网络

Import-Module "c:\k\hns.psm1"
New-HnsNetwork -Type NAT -Name nat

2: window 节点执行 crictl ps 报一下错误

 level=error msg="unable to determine image API version: rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing open //./pipe/dockershim: The system cannot find the file specified.\""

可通过执行以下两个命令来处理:

crictl config runtime-endpoint  npipe:./pipe/containerd-containerd
crictl config image-endpoint npipe:./pipe/containerd-containerd
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐