Flannel的IP地址段扩容方法

栏目: 编程工具 · 发布时间: 5年前

内容简介:历史原因,flannel的网段设置的过小,导致kubernetes集群最多只能有256个node,这显然是不行的,需要对flannel进行扩容。Flannel版本是0.7.0。Flannel的子网有几种获取方式。

说明

历史原因,flannel的网段设置的过小,导致kubernetes集群最多只能有256个node,这显然是不行的,需要对flannel进行扩容。Flannel版本是0.7.0。

Kubernetes网络方案Flannel的学习笔记

Flannel的子网的获取

Flannel的子网有几种获取方式。

第一种是所有flanneld都直连etcd,自主决定要使用的子网,抢占的方式。

第二种是部署flannel server(运行在server模式的flannel),flanneld连接flannel server。

第三种是flanneld直连kube-apiserver,从kube-apiserver中获取子网网段, -kube-subnet-mgr

当前接手的环境使用的是第一种方式,后两种方式没用过,这里也不探讨了。

阅读0.7.0代码,找到了申请子网的实现代码:

// flannel/subnet/local_manager.go: 124
func (m *LocalManager) tryAcquireLease(ctx context.Context, network string, config *Config, extIaddr ip.IP4, attrs *LeaseAttrs) (*Lease, error) {
	leases, _, err := m.registry.getSubnets(ctx, network)
	if err != nil {
		return nil, err
	}
	// try to reuse a subnet if there's one that matches our IP
	if l := findLeaseByIP(leases, extIaddr); l != nil {
		...(省略)...
	}
	
	// no existing match, grab a new one
	sn, err := m.allocateSubnet(config, leases)
	if err != nil {
		return nil, err
	}
	
	exp, err := m.registry.createSubnet(ctx, network, sn, attrs, subnetTTL)
	switch {
		...(省略)...
	}
}

可以看到首先会用node的IP查找子网,如果子网已经存在就不新建。

创建新子网的过程就是找到一个还没有被使用的子网:

// flannel/subnet/local_manager.go: 178
func (m *LocalManager) allocateSubnet(config *Config, leases []Lease) (ip.IP4Net, error) {
	log.Infof("Picking subnet in range %s ... %s", config.SubnetMin, config.SubnetMax)
	
	var bag []ip.IP4
	sn := ip.IP4Net{IP: config.SubnetMin, PrefixLen: config.SubnetLen}
	
OuterLoop:
	for ; sn.IP <= config.SubnetMax && len(bag) < 100; sn = sn.Next() {
		for _, l := range leases {
			if sn.Overlaps(l.Subnet) {
				continue OuterLoop
			}
		}
		bag = append(bag, sn.IP)
	}
	
	if len(bag) == 0 {
		return ip.IP4Net{}, errors.New("out of subnets")
	} else {
		i := randInt(0, len(bag))
		return ip.IP4Net{IP: bag[i], PrefixLen: config.SubnetLen}, nil
	}
}

子网信息写入etcd的时候,是以子网地址为key的,从而确保子网不会重叠、冲突:

// flannel/subnet/registry.go: 165
func (esr *etcdSubnetRegistry) createSubnet(ctx context.Context, network string, sn ip.IP4Net, attrs *LeaseAttrs, ttl time.Duration) (time.Time, error) {
	key := path.Join(esr.etcdCfg.Prefix, network, "subnets", MakeSubnetKey(sn))
	value, err := json.Marshal(attrs)
	if err != nil {
		return time.Time{}, err
	}
	
	opts := &etcd.SetOptions{
		PrevExist: etcd.PrevNoExist,
		TTL:       ttl,
	}
	
	resp, err := esr.client().Set(ctx, key, string(value), opts)
	if err != nil {
		return time.Time{}, err
	}
	
	exp := time.Time{}
	if resp.Node.Expiration != nil {
		exp = *resp.Node.Expiration
	}
	
	return exp, nil
}

Flannel网段扩容

根据上面的分析,可以得到初步结论: 只要每个node上的子网前缀是不变的,调整flannel整个网段的前缀就是安全的,原先的node分配的网段不会发生变化,新增node的网段不会与其它node的网段重叠。

直接修改Flannel网段:

etcdctl set  /coreos.com/network/config  '{"Network":"11.0.0.0/8"}'

这个配置相当简洁,默认使用udp模式,不是推荐的方式,这里只是试验,就不考虑那么多了。

扩容之后,新增node的网段情况如下:

$ cat /run/flannel/subnet.env
FLANNEL_NETWORK=11.0.0.0/8      《《 网段前缀是/8
FLANNEL_SUBNET=11.0.47.1/24
FLANNEL_MTU=1426
FLANNEL_IPMASQ=false

原有的node的上的网段还是以前的配置,

$ cat /run/flannel/subnet.env
FLANNEL_NETWORK=11.0.0.0/16     《《  注意还是/16
FLANNEL_SUBNET=11.0.98.1/24
FLANNEL_MTU=1426
FLANNEL_IPMASQ=false

Pod之间的通信不受影响,并且将原有node上flannel重启后,子网配置会自动刷新:

$ cat /run/flannel/subnet.env
FLANNEL_NETWORK=11.0.0.0/8     《《  前缀刷新
FLANNEL_SUBNET=11.0.98.1/24    《《  子网网段不变
FLANNEL_MTU=1426
FLANNEL_IPMASQ=false

Flannel多网段

Flannel曾经支持“多网段的方式”,但是后来又将这个特性移除了(https://github.com/coreos/flannel/pull/633 ),因此不考虑也无须考虑多网段方案。

参考

  1. flannel is a network fabric for containers, designed for Kubernetes

本文 原创首发 于网站:www.lijiaocn.com


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C++沉思录

C++沉思录

Andrew Koenig、Barbara Moo / 黄晓春、孟岩(审校) / 人民邮电出版社 / 2008-1 / 55.00元

《C++沉思录》基于作者在知名技术杂志发表的技术文章、世界各地发表的演讲以及斯坦福大学的课程讲义整理、写作而成,融聚了作者10多年C++程序生涯的真知灼见。全书分为6篇32章,分别对C++语言的历史和特点、类和继承、STL与泛型编程、库的设计等几大技术话题进行了详细而深入的讨论,细微之处几乎涵盖了C++所有的设计思想和技术细节。全书通过精心挑选的实例,向读者传达先进的程序设计的方法和理念。一起来看看 《C++沉思录》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具