本文是开源项目lab-k8s-playground及其All-in-One Playground的中文使用指南!如果您喜欢这个项目,欢迎点击下面的按钮,关注,加星,以及贡献代码^_^

Watch Star Fork

Launch multi-node Kubernetes cluster locally in one minute and more一文里,我们提到过开源项目lab-k8s-playground。它提供了一种用于在单机环境下部署多节点Kubernetes集群的方法,并在此基础上进行了多种优化,以加速集群的启动过程。有了这样一套环境,我们就可以高效地在本地进行各种和Kubernetes有关的学习,开发,部署,测试,以及演示了;或者,也可以把它放到CI/CD的Pipeline上,快速启动起一个用于测试的环境来。

现在,该项目又有了全新升级,那就是“All-in-One Playground”🎉🎉🎉利用它,我们可以一键搞定Kubernetes部署:通过把部署集群之前要做的很多复杂的准备工作固化在一套脚本里,我们就不用再关心集群部署的优化细节了。只要一行命令,就能完成集群部署。不仅如此,这个Playground环境里还预装了很多常用的Kubernetes命令行工具,并支持Istio等应用的追加部署。所有这些功能,都可以一键式搞定,并且可以反复卸载和安装!

是不是有点迫不及待地想体验一下这个Playground了呢?下面我们就一起来了解一下这个All-in-One Kubernetes Playground吧!

我都等不及啦!

首先,我们把lab-k8s-playground项目克隆到本地,并进入该项目的根目录:

$ git https://github.com/morningspace/lab-k8s-playground.git

在Vagrant Box里启动

启动Playground非常简单,如果你的机器安装了Vagrant Box,那么只要一条命令就行了:

$ vagrant up

整个启动过程大约需要一杯咖啡 ☕️ 的时间。具体取决于你的系统配置,以及分配给虚机的资源大小,还有网络环境等。以我的笔记本为例,8核CPU,16G内存,网络畅通的情况下,大概15分钟内完成。

在这个过程中,脚本会为我们完成所有的脏活累活,包括:

  • 自动安装docker,docker compose,kubectrl,helm,以及Kubernetes的一些日常使用的命令行工具;
  • 自动搭建Private Registry,用于保存集群部署用到的所有Docker镜像。利用Private Registry可以免去通过网络访问远程Public Registry的需要,从而极大地提高了部署的速度。并且,因为全部镜像都在本地,所以还可以实现离线安装,非常适合单机的demo环境。
  • 最后,它还会为我们部署好一个默认由三个节点构成的Kubernetes集群,即:一个master节点加两个worker节点。这个节点数目是可以定制的,不仅如此,就连Kubernetes所用的版本也是可以指定的。关于怎么定制Playground,后面还会讲解。

在宿主机上启动

除了Vagrant Box,Playground也支持直接在宿主机上启动。只要在项目的根目录下执行如下命令,对环境进行初始化:

$ ./install/launch.sh init

因为这条命令会修改当前用户Home目录下的.bashrc,所以建议执行完毕后重新登录一次终端,以便在新的用户Session里重新加载.bashrc。或者,你也可以执行下面的命令,直接在当前Session里主动加载.bashrc

$ . ~/.bashrc

另外,.bashrc里还有一些和Playground相关的环境变量,你可以根据自己的实际需求对它们进行修改。如果不修改也没关系,脚本会为它们指定默认值:

# The IP of your host, default is 127.0.0.1
export HOST_IP=
# The Kubernetes version, default is v1.14
export K8S_VERSION=
# The number of worker nodes, default is 2
export NUM_NODES=

最后,我们执行下面的命令,把Kubernetes集群启动起来:

$ launch default

也许你已经注意到,这里我们用的是launch,而不是带着一串路径的launch.sh。当执行完init命令对Playground进行初始化,并确保.bashrc被重新加载以后,我们就可以直接使用launch命令了。你可以在任意目录下执行launch,而不必非得在项目的根目录下。

Vagrant Box还是宿主机?

如果是跑在笔记本或者本地机器上,并且你希望机器始终保持干净,那么使用Vagrant Box应该是一个不错的选择。否则地话,不妨直接在宿主机上安装,因为这样可以省去在box里安装操作系统的时间,所以启动速度会更快。

如果是跑在虚机里,那也可以不用Vagrant Box,因为没有必要让一个虚机(即box)跑在另一个虚机里。

我该选择哪种操作系统?

Playground支持多种操作系统,包括:

  • Ubuntu
  • CentOS
  • RHEL
  • MacOS

如果你选择Vagrant Box启动Playground,尽管Vagrantfile里用的是Ubuntu,但你也可以改成其他的操作系统。

我该怎么访问呢?

环境准备好了,该怎么访问呢?如果是在Vagrant Box里启动的集群,我们可以利用vagrant ssh命令进入虚机环境。如果是在宿主机上启动的集群,那什么也不用做,就可以直接访问集群了。比如,用kubectl对集群进行管理,或者用一下预装的那些Kubernetes常用命令行工具。

不仅如此,Playground还提供了一个Web终端,可以在浏览器里模拟普通终端,执行命令行命令。只要在浏览器地址栏输入https://192.168.56.100:4200就可以访问到Web终端。根据提示输入用户名和密码,如果你用的是Vagrant Box,那么用户名密码分别是vagrantvagrant。这里的IP地址对应的就是运行Playground的那台机器的地址,如果你用的是Vagrant Box,则对应虚机的IP地址,默认值为192.168.56.100。当然,它也是可以定制的。

动图演示

在下面这个GIF动图里,大家可以看到我是如何分别利用普通终端和Web终端展示各种Kubernetes命令行工具的使用的,是不是很酷啊😊(点击图片可放大观看哦)

另外,对于基于Vagrant Box建立起来的Playground环境,如果想暂停手头和Playground相关的工作,可以执行vagrant suspend命令,把当前的虚机环境停掉。

要想再次恢复虚机环境,则执行vagrant resume命令。和第一次启动虚机环境不同,再次启动会变得非常快。这是因为它只是简单地把虚机环境恢复,而不需要重新初始化和安装所需要的软件了。

最后,如果不想保留当前的虚机环境,比如想重新启动一个配置和原来不一样的新环境,可以执行vagrant destroy命令,这会把当前的虚机彻底清除掉。

我还想装点别的……

默认启动起来的Playground,里面只包含了一个Kubernetes集群,和一系列命令行工具。如果我们想在这个基础上继续部署安装更多其他的应用该怎么办呢?这就需要用到Launch Utility了。

Launch Utility晴耕实验室专门为这个Playground开发的一套命令行工具。它的目的是为了简化基于Kubernetes的各种应用的部署安装。所有应用,都只需要清一色地执行一条launch <target>命令,就可以自动完成部署安装。其中的<target>,是对所有部署或安装任务的一种抽象和封装。

实际上,我们在前面已经用到过Launch Utility了,比如在对Playground环境进行初始化的时候。包括Vagrant Box在启动的过程中有很多环节,比如像:各种命令行工具的安装,Private Registry的搭建,Kubernetes集群的启动,背后都是通过执行Launch Utility完成的,它们都有各自对应的<target>可以“launch”。

安装Istio

下面,我们以安装Istio,及Istio的演示程序Bookinfo为例,熟悉一下Launch Utility的使用。

当Playground启动起来以后,我们通过普通终端或Web终端进入命令行。首先,确保几个Private Registry都已经启动起来了:

$ docker ps
CONTAINER ID  NAMES                 IMAGE       COMMAND                 CREATED       STATUS        PORTS
6e48d7ef4eb5  quay.io               registry:2  "/entrypoint.sh /etc…"  4 minutes ago Up 4 minutes  5000/tcp
58432b935674  gcr.io                registry:2  "/entrypoint.sh /etc…"  4 minutes ago Up 4 minutes  5000/tcp
8e26e4f744e3  registry-1.docker.io  registry:2  "/entrypoint.sh /etc…"  4 minutes ago Up 4 minutes  5000/tcp
8d3ede4e6c7b  k8s.gcr.io            registry:2  "/entrypoint.sh /etc…"  4 minutes ago Up 4 minutes  5000/tcp
0ca0b10a2d87  mr.io                 registry:2  "/entrypoint.sh /etc…"  4 minutes ago Up 4 minutes  5000/tcp, 0.0.0.0:5000->80/tcp

从输出结果里我们可以看到,前面几个代表的都是Public Registry,分别对应了gcr.iok8s.gcr.ioregistry-1.docker.ioquay.io。最后的mr.io不代表任何Public Registry,我们可以用它来存放一些私有的Docker镜像。如果Private Registry没有启动,我们可以利用launch命令把它们启动起来:

$ launch registry

然后,确保Kubernetes集群是正常启动着的:

$ kgno
NAME          STATUS   ROLES    AGE     VERSION
kube-master   Ready    master   2d19h   v1.14.4
kube-node-1   Ready    <none>   2d19h   v1.14.4
kube-node-2   Ready    <none>   2d19h   v1.14.4

如果集群没有启动,同样也可以利用launch命令把它启动起来:

$ launch kubernetes

如果两者都没启动,还可以在launch后面分别跟上registrykubernetes,在一条命令里分别把Private Registry和Kubernetes集群依次启动起来:

$ launch registry kubernetes

最后,Istio的安装,也同样用的launch命令。我们只需要执行如下命令,就可以完成Istio的自动安装:

$ launch istio

launch命令会在部署完Istio后,持续等待直到Istio的所有Pod都成功启动起来以后才结束。这个过程可能会持续大概一到几分钟的时间。

紧接着,我们再利用launch命令把Bookinfo也部署到集群里:

$ launch istio-bookinfo

同样地,launch命令会在部署完Bookinfo以后监控Bookinfo的Pod,直到所有Pod成功启动才退出。

等Istio和Bookinfo都启动起来以后,我们再利用launch命令,通过端口转发的方式把它们各自的应用端口都暴露出来。这里,我们用的是istioistio-bookinfo这两个target提供的portforward命令。调用target提供的命令,可以通过在指定<target名称>后面跟::<命令名称>的方式来实现。例如:

  • istio::portforwarding
  • istio-bookinfo::portforwarding

同样地,我们可以把这两个target的命令串接起来,在一个命令行里执行:

$ launch istio::portforward istio-bookinfo::portforward 
Targets to be launched: [istio::portforward istio-bookinfo::portforward]
####################################
# Launch target istio...
####################################
» Forwarding service/grafana 3000:3000...
Done. Please check /home/vagrant/lab-k8s-playground/install/logs/pfwd-grafana.log
» Forwarding service/kiali 20001:20001...
Done. Please check /home/vagrant/lab-k8s-playground/install/logs/pfwd-kiali.log
» Forwarding pod/jaeger 15032:16686...
Done. Please check /home/vagrant/lab-k8s-playground/install/logs/pfwd-jaeger.log
» Forwarding pod/prometheus 9090:9090...
Done. Please check /home/vagrant/lab-k8s-playground/install/logs/pfwd-prometheus.log
####################################
# Launch target istio-bookinfo...
####################################
» Forwarding service/istio-ingressgateway 31380:80...
Done. Please check /home/vagrant/lab-k8s-playground/install/logs/pfwd-istio-ingressgateway.log
Total elapsed time: 2 seconds

这样,我们就能在本机浏览器里对它们进行访问了。利用launch endpoints命令,我们可以看到当前集群里可供访问的所有endpoint:

$ launch endpoints
Targets to be launched: [endpoints]                                                                                                          
####################################                                                                                                         
# Launch target endpoints...                                                                                                                 
####################################                                                                                                         
» common endpoints...
✔ Web terminal: https://192.168.56.100:4200                                                                                                  
✔    Dashboard: http://192.168.56.100:32768/api/v1/namespaces/kube-system/services/http:kubernetes-dashboard:/proxy                          
» istio endpoints...
✔        Grafana: http://192.168.56.100:3000                                                                                                 
✔          Kiali: http://192.168.56.100:20001                                                                                                
✔         Jaeger: http://192.168.56.100:15032                                                                                                
✔     Prometheus: http://192.168.56.100:9090                                                                                                 
✔ Istio Bookinfo: http://192.168.56.100:31380/productpage                                                                                    
Total elapsed time: 1 seconds                                                                                                                

输出结果最左侧显示的,是每个endpoint当前的连通状态,表示当前可访问,则表示当前不可访问。如果是在Web终端里执行上述命令,你就可以直接点击每个endpoint后面跟着的URL链接,在新打开的浏览器窗口里访问各个应用,非常方便!

怎么样,Launch Utility的使用是不是很简单啊😊 “简单易用,风格一致”,是开发Launch Utility始终坚持的设计原则。后面,我们还将看到有关Launch Utility的更多玩法!

Launch Utility支持Auto-Completion,如果你想知道当前都支持哪些target,只要在命令行输入launch<空格>,然后按两次Tab,就可以列出全部target。如果想知道当前target都支持哪些命令,则在target名称后面输入::,然后按两次Tab,就可以列出target的全部命令。

动图演示

在下面这个GIF动图里,大家可以看到在Istio和Bookinfo成功部署以后,我是如何在浏览器里访问各个不同应用的,包括:Grafana,Kiali,Jaeger,以及Kubernete Dashboard等(点击图片可放大观看哦)

利用快照恢复集群

随着更多的应用被部署到当前的集群里,我们还可以通过下面的命令为当前集群建立一份快照:

$ launch kubernetes::snapshot

在这一过程中,脚本会搜集并保存当前集群的各种信息。这样一来,即使后面因为某些原因我们把集群“玩”坏了也没关系。只要“销毁”当前集群:

$ launch kubernetes::down

再根据先前保存的快照重启一个新的就可以了:

$ launch kubernetes::up

通过快照恢复得到的集群,会包含创建快照之前部署的所有应用。并且集群启动的速度会很快,因为它不需要再从无到有的部署先前那些应用了。

容器的镜像有更新了怎么办?

前面我们已经看到了,利用Private Registry,我们可以把部署集群需要的所有Docker镜像都保存到Private Registry里。这样,就可以免去通过网络访问远程Public Registry的需要,从而极大地提高了部署的速度。

那么,假如有些保存在Private Registry里的Docker镜像有版本更新了,或者我们有新的Docker镜像需要放到Private Registry里,对于一个已经启动起来的Playground,我们该怎么对Private Registry进行更新,从而反映Docker镜像的这些变化呢?要完成这一工作,依然离不开Launch Utility!用到的命令就是我们前面见到过的:

$ launch registry

每当Private Registry需要更新的时候,我们都可以通过执行这条命令来完成。即使虚机环境已经启动起来了,这条命令也是可以被反复执行的。我们只需要在执行命令之前,找到lab-k8s-playground项目的install/targets/目录,并在该目录下找到images.list文件进行编辑,修改里面Docker镜像的配置信息就可以了,比如修改已有镜像的版本,或添加新的镜像。launch registry命令在执行时会读取这个文件,根据里面的信息对Private Registry进行更新。

我能和别人共享Registry吗?

在基于Vagrant Box的Playground环境里,Private Regsitry是安装在虚机环境里面的,所以当我们利用vagrant destroy把虚机销毁以后,下次再启动新的虚机时,这个初始化过程又会重新执行一遍。在整个虚机环境的启动过程中,Private Registry的初始化是比较耗时的一个环节。如果我们不希望每次启动一个新的虚机环境都要初始化一遍Private Registry,我们也可以把这个环节“搬到”虚机外面来执行。

这种做法还有一个好处,就是能实现一套Private Registry在多个Playground之间共享。比如,在一个团队里面,我们可以搭建起一套团队共享的Private Registry,然后让每个开发人员的本机都指向这个Private Registry。

具体的做法还是执行launch registry命令,只是这一次我们是在虚机外面执行这条命令。耐心等待一段时间之后,Private Registry就在本地启动起来了。这个时候再通过Web终端或普通终端进入虚机,执行如下命令,把当前正在虚机里运行的所有Private Registry都停掉:

$ launch registry::down

然后再利用如下命令,在虚机内部为每个Private Registry启动相应的代理:

$ launch registry-proxy

如果我们为Playground里的代理所提供的Private Registry不是跑在本地宿主机上,而是远程的某台服务器,那么在运行registry-proxy命令之前,需要通过环境变量REGISTRY_REMOTE告诉脚本,远程服务器的IP地址:

$ export REGISTRY_REMOTE=<your_team_registry>
$ launch registry-proxy

最后,我们再次执行launch命令,重新部署一次Kubernetes集群,看看集群是否能成功部署:

$ launch kubernetes

怎么在离线模式下使用虚机?

前面我们提到过,Private Registry实际上是把部署集群所需的Docker镜像都保存到了本地,从而免去通过网络访问远程Public Registry抓取镜像的需要。这样做除了能够提高部署速度以外,还有另一个效果,那就是我们可以实现在没有网络连接的情况下运行Kubernetes集群,从而实现真正的“All-in-One”,非常适合demo环境的搭建。

要实现这一点,除了用到前面的launch registry命令外,我们还可以通过下面这条命令,把前面提到的用于模拟Docker Hub的registry-1.docker.io通过443端口暴露到集群外部:

$ launch registry::docker.io

完成这一步之后,我们就可以彻底把网络切断了!

动图演示

在下面这个GIF动图里,大家可以看到我是如何在没有网络连接的状态下部署Kubernetes集群并安装Helm的!(点击图片可放大观看哦)

还有哪些地方我可以定制的?

前面我们已经看到了,即使Playground环境已经启动了,我们依然可以利用强大而灵活的Launch Utility根据需要对环境进行各种定制,比如:有选择性的部署安装某些应用,或者对Private Registry进行更新等等。

Vagrantfile

除此以外,针对基于Vagrant Box的Playground环境,我们还可以通过位于项目根目录下的Vagrantfile文件对其进行定制:

# set number of vcpus
cpus = '6'
# set amount of memory allocated by vm
memory = '8192'

# targets to be run, can be customized as your need
targets = "init default helm tools"

# set Kubernetes version, supported versions: v1.12, v1.13, v1.14, v1.15
k8s_version = "v1.14"
# set number of worker nodes
num_nodes = 2
# set host ip of the box
host_ip = '192.168.56.100'

# special optimization for users in China, 1 or 0
is_in_china = 0
# set https proxy
https_proxy = ""

比如,我们可以调节分配给虚机环境的CPU和内存资源的大小,以及虚机的IP地址,还可以指定集群环境所使用的Kubernetes版本,节点的数目,以及所要安装和部署的target。

针对中国用户的优化

另外,对于中国地区的用户,lab-k8s-playground还专门设计了一个配置项,叫做is_in_china。其目的是为了解决Kubernetes集群部署过程中,由于区域网络限制而无法访问某些国外网站,如:Google的Container Registry,Helm的默认Repository等,而导致集群部署失败的问题。

注意,大部分配置项在虚机里面和外面都是有效和可用的。如果是在虚机外面使用,只要把配置项的名称转换成全大写形式,然后以环境变量的方式定义就可以了。比如:

$ NUM_NODES=3 IS_IN_CHINA=1 launch registry kubernetes helm

这条命令告诉launch.sh,启动的集群要包含3个工作节点,且针对中国地区的用户进行优化。

扩展Launch Utility

最后,Launch Utility本身也是支持扩展的。如果我们希望用launch命令部署lab-k8s-playground项目目前还不支持的应用,包括我们自己的应用,那就定义一个你自己的target吧!自定义target非常简单,除了需要会一点Shell编程的技能以外,剩下的就是快速阅读一下“Launch Utility Usage Guide”这篇文档,或者学习一下 install/targets/sample.sh 这个参考实现,然后你就可以动手改造Launch Utility啦!

还有哪些参考资料我能访问?

读到这里,相信你对开源项目lab-k8s-playground及其All-in-One Playground的使用应该有了比较全面的了解了。那么,还有哪些参考资料你可以访问呢?那就请快速读一下下面这段Shell脚本编写的“代码”吧😊 相信一定难不倒你!

选择你感兴趣的分支,点击相应分支下列出的文档资源。最后,如果您喜欢这个项目,欢迎点击本文开头处(或下列代码注释里)的按钮,关注,加星,以及贡献代码^_^

function where_to_start {
  case $I_want in
  "to learn what it provides in general")
    cat "All-in-One K8S Playground Overview"
    ;;
  "to get started quickly")
    cat "All-in-One K8S Playground Usage Guide"
    cat "All-in-One K8S Playground 中文使用指南"
    ;;
  "to understand what's behind")
    cat "Launch multi-node k8s cluster locally in one min..."
    cat "Kubernetes实战视频: 如何1分钟内在本地启动一个多节点集群"
    cat "OpenShift v3的填坑之旅"
    cat "OpenShift v4的填坑之旅"
    ;;
  "to extend it by myself")
    cat "Launch Utility Usage Guide"
    cat "A Sample Target for Demo Purpose"
    ;;
  "to learn more cool features")
    cat "Quick Guide to Launch APIC Playground"
    cat "把API Connect关进All-in-One K8S Playground里"
    cat "All-in-One K8S Playground新增OpenShift支持"
    cat "All-in-One K8S Playground支持OpenShift v4"
    ;;
  "to contribute back")
    # Feel free to click these buttons: Watch Star Fork
    git clone https://github.com/morningspace/lab-k8s-playground.git
    ;;
  esac
}

留下评论

您的电子邮箱地址并不会被展示。请填写标记为必须的字段。 *

正在加载...