k8s西遊記 - 切換網路外掛IP池
前言
最近在另一個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: 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
最後
如果有什麼疑問和見解,歡迎評論區交流。
如果你覺得本篇文章對您有幫助的話,感謝您的【推薦】。
如果你對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-po