Minikube 架构及启动流程剖析

2023-11-19

原文作者:wzqnls

编辑:夏天

对于要学习 Kubernetes 或者需要本地开发的开发人员来说,Minikube 是一个不错的选择。通过使用 Minikube 这个工具,我们可以非常快捷地在本地部署一套单节点的 Kubernetes 集群,并且对物理资源没有过高的要求,有一种开箱即用的感觉。本文通过对 Minikube 架构及源码的分析带读者了解 Minikube start 这个命令背后发生的故事。

Minikube 背景简述

Kubernetes 是目前公认最为主流的容器编排的开源平台。企业应用服务需要容器化时都避免不了学习和使用 Kubernetes 。然而部署一整套多节点的 Kubernetes 集群对于刚接触它的开发人员来说确实有一定的难度。

针对这种情况,Kubernetes 官方提供了 Minikube 与 Kubeadm 两个工具来帮助开发人员快速部署 Kubernetes 环境。 Minikube 用于快速在本地搭建 Kubernetes 单节点集群环境,它对硬件资源没有太高的要求,方便开发人员学习试用,或者进行日常的开发。 虽然说 Minikube 部署的是单节点的集群,不过麻雀虽小,五脏俱全,深入了解后就会发现这也是个有意思的项目。Kubeadm 则是官方推荐的部署 Kubernetes 多节点集群的工具,由于不是本文重点,不作过多赘述。

Minikube 架构分析

主要组件

localkube

  1. 为了运行和管理 Kubernetes 的组件,Minikube 中使用了 Spread's 的 localkube,localkube 是一个独立的 Go 语言的二进制包,包含了所有 Kubernetes 的主要组件,并且以不同的 goroutine 来运行。

libmachine

  1. 为了支持 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。

启动流程总结

  1. 通过 libmachine 启动虚拟机,生成 Docker 相关证书及配置文件,启动 Docker;

  2. 生成 Kubernetes 相关配置文件和 addons,以及相关证书,拷贝至虚拟机;

  3. 基于之前的配置文件,生成启动脚本,启动 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Minikube 架构及启动流程剖析 的相关文章

随机推荐

  • System.getProperty用法

    转自 http blog darkmi com 2011 03 16 1666 html System getProperty 用于获取当前的系统属性 比如java版本 操作系统名称 区域 用户名等 这些属性一般由jvm自动获取 不能手工设
  • IQ调制的过程

    正交调制 IQ modulation IQ调制器的相移器原理 正交调制数学表达和图形化过程i显示 关键元素都在里面 普通调制的过程 PAM调制的原理 IQ modulators are versatile building blocks f
  • 如何将Visio绘制的图保存为300dpi的tif图片

    采用visio 2013绘图 用ctrl A全选绘制的图 开始 另存为 选择保存类型为tif Tif输出设置 分辨率设为300dpi 300dpi 验证一下图片分辨率 右击生成的tif文件 属性 详细信息
  • 问题记录:js的=>和function

    这个问题搞了一整天 是这么一个功能
  • 认识 maven_我的总结

    认识 maven maven Apache Maven 是一种用于软件项目管理工具 基于 Project Object Model POM 用来管理项目的构建 汇报及文档生成等功能 软件开发 开发 gt 测试 gt 安装与部署 开发阶段 依
  • Apache Flink Checkpoint 应用实践

    Checkpoint 与 state 的关系 Checkpoint 是从 source 触发到下游所有节点完成的一次全局操作 下图可以有一个对 Checkpoint 的直观感受 红框里面可以看到一共触发了 569K 次 Checkpoint
  • STM32_USB之完全双缓存(包括发送和接收) -- 更新中断处理

    STM32的USB双缓存接收代码其实已经可以在ST提供的USB示例代码中找到 只要稍加修改 就可以得到将近1MB的数据接收性能 虽然Datasheet中说明USB发送也同样可以使用双缓存 但并没有示例代码 由于为了测试性能 自己做了一个 测
  • R语言GGPLOT2绘制圆环图雷达图/星形图/极坐标图/径向图Polar Chart可视化分析汽车性能数据

    最近我们被客户要求撰写关于可视化的研究报告 包括一些图形和统计输出 漂亮的圆形图 我不确定对数据分析师本身是否有额外的好处 但如果能吸引决策者的注意 那对我来说就是额外的价值 然而 用coord polar 或偶尔发现的ggplot2中的c
  • Lua的线程和状态 及协程

    luaL loadstring L return coroutine create function end nCallResult lua pcall L 0 1 0 创建一个协程和lua newthread创建一个线程一样 不过这个创建
  • 关于mysql group_concat不得不说的事

    mysql中 group concat函数将group by产生的同一个分组中的值连接起来 返回一个字符串结果 当查询的数据过多时 group concat超出了默认值1024个字符 超过就会截断 导致group concat查询出来的数据
  • ppt怎么压缩文件大小?学会这几种方法

    ppt 用office PowerPoint 制作的幻灯片 用于编辑 播放 各种操作 简单易学 在实际的生活和办公过程中 ppt文件的应用范围非常广泛 同样的 ppt也是非常重要的工具之一 很多时候 我们需要对ppt文件进行压缩 从而满足p
  • 原理图中的电阻旁边有个”NC“,什么意思?

    NC表示此处空贴 即此处不贴任何电子器件 如果安装的话 电路会有另外的功能 或许在性能上会有变化 常用于电路板贴装技术中 电路板贴装是回流焊中的一种工艺流程 回流焊也叫再流焊 是伴随微型化电子产品的出现而发展起来的焊接技术 主要应用于各类表
  • leetcode-无重复元素的最长子串

    给定一个字符串 请你找出其中不含有重复字符的最长子串的长度 例如对于字符串 str adfhdsla 它的无重复字符的最长子串为 sub adfhdsl 很显然 首先要有一个函数用以判断当前的子串中有无重复元素 然后寻找子串的工作就要用这个
  • 闲云:unity中不能识别monobehevior关键字的问题

    有时候一些小问题很恼人 如unity中新建脚本后不能识别monobehevior关键字 在vs2017右侧的解决方案中点击刷新图标 或者把不能识别的脚本添加到vs2017右侧的解决方案中的Assets中即可 还不行就点击 排除 然后再 添加
  • QApplication和QCoreApplication

    一 QCoreApplication用于non GUI的应用程序 不需要依赖QtGui库 QApplication用于包含GUI的应用程序 需要用到QtGui库 Qt是一个开源的C 库 主要用来开发GUI程序 但同时 它也支持控制台程序的开
  • log4j使用说明

    查阅阿里的jva开发手册 我们发现在打印日志的时候有一下几条是强制的 1 应用中不可直接使用日志系统 Log4j Logback 中的API 而应依赖使用日志框架SLF4J中的API 使用门面模式的日志框架 有利于维护和各个类的日志处理方式
  • 前端自测.

    交互 宽度1200px 表单校验 长度 敏感词汇 初始化 loading 结果 空 表单重复提交 loading 请求拦截 限流 数字 大数据 千分位 文本长度 省略号 数据查询结果校验 按条件查询结果是否正确 空数据传参 xx 参数头尾有
  • go struct{} 空结构体的特点和作用

    空结构体的特点和作用 参考代码 package main import fmt unsafe func main empStruct 空结构体的实例和作用 func empStruct 空结构体的特点 1 不占用内存 2 地址不变 var
  • Input

    Unity3d的所有输入 包括键盘鼠标和智能手机触摸等都是通过这一个类来完成 Input类 见API http docs unity3d com ScriptReference Input html 输入Input类使用 建议在Updata
  • Minikube 架构及启动流程剖析

    原文作者 wzqnls 编辑 夏天 对于要学习 Kubernetes 或者需要本地开发的开发人员来说 Minikube 是一个不错的选择 通过使用 Minikube 这个工具 我们可以非常快捷地在本地部署一套单节点的 Kubernetes