flannel ip 地址段扩容方法

Tags: flannel  kubernetes 

目录

说明

历史原因,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曾经支持“多网段的方式”,但是后来又将这个特性移除了Remove the experimental support for multiple networks,因此不考虑也无须考虑多网段方案。

参考

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

kubernetes

  1. Prometheus 采集 Kubernetes 中的 pod 的 metrics 的方法
  2. kubernetes configmap 热加载,inotifywatch 监测文件触发热更新
  3. kubernetes 百变定制: 支持的扩展点和扩展方法(api/crd/plugin...)
  4. kubernetes 调度组件 kube-scheduler 1.16.3 源代码阅读指引
  5. kubernetes 代码中的 k8s.io 是怎么回事?
  6. 旌旗招展,向网格而行!
  7. 《不一样的 双11 技术,阿里巴巴经济体云原生实践》阅读笔记
  8. kubernetes ingress-nginx 启用 upstream 长连接,需要注意,否则容易 502
  9. ingress-nginx 的限速功能在 nginx.conf 中的对应配置
  10. kubernetes 中的容器设置透明代理,自动在 HTTP 请求头中注入 Pod 信息
  11. kubernetes ingress-nginx 的测试代码(单元测试+e2e测试)
  12. kubernetes ingress-nginx http 请求复制功能与 nginx mirror 的行为差异
  13. kubernetes 基于 openresty 的 ingress-nginx 的状态和配置查询
  14. Kubernetes ingress-nginx 0.25 源代码走读笔记
  15. kubernetes ingress-nginx 的金丝雀(canary)/灰度发布功能的使用方法
  16. kubernetes code-generator 用法: 生成 kubernetes-style 的 api 和 client 代码
  17. kubernetes 操作命令 kubectl 在 shell 中的自动补全配置
  18. flannel ip 地址段扩容方法
  19. kubernetes 组件 kube-proxy 的 IPVS 功能的使用
  20. lxcfs 是什么? 怎样通过 lxcfs 在容器内显示容器的 CPU、内存状态
  21. kubernetes initializer 功能的使用方法: 在 Pod 等 Resource 落地前进行修改
  22. kubernetes 版本特性: 新特性支持版本和组件兼容版本
  23. kubernetes API 与 Operator: 不为人知的开发者战争(完整篇)
  24. kubernetes 1.12 从零开始(七): kubernetes开发资源
  25. kubernetes 1.12 从零开始(六): 从代码编译到自动部署
  26. kubernetes 网络方案 Flannel 的学习笔记
  27. kubernetes 1.12 从零开始(五): 自己动手部署 kubernetes
  28. kubernetes 1.12 从零开始(四): 必须先讲一下基本概念
  29. kubernetes 1.12 从零开始(三): 用 kubeadm 部署多节点集群
  30. kubernetes 1.12 从零开始(二): 用 minikube 部署开发测试环境
  31. kubernetes 1.12 从零开始(一): 部署环境准备
  32. kubernetes 1.12 从零开始(零): 遇到的问题与解决方法
  33. kubernetes 1.12 从零开始(初): 课程介绍与官方文档汇总
  34. 通过Prometheus查询计算Kubernetes集群中的容器CPU、内存使用率等指标
  35. 使用 grafana 和 prometheus 监控 kubernetes 集群状态
  36. 一些比较有意思的Kubernetes周边产品
  37. Borg论文阅读笔记
  38. kubelet下载pod镜像时,docker口令文件的查找顺序
  39. kubernetes 的 Client Libraries 的使用
  40. kubernetes的网络隔离networkpolicy
  41. kube-router的源码走读
  42. 使用calico的ipip模式解决k8s的跨网段通信
  43. kubernetes的调试方法
  44. kubernetes 与 calico 的衔接过程
  45. 怎样理解 kubernetes 以及微服务?
  46. kubernetes中部署有状态的复杂分布式系统
  47. kubernetes的apiserver的启动过程
  48. kubernetes的api定义与装载
  49. kubernetes的federation部署,跨区Service
  50. kubernetes的编译、打包、发布
  51. kubernetes的第三方包的使用
  52. kubernetes的Storage的实现
  53. kubernetes 的 Apiserver 的 storage 使用
  54. kubernetes的Controller-manager的工作过程
  55. kubernetes的Client端Cache
  56. kubernetes 的 Apiserver 的工作过程
  57. kubernetes的CNI插件初始化与Pod网络设置
  58. kubernetes的Pod变更过程
  59. kubernetes的kubelet的工作过程
  60. kuberntes 的 Cmdline 实现
  61. kubernetes的Pod内挂载的Service Account的使用方法
  62. kubernetes的社区资源与项目参与方式
  63. kubernetes的Kube-proxy的转发规则分析
  64. kubernetes的基本操作
  65. kubernetes在CentOS上的集群部署
  66. kubernetes在CentOS上的All In One部署
  67. 怎样选择集群管理系统?

flannel

  1. flannel ip 地址段扩容方法
  2. kubernetes 网络方案 Flannel 的学习笔记

推荐阅读

Copyright @2011-2019 All rights reserved. 转载请添加原文连接,合作请加微信lijiaocn或者发送邮件: [email protected],备注网站合作

友情链接:  李佶澳的博客  小鸟笔记  软件手册  编程手册  运营手册  网络课程  收藏文章  发现知识星球  百度搜索 谷歌搜索