前言

最近在另一个k8s集群中,搭建了kong网关,在配置OIDC插件时,希望使用Memcahe代替Cookie来存储会话信息,于是把部署在同一局域网Memcahe的内网IP,比如:192.168.10.145配置给了kong,发现kong居然不能访问这个IP,于是进入容器组,执行命令:ping 192.168.10.145,不通,what are you 弄啥呢?



这可怎么肿么玩呢?

突然想到,在给Kubernetes配置网络插件Calico时,初始化集群时,使用了官方推荐C类IP池,即:192.168.0.0/16,而内网IP刚好符合C类IP池,可能就导致此类IP始终不会被转发到主机网络,带着这样子的猜想,于是决定修改网络插件的IP池。

如何修改Calico网络插件IP池?

1. 安装calicoctl

calicoctl允许您从命令行创建、读取、更新和删除Calico对象。有三种方式可以安装此工具,参考链接:https://docs.projectcalico.org/v3.8/getting-started/calicoctl/install

以二进制文件安装到k8s master主机上

root@001:~# cd /usr/local/bin;
root@001:~# curl -O -L https://github.com/projectcalico/calicoctl/releases/download/v3.8.2/calicoctl;
root@001:~# chmod +x calicoctl;

备注:其他安装方式,请大家下去自行研究。

2. 配置calicoctl

配置calicoctl连接到kubernetes API,这里使用最简单的命令行形式,如下:

root@001:~# DATASTORE_TYPE=kubernetes KUBECONFIG=~/.kube/config calicoctl [命令]

备注:其他连接配置,请参考链接:https://docs.projectcalico.org/v3.8/getting-started/calicoctl/configure/kdd,大家下去自行研究吧。

设置命令别名

root@001:~# alias k8s-calicoctl='DATASTORE_TYPE=kubernetes KUBECONFIG=~/.kube/config calicoctl'

3. 变更IP池

3.1 查看目前支持的IP池

root@001:~# k8s-calicoctl get ippool -o wide;
NAME CIDR NAT IPIPMODE VXLANMODE DISABLED SELECTOR
default-ipv4-pool 192.168.0.0/16 true Always Never false all()

备注:看到CIDR字段值,明白了吧,这里就不赘述了。

3.2 添加新的IP池

root@001:~# k8s-calicoctl create -f -<<EOF
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: b-ipv4-pool
spec:
cidr: 172.16.0.0/16
ipipMode: Always
natOutgoing: true
EOF;

备注:根据ipv4的指派范围,一般分为A类、B类、C类,局域网一般使用C类IP池,为了避免和k8s冲突,决定选择B类IP池,即:172.16.0.0/16,关于IP池详细划分,请大家下去自行查阅资料。

再次查看支持的IP池
root@001:~# k8s-calicoctl get ippool -o wide;
NAME CIDR NAT IPIPMODE VXLANMODE DISABLED SELECTOR
default-ipv4-pool 192.168.0.0/16 true Always Never false all()
b-ipv4-pool 172.16.0.0/16 true Always Never false all()

备注:看到CIDR字段值,明白了吧,这里就不赘述了。

3.3 禁用旧的IP池

备份IP池到文件
root@001:~# k8s-calicoctl get ippool -o yaml > /root/k8s-calico-pools.yaml
编辑k8s-calico-pools.yaml
root@001:~# vi /root/k8s-calico-pools.yaml
apiVersion: projectcalico.org/v3
items:
- apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: default-ipv4-ippool
spec:
blockSize: 26
cidr: 192.168.0.0/16
ipipMode: Always
natOutgoing: true
disabled: true # 添加的脚本
nodeSelector: all()
- apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: network-b-pool
spec:
blockSize: 26
cidr: 172.16.0.0/16
ipipMode: Always
natOutgoing: true
nodeSelector: all()
vxlanMode: Never
kind: IPPoolList
metadata:
resourceVersion: "44524549"

添加disabled: truedefault-ipv4-ippool,上面注释位置。

应用变更:
root@001:~# k8s-calicoctl apply -f pool.yaml
再次查看IP池:
root@001:~# k8s-calicoctl get ippool -o wide;
NAME CIDR NAT IPIPMODE VXLANMODE DISABLED SELECTOR
default-ipv4-pool 192.168.0.0/16 true Always Never true all()
b-ipv4-pool 172.16.0.0/16 true Always Never false all()

4. 重启所有容器组

kubectl -n [命名空间] delete pods --all;

备注:请大家下去自己完善遍历删除吧。

这一步会使用新的IP池重新分配容器组IP,如下:

root@001:~# kubectl -n kong get pods -o wide
NAME READY STATUS RESTARTS AGE IP
kong-kong-574957fdf7-x8ppk 1/1 Running 0 2d1h 172.16.252.126
kong-postgresql-0 1/1 Running 0 4d23h 172.16.252.100
kong-kong-controller-74fd6 2/2 Running 2 2d2h 172.16.252.124
konga-8cc9565d5-bbm9p 1/1 Running 0 4d22h 172.16.252.103

5. 删除旧IP池

如果所有的Pod IP都已正常分配,但是发现满足旧IP池的IP地址还是无法ping通,也就是无法逃逸出k8s网络,那么请执行下面的命令吧:

root@001:~# k8s-calicoctl delete pool default-ipv4-ippool

最后

如果有什么疑问和见解,欢迎评论区交流。

如果你觉得本篇文章对您有帮助的话,感谢您的【推荐】。

如果你对k8s感兴趣的话可以【关注我】,我会定期的在博客分享我的心得。

未经允许,禁止转载

参考链接

https://docs.projectcalico.org/v3.8/getting-started/calicoctl/install

https://docs.projectcalico.org/v3.8/getting-started/calicoctl/configure/kdd

https://docs.projectcalico.org/v3.8/networking/changing-ip-pools

k8s西游记 - 切换网络插件IP池的更多相关文章

  1. k8s的flannel网络插件配置

    flannel的网络插件配置 Kubernetes网络通信需要解决以下问题:            (1)容器间通信:同一个Pod内的多个容器间的通信,lo            (2)Pod通信:P ...

  2. 071、如何定制calico网络的IP池(2019-04-16 周二)

    参考https://www.cnblogs.com/CloudMan6/p/7571272.html   在前面的学习中,我们没有特别配置,calico会自动为网络分配subnet,当然我们也可以根据 ...

  3. 3.kubernetes的CNI网络插件-Flannel

    目录 1.1.K8S的CNI网络插件-Flannel 1.1.1.集群规划 1.1.2.下载软件.解压.软链接 1.1.3.最终目录结构 1.1.4.拷贝证书 1.1.5.创建配置 1.1.6.创建启 ...

  4. K8S Calico网络插件

    0.前言 参考文档:https://github.com/containernetworking/cni Pod网络插件,为了实现Pod网络而需要的插件.组件.由于Kubernetes通过开放的CNI ...

  5. K8S(03)核心插件-Flannel网络插件

    系列文章说明 本系列文章,可以基本算是 老男孩2019年王硕的K8S周末班课程 笔记,根据视频来看本笔记最好,否则有些地方会看不明白 需要视频可以联系我 K8S核心网络插件Flannel 目录 系列文 ...

  6. k8s入坑之路(9)k8s网络插件详解

    Flannel: 最成熟.最简单的选择 Calico: 性能好.灵活性最强,目前的企业级主流 Canal: 将Flannel提供的网络层与Calico的网络策略功能集成在一起. Weave: 独有的功 ...

  7. k8s更换网络插件:从flannel更换成calico

    卸载flannel 查看已安装的flannel的信息 # 查看CNI插件,可以得知使用的是flannel # cat /etc/cni/net.d/10-flannel.conflist { &quo ...

  8. 第 8 章 容器网络 - 071 - 如何定制 Calico 的 IP 池?

    定制IP池 首先定义一个 IP Pool,比如: calicoctl create -f ipPool.yml 用此 IP Pool 创建 calico 网络. docker network crea ...

  9. K8S Flannel网络插件

    0.前言 参考文档:https://github.com/containernetworking/cni Pod网络插件,为了实现Pod网络而需要的插件.组件.由于Kubernetes通过开放的CNI ...

随机推荐

  1. Android studio 混淆打包安装后报错NullPointerException int java.util.List.size()

    菜鸟的我,尝试混淆打包app...打包之前没有什么问题,混淆打包之后遇到各种问题.首先,感谢原博主的分享.解决了我的问题.谢谢. 原文地址:http://blog.csdn.net/tou_star/ ...

  2. [leetcode] 559. Maximum Depth of N-ary Tree (easy)

    原题链接 思路: 简单bfs class Solution { public: int maxDepth(Node *root) { int depth = 0; if (root == NULL) ...

  3. [leetcode] 621. Task Scheduler(medium)

    原题 思路: 按频率最大的字母来分块,频率最大的字母个数-1为分成的块数,每一块个数为n+1 比如AAABBCE,n=2, 则分为A-A- +A AAABBBCCEE,n=2,则分为AB-AB- +A ...

  4. PTA L2-031 深入虎穴 非dfs的一点想法

    著名的王牌间谍 007 需要执行一次任务,获取敌方的机密情报.已知情报藏在一个地下迷宫里,迷宫只有一个入口,里面有很多条通路,每条路通向一扇门.每一扇门背后或者是一个房间,或者又有很多条路,同样是每条 ...

  5. python整型-浮点型-字符串-列表及内置函数(上)

    整型 简介 # 是否可变类型: 不可变类型 # 作用:记录年龄.手机号 # 定义: age = 18 # --> 内部操作 age = int(18) # int('sada') # 报错 in ...

  6. JedisClient操作redis 单机版和集群版

    一.在pom文件中添加依赖 <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency&g ...

  7. DedeCms常用内容调用标签实例大全

    一.调用顶级栏目标签 <a href="{dede:global.cfg_cmsurl/}/" class="ahov">首页</a> ...

  8. 敏捷和DevOps:是敌是友?

    DevOps是敏捷在软件开发团队的另一应用.那么相比之下,哪个更胜一筹? 一边,有业界认可的scrum master,它的朋友极限编程者,以及由其衍生的 LeSS.SAFe.DAD等,是敏捷. 另一边 ...

  9. Redis的HelloWorld

    1.安装完成的Redis: linux安装的应用默认会在:usr/local/bin. 1.redis-benchmark:性能测试工具,是redis提供的一个高并发程序,可以在自己本机运行,看看自己 ...

  10. 【Android】java.lang.SecurityException: getDeviceId: Neither user 10065 nor current process has android.permission.READ_PHONE_STATE

    RT, 异常信息如下: java.lang.SecurityException: getDeviceId: Neither user 10065 nor current process has and ...