欢迎关注本专栏,本专栏主要从 K8s 源码出发,深入理解 K8s 一些组件底层的代码逻辑,同时借助 debug Minikube 来进一步了解 K8s 底层的代码运行逻辑细节,帮助我们更好的了解不为人知的运行机制,让自己学会如何调试源码,玩转 K8s。
本专栏适合于运维、开发以及希望精进 K8s 细节的同学。同时本人水平有限,尽量将本人理解的内容最大程度的展现给大家~
前情提要:
《K8s 源码剖析及debug实战(一):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
下面以组件 kube-scheduler 为例,介绍如何 debug K8s。
我这里的启动参数 --driver=docker
,说明 K8s 进程是在 docker 容器中的。
docker ps |grep minikube
docker exec -it minikube bash
cd /etc/kubernetes
其中 manifests
目录里存放着 K8s 所有的核心组件的 yaml 文件。
ps -ef |grep scheduler
从图中可以看到,这里的启动参数有配置文件 /etc/kubernetes/scheduler.conf
,因此将 /etc/kubernetes/scheduler.conf
保存下来,后续要用
因为我们要用自己本地的代码代替环境中的组件,所以环境里的组件要停止,让逻辑走到本地来。以 kube-scheduler 为例:
mv /etc/kubernetes/manifests/kube-scheduler.yaml /etc/kubernetes/kube-scheduler.yaml
一旦把 kube-scheduler.yaml
从 manifests
文件夹中移走,则 K8s 的 kube-schedueler pod 会删除。环境没有 kube-schedueler pod:
将上节的 /etc/kubernetes/scheduler.conf
拷贝到源码的 cmd/kube-scheduler/scheduler.conf
。
注意,本地 scheduler.conf
的 server 需要修改:
具体的端口需要查看 docker:
docker ps |grep minikube
找到指向 8443/tcp
的,这里的端口就是上面要改的,也就是说,我们访问本地的 51891
端口,就可以访问到容器的 kube-scheduler
。
启动参数:
--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
kubectl run busybox --image=busybox:1.28
kubectl get pod -A
如此,大功告成,可以 debug K8s 源码了!!