kubernetes에서 사용하는 subnet은 2개가있습니다.
Pod subnet
service subnet
해당 문서에서 다룰 건 pod subnet 을 변경하는 내용입니다.
Ref :: https://docs.tigera.io/calico/latest/networking/ipam/migrate-pools
우선 현재 내 개인환경에는 어떻게 설정되어있는지 확인합니다.
$ cat /etc/cni/net.d/10-calico.conflist
...
"ipam": {
"type": "calico-ipam",
"assign_ipv4": "true"
},
....
현재 사용 중인 IP pool 의 CIDR는 이렇습니다.
$ sudo calicoctl get ippool -o wide
NAME CIDR NAT IPIPMODE VXLANMODE DISABLED DISABLEBGPEXPORT SELECTOR
default-pool 10.200.0.0/13 true Never Never false false all()
현재 pod에서 사용중인 subnet CIDR는 이렇습니다.
$ sudo calicoctl get wep --all-namespaces
NAMESPACE WORKLOAD NODE NETWORKS INTERFACE
ceph-csi csi-rbdplugin-provisioner-859d94c9cf-xfkdm control-01 10.206.128.12/32 calie7aa1737b9d
cert-manager cert-manager-64847f947d-r9rhp control-01 10.206.128.4/32 cali87bee63ff41
cert-manager cert-manager-cainjector-6b7c755bd9-jpcm8 control-01 10.206.128.3/32 calia97f8e9fa44
cert-manager cert-manager-webhook-7455dfd6f9-b8nx5 control-01 10.206.128.5/32 cali6716b8af2c4
kube-system calico-kube-controllers-69f46f5874-m5n28 control-01 10.206.128.11/32 cali9137438ead2
kube-system coredns-5d8b7b6-4dl74 control-01 10.206.128.6/32 calie49d7994f3c
kube-system dns-autoscaler-59546dbc67-w9vcz control-01 10.206.128.7/32 cali11bfb4f0bb5
kube-system kubelet-csr-approver-6557cf65fc-kmmcv control-01 10.206.128.0/32 cali73e1f24658c
kube-system kubelet-csr-approver-6557cf65fc-tl9mg control-01 10.206.128.1/32 cali72c198e1b51
kube-system localrepo-6b59796fd5-v2vxf control-01 10.206.128.13/32 cali8ab593de4c0
kube-system reflector-57684cdc67-pnl28 control-01 10.206.128.14/32 calid9452c03235
kube-system registry-75c4c4764f-rq457 control-01 10.206.128.10/32 calicf3bd236e32
....
우선 현재 CIDR pool 설정을 백업해둡니다.
$ sudo calicoctl get -o yaml ippool > backup_ippool.yaml
해당 yaml파일을 열어보면 이렇게 나옵니다.
apiVersion: projectcalico.org/v3
items:
- apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
creationTimestamp: "2024-11-13T04:49:44Z"
name: default-pool
resourceVersion: "619"
uid: 67d8826a-b2f8-4983-a5b9-cfc070bf22bc
spec:
allowedUses:
- Workload
- Tunnel
blockSize: 24
cidr: 10.200.0.0/13
ipipMode: Never
natOutgoing: true
nodeSelector: all()
vxlanMode: Never
kind: IPPoolList
metadata:
resourceVersion: "36439"
신규 CIDR pool파일을 작성합니다.
$ vi replace-default-pool.yaml
apiVersion: projectcalico.org/v3
items:
- apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: replace-default-pool
spec:
allowedUses:
- Workload
- Tunnel
blockSize: 24
cidr: 10.233.64.0/18
ipipMode: Never
natOutgoing: true
nodeSelector: all()
vxlanMode: Never
kind: IPPoolList
신규 CIDR를 추가하자.
$ sudo calicoctl create -f replace-default-pool.yaml
$ sudo calicoctl get ippool -o wide
NAME CIDR NAT IPIPMODE VXLANMODE DISABLED DISABLEBGPEXPORT SELECTOR
default-pool 10.200.0.0/13 true Never Never false false all()
replace-default-pool 10.210.0.0/18 true Never Never false false
이제 기존 pod subnet은 disabled로 비활성화 상태로 변경합니다.
disabled-default-pool.yaml
vi disable-default-pool.yaml
apiVersion: projectcalico.org/v3
items:
- apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: default-pool
spec:
allowedUses:
- Workload
- Tunnel
blockSize: 24
cidr: 10.200.0.0/13
ipipMode: Never
natOutgoing: true
nodeSelector: all()
vxlanMode: Never
disabled: true
kind: IPPoolList
해당 yaml파일을 적용하면 아래와 같이 나타나게됩니다.
$ sudo calicoctl apply -f disable-default-pool.yaml
$ sudo calicoctl get ippool -o wide
NAME CIDR NAT IPIPMODE VXLANMODE DISABLED DISABLEBGPEXPORT SELECTOR
default-pool 10.200.0.0/13 true Never Never true false all()
replace-default-pool 10.233.64.0/18 true Never Never false false all()
이제 각 namespace별로 pod를 재기동하면 신규 pod subnet으로 pool migration이 진행됩니다.
다만, 제 환경의 경우 kubernetes 로 배포된 openstack이 있습니다.
openstack db에서는 각 component별로 pod subnet pool로 접근하고있습니다.
이걸 바꾸어 주어야합니다.
( 각 환경별로 db가 있다면 해당 부분을 확인하면 좋습니다. )
안바꾸게되면 각 openstack component가 db에 접근하지못하는 이슈가 발생합니다.
현재 저의 openstack db는 아래와 같은 구조로 되어있습니다.
MariaDB [(none)]> SELECT User, Host FROM mysql.user;
+-------------+------------------------+
| User | Host |
+-------------+------------------------+
| audit | 10.200.0.0/255.248.0.0 |
| barbican | 10.200.0.0/255.248.0.0 |
| cinder | 10.200.0.0/255.248.0.0 |
| glance | 10.200.0.0/255.248.0.0 |
| horizon | 10.200.0.0/255.248.0.0 |
| keystone | 10.200.0.0/255.248.0.0 |
| neutron | 10.200.0.0/255.248.0.0 |
| nova | 10.200.0.0/255.248.0.0 |
| placement | 10.200.0.0/255.248.0.0 |
| root | 10.200.0.0/255.248.0.0 |
| root | 127.0.0.1 |
| sst | 127.0.0.1 |
| mariadb.sys | localhost |
| root | localhost |
+-------------+------------------------+
14 rows in set (0.002 sec)
각 component가 신규 pod subnet pool의 CIDR로 접속할 수 있게끔 변경해줍니다.
이후에 pod들을 모두 재기동하면 신규 CIDR로 pool CIDR로 변경된 것을 확인 할 수 있습니다.