在 Windows 下使用 WSL2 搭建运行GPU的Kubernetes集群

0 / 1511

本文我们将介绍如何在 Windows10 下使用 WSL2 和 KinD 来搭建一套带GPU的 Kubernetes 集群。在过去几年,Kubernetes 已经成为了容器编排领域事实上的标准。虽然现在已经有各种各样的 Kubernetes 发行版本和安装程序来部署 Kubernetes 环境了,除了云环境或者裸机环境下面之外,我们仍然需要在本地部署和运行 Kubernetes 集群,特别是对于相关的开发人员。

但是 Kubernetes 最开始是被设计在 Linux 环境中来部署和使用的,然而还是有不少用户平时工作还是使用的是 Windows 操作系统,为了降低 Windows 用户使用 Linux 的困难程度,微软推出了 WSL (Windows Subsystem for Linux),该工具相当于一个运行在 Windows 下面的 Linux 子系统,这让 Windows 和 Linux 之间的环境界限变得更加不明显了,特别是 WSL2 版本推出以后,完全具有了在 WSL2 中运行 Docker 的能力了,所以现在我们几乎可以无缝地在 WSL2 上面运行 Kubernetes。

下面我们就来简要介绍下在 Windows10 下面如何安装和配置 WSL2 以及 Kubernetes 集群。

环境需求和软件版本

我的环境如下:

  • win10 版本21390
  • WSL2 5.4.72
  • Docker Desktop 20.10.7
  • CUDA driver for WSL2 470.76,同时 CUDA Version: 11.4
  • 显卡:NVIDIA GeForce 1060

环境准备

说明

一开始,在docker容器中使用GPU,需要在宿主机安装nvidia-docker。且在启动容器的时候使用 --runtime=nvidia选项。
nvidia-docker 是英伟达官方的项目,只支持Linux系统,所以windows上不能实现。

到了 19.03 版本,Docker 提供了对GPU的原生支持(同时 nvidia-docker 就过时了)。
这个时候docker 内置的gpu支持,需要安装 nvidia-container-runtime,然后启动容器的时候带上 --gpus all 参数(代替了
旧参数–runtime=nvidia),就像这样 docker run -it --rm --gpus all ubuntu nvidia-smi

Q. Linux 下呢?

ps:这两段信息是从别处看到的,仅供参考。

现在,Win10 + WSL2 + Docker Desktop + CUDA driver for WSL2 就能用了。
注:

  • 只需要在宿主机上安装 CUDA for WSL2 驱动,不用其它cuda驱动
  • 不需要在 WSL2 中安装任何 CUDA 驱动,win10安装 CUDA for WSL2 驱动之后,wsl2 内会自动有对应的驱动。
  • 不需要在 WSL2中安装dockerd,因为最新的 Docker Desktop 支持使用 WSL2 backend,用 WSL2 backend,启动的容器不需要额外配置就能
    直接访问到GPU。

安装过程

安装之前,我电脑已经启用了WSL2,并安装了 Docker Desktop 20.10.7,Window是版本是专业版 19043。以此为起点,我的环境还差两步:

  1. 安装 CUDA for WSL2 驱动
  2. 把 Windows 10 升级到 21390
    这两步不分先后,先执行哪个都一样。

安装 CUDA for WSL2 驱动

CUDA for WSL2下载驱动,根据显卡类型(GEFORCE 或者 QUADRO )选择对应的下载链接。
这个驱动还不是正式发行版。下载这个驱动需要注册账号。下载完成后点击执行,安装完成后重启系统。

升级win10到 21390

按微软官网的操作步骤进行Windows Insider
当前(2021-06-12)windows 最新的稳定发布版是 19043,而显卡透传需要升级到 windows 21332,这是个测试版。
当前最新的测试版是 21390。
基本步骤是:

  1. 在微软官网注册 Windows Insider Program 账号,注册地址:
    Windows Insider,注册完成后登录。注册的时候可以使用已有的
    windows账号。
  2. 在windows系统打开
    菜单路径:Settings > Update & Security > Windows Insider Program,点击 Get Started 按钮,点击 +,接下来选择 dev 通道。
    重启电脑,使配置生效。
  3. 更新系统。
    选择dev通道后,就能更新到最新版本了。
    菜单路径 Settings > Update & Security > Windows Update,然后点击 Check for updates,接着就是等待了。
    windows 会下载更新并自动安装,安装完成后需要重启电脑。
    这一步更新需要一点时间。

注:第二步,Windows Insider Program 对应的中文是 Windows 预览体验计划。

安装 WSL2

首先我们需要先启用”适用于 Linux 的 Windows 子系统”这个功能,然后才能在 Windows 上安装 Linux 发行版。以管理员身份打开 PowerShell 运行如下所示的命令:

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

如果我们只是安装 WSL1 的话,执行完上面的命令重启计算机然后安装对应的 Linux 发行版即可,如果需要安装到 WSL2 则需要执行下面的其他额外操作。

启用“虚拟机平台”可选组件

安装 WSL 2 之前,还必须启用“虚拟机平台”可选功能。以管理员身份打开 PowerShell 并运行如下所示命令:

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

重新启动计算机,以完成 WSL 安装并更新到 WSL2。

还有一个前提条件是需要开启硬件层面的虚拟化,可以通过 BIOS 进入开启。

将 WSL2 设置为默认版本

安装新的 Linux 分发版时,请在 Powershell 中运行以下命令,以将 WSL 2 设置为默认版本:

wsl --set-default-version 2

安装配置 Linux 发行版

  1. 打开 Microsoft Store,搜索 Terminal,安装 Windows Terminal,用于后面和 WSL 子系统交互。
    安装 windows terminal安装 windows terminal
  2. 搜索 Ubuntu,选择安装。
    安装 Ubuntu安装 Ubuntu

安装完成后,第一次打开 Ubuntu 的时候,将打开一个控制台窗口,会等待几分钟来进行配置,启动完成后为 Ubuntu 创建一个用户和密码。

然后我们就可以使用 Windows Terminal 来操作 Ubuntu 系统了,在 Windows Terminal 中选择 Ubuntu 发行版就可以跳转到 Ubuntu 终端中,使用上面我们配置的用户名和密码登录即可:

PowershellPowershell由于默认情况下我们不知道 root 用户的密码,所以如果我们想要使用 root 用户的话可以使用 passwd 命令为 root 用户设置一个新的密码。

  1. win10 WSL2问题解决WslRegisterDistribution failed with error: 0x800701bc
    下载安装适用于 x64 计算机的最新 WSL2 Linux 内核更新包。

下载链接:https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

配置 Linux

然后可以将 Ubuntu 的软件源更换成阿里云的源:

root@k8s:~# cp /etc/apt/sources.list /etc/apt/sources.list.bak
root@k8s:~# echo "deb http://mirrors.aliyun.com/ubuntu/ focal main restricted
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted
deb http://mirrors.aliyun.com/ubuntu/ focal universe
deb http://mirrors.aliyun.com/ubuntu/ focal-updates universe
deb http://mirrors.aliyun.com/ubuntu/ focal multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted
deb http://mirrors.aliyun.com/ubuntu/ focal-security universe
deb http://mirrors.aliyun.com/ubuntu/ focal-security multiverse" > /etc/apt/sources.list
root@k8s:~#

然后执行更新即可:

root@k8s:~# apt update && apt upgrade -y

此外我们还可以对终端进行配置,比如将终端替换成 zsh:

# 安装 zsh
root@k8s:~# apt-get install zsh

oh-my-zsh可以用于快速配置zsh,进入官网或者 Github 可以了解其基本使用及其丰富的主题使用,安装只需要执行下面代码即可:

root@k8s:~# sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

安装zsh-syntax-higlighting语法高亮插件:

root@k8s:~# git clone https://github.com/zsh-users/zsh-syntax-highlighting.git
# 移动到 plugins 文件夹中
root@k8s:~# mv zsh-syntax-highlighting $ZSH_CUSTOM/plugins
# 配置环境变量
root@k8s:~# cd ~
root@k8s:~# vim .zshrc
#在 plugins 一列中添加 zsh-syntax-highlighting,如下
plugins=(git sh-syntax-highlighting)
# 在文件最后添加
root@k8s:~# source $ZSH_CUSTOM/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
# 配置生效
root@k8s:~# source ~/.zshrc

配置完成之后,Terminal 的最终效果如下图所示。

zsh configzsh config

配置 Systemd

由于默认情况下 WSL 中不能使用 systemd,所以很多应用程序没办法启动,不过还是有一些大神解决了这个问题,我们可以在 https://forum.snapcraft.io/t/running-snaps-on-wsl2-insiders-only-for-now/13033 链接下面找到启动 SystemD 的方法。

首先安装 Systemd 相关的依赖应用:

apt install -yqq fontconfig daemonize

然后创建一个如下所示的脚本文件:

# Create the starting script for SystemD
sudo vim /etc/profile.d/00-wsl2-systemd.sh

SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk '{print $2}')

if [ -z "$SYSTEMD_PID" ]; then
   sudo /usr/bin/daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
   SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk '{print $2}')
fi

if [ -n "$SYSTEMD_PID" ] && [ "$SYSTEMD_PID" != "1" ]; then
    exec sudo /usr/bin/nsenter -t $SYSTEMD_PID -a su - $LOGNAME
fi

# 文件/etc/sudoers末尾加入
%sudo ALL=(ALL) NOPASSWD: /usr/sbin/daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
%sudo ALL=(ALL) NOPASSWD: /usr/bin/nsenter -t [0-9]* -a su - [a-zA-Z0-9]*

# 使配置生效
$ sudo -s
$ source /etc/profile

wsl2 systemdwsl2 systemd到这里我们就完成了 WSL2 的安装和配置。

安装 Docker

其实现在我们已经可以直接在 WSL 中去安装 Docker 了,和平时在 Linux 下面操作方式是一样的。但实际上 Docker 也专门开发了可以使用 WSL2 中的 Docker 守护进程的桌面管理程序, 打开 Docker Desktop WSL2 backend 页面,下载最新的 Docker Desktop for Windows 程序 ,安装之后,打开程序做如下设置

  • 启用基于WSL2的引擎复选框(Use the WSL 2 based engine)
    docker use wsl2docker use wsl2
    这个时候在 WSL 里面执行 docker 命令还是找不到的:
    select wsl2select wsl2
  • 我们还需要在 Resources 中设置要从哪个 WSL2 发行版中访问 Docker,如下图使用的是 Ubuntu-20.04:
    wsl2wsl2
  • 然后记住重启 Docker for Windows,重启完成后我们就可以在 WSL 里面使用 docker 命令了:
    docker clidocker cli

到这里 Docker 和 WSL2 的基本配置就完成了,接下来我们来安装 Kubernetes 集群。

配置Nvidia GPU

在Windows 10上安装Nvidia Drivers

下载驱动地址:https://developer.nvidia.com/cuda/wsl/download

在Ubuntu上安装 nvidia-docker2:

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
&& curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list && curl -s -L https://nvidia.github.io/libnvidia-container/experimental/$distribution/libnv