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

Kubernetes源码学习

kubernetes源码剖析

1.下载和编译源码

go 1.18.3

kubernetes 1.24.2

centos 7.9

进入目录$GOPATH/src/k8s.io/kubernetes,执行以下命令即可全量构建,并且构建结果只包含linux平台的:

KUBE_BUILD_PLATFORMS=linux/amd64 make all GOFLAGS=-v GOGCFLAGS="-N -l"

在目录$GOPATH/src/k8s.io/kubernetes执行以下命令,就会构建linux平台下的kubectl文件:

KUBE_BUILD_PLATFORMS=linux/amd64 make WHAT=cmd/kubectl GOFLAGS=-v GOGCFLAGS="-N -l"

在目录$GOPATH/src/k8s.io/kubernetes/_output/bin,可以见到最新构建的kubectl文件.

2.编译和部署镜像(api-server)

go 1.18.3

kubernetes 1.24.2

centos 7.9

containerd v1.6.6

依赖镜像的下载
在编译过程中会用到以下三个镜像
k8s.gcr.io/kube-cross:v1.11.5-1
k8s.gcr.io/debian-iptables-amd64:v11.0
k8s.gcr.io/debian-base-amd64:0.4.0

打开文件build/lib/release.sh,找到下面这段内容,将其中的—pull删除,这样就不会重新去远程下载镜像了:

"${DOCKER[@]}" build --pull -q -t "${docker_image_tag}" "${docker_build_path}" >/dev/null

修改源码,本次要修改的是api-server的源码,在里面加一些日志,最后在验证环节只要能看见这些日志就说明我们修改的源码可以成功运行;
修改的文件是create.go路径如下,这个文件是创建资源的响应入口:

$GOPATH/src/k8s.io/kubernetes/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/create.go

在create.go处理请求的位置增加日志代码,如下所示,所有fmt.Println的调用都是本次新增的内容:

func createHandler(r rest.NamedCreater, scope RequestScope, admit admission.Interface, includeName bool) http.HandlerFunc {return func(w http.ResponseWriter, req *http.Request) {fmt.Println("***********************************************************************************************")fmt.Println("start create", req)fmt.Println("-----------------------------------------------------------------------------------------------")fmt.Printf("%s\n", debug.Stack())fmt.Println("***********************************************************************************************")

上述代码的作用是在api-server接收到创建资源的请求时打印日志,日志内容是http请求内容和当前方法的调用堆栈打印出来;

进入目录$GOPATH/src/k8s.io/kubernetes,执行以下命令开始构建镜像:
根据build/root/Makefile中的描述,KUBE_BUILD_CONFORMANCE参数用来控制是否创建一致性测试镜像,KUBE_BUILD_HYPERKUBE控制是否创建hyperkube镜像(各种工具集成在一起),这两个目前都用不上,因此是设置为"n"表示不构建;

http://www.lryc.cn/news/33625.html

相关文章:

  • 筑基九层 —— 指针详解
  • 内存清理、动画制作、CPU检测等五款实用软件推荐
  • RocketMQ 5.0 学习笔记
  • 796.子矩阵的和
  • 【PySide6】信号(signal)和槽函数(slot),以及事件过滤器
  • canal admin管理端配置(二)
  • Servlet 生命周期
  • redis集群模式登陆
  • 04-useMemo 、React.memo、useCallback
  • windows下安装emqx Unable to load emulator DLL@if ===/ SET data_dir=“
  • Redis常见问题(未完待续)
  • 2024秋招BAT核心算法 | 详解图论
  • 凝聚共识,锚定未来 | 第四届OpenI/O 启智开发者大会NLP大模型论坛成功举办!
  • 99.【Git】
  • Linux驱动交叉编译把驱动文件放入开发板,以及printk函数打印级别
  • 力扣(LeetCode)433. 最小基因变化(2023.03.07)
  • 网络基础(2)
  • 掌握Spring Cloud Gateway:构建高性能API网关的原理和实践
  • NAST概述
  • 【JS知识点】——原型和原型链
  • c盘怎么清理到最干净?有什么好的清理方法
  • day26_HTML
  • 深度剖析C语言预处理
  • 【WPF 值转换器】ValueConverter 进阶用法
  • Vue2的基本使用
  • 【云原生kubernetes】k8s数据存储之Volume使用详解
  • SerDes---CDR技术
  • 如何实现在on ethernetPacket中自动回复NDP response消息
  • CSS清楚浮动
  • HTTPS详解(原理、中间人攻击、CA流程)