flannel 实战与源码分析(六)

2024-05-10 18:08
文章标签 分析 实战 源码 flannel

本文主要是介绍flannel 实战与源码分析(六),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

其实flannel的东西基本都说完了,还有一个功能点由于和kubernetes紧密结合的,所以在这里解释一下。相信大家都还记得之前写的创建SubnetManager


func newSubnetManager() (subnet.Manager, error) {if opts.kubeSubnetMgr {return kube.NewSubnetManager()}cfg := &etcdv2.EtcdConfig{Endpoints: strings.Split(opts.etcdEndpoints, ","),Keyfile:   opts.etcdKeyfile,Certfile:  opts.etcdCertfile,CAFile:    opts.etcdCAFile,Prefix:    opts.etcdPrefix,Username:  opts.etcdUsername,Password:  opts.etcdPassword,}return etcdv2.NewLocalManager(cfg)
}

如果传参是 –kube-subnet-mgr那么将启动kube的子网管理,如果熟悉kubernetes的人可能都知道,其实kubernetes没有什么网络管理,只有一个网络策略,那这个网络管理从何说起呢?
看代码就会明白subnet/kube/kube.go

indexer, controller := cache.NewIndexerInformer(&cache.ListWatch{ListFunc: func(options metav1.ListOptions) (runtime.Object, error) {return ksm.client.Core().Nodes().List(options)},WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) {return ksm.client.Core().Nodes().Watch(options)},},&v1.Node{},resyncPeriod,cache.ResourceEventHandlerFuncs{AddFunc: func(obj interface{}) {ksm.handleAddLeaseEvent(subnet.EventAdded, obj)},UpdateFunc: ksm.handleUpdateLeaseEvent,DeleteFunc: func(obj interface{}) {ksm.handleAddLeaseEvent(subnet.EventRemoved, obj)},},cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc},)

所谓的网络管理就是listwatch node节点。再看看kubernetes的node的annotations就恍然大悟了

 annotations:flannel.alpha.coreos.com/backend-data: '{"VtepMAC":"8e:11:4d:6c:15:1c"}'flannel.alpha.coreos.com/backend-type: vxlanflannel.alpha.coreos.com/kube-subnet-manager: "true"flannel.alpha.coreos.com/public-ip: 10.39.0.46

原理就是放到node的annotations,通过这种方式去替换etcd的作用,我这也是醉了,这个信心还是保存到etcd的啊!大神们!
当然还提供WatchLease等方法

func (ksm *kubeSubnetManager) WatchLease(ctx context.Context, sn ip.IP4Net, cursor interface{}) (subnet.LeaseWatchResult, error) {select {case event := <-ksm.selfEvents:return subnet.LeaseWatchResult{Events: []subnet.Event{event},}, nilcase <-ctx.Done():return subnet.LeaseWatchResult{}, nil}
}

只不过不再直接watch etcd了,通过kubernetes的api listwatch机制,把event放到subnet.Event这个管道里面,然后WatchLease从管道中获取。至于怎么放进去的看下面代码

func (ksm *kubeSubnetManager) handleAddLeaseEvent(et subnet.EventType, obj interface{}) {n := obj.(*v1.Node)if s, ok := n.Annotations[subnetKubeManagedAnnotation]; !ok || s != "true" {return}l, err := nodeToLease(*n)if err != nil {glog.Infof("Error turning node %q to lease: %v", n.ObjectMeta.Name, err)return}ksm.events <- subnet.Event{et, l}if n.ObjectMeta.Name == ksm.nodeName {ksm.selfEvents <- subnet.Event{et, l}}
}

上面的代码以网络添加为例,那么这个kube-mgr就可以替换etcd,如果要说这样设计的比直接用etcd的好处的话,我觉得是可以配合网络策略实现网络隔离。应为有了这些节点信息,配合calico的网络策略,就可以很好的控制网络隔离,有个开源的项目canal,如果感兴趣可以了解一下。

这篇关于flannel 实战与源码分析(六)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/977170

相关文章

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Redis中的AOF原理及分析

《Redis中的AOF原理及分析》Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率... 目录开篇:从日记本到AOF一、AOF的基本执行流程1. 命令执行与记录2. AOF重写机制二、AOF的

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

MyBatis Plus大数据量查询慢原因分析及解决

《MyBatisPlus大数据量查询慢原因分析及解决》大数据量查询慢常因全表扫描、分页不当、索引缺失、内存占用高及ORM开销,优化措施包括分页查询、流式读取、SQL优化、批处理、多数据源、结果集二次... 目录大数据量查询慢的常见原因优化方案高级方案配置调优监控与诊断总结大数据量查询慢的常见原因MyBAT

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

Oracle Scheduler任务故障诊断方法实战指南

《OracleScheduler任务故障诊断方法实战指南》Oracle数据库作为企业级应用中最常用的关系型数据库管理系统之一,偶尔会遇到各种故障和问题,:本文主要介绍OracleSchedul... 目录前言一、故障场景:当定时任务突然“消失”二、基础环境诊断:搭建“全局视角”1. 数据库实例与PDB状态2

Git进行版本控制的实战指南

《Git进行版本控制的实战指南》Git是一种分布式版本控制系统,广泛应用于软件开发中,它可以记录和管理项目的历史修改,并支持多人协作开发,通过Git,开发者可以轻松地跟踪代码变更、合并分支、回退版本等... 目录一、Git核心概念解析二、环境搭建与配置1. 安装Git(Windows示例)2. 基础配置(必