K8s 源码剖析及debug实战(二):debug K8s 源码

发布时间:2023年12月27日


0. 引言

欢迎关注本专栏,本专栏主要从 K8s 源码出发,深入理解 K8s 一些组件底层的代码逻辑,同时借助 debug Minikube 来进一步了解 K8s 底层的代码运行逻辑细节,帮助我们更好的了解不为人知的运行机制,让自己学会如何调试源码,玩转 K8s。

本专栏适合于运维、开发以及希望精进 K8s 细节的同学。同时本人水平有限,尽量将本人理解的内容最大程度的展现给大家~

前情提要:
《K8s 源码剖析及debug实战(一):Minikube 安装及源码准备》

1. 启动 Minikube

其中 --kubernetes-version 可以选择其他版本,我这里用的是 v1.21.2

minikube start --driver=docker --image-mirror-country='cn' --image-repository='docker.io' --kubernetes-version=v1.21.2

如果启动遇到拉取镜像异常,参考《Mac 安装 Minikube 及解决 “[ERROR ImagePull]: failed to pull image“ 问题》 第4章。

当 K8s 所有管控面的组件拉起后,Minikube 才启动成功:

kubectl get pod -A

在这里插入图片描述

2. 停止 K8s 组件

下面以组件 kube-scheduler 为例,介绍如何 debug K8s。

2.1 找到 Minikube 容器

我这里的启动参数 --driver=docker,说明 K8s 进程是在 docker 容器中的。

docker ps |grep minikube

在这里插入图片描述

2.2 找到 K8s 配置文件

  1. 进入到 Minikube 容器
docker exec -it minikube bash
  1. 进入 K8s 配置路径
cd /etc/kubernetes

其中 manifests 目录里存放着 K8s 所有的核心组件的 yaml 文件。
在这里插入图片描述

  1. 以 kube-scheduler 为例,查看启动命令
ps -ef |grep scheduler

在这里插入图片描述
从图中可以看到,这里的启动参数有配置文件 /etc/kubernetes/scheduler.conf,因此将 /etc/kubernetes/scheduler.conf 保存下来,后续要用

2.3 停止组件

因为我们要用自己本地的代码代替环境中的组件,所以环境里的组件要停止,让逻辑走到本地来。以 kube-scheduler 为例:

mv /etc/kubernetes/manifests/kube-scheduler.yaml /etc/kubernetes/kube-scheduler.yaml

一旦把 kube-scheduler.yamlmanifests 文件夹中移走,则 K8s 的 kube-schedueler pod 会删除。环境没有 kube-schedueler pod:
在这里插入图片描述

3. Goland 配置

3.1 scheduler.conf 配置

将上节的 /etc/kubernetes/scheduler.conf 拷贝到源码的 cmd/kube-scheduler/scheduler.conf
在这里插入图片描述
注意,本地 scheduler.conf 的 server 需要修改:
在这里插入图片描述
具体的端口需要查看 docker:

docker ps |grep minikube

在这里插入图片描述
找到指向 8443/tcp 的,这里的端口就是上面要改的,也就是说,我们访问本地的 51891 端口,就可以访问到容器的 kube-scheduler

3.2 启动配置

在这里插入图片描述
在这里插入图片描述
启动参数:

--authentication-kubeconfig=cmd/kube-scheduler/scheduler.conf
--authorization-kubeconfig=cmd/kube-scheduler/scheduler.conf
--bind-address=127.0.0.1
--kubeconfig=cmd/kube-scheduler/scheduler.conf
--leader-elect=false
--port=0

4. 验证

  1. 打上断点
    在这里插入图片描述
  2. 点击 Goland 的 debug 按钮
  3. 运行一个 pod
kubectl run  busybox  --image=busybox:1.28
  1. 可以捕捉到程序,进入到断点在这里插入图片描述
    同时 pod 处于 pending 阶段:
kubectl get pod -A

在这里插入图片描述
如此,大功告成,可以 debug K8s 源码了!!

5. 参考

《K8s 源码剖析及debug实战(一):Minikube 安装及源码准备》

文章来源:https://blog.csdn.net/qq_36803941/article/details/135223851
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。