Minikube 架构及启动流程剖析
技术
作者:wzqnls
译者:
2018-06-20 02:49



原文作者:wzqnls

编辑:夏天

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

246 comCount 0