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: 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM