在windows学习Kubernetes的几个障碍
1 概述
要学习Kubernetes,最好有个环境可以直接就把命令执行起来看效果,就像学编程语言先运行一个HelloWorld一样。普通人的电脑大多都是Windows环境的,但Kubernetes天然就不匹配Windows环境,要想在Windows上配置出一个Kubernetes的环境还真不容易。
一种办法就是用虚拟机的方式在Windows上先搭建Linux的虚拟机环境,然后在Linux环境上面安装Kubernetes。另外一种办法就是解决Windows里的各种环境问题,把Kubernetes在Windows上安装起来。如果希望在Windows建一个简单的Kubernetes环境,以便能够快速试验Kubernetes的各种操作,即使对这个环境要求不高,也面临几个障碍需要克服。
2 Windows上的障碍
2.1 网络
Kubernetes的安装需要软件包,运行里面的容器需要有镜像包,安装的过程中还有相关的依赖,这些大多都需要访问国外的网络,访问这些网络的时候就经常会遇到网络问题,提示的错误却不一定能够体现出网络问题,定位这些问题比较浪费时间。
一种方法就是找各种替代源来解决一部分问题,比如镜像源、从国内网络下载安装包等。在网络上找到一系列的镜像源,有可能可以用,有可能不可以用,配置完之后还可能有相关的问题,也比较费时间。
另外一种方法就是弄一个特殊网络,搞定了特殊网络,就可以省掉很多定位跟网络有关的问题时间,整个过程也会比较顺利一些。
2.2 安装
要安装Kubernetes,得先有个Linux环境。要在Windows上安装Linux环境,比较好的方式就是先安装虚拟化工具(比如VirtualBox或VMWare),再使用虚拟化工具创建出Linux虚拟机,才能在Linux虚拟机上安装Kubernetes。Kubernetes官方并没有提供很方便的安装方式,社区倒是提供了各种各样的方案,比如kubeadm,要折腾一番功夫才能够搞定。
安装Kubernetes并不是这个场景的目的,如果能够不需要安装Kubernetes,而能够直接使用就更省事。Windows 10之后支持了WSL(Windows Subsystem for Linux),就具备了一定的Linux能力,可以利用这个能力去简化安装。有了WSL的支持,安装Docker Desktop就跟安装一个普通的exe软件一样简单,Docker Desktop的官方下载网址为 https://www.docker.com/。
安装好Docker Desktop之后,进入Docker Desktop界面,点击右上角的Settings齿轮按钮,选择左侧的Kubernetes子菜单,勾选右侧的“Enable Kubernetes”,点击“Apply & restart”,操作见下图。如果特殊网络通畅的话,Kubernetes就会自动安装并重启完成,很简单地就装好了一个单机版的Kubernetes环境,这样就可以专注于学习Kubernetes的操作和原理了。(强调一下网络,如果网络不好,也是困难重重)
2.3 存储
在学习Kubernetes的时候,网上也挺多例子的,但真的自己拿来模仿,也会遇到各种各样的问题,特别是和PV和Volume有关的。要存储数据,就需要用到PV和Volume。很多例子都是弄个空目录或者给的是个NFS(Network File System),空目录看不见摸不着,NFS则需要一套复杂的安装,这样就导致要想成功运行一个带存储的例子,也不容易。
最直观的就是希望把数据存储到自己指定的一个目录下,windows的目录一般是盘符后带个路径,如D:/a/b/c,但如果把这个目录配置到Volume的hostPath里,那得到的就是个找不到目录的错误。
这个错误是由于对运行的环境有误解,Kubernetes是需要运行在Linux环境上的,虽然通过Docker Desktop简化了安装,但它仍然是运行在Linux环境上的。也就是说Windows上有个常规看不见的Linux系统在支撑着Kubernetes的运行,这个Linux系统就是WSL。当操作目录的时候,要记着Kubernetes用的是Linux上的目录,而不是Windows的目录。
在Windows的文件夹地址栏里输入:\\wsl.localhost\\docker-desktop,就可以进入这个Linux系统的文件目录,Windows的各个盘(如C盘、D盘等)是挂载到/mnt/host目录下的,如果希望Volume指定的目录是D:/a/b/c,那么指定的路径应该是/mnt/host/d/a/b/c,也就是要有个思想转换:指定的目录要把Windows目录转为Linux目录。
2.4 日志
这个障碍与Windows无关,而是学习Kubernetes的时候遇到的障碍之一。Kubernetes使用声明式的方式来管理所有事情,操作基本都是写一个或者改一下yaml配置文件,然后执行kubectl apply -f xxx.yaml命令。好处是如果顺利的话就非常方便,缺点就是如果出错了就没有即时的错误反馈。因为它并没有像命令式那样,每执行一个命令就给一个反馈,即使错误了也知道是这个命令产生的错误。声明式面对是一个yaml文件,可能是一个复杂的yaml配置文件,不知道是哪里出错了。
这个时候就需要靠日志来了解具体的情况了。下面给3种常用方式:
1、在执行命令的时候加上--v=9参数,可以列出命令执行的详情。如:kubectl apply -f xx.yaml --v=9
2、查看事件日志:kubectl describe type name,如查看Pod abc的事件日志:kubectl describe pod abc
3、查看日志:kubectl log,如查看pod1的容器c1的日志:kubectl logs pod1 -c c1 -p
有了日志才能根据日志信息定位具体哪些地方错了,才能够根据定位到的错误去调整yaml配置,以达到正常运行的目的。
3 小结
学习一个新知识,最快的方式就是先上手实践。新手安装Kubernetes环境比较耗费时间,在Windows上建一个Kubernetes学习环境,比较简单的方式是利用Docker Desktop自带的Kubernetes,利用这个环境可以快速进入上手实践环节,等对Kubernetes熟悉到一定程度后,带着一定的背景知识补充学习如何搭建可用于生产的Kubernetes环境会更容易一些。这个方式要注意的是Windows需要带有WSL环境和配备一个特殊网络。如果这个方式还是磕磕碰碰的,则推荐直接使用Linux的环境来上手实践。