作者:justmine
前言
最近在另一个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 -<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: true
到default-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
最后
如果有什么疑问和见解,欢迎评论区交流。如果觉得本篇有帮助的话,欢迎推荐和转发。如果觉得本篇非常不错的话,可以请作者吃个鸡腿,创作的源泉将如滔滔江水连绵不断,嘿嘿。