kubernetes calico network pool 변경

beomjin·2024년 12월 14일

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는 10.233.64.0/18 이지만 적용하려는 환경에 맞춰 설정된 CIDR로 수정하면 됩니다.

신규 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()
  • disabled 값이 true면 비활성화

이제 각 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로 변경된 것을 확인 할 수 있습니다.

0개의 댓글