皮皮网
皮皮网

【流量消耗源码】【dcloud app 源码】【linux mmap源码】kubelet 源码分析

来源:自写机架源码 发表时间:2024-12-22 21:22:01

1.kubelet 启动流程分析
2.什么是码分K8S?
3.详解边缘计算系统逻辑架构:云、边、码分端协同
4.kubelet版本升级引起的码分容器重启机制与参考解决方案
5.一次“不负责任”的 K8s 网络故障排查经验分享

kubelet 源码分析

kubelet 启动流程分析

       kubernetes版本:v1.

       kubelet启动流程从其main函数开始,调用NewKubeletCommand方法获取配置参数并校验,码分为参数设置默认值。码分

       Run方法仅调用run方法执行后续启动逻辑,码分流量消耗源码run方法为kubelet启动配置及检查工作,码分主要逻辑涉及基本配置和检查。码分

       RunKubelet调用createAndInitKubelet方法,码分完成kubelet组件初始化,码分随后调用startKubelet启动组件。码分

       createAndInitKubelet方法调用三个方法实现kubelet初始化,码分NewMainKubelet方法初始化kubelet依赖模块,码分每个模块功能在前文“kubelet架构浅析”中介绍过。码分

       startKubelet通过调用k.Run启动kubelet所有模块和主流程,码分启动/service-account

       /cloud-native-academy/cloud-native-applications/cloud-native-infrastructure/

       putePodActions()`函数中的`containerChanged()`函数。该函数通过比较容器结构元素的HASH值来判断容器是否发生变化,进而决定是否重启。

       原因解析

       kubelet升级后,不同版本的容器结构可能包含额外的成员,如`VolumeDevices`等。dcloud app 源码这些新增成员导致在进行HASH计算时,升级前后的HASH值不一致,从而触发容器的重启。

       解决方案

       为了避免容器因版本升级而自动重启,可以记录并持久化kubelet版本信息与启动时间。在计算容器结构的HASH值时,参考持久化信息来判断是否忽略重启操作。通过修改源代码,实现这一方案,代码示例可参考GitHub上的linux mmap源码补丁文件。

       适用场景及注意事项

       此方案适用于在kubelet版本升级情况下,希望容器服务持续运行不重启的业务场景。但在实现中需要注意以下几点:

       1. 在版本升级前,需对比不同版本容器结构的变化,了解版本升级对容器HASH计算的影响。

       2. 采用记录并缓存kubelet版本及启动时间至本地文件的方法,可能因文件损坏导致容器服务仍重启。可临时手动生成文件作为备份。

       3. 每次版本升级前需更新源码并重新编译生成二进制文件,这一过程较为繁琐。pppd进程源码

       总结

       通过解析自kubelet启动至容器服务重启的调用链路,确认了版本升级后引起容器重启的判断条件及处理逻辑。同时,提供了解决方案以避免容器因版本升级而重启,这一方法有助于解决生产环境中关键业务无服务中断的问题。尽管存在一些注意事项,但通过代码修改和适当的规划,可以实现稳定、高效的容器服务运行。

一次“不负责任”的蜜色live源码 K8s 网络故障排查经验分享

       一次K8s网络故障排查的实战分享

       作者骆冰利在处理一起客户K8s集群扩容失败问题时,揭示了深入排查的整个过程。客户使用的是1..版本的Kubernetes,宿主机内核为4.(CentOS 8.2),遇到节点无法加入集群的问题。故障现象表现为新节点无法通过master service VIP访问,但直接访问master hostIP则正常。以下是排查的关键步骤:

       首先,常规排查显示iptables模块加载正常,iptables转发规则默认接受,宿主机和容器网络都正常。接着,通过ipvsadm发现kube-proxy在启动后存在异常连接,syn_recv状态,表明K8s service网络出现问题。

       进一步分析,通过tcpdump抓包发现SYN包未从本地发送,初步锁定问题在kube-proxy。查看kube-proxy日志后,发现与iptables-restore命令的执行异常有关,涉及到KUBE-MARK-DROP链的创建问题。深入源码后,发现1..版本在特定条件下存在逻辑缺陷,导致报错。

       问题的根源在于,CentOS 8.2的4.内核环境下的iptables配置与kube-proxy容器内的配置不一致,因为Kubernetes的kubelet也在操作iptables。解决办法是升级内核至3.或5.0+,或者更新Kubernetes版本至1..以上。

       总结这次经验,对于K8s网络故障,关键在于理解内核、kube-proxy、kubelet之间的交互,以及选用正确的工具,如iptables或nftables。希望这个案例能帮助其他开发者在遇到类似问题时能更快定位和解决。

       如果想了解更多Erda项目信息,可以添加小助手微信(Erda)加入交流群。Erda是一个开源的云原生PaaS平台,欢迎关注、贡献代码和Star支持。

       Erda Github 地址 | Erda Cloud - 企业级数字平台

相关栏目:焦点