前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何修改pod ip地址段

如何修改pod ip地址段

作者头像
没有故事的陈师傅
发布2020-05-22 17:45:28
6.2K0
发布2020-05-22 17:45:28
举报
文章被收录于专栏:运维开发故事运维开发故事

说明

本周在部署服务时,遇到了一个错误。因为不方便截图,这边只说明一下错误提示。我这里的网络为cannal,具体错误为:

error in getting result from AddNetworkList: failed to allocate for range 0: no IP addresses available in range set: 192.168.1.33-192.168.1.62

分析

从字面意思是说,在这个ip地址段已经没有可用的ip了,说明已经分配完了。

而k8s的网络有pod 网络、service网络以及宿主机网络,这个提示很明显是pod网络。既然是没有可用ip可分配了,1.33~1.62也就只有30个ip地址,那就去看看pod cidr的规划,以及这个服务调度到的node上所分配的pod地址段和已经在node上运行的pod。

controllermanager中的cidr相关配置:

--cluster-cidr=192.168.1.0/24
--node-cidr-mask-size=27
--allocate-node-cidrs=true

问题node已分配网络:

kubectl get node nodexxxx -o yaml >>nodexxxx.yaml
cat nodexxxx.yaml
spec:
  podCIDR: 192.168.1.32/27

问题node上已经运行的pod数量:

[root@kube-master]$ kubectl get po -A -o wide --kubeconfig=/etc/kubernetes/kubelet.kubeconfig |grep node_ip |wc -l
30

由上图我们来算一下:

192.168.1.0/24 node掩码为27 那么每个node上只能分配到30个可用pod ip,
则最多能有30个pod运行,而问题node上刚好已经跑了30个pod,当再有pod调度过
来,那就有问题了(其实按理说都不应该再被调度过来的,这一点需要看看k8s的调度策略)。
而且算下来,就支持8个node,每个node上30个pod,似乎是有点少。

由以上做一个总结:出现问题的根本原因是pod cidr规划的不够完美,需要做一些修改。

解决办法

由上面可知,决定扩大cidr。这里计划是将192.168.1.0/24改为192.168.1.0/20,node掩码由27改为24。另外,由于集群中已经运行了一些pod,所以需要先修改集群的cidr,然后新增几个节点,把已经运行的服务强制调度到新的节点上,然后删除旧的节点,然后再重新加入。因为node分配到的pod cidr是一开始就分配好了,即使修改了集群cidr,还是对已经存在的node不起作用,另外我这里只有一个master,所以master不会重建。

具体过程

  1. 修改组件中关于cidr的设置并重启,kubelet也重启下。
  2. 修改calico ip pool。
  1.保存现有ip pool信息
   kubectl get ippool k8s-ippool -o yaml > k8s-ippool.yaml
  2.修改k8s-ippool.yaml中cidr为新的cidr
  3.删除现有ip pool
   kubectl delete ippool k8s-ippool
  4.创建新的ip pool
   kubectl create -f k8s-ippool.yaml
  1. 更新节点网络

原因:容器网络扩大了,假如我们不剔除旧的node,而直接添加新的node,则新旧 node之间的容器网络是不通的,所以需要更新一下旧node的iptables规则,以及重启flannel。

  # 每个node都要操作
 1.查看当前iptables规则  
iptables-save | grep -v KUBE- | grep -v cali- | grep -v LOADBALANCER- | grep -v CNI- | grep 192.168
 2.重启flnanel
 3.查看要执行的命令
iptables-save -t nat| grep -v KUBE- | grep -v cali- | grep -v LOADBALANCER- | grep -v CNI- | grep 192.168.1.0/24 | sed 's/-A/-D/' | xargs -L 1 echo iptables -t nat
iptables-save -t filter| grep -v KUBE- | grep -v cali- | grep -v LOADBALANCER- | grep -v CNI- | grep 192.168.1.0/24 | sed 's/-A/-D/' | xargs -L 1 echo iptables -t filter
 4.修改iptables规则

iptables-save -t nat| grep -v KUBE- | grep -v cali- | grep -v LOADBALANCER- | grep -v CNI- | grep 192.168.1.0/24 | sed 's/-A/-D/' | xargs -L 1 iptables -t nat
iptables-save -t filter| grep -v KUBE- | grep -v cali- | grep -v LOADBALANCER- | grep -v CNI- | grep 192.168.1.0/24 | sed 's/-A/-D/' | xargs -L 1 iptables -t filter
 5.确认iptabes规则正确
 
iptables-save | grep -v KUBE- | grep -v cali- | grep -v LOADBALANCER- | grep -v CNI- | grep 192.168
4. 维护旧的节点

1.增加节点,并确认网络

2.驱逐旧的节点上的服务

3.删除旧的节点

4.重新加入旧的节点,并确认网络

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维开发故事 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档