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

Html5移动网站该网站正在建设中 马上就来

Html5移动网站,该网站正在建设中 马上就来,互联网平台推广方案,网站开发地址目标 前面看了minikube的源码了解到其本质是调用了kubeadm来启动k8s集群#xff0c;并没有达到最初看代码的目的。 所以继续看看kubeadm的代码#xff0c;看看能否用来方便地构建源码调试环境。 k8s源码编译 kubeadm源码在k8s源码库中#xff0c;所以要先克隆k8s源码。之…目标 前面看了minikube的源码了解到其本质是调用了kubeadm来启动k8s集群并没有达到最初看代码的目的。 所以继续看看kubeadm的代码看看能否用来方便地构建源码调试环境。 k8s源码编译 kubeadm源码在k8s源码库中所以要先克隆k8s源码。之前用minikube创建的k8s集群是v1.32.0 所以克隆v1.32.0版本的代码 git clone --branch v1.32.0 --single-branch https://github.com/kubernetes/kubernetes.git考虑到后续可能要改改源码并保存下来所以我fork了master分支去编译。 在Makefile中可以看到如何编译 在编译前先修改.go-version文件中go的版本, 默认里面指定的是1.23.4。k8s源码中要求go版本是1.23.0以上就可以了我的是1.23.3不想重新下载go压缩包了所以改了。 修改shell脚本让其输出编译的命令看不到命令我不是很放心 通过环境变量指定版本号修改完版本后执行编译命令编译kubeadm export KUBE_GIT_VERSIONv1.32.0 export KUBE_GIT_COMMIT$(git rev-parse --short HEAD) export KUBE_GIT_TREE_STATEclean make all DBG1 WHATcmd/kubelet可以看到编译的命令已经带上了禁用优化的参数了 kubeadm在一开始检查的过程中会调用kubelet获取版本号所以我把全部二进制文件都编译了 export KUBE_GIT_VERSIONv1.32.0 export KUBE_GIT_COMMIT$(git rev-parse --short HEAD) export KUBE_GIT_TREE_STATEclean make all DBG1调试命令如下 dlv --headless --listen:8005 --api-version2 --accept-multiclient --log exec /root/kubernetes/_output/bin/kubeadm -- init --cri-socket unix:///run/containerd/containerd.sockvscode配置如下 {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息请访问: https://go.microsoft.com/fwlink/?linkid830387version: 0.2.0,configurations: [{name: kubeadm,type: go,request: attach,mode: remote,remotePath: /root/kubernetes,port: 8005,host: 4c,showLog: true,trace: verbose,substitutePath: [{from: ${workspaceFolder},to: /root/kubernetes},{from: /Users/wy/wy/workspace_go/pkg/mod, // 本地路径to: /root/go_path/pkg/mod // 远程路径},]}] }调试源码前准备工作 PATH环境变量 将前面编译源码生成二进制文件的目录添加到PATH环境变量中因为kubeadm需要调用kubelet containerd启用cri插件 kubeadm中contianerd是默认的容器运行时containerd需要启动cri插件随docker启动的contianerd默认是禁用了cri插件的。 containerd配置cri插件官方文档地址 https://github.com/containerd/containerd/blob/main/docs/cri/config.md docker version命令查看docker版本是27.5.0, containerd对应的版本是1.7.25 containerd配置文件默认位置是/etc/containerd/config.toml 在配置文档中有完整的配置文件样例且有大量的注释有需要的时候再来看但这不是我们目前要关注的 使用命令生成默认配置 # 备份旧配置 cp /etc/containerd/config.toml /etc/containerd/config.toml.bak # 生成默认配置 containerd config default /etc/containerd/config.toml修改的值如下v1.32.0版本k8s要求是3.10版本没有的话会触发下载镜像的操作 SystemdCgroup true sandbox_image registry.k8s.io/pause:3.10需要重启containerd。由于我docker服务是apt安装的估计是自动装的containerd是由systemd托管的。所以重启命令如下 sudo systemctl restart containerd下载k8s相关镜像 由于网络问题你得先下载k8s的镜像 # 查看需要下载的镜像 kubeadm config images list镜像清单如下 registry.k8s.io/kube-apiserver:v1.32.1 registry.k8s.io/kube-controller-manager:v1.32.1 registry.k8s.io/kube-scheduler:v1.32.1 registry.k8s.io/kube-proxy:v1.32.1 registry.k8s.io/coredns/coredns:v1.12.0 registry.k8s.io/pause:3.10 registry.k8s.io/etcd:3.5.17-0然后用github action大法下载镜像下载完成后检查镜像 ctr --namespace k8s.io images list | awk {print $1}镜像已经拉取成功了 配置kubelet kubeadm init命令会使用systemctl命令重启kubelet所以需要编写 /etc/systemd/system/kubelet.service 但是具体怎么写需要通过官方提供的apt命令安装kubeadm后使用kubeadm命令安装一次k8s然后查看kubelet.service可以看到具体的脚本是怎么写的 可以看到需要编写两个文件分别是kubelet.service以及 10-kubeadm.conf 编写/etc/systemd/system/kubelet.service [Unit] Descriptionkubelet: The Kubernetes Node Agent Documentationhttps://kubernetes.io/docs/home/ Wantsnetwork-online.target Afternetwork-online.target[Service] ExecStart/root/kubernetes/_output/bin/kubelet Restartalways StartLimitInterval0 RestartSec10 KillModeprocess Delegateyes[Install] WantedBymulti-user.target 编写/etc/systemd/system/kubelet.service.d/10-kubeadm.conf可以看到这里指定了config.yaml文件 # Note: This dropin only works with kubeadm and kubelet v1.11 [Service] EnvironmentKUBELET_KUBECONFIG_ARGS--bootstrap-kubeconfig/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig/etc/kubernetes/kubelet.conf EnvironmentKUBELET_CONFIG_ARGS--config/var/lib/kubelet/config.yaml # This is a file that kubeadm init and kubeadm join generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically EnvironmentFile-/var/lib/kubelet/kubeadm-flags.env # This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use # the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file. EnvironmentFile-/etc/default/kubelet ExecStart ExecStart/root/kubernetes/_output/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS然后启用该service systemctl enable kubelet.service调试源码 主要是想搞清kubeadm是怎么部署k8s集群的看看能不能用来调试代码。 代码入口是/cmd/kubeadm/kubeadm.go kubeadm源码调试 kebeadm中将部署集群的每个步骤抽象成phase组成一个数组然后遍历这个数组运行每个phase对应的函数当phase数组遍历完了kubeadm init命令就完成了 在cmd命令初始化的时候可以看到有哪些phase 其实在磊哥的《深入剖析Kubernetes》中有写了kubeadm的部署原理只是有些东西还是得自己看看才知道 很明显kubelet的启动对应是NewKubeletStartPhase,随后的NewWaitControlPlanePhase中等待apiserver启动完成。 ... 省略 initRunner.AppendPhase(phases.NewKubeletStartPhase()) initRunner.AppendPhase(phases.NewWaitControlPlanePhase()) ... 省略当 Kubelet 运行时它会持续监视参数staticPodPath指定的目录如果有新的 Pod 配置文件加入Kubelet 会自动创建 Pod。这种启动Pod的方式叫静态启动该过程不需要 apiserver 参与调度。 kubeadm生成的kubelet的配置文件中有个staticPodPath选项值如下 staticPodPath: /etc/kubernetes/manifests该目录下的yaml都是kubeadm生成的共四个yaml文件,分别是 etcd.yamlkube-apiserver.yamlkube-controller-manager.yamlkube-scheduler.yaml kubelet源码调试 正常情况下kubelet是不会有问题的如果在kubeadm init命令执行过程提示 kubelet失败得看kubelet到底报啥错了。查看kubelet日志 journalctl -u kubelet如果从日志上没看出是啥问题可以调试下源码看看。当代码运行到启动kubelet时启动所需要的配置文件都已经生成了所以调试kubelet的时候可以先退出kubeadm的调试。 调试kubelet需要先把kubeadm init的代码运行到下图中的位置然后kill掉调试kubeadm init的dlv进程然后调试kubelet进程 调试前需要先停止kubelet并禁用自动重启 systemctl disable kubelet.service systemctl stop kubelet用下面的命令调试kubelet源码 KUBELET_CONFIG_ARGS--config/var/lib/kubelet/config.yaml KUBELET_KUBECONFIG_ARGS--bootstrap-kubeconfig/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig/etc/kubernetes/kubelet.conf KUBELET_KUBEADM_ARGS--container-runtime-endpointunix:///run/containerd/containerd.sock --pod-infra-container-imageregistry.k8s.io/pause:3.10 dlv --headless --listen:8005 --api-version2 --accept-multiclient --log exec /root/kubernetes/_output/bin/kubelet -- $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS变量$KUBELET_EXTRA_ARGS是由文件/etc/default/kubelet中定义的默认是空值所以我没有赋值。 读取pod文件的代码位置如下config.NewSourceFile中会启动goroutinue监听/etc/kubernetes/manifests的文件如果文件有改动会往一个 channel发送数据 最后在kubelet的主循环中处理channel中的数据创建、更新或者删除pod 启动的代码东西太多了等需要的时候再回来看此处只是记录下代码的位置 kube-scheduler源码调试 回到主题上k8s相关的组件都是通过静态pod的方式启动的要了解一个pod就得看它的yaml文件,以kube-scheduler组件为例 可以看到是使用宿主机的网络命名空间那么就可以直接使用执行源码编译的二进制文件启动kube-schedualer代替静态pod的方式来实现断点调试了。 先用kubeadm init命令把k8s部署成功默认情况下出于安全原因不会在控制平面节点上调度 Pod。想要在控制平面节点上调度需要执行下面的命令 kubectl taint nodes --all node-role.kubernetes.io/control-plane-然后删除对应的kube-scheduler.yaml,由于kubelet是持续监视着/etc/kubernetes/manifests的如果文件有变动则执行对应的操作例如我删除了yaml文件kubelet会删除掉对应的pod 删除yaml文件后已经看不到kube-scheduler了coredns是要等到CNI插件安装成功后才会启动这里先不管 参考yaml中的启动命令使用下面的命令调试 dlv --headless --listen:8005 --api-version2 --accept-multiclient --log exec /root/kubernetes/_output/bin/kube-scheduler -- --authentication-kubeconfig/etc/kubernetes/scheduler.conf --authorization-kubeconfig/etc/kubernetes/scheduler.conf --bind-address127.0.0.1 --kubeconfig/etc/kubernetes/scheduler.conf --leader-electfalse参数说明 --authentication-kubeconfig 负责身份认证确保 kube-scheduler 可以连接 API Server。--authorization-kubeconfig 负责权限授权确保 kube-scheduler 有权限调度 Pod。--leader-electfalse因为没有多个节点所以把leader选举关掉 可以看到已经能够成功断点调试了SchedulerOne函数就是对Pod进行调度的入口函数。
http://www.hkea.cn/news/14483703/

相关文章:

  • 聊城做网站的公司资讯百度下载app
  • 个人网站电商怎么做初学者自己做网站
  • 网站开发公司代理企业营销培训
  • 有趣的网站名制作网页用什么语言
  • 网站建设报什么专业网站建站上海
  • 联科三网合一网站建设系统外包小程序开发技巧
  • 上海软件开发的公司排名seo上海优化
  • 深圳建设网站首页网站开发中的渲染是什么意思
  • 网站建设选超速云建站做网站应该了解什么
  • 永久免费建站空间做论坛app网站有哪些
  • 如何进行网站的seo做微信的网站叫什么名字
  • 加强门户网站建设 信息公开北京建网站定制价格
  • wordpress入门建站教程二陕西城乡住房建设厅网站
  • 石家庄好用的招聘网站建立wordpress显示数据库错误
  • 张家港质监站网址动漫网站开发优势
  • 网站开发哪些百度站长官网
  • 优秀服装网站设计网站建设管理需要招聘什么人才
  • 用eclipse做网站网站外链可以在哪些平台上做外链
  • 网站建设公司怎么公司网站用个人备案可以
  • 上海网站设计见建设羊绒制品有限公司网站建设论文
  • 免费建立网站的网站都有啥网站之家
  • 个人网站能允许做哪些画廊网站模板 frontpage
  • 零基础怎么做网站自己做的网站是怎么赚钱吗
  • 网站建设藤设计集团企业网工管理系统
  • 江苏天目建设网站已有网站域名 怎么做网站
  • 做英文题的网站长沙做网站最好的公司
  • 网站开发项目经验总结教训网页设计制作要求
  • 广西建设厅官网站中国龙岩网
  • 做网站的分析报告案例网站建设好还需投资吗
  • 手机网站 制作教程外贸seo教程