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

文章目录

  • 0. 引言
  • 1. 启动 Minikube
  • 2. 停止 K8s 组件
    • 2.1 找到 Minikube 容器
    • 2.2 找到 K8s 配置文件
    • 2.3 停止组件
  • 3. Goland 配置
    • 3.1 scheduler.conf 配置
    • 3.2 启动配置
  • 4. 验证
  • 5. 参考


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

K8s 源码剖析及debug实战(二):debug K8s 源码_第1张图片

2. 停止 K8s 组件

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

2.1 找到 Minikube 容器

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

docker ps |grep minikube

K8s 源码剖析及debug实战(二):debug K8s 源码_第2张图片

2.2 找到 K8s 配置文件

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

其中 manifests 目录里存放着 K8s 所有的核心组件的 yaml 文件。
K8s 源码剖析及debug实战(二):debug K8s 源码_第3张图片

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

K8s 源码剖析及debug实战(二):debug K8s 源码_第4张图片
从图中可以看到,这里的启动参数有配置文件 /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:
K8s 源码剖析及debug实战(二):debug K8s 源码_第5张图片

3. Goland 配置

3.1 scheduler.conf 配置

将上节的 /etc/kubernetes/scheduler.conf 拷贝到源码的 cmd/kube-scheduler/scheduler.conf
K8s 源码剖析及debug实战(二):debug K8s 源码_第6张图片
注意,本地 scheduler.conf 的 server 需要修改:
K8s 源码剖析及debug实战(二):debug K8s 源码_第7张图片
具体的端口需要查看 docker:

docker ps |grep minikube

K8s 源码剖析及debug实战(二):debug K8s 源码_第8张图片
找到指向 8443/tcp 的,这里的端口就是上面要改的,也就是说,我们访问本地的 51891 端口,就可以访问到容器的 kube-scheduler

3.2 启动配置

K8s 源码剖析及debug实战(二):debug K8s 源码_第9张图片
K8s 源码剖析及debug实战(二):debug K8s 源码_第10张图片
启动参数:

--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. 打上断点
    K8s 源码剖析及debug实战(二):debug K8s 源码_第11张图片
  2. 点击 Goland 的 debug 按钮
  3. 运行一个 pod
kubectl run  busybox  --image=busybox:1.28
  1. 可以捕捉到程序,进入到断点K8s 源码剖析及debug实战(二):debug K8s 源码_第12张图片
    同时 pod 处于 pending 阶段:
kubectl get pod -A

K8s 源码剖析及debug实战(二):debug K8s 源码_第13张图片
如此,大功告成,可以 debug K8s 源码了!!

5. 参考

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

你可能感兴趣的:(K8s源码剖析及debug实战,kubernetes,容器,云原生,运维,k8s,开源)