当前位置: 首页 > article >正文

minikube源码学习

在这里插入图片描述

源码编译

获取源码

git clone --branch v1.35.0 --single-branch   https://github.com/kubernetes/minikube

查看编译命令

默认make命令会编译多个平台的minikube二进制文件,我们只需要linux即可。
查看makefile文件,会看到
在这里插入图片描述

执行命令

make minikube-linux-amd64

可以看到编译命令,我们添加禁用优化参数后如下:

GOOS="linux" GOARCH="amd64"  \
go build -tags "" -gcflags="all=-N -l" -ldflags="-X k8s.io/minikube/pkg/version.version=v1.35.0 -X k8s.io/minikube/pkg/version.isoVersion=v1.35.0 -X k8s.io/minikube/pkg/version.gitCommitID="dd5d320e41b5451cdf3c01891bc4e13d189586ed" -X k8s.io/minikube/pkg/version.storageProvisionerVersion=v5" -a -o out/minikube-linux-amd64 k8s.io/minikube/cmd/minikube

注意go.mod文件中go开发工具链的版本要与本地环境一致,否则触发下载go的压缩包,很慢。

编译成功后,添加到$HOME/.profile中, 方便使用

alias minikube='/root/minikube/out/minikube-linux-amd64'

vscode配置

lanunch.json配置

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Remote Attach",
            "type": "go",
            "request": "attach",
            "mode": "remote",
            "remotePath": "/root/minikube",
            "port": 8005,
            "host": "4c",  // 远程服务器的 IP 地址
            "showLog": true,
            "trace": "verbose",             // 更详细的日志输出
            "substitutePath": [
                {
                    "from": "/Users/wy/wy/workspace/k8s-space/minikube", // 本地路径
                    "to": "/root/minikube"                               // 远程路径
                },
                {
                    "from": "/Users/wy/wy/workspace_go/pkg/mod", // 本地路径
                    "to": "/root/go_path/pkg/mod" // 远程路径
                },
                
            ]
        }, 
    ]
}

调试命令如下

dlv --headless --listen=:8005 --api-version=2 --accept-multiclient --log exec /root/minikube/out/minikube-linux-amd64 -- start --force --log_file=minikube.log --v=3

minikube start源码阅读

老规矩,从makefile或者上面得到编译命令可知,minikube二进制文件的入口代码是cmd/minikube/main.go.知道了入口后,没什么好说的,又是一行行地读源码了。

从入口可以看到又是老朋友github.com/spf13/cobra,于是在root.go中看到所有的子命令对应的执行函数
在这里插入图片描述

然后就是一直顺着读代码就行,无非就是校验配置、补全配置、然后保存配置到文件以及下载gcr.io/k8s-minikube/kicbase镜像。直到创建了一个APIClient
在这里插入图片描述

返回一个LocalClient结构体对象

type LocalClient struct {
	certsDir  string
	storePath string
	*persist.Filestore
	legacyClient libmachine.API
	flock        *fslock.Lock
}

随后会调用它的Create函数启动gcr.io/k8s-minikube/kicbase容器
在这里插入图片描述

在创建容器前,会先配置网络和创建卷,然后将后续部署k8s所需要的tar包解压到卷上。这里代码就不截图了,记录下执行的docker命令。

创建网络的命令如下

docker network create --driver=bridge --subnet=192.168.49.0/24 --gateway=192.168.49.1 -o --ip-masq -o --icc -o com.docker.network.driver.mtu=1500 --label=created_by.minikube.sigs.k8s.io=true --label=name.minikube.sigs.k8s.io=minikube minikube

该命令的作用是创建了一个名为 minikube 的自定义 Docker 桥接网络。该网络的子网为 192.168.49.0/24,网关为 192.168.49.1,启用了 IP 伪装和容器间通信,并设置了网络的 MTU

创建卷的命令如下

docker volume create minikube --label name.minikube.sigs.k8s.io=minikube --label created_by.minikube.sigs.k8s.io=true

解压命令如下

docker run --rm --entrypoint /usr/bin/tar -v /root/.minikube/cache/preloaded-tarball/preloaded-images-k8s-v18-v1.32.0-docker-overlay2-amd64.tar.lz4:/preloaded.tar:ro -v minikube:/extractDir gcr.io/k8s-minikube/kicbase:v0.0.46 -I lz4 -xf /preloaded.tar -C /extractDir

压缩包里面的内容如下,不难猜出后续是利用kubeadm进行部署集群
在这里插入图片描述

继续看minikube源码,会看到熟悉的拼接docker命令的代码
在这里插入图片描述

最终执行的docker命令如下

docker run -d -t --privileged --security-opt seccomp=unconfined --tmpfs /tmp --tmpfs /run -v /lib/modules:/lib/modules:ro --hostname minikube --name minikube --label created_by.minikube.sigs.k8s.io=true --label name.minikube.sigs.k8s.io=minikube --label role.minikube.sigs.k8s.io= --label mode.minikube.sigs.k8s.io=minikube --network minikube --ip 192.168.49.2 --volume minikube:/var --security-opt apparmor=unconfined --memory=3700mb -e container=docker --expose 8443 --publish=127.0.0.1::8443 --publish=127.0.0.1::22 --publish=127.0.0.1::2376 --publish=127.0.0.1::5000 --publish=127.0.0.1::32443 gcr.io/k8s-minikube/kicbase:v0.0.46

这条命令创建并启动了一个名为 minikube 的容器,下面是部分参数的说明

  • --privileged 启用特权模式,授予容器更高的权限(如访问主机设备)
  • -security-opt seccomp=unconfined 关闭了seccomp 沙箱限制,允许容器运行更多系统调用
  • --security-opt apparmor=unconfined: 禁用 AppArmor 安全策略
  • --tmpfs /tmp --tmpfs /run/tmp/run 挂载为临时文件系统(存储在内存中)

既然是容器,那么就要看dockerfile文件去了解这个容器里面干了什么。 在Makefile里面有几条规则是用来构建Kicbase镜像的,可以找到对应的dockerfile
在这里插入图片描述

查看dockerfile后,发现仅仅是在ubuntu镜像上安装了一些基础包、dockerpodman等软件,并没有启动k8s相关的进程逻辑在里面。容器默认的entrypoint也仅仅是启动了init进程。所以kicbase容器,是用来充当一台虚拟机用的。可以猜想,后续的逻辑是在这个kicbase容器中,使用kubeadm部署k8s集群,也就是所谓的DinD(docker in docker)。

回到先前代码的分叉路继续往下看
在这里插入图片描述

最终看到在minikube容器内调用kubeadm初始化集群的命令如下

sudo env PATH="/var/lib/minikube/binaries/v1.32.0:$PATH" kubeadm init --config /var/tmp/minikube/kubeadm.yaml --ignore-preflight-errors=DirAvailable--etc-kubernetes-manifests,DirAvailable--var-lib-minikube,DirAvailable--var-lib-min ikube-etcd,FileAvailable--etc-kubernetes-manifests-kube-scheduler.yaml,FileAvailable--etc-kubernetes-manifests-kube-apiserver.yaml,FileAvailable--etc-k ubernetes-manifests-kube-controller-manager.yaml,FileAvailable--etc-kubernetes-manifests-etcd.yaml,Port-10250,Swap,NumCPU,Mem,SystemVerification,FileContent--proc-sys-net-bridge-bridge-nf-call-iptables

kubeadm启动集群所需要的容器是前面创建卷的时候,解压preloaded-images-k8s-v18-v1.32.0-docker-overlay2-amd64.tar.lz4到卷里面,然后在启动kicbase容器的时候将卷挂载到/var目录下,docker默认的镜像存储目录就是/var/lib/docker,如果使用的存储驱动是overlay2则存储目录是/var/lib/docker/overlay2/

总结

miniKubekubeadm搞环境,选择了minikube,想着容器对环境的污染少一点,才看的minikube源码,没想到里面调的是kubeadm


http://www.kler.cn/a/519084.html

相关文章:

  • 【自然语言处理(NLP)】jieba分词的使用(分词模式、关键词提取)
  • 【BQ3568HM开发板】深入解析智能家居中控屏工程的NAPI接口设计
  • 视觉语言模型 (VLMs):跨模态智能的探索
  • [ACTF2020 新生赛]BackupFile1
  • 【Redis】在ubuntu上安装Redis
  • 每天五分钟深度学习框架pytorch:搭建谷歌的Inception网络模块
  • Elastic Agent 对 Kafka 的新输出:数据收集和流式传输的无限可能性
  • CSS(二)——选择器
  • 个人网站搭建
  • 基于Flask的北京房屋租赁管理系统的设计与实现
  • 从管道符到Java编程
  • Linux 常用命令——网络篇(保姆级说明)
  • jira.issueviews
  • 把Eclipse转为AndroidStudio2024.1工程android源码转换过程 解决示例:android蓝牙串口助手
  • C++11线程
  • 超分辨率体积重建实现术前前列腺MRI和大病理切片组织病理学图像的3D配准
  • 【网络编程】Java高并发IO模型深度指南:BIO、NIO、AIO核心解析与实战选型
  • 【技术】TensorRT 10.7 安装指南(Ubuntu22.04)
  • Unity git版本管理
  • react面试题二