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
끝.