原文作者:wzqnls
编辑:夏天
对于要学习 Kubernetes 或者需要本地开发的开发人员来说,Minikube 是一个不错的选择。通过使用 Minikube 这个工具,我们可以非常快捷地在本地部署一套单节点的 Kubernetes 集群,并且对物理资源没有过高的要求,有一种开箱即用的感觉。本文通过对 Minikube 架构及源码的分析带读者了解 Minikube start 这个命令背后发生的故事。
Minikube 背景简述
Kubernetes 是目前公认最为主流的容器编排的开源平台。企业应用服务需要容器化时都避免不了学习和使用 Kubernetes 。然而部署一整套多节点的 Kubernetes 集群对于刚接触它的开发人员来说确实有一定的难度。
针对这种情况,Kubernetes 官方提供了 Minikube 与 Kubeadm 两个工具来帮助开发人员快速部署 Kubernetes 环境。 Minikube 用于快速在本地搭建 Kubernetes 单节点集群环境,它对硬件资源没有太高的要求,方便开发人员学习试用,或者进行日常的开发。 虽然说 Minikube 部署的是单节点的集群,不过麻雀虽小,五脏俱全,深入了解后就会发现这也是个有意思的项目。Kubeadm 则是官方推荐的部署 Kubernetes 多节点集群的工具,由于不是本文重点,不作过多赘述。
Minikube 架构分析
主要组件
localkube
- 为了运行和管理 Kubernetes 的组件,Minikube 中使用了 Spread's 的 localkube,localkube 是一个独立的 Go 语言的二进制包,包含了所有 Kubernetes 的主要组件,并且以不同的 goroutine 来运行。
libmachine
- 为了支持 MacOS 和 Windows,Minikube 在内部使用 libmachine 创建或销毁虚拟机,可以将它理解为一个虚拟机的驱动程序。至于在 Linux 上,由于集群可以直接本地运行,所以避免设置虚拟机。
流程总结
MacOS/Windows
minikube -> libmachine -> virtualbox/hyper V -> linux VM -> localkube
Linux
minikube -> docker -> localkube
Minikube 启动过程分析
启动过程中的主要调动关系
部分源码分析
cmd/minikube/cmd/start.go
在执行 Minikube start 命令之后,这段代码会进行一个初始化,并且会调用 runStart() 函数,这个函数在整个启动过程起着至关重要的作用。
cmd/minikube/cmd/start.go
在这段代码块中,k8sBootstrapper 执行了 UpdateCluster、SetupCerts、StartCluster 三个方法。这三个方法被定义在 Bootstrapper 这个接口中, Bootstrapper 接口共有 LocalkubeBootstrapper 和 KubeadmBootstrapper 两种实现,然而 LocalkubeBootstrapper 的实现目前已被声明弃用,在后续的版本中会进行移除,故推荐使用 KubeadmBootstrapper 实现。
pkg/minikube/bootstrapper/kubeadm/kubeadm.go
UpdateCluster() 首先对 Kubernetes 镜像缓存进行了加载,然后将 addons 拷贝至虚拟机中,接着启动了 Kubelet 服务。
pkg/minikube/bootstrapper/kubeadm/kubeadm.go
pkg/minikube/bootstrapper/certs.go
SetUpCerts() 生成 Kubernetes 相关证书,并拷贝至虚拟机。
pkg/minikube/bootstrapper/kubeadm/kubeadm.go
调用 GetStartCommand 获取 startCommand,然后执行 startCommand 命令,启动 Cluster。
cmd/minikube/cmd/start.go
pkg/util/kubeconfig/config.go
kubeconfig 中保存了 Kubernetes Client 的配置信息,SetupKubeConfig() 将 kubeconfig 读出来,然后将 Minikube 的配置添加进去,并重新写回硬盘。
pkg/provision/buildroot.go
configureAuth() 主要生产了 Docker 相关证书,并将证书拷贝至虚拟机。p.GenerateDockerOptions() 生成了 Docker 的配置文件,并启动 Docker。
启动流程总结
-
通过 libmachine 启动虚拟机,生成 Docker 相关证书及配置文件,启动 Docker;
-
生成 Kubernetes 相关配置文件和 addons,以及相关证书,拷贝至虚拟机;
-
基于之前的配置文件,生成启动脚本,启动 Kubernetes 集群,并可以通过 Client 进行访问。
参考文献:
[1] https://kubernetes.io/blog/2016/07/minikube-easily-run-kubernetes-locally/
[2] https://github.com/kubernetes/minikube
[3] https://github.com/kubernetes/community/blob/master/contributors/design-proposals/cluster-[4] lifecycle/local-cluster-ux.md
[5] https://github.com/kubernetes/minikube/blob/master/docs/contributors/build_guide.md