OpenShift v4.x 클러스터에서 OpenShift-SDN을 OVN-Kubernetes SDN으로 마이그레이션 방법을 정리한다.
본 방법은 OpenShift 클러스터 전체에 영향도가 있는 작업이므로 작업 전 VM 스냅샷 백업 또는 ETCD 백업을 적극 권장한다.

ETCD 백업의 경우 아래 링크를 통해 백업&복구 전략을 세우고 진행하기 바란다.
OpenShift v4.x – ETCD 백업 및 복구 방법

1. SDN 네트워크 정보

 

기본적으로 사용하는 OpenShift-SDN의 네트워크 정보를 백업 후 확인한다.

[root@bastion ~]# oc get Network.config.openshift.io cluster -o yaml > cluster-openshift-sdn.yaml

해당 내용에서는 VXLAN 기반의 OpenShiftSDN SDN Plugin을 사용중이며, ClusterNetwork CIDR 및 hostPrefix를 확인한다.

apiVersion: config.openshift.io/v1
kind: Network
metadata:
  name: cluster
spec:
  clusterNetwork:
  - cidr: 10.128.0.0/14
    hostPrefix: 22
  externalIP:
    policy: {}
  networkType: OpenShiftSDN
  serviceNetwork:
  - 172.30.0.0/16

2. OVN-Kubernetes SDN 설정

 

해당 SDN은 GENEVE(Generic Network Virtualization Encapsulation)를 사용하며,
패킷 캡슐화에 100byte를 사용하기 때문에, 클러스터 노드의 MTU의 크기에 100byte 제외한 값으로 설정해야 하며,
Geneve 통신용 서비스 포트는 OpenShift-SDN의 VXLAN에서 사용되는 4789/UDP 포트는 사용할 수 없다.

2.1. Network Operator 설정

 

MTU 크기는 1500-100를 제외한 1400으로 설정하고, Geneve Port는 6081/UDP를 사용하면 된다.
(Jumbo Frame을 사용하는 경우 9000-100=8900으로 MTU를 설정하면 된다.)

또한, Geneve에서 내부적으로 사용하는 IPv4 CIDR 대역을 지정 해야한다.
이 대역은 반드시 클러스터 노드에서 사용하는 CIDR, Service CIDR, Cluster CIDR, 기타 외부 CIDR 대역과 겹치지 않아야 한다.
이 항목을 정의하지 않으면 기본값으로 사용되고, 한번 구성이 되면 변경이 불가하므로 신중하게 생각하여 진행한다.

[root@bastion ~]# oc patch Network.operator.openshift.io cluster --type=merge \
--patch '{
   "spec":{
      "defaultNetwork":{
         "ovnKubernetesConfig":{
            "mtu":1400,
            "genevePort":6081,
            "v4InternalSubnet":"100.64.0.0/16"
         }
      }
   }
}'

3. SDN 마이그레이션

 

OVN-Kubernetes SDN으로 마이그레이션 준비를 시작한다.
명령어 수행시 Machine Config Operator에 의해 노드가 롤링(Rolling) 방식으로 클러스터 노드가 재부팅 된다.

[root@bastion ~]# oc patch Network.operator.openshift.io cluster --type='merge' \
--patch '{"spec": {"migration": {"networkType": "OVNKubernetes"}}}'

4. 클러스터 상태 확인

 

4.1. 클러스터 노드 확인

 

OpenShift 클러스터 노드의 STATUS를 매초마다 확인하여 모두 Ready가 출력되어야 한다.

[root@bastion ~]# watch -n 1 ‘oc get node'
NAME                  STATUS   ROLES                  AGE   VERSION
infra01.ocp4.local    Ready    infra                  4d    v1.25.4+a34b9e9
infra02.ocp4.local    Ready    infra                  4d    v1.25.4+a34b9e9
master01.ocp4.local   Ready    control-plane,master   4d    v1.25.4+a34b9e9
master02.ocp4.local   Ready    control-plane,master   4d    v1.25.4+a34b9e9
master03.ocp4.local   Ready    control-plane,master   4d    v1.25.4+a34b9e9
worker01.ocp4.local   Ready    worker                 4d    v1.25.4+a34b9e9
worker02.ocp4.local   Ready    worker                 4d    v1.25.4+a34b9e9
worker03.ocp4.local   Ready    worker                 4d    v1.25.4+a34b9e9

4.2. Cluster Operator 확인

 

Cluster Operator를 매초 확인하여, AVAILABLE 항목이 모두 TRUE로 변경 되었는지 확인한다.

[root@bastion ~]# watch -n 1 ‘oc get clusteroperator’
NAME                                       VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE   MESSAGE
authentication                             4.12.4    True        False         False      144m
baremetal                                  4.12.4    True        False         False      4d
cloud-controller-manager                   4.12.4    True        False         False      4d
cloud-credential                           4.12.4    True        False         False      4d
cluster-autoscaler                         4.12.4    True        False         False      4d
config-operator                            4.12.4    True        False         False      4d
console                                    4.12.4    True        False         False      143m
control-plane-machine-set                  4.12.4    True        False         False      4d
csi-snapshot-controller                    4.12.4    True        False         False      4d
dns                                        4.12.4    True        False         False      4d
etcd                                       4.12.4    True        False         False      35h
image-registry                             4.12.4    True        False         False      3d16h
ingress                                    4.12.4    True        False         False      143m
insights                                   4.12.4    True        False         False      4d
kube-apiserver                             4.12.4    True        False         False      4d
kube-controller-manager                    4.12.4    True        False         False      4d
kube-scheduler                             4.12.4    True        False         False      4d
kube-storage-version-migrator              4.12.4    True        False         False      144m
machine-api                                4.12.4    True        False         False      4d
machine-approver                           4.12.4    True        False         False      4d
machine-config                             4.12.4    True        False         False      22h
marketplace                                4.12.4    True        False         False      4d
monitoring                                 4.12.4    True        False         False      4d
network                                    4.12.4    True        False         False      4d
node-tuning                                4.12.4    True        False         False      3d15h
openshift-apiserver                        4.12.4    True        False         False      5h22m
openshift-controller-manager               4.12.4    True        False         False      4d
openshift-samples                          4.12.4    True        False         False      3d23h
operator-lifecycle-manager                 4.12.4    True        False         False      4d
operator-lifecycle-manager-catalog         4.12.4    True        False         False      4d
operator-lifecycle-manager-packageserver   4.12.4    True        False         False      5h40m
service-ca                                 4.12.4    True        False         False      4d
storage                                    4.12.4    True        False         False      4d

5. Network Config 설정

 

clusterNetwork(Pod IP) 대역과 단일 클러스터 노드에서 최대 할당할 수 있는 IP 개수인 hostPrefix를 지정한다.
hostPrefix는 단일 클러스터 노드에서 최대로 할당할 수 있는 IP 개수와 Pod가 구동될 수 있는 MaxPod 개수에 영향이 있다.
OpenShift에서 기본값은 23으로 설정되어 있으며, 이는 512개의 IP와 Pod를 할당 가능하다는 뜻이다.

본 예제에서는 512의 2배인 1024로 할당 할 수 있도록 hostPrefix를 22로 주겠다.

[root@bastion ~]# oc patch Network.config.openshift.io cluster --type='merge' \
--patch '{
   "spec":{
      "clusterNetwork":[
         {
            "cidr":"10.128.0.0/14",
            "hostPrefix":'22'
         }
      ],
      "networkType":"OVNKubernetes"
   }
}'

6. 노드 재부팅

 

마이그레이션을 진행하기 위해 모든 클러스터 노드를 재부팅 한다.

6.1. OVN Kubernetes Pod 상태 확인

 

재부팅 시점은 항목 “5. Network Config 설정” patch 수행 후 ovnkube가 재배포 된 후
openshift-ovn-kubernetes 프로젝트(namespace)에서 Pod의 상태가 CrashLoopBackOff 일때 재부팅을 해야한다.
아직, SDN Migration을 위한 사전 준비만 진행이 되었으므로, CrashLoopBackOff 상태가 보이는 것이 정상이다.

[root@bastion ~]#  oc get pod -l app=ovnkube-node -n openshift-ovn-kubernetes
NAME                   READY   STATUS             RESTARTS        AGE
ovnkube-node-6vvwx     4/5     CrashLoopBackOff   1               4h52m
ovnkube-node-7qpzb     4/5     CrashLoopBackOff   1               4h52m
ovnkube-node-gqhfs     4/5     CrashLoopBackOff   1               4h52m
ovnkube-node-k4j76     4/5     CrashLoopBackOff   1               4h52m
ovnkube-node-l7f8f     4/5     CrashLoopBackOff   1               4h52m
ovnkube-node-mqsnj     4/5     CrashLoopBackOff   1               4h52m
ovnkube-node-pwrnd     4/5     CrashLoopBackOff   1               4h52m
ovnkube-node-sgzhp     4/5     CrashLoopBackOff   1               4h52m

클러스터 노드를 재부팅 한다.

[root@bastion ~]# for node in $(oc get node -o name | cut -d '/' -f '2'); do \
  ssh core@$node "sudo systemctl reboot";
done

이후 “4. 클러스터 상태 확인” 항목을 통해 클러스터의 전반적인 상태확인 후 작업을 마친다.

7. SDN 정보 확인

 

OVN-Kubernetes SDN Plugin으로 마이그레이션이 정상적으로 되었는지 확인한다.

[root@bastion ~]# oc get Network.config.openshift.io cluster -o yaml
apiVersion: config.openshift.io/v1
kind: Network
metadata:
  name: cluster
spec:
  clusterNetwork:
  - cidr: 10.128.0.0/14
    hostPrefix: 22
  externalIP:
    policy: {}
  networkType: OVNKubernetes
  serviceNetwork:
  - 172.30.0.0/16
status:
  clusterNetwork:
  - cidr: 10.128.0.0/14
    hostPrefix: 22
  clusterNetworkMTU: 1400
  migration:
    networkType: OVNKubernetes
  networkType: OVNKubernetes
  serviceNetwork:
  - 172.30.0.0/16

끝.