1、查看windows中是否有其它程序占用53端口,如果存在先停掉,否则Ubuntu启动错误,它需要监听这个端口;
2、在ubuntu中启动ssh,并在windows中设置端口转发,就将本机ip和127.0.0.1对ssh端口的请求转发到localhost,否则除了本机通过localhost能访问外,其它地址和机器都是拒绝。
(netsh interface portproxy reset all)
(netsh interface portproxy add v4tov4 listenaddress=192.168.31.146 listenport=22222 connectaddress=127.0.0.1 connectport=22222)
(netsh interface portproxy add v4tov4 listenaddress=localhost listenport=22222 connectaddress=127.0.0.1 connectport=22222)
(netsh interface portproxy show all)
以上命令在powershell中以管理员权限执行。
先启动ubuntu里的ssh监听后再执行上述命令,如果还是不行请重启机器再执行一遍。
3、启动docker服务
由于wsl2中无法启动systemd,所以也就无法执行systemctl start docker。
但kubernetes初始化需要docker service,而且通过service start docker方式启动的不行,提示必须要systemctl start docker。
此时可以通过大牛提供的其它方式来实现,不知道他是怎么实现的,但确实有效,就安装个一个东西,再创建两个个脚本并赋予权限就行。
https://kubernetes.io/blog/2020/05/21/wsl-docker-kubernetes-on-the-windows-desktop/
上面文章是使用了大牛的解决方案,搜索“enabling SystemD”就可找到怎么使用的介绍。
大牛的原始文章地址:
https://forum.snapcraft.io/t/running-snaps-on-wsl2-insiders-only-for-now/13033
4、初始化kubernetes
可以指定kubernetes的版本,因为有时候阿里镜像没有最新的版本,可以通过修改版本号采用老版本镜像。
可以指定镜像仓库为本地地址,这样就可以将之前pull来的镜像存在本地,以供其它机器使用。
必须将apiserver地址指定为ubuntu中eth0的ip,而不是windows的真实网卡ip,否则初始化不成功。
kubeadm init --image-repository 192.168.31.151:5000/google_containers --kubernetes-version v1.18.2 --apiserver-advertise-address 172.19.20.236 --pod-network-cidr=192.168.0.0/16
5、安装网络插件
初始化完成后,查看kubelet的日志,会发现一直提示本地node找不到,并且提示/etc/cni/net.d里内容为空,无法初始化。这时候就可安装网络插件了。
calico是其中的一个,现在github上维护的比较勤。
https://docs.projectcalico.org/getting-started/kubernetes/quickstart
查看提供的calico.yaml发现,其启动了几个自己的容器,并且挂在了主机的/etc/cni/net.d和/opt/cni目录。
这样关于网络启动这块的过程就比较清楚了,kubeadm初始完后,由于没有容器网络接口cni,导致本地node无法运行,然后去/etc/cni/net.d下找网络插件配置,发现是空的就报错无法初始化cni。
通过kubectl apply部署网络插件后,网络插件容器启动并向主机的两个cni目录里写入配置及执行程序。
这期间kubelet一直不停的扫描目录/etc/cni/net.d,当发现被灌入内容后立马执行,然后网络有了,node也正常了,一切成功。
6、swap问题
官方资料:https://docs.microsoft.com/en-us/windows/wsl/wsl-config
7、网络问题
双网卡可以操作,因为中间会导致网络中断,没有另一个网卡的话是没法在通过远程桌面连上操作的。
右键管理员打开Hyper-V管理器。
需要先打开wsl,才会在虚拟交换机列表看到wsl。
必须管理员权限才能应用成功,并且可能会失败,失败后多尝试几次就行了。
成功后这个网卡就暂时不能用了,需要通过另外一个网卡的IP远程连上。
通过Windows Terminal登录到wsl后执行上面的命令,操作过程是将wsl里的网卡eth0的ip地址改为局域网地址。
这样就不用忍受wsl的ip地址是虚拟的、飘忽不定的,且还需要端口转发才能访问。
但这样有个问题就是没法在wsl里访问带域名的网址,也就没法访问apt、github、yum、dockerhub等这些默认地址。
但也不是没办法解决,在局域网的其它主机建立一个代理服务器,然后将wsl的访问方式改为通过这个内网代理就可以。
通过这种方式设置的内网ip,在wsl重启后会被还原,所以每重启一次都要重复一遍,除设置代理外。