一:CNI和集群核心功能的再理解
之前分析calico 网络时候,发现了知乎上有一位大神,通过代码实现了各种网络通信。后来就想通过实现该过程加深对基础框架的理解。
结合上图,对于在k8s环境拉起pod过程,有一个直观、深入的额理解;
①CRI的实现最终是通过OCI进行的;
②CRi会调用CSI、CNI接口;
③OCI 拉起sandpod过程其实就是对于pod 的网络、存储资源一个基础化过程,给后续pod拉起提供一个类似底座的功能;
二:CNI的实现过程
1:参考和环境准备
参考大神文章链接:https://zhuanlan.zhihu.com/p/450514389
部署集群的时候要去除网络插件,否则后续实现可能受影响。初始化部署集群以后集群和系统日志截图如下:
节点notready,系统日志显示cni未初始化;
2:代码实现CNI过程
此过程需要加深对CNI功能、实现方式的理解(太复杂,此处略)。主要实现过程是:将CNI配置文件置于 /etc/cni/net.d/ 目录,将编译cnitool置于 /opt/cni/bin/目录,然后根据代码功能调试CNI功能。
pod创建失败,需要查找日志分析具体原因
根绝代码和日志,最后排查etcd没有获取到ippool,排查响应代码,在subnet获取时候掩码配置代码不支持随机位置配置;
Etcd 查询IPpool,到这一步ipam 获取到部分网络配置了,后续再部署pod,node5、node6上pod可分配地址;
问题解决以后pod 地址分配成功:
Pod互ping 失败;
3:路由失败分析
期待继续…
三:问题及总结
1:代码实现核心组件功能这个项目是一个很好的理解和实现容器通信功能的尝试,整个项目代码量对于几个开源项目做了一个简化;
2:实际实现中会碰到各种问题,因为大家的环境不同,代码中固化了很多东西,需要优化,最新版的实现过于复杂,我是在9c207a211b8bfb1c44879caf9eee03602a31c2a6这一单的基础上继续修改验证的;
3:提高自己的代码能力,代码不仅是阅读、理解功能的工具,也是一个实现的路径。