25.7. Kuryr 네트워크 플러그인에서 OVN-Kubernetes 네트워크 플러그인으로 마이그레이션
Kuryr에서 OVN-Kubernetes로의 마이그레이션은 기술 프리뷰 기능 전용입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.
Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.
RHOSP(Red Hat OpenStack Platform)에서 실행되는 클러스터의 관리자는 Kuryr SDN 네트워크 플러그인에서 OVN-Kubernetes 네트워크 플러그인으로 마이그레이션할 수 있습니다.
OVN-Kubernetes에 대한 자세한 내용은 OVN-Kubernetes 네트워크 플러그인 정보를 참조하십시오.
25.7.1. OVN-Kubernetes 네트워크 공급자로 마이그레이션
RHOSP(Red Hat OpenStack Platform)에서 실행되는 클러스터를 OVN-Kubernetes 네트워크 공급자로 수동으로 마이그레이션할 수 있습니다.
OVN-Kubernetes로의 마이그레이션은 단방향 프로세스입니다. 마이그레이션하는 동안 짧은 시간 동안 클러스터에 연결할 수 없습니다.
25.7.1.1. OVN-Kubernetes 네트워크 공급자로 마이그레이션할 때 고려 사항
Kubernetes 네임스페이스는 Kuryr에 의해 별도의 RHOSP 네트워킹 서비스(Neutron) 서브넷에 보관됩니다. 개별 포드에 할당된 서브넷 및 IP 주소는 마이그레이션 중에 보존되지 않습니다.
25.7.1.2. 마이그레이션 프로세스의 작동 방식
다음 표에는 클러스터 및 Operator에서 수행하는 작업과 관련된 마이그레이션 프로세스가 요약되어 있습니다.
사용자 시작 단계 | 마이그레이션 활동 |
---|---|
|
|
|
|
클러스터의 각 노드를 재부팅합니다. |
|
|
|
25.7.2. OVN-Kubernetes 네트워크 플러그인으로 마이그레이션
클러스터 관리자는 클러스터의 네트워크 플러그인을 OVN-Kubernetes로 변경할 수 있습니다.
마이그레이션하는 동안 클러스터의 모든 노드를 재부팅해야 합니다.
사전 요구 사항
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
$ oc get Network.config.openshift.io cluster -o yaml > cluster-kuryr.yaml
$ CLUSTERID=$(oc get infrastructure.config.openshift.io cluster -o=jsonpath='{.status.infrastructureName}')
$ oc patch Network.operator.openshift.io cluster --type='merge' \ --patch '{ "spec": { "migration": { "networkType": "OVNKubernetes" } } }'
참고이 단계는 OVN-Kubernetes를 즉시 배포하지 않습니다.
- 최대 전송 단위(MTU)
- Geneve(Generic Network Virtualization Encapsulation) 오버레이 네트워크 포트
- OVN-Kubernetes IPv4 내부 서브넷
- OVN-Kubernetes IPv6 내부 서브넷
$ oc patch Network.operator.openshift.io cluster --type=merge \ --patch '{ "spec":{ "defaultNetwork":{ "ovnKubernetesConfig":{ "mtu":<mtu>, "genevePort":<port>, "v4InternalSubnet":"<ipv4_subnet>", "v6InternalSubnet":"<ipv6_subnet>" }}}}'
다음과 같습니다.
mtu
-
MTU 값은 일반적으로 자동으로 지정되지만 클러스터의 모든 노드가 동일한 MTU를 사용하지 않을 때는 최소 노드 MTU 값에서
100
을 뺀 값으로 명시적으로 설정해야 합니다. port
-
값을 지정하지 않으면 기본값은
6081
입니다. VXLAN 포트의 기본값은4789
입니다. ipv4_subnet
-
IP 주소 범위가 OpenShift Container Platform 설치에 사용된 다른 서브넷과 겹치지 않도록 해야 합니다. IP 주소 범위는 클러스터에 추가할 수 있는 최대 노드 수보다 커야 합니다. 기본값은
100.64.0.0/16
입니다. ipv6_subnet
-
IP 주소 범위가 OpenShift Container Platform 설치에 사용된 다른 서브넷과 겹치지 않도록 해야 합니다. IP 주소 범위는 클러스터에 추가할 수 있는 최대 노드 수보다 커야 합니다. 기본값은
fd98::/48
입니다.
기본값을 변경할 필요가 없는 경우 패치에서 키를 생략합니다.
mtu
필드를 업데이트하는 패치 명령 예$ oc patch Network.operator.openshift.io cluster --type=merge \ --patch '{ "spec":{ "defaultNetwork":{ "ovnKubernetesConfig":{ "mtu":1200 }}}}'
다음 명령을 입력하여 머신 구성 풀 상태를 확인합니다.
$ oc get mcp
업데이트된 노드의 상태가
UPDATED=true
,UPDATING=false
,DEGRADED=false
입니다.참고호스트의 새 머신 구성 상태를 확인합니다.
머신 구성 상태 및 적용된 머신 구성 이름을 나열하려면 다음 명령을 입력합니다.
$ oc describe node | egrep "hostname|machineconfig"
출력 예
kubernetes.io/hostname=master-0 machineconfiguration.openshift.io/currentConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b 1 machineconfiguration.openshift.io/desiredConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b 2 machineconfiguration.openshift.io/reason: machineconfiguration.openshift.io/state: Done
-
machineconfiguration.openshift.io/state
필드의 값은Done
입니다. -
machineconfiguration.openshift.io/currentConfig
필드의 값은machineconfiguration.openshift.io/desiredConfig
필드의 값과 동일합니다.
-
머신 구성이 올바른지 확인하려면 다음 명령을 입력합니다.
$ oc get machineconfig <config_name> -o yaml | grep ExecStart
다음과 같습니다.
- <config_name>
머신 구성은 다음 업데이트를 systemd 구성에 포함해야 합니다.
출력 예
ExecStart=/usr/local/bin/configure-ovs.sh OVNKubernetes
포드를 나열하려면 다음 명령을 입력합니다.
$ oc get pod -n openshift-machine-config-operator
출력 예
NAME READY STATUS RESTARTS AGE machine-config-controller-75f756f89d-sjp8b 1/1 Running 0 37m machine-config-daemon-5cf4b 2/2 Running 0 43h machine-config-daemon-7wzcd 2/2 Running 0 43h machine-config-daemon-fc946 2/2 Running 0 43h machine-config-daemon-g2v28 2/2 Running 0 43h machine-config-daemon-gcl4f 2/2 Running 0 43h machine-config-daemon-l5tnv 2/2 Running 0 43h machine-config-operator-79d9c55d5-hth92 1/1 Running 0 37m machine-config-server-bsc8h 1/1 Running 0 43h machine-config-server-hklrm 1/1 Running 0 43h machine-config-server-k9rtx 1/1 Running 0 43h
구성 데몬 포드의 이름은 다음 형식입니다.
machine-config-daemon-<seq>
.<seq>
값은 임의 5자 영숫자 순서입니다.다음 명령을 입력하여 이전 출력에 표시된 첫 번째 머신 구성 데몬 포드에 대한 포드 로그를 표시합니다.
$ oc logs <pod> -n openshift-machine-config-operator
다음과 같습니다.
- <pod>
- 이전 명령의 출력에 표시된 로그의 오류를 해결합니다.
마이그레이션을 시작하려면 다음 명령 중 하나를 사용하여 OVN-Kubernetes 네트워크 플러그인을 구성합니다.
클러스터 네트워크 IP 주소 블록을 변경하지 않고 네트워크 공급자를 지정하려면 다음 명령을 입력합니다.
$ oc patch Network.config.openshift.io cluster \ --type='merge' --patch '{ "spec": { "networkType": "OVNKubernetes" } }'
다른 클러스터 네트워크 IP 주소 블록을 지정하려면 다음 명령을 입력합니다.
$ oc patch Network.config.openshift.io cluster \ --type='merge' --patch '{ "spec": { "clusterNetwork": [ { "cidr": "<cidr>", "hostPrefix": "<prefix>" } ] "networkType": "OVNKubernetes" } }'
다음과 같습니다.
- <cidr>
- <prefix>
- 중요
마이그레이션 중에 서비스 네트워크 주소 블록을 변경할 수 없습니다.
OVN-Kubernetes 네트워크 공급자가 이 블록을 내부에서 사용하므로
100.64.0.0/16
CIDR 블록과 겹치는 CIDR 블록을 사용할 수 없습니다.
$ oc -n openshift-multus rollout status daemonset/multus
포드를 다시 시작하는 데 시간이 다소 걸릴 수 있습니다.
출력 예
Waiting for daemon set "multus" rollout to finish: 1 out of 6 new pods have been updated... ... Waiting for daemon set "multus" rollout to finish: 5 of 6 updated pods are available... daemon set "multus" successfully rolled out
마이그레이션을 완료하려면 클러스터의 각 노드를 재부팅합니다. 예를 들어 다음 예와 유사한 bash 스크립트를 사용할 수 있습니다.
#!/bin/bash for ip in $(oc get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="InternalIP")].address}') do echo "reboot node $ip" ssh -o StrictHostKeyChecking=no core@$ip sudo shutdown -r -t 3 done
참고$ for name in $(openstack server list --name ${CLUSTERID}\* -f value -c Name); do openstack server reboot $name; done
그렇지 않으면 SSH 또는 관리 포털 및 OpenStack 클라이언트를 통해 가상 시스템에 액세스할 수 있는 적절한 기관에 문의하십시오.
검증
마이그레이션이 성공했는지 확인한 다음 마이그레이션 리소스를 제거합니다.
네트워크 플러그인이 OVN-Kubernetes인지 확인하려면 다음 명령을 입력합니다.
$ oc get network.config/cluster -o jsonpath='{.status.networkType}{"\n"}'
status.networkType
의 값은OVNKubernetes
이어야 합니다.클러스터 노드가
준비
상태에 있는지 확인하려면 다음 명령을 입력합니다.$ oc get nodes
Pod가 오류 상태가 아닌지 확인하려면 다음 명령을 입력합니다.
$ oc get pods --all-namespaces -o wide --sort-by='{.spec.nodeName}'
노드의 Pod가 오류 상태인 경우 해당 노드를 재부팅합니다.
모든 클러스터 Operator가 비정상적인 상태가 아닌지 확인하려면 다음 명령을 입력합니다.
$ oc get co
모든 클러스터 Operator의 상태는
AVAILABLE="True"
,PROGRESSING="False"
,DEGRADED="False"
여야 합니다. 클러스터 Operator를 사용할 수 없거나 성능이 저하된 경우 자세한 내용은 클러스터 Operator의 로그를 확인합니다.중요이전 확인 단계에서 오류가 표시되면 진행하지 마십시오. 오류 표시가 아닙니다.
마이그레이션이 완료되고 클러스터가 정상 상태인 경우 다음 명령을 입력하여 CNO 구성 오브젝트에서 마이그레이션 구성을 제거합니다.
$ oc patch Network.operator.openshift.io cluster --type='merge' \ --patch '{ "spec": { "migration": null } }'
25.7.3. 마이그레이션 후 리소스 정리
Kuryr 네트워크 플러그인에서 OVN-Kubernetes 네트워크 플러그인으로 마이그레이션한 후 Kuryr가 이전에 생성한 리소스를 정리해야 합니다.
정리 프로세스는 Python 가상 환경을 사용하여 Octavia 오브젝트에 대한 지원 태그를 사용하는 패키지 버전이 있는지 확인합니다.
사전 요구 사항
- Python 인터프리터를 설치했습니다.
- 기본 RHOSP 클라우드에 액세스할 수 있습니다.
프로세스
정리 Python 가상 환경을 생성합니다.
환경에 사용할 임시 디렉터리를 생성합니다. 예를 들면 다음과 같습니다.
$ python3 -m venv /tmp/venv
가상 환경을 입력합니다. 예를 들면 다음과 같습니다.
$ source /tmp/venv/bin/activate
(venv) $ pip install pip --upgrade
다음 명령을 실행하여 필요한 Python 패키지를 설치합니다.
(venv) $ pip install openstacksdk==0.54.0 python-openstackclient==5.5.0 python-octaviaclient==2.3.0
터미널에서 다음 명령을 실행하여 변수를 클러스터 및 Kuryr 식별자로 설정합니다.
클러스터 ID를 설정합니다.
(venv) $ CLUSTERID=$(oc get infrastructure.config.openshift.io cluster -o=jsonpath='{.status.infrastructureName}')
클러스터 태그를 설정합니다.
(venv) $ CLUSTERTAG="openshiftClusterID=${CLUSTERID}"
라우터 ID를 설정합니다.
(venv) $ ROUTERID=$(oc get kuryrnetwork -A --no-headers -o custom-columns=":status.routerId"|head -n 1)
다음 명령을 실행하여 지정된 리소스에서 종료자를 제거하는 Bash 함수를 생성합니다.
(venv) $ function REMFIN { local resource=$1 local finalizer=$2 for res in $(oc get $resource -A --template='{{range $i,$p := .items}}{{ $p.metadata.name }}|{{ $p.metadata.namespace }}{{"\n"}}{{end}}'); do name=${res%%|*} ns=${res##*|} yaml=$(oc get -n $ns $resource $name -o yaml) if echo "${yaml}" | grep -q "${finalizer}"; then echo "${yaml}" | grep -v "${finalizer}" | oc replace -n $ns $resource $name -f - fi done }
함수에는 두 개의 매개 변수가 사용됩니다. 첫 번째 매개 변수는 리소스 이름이고 두 번째 매개 변수는 제거할 종료자입니다. 지정된 리소스는 클러스터에서 제거되고 지정된 종료자를 제외하고 해당 정의는 복사된 데이터로 교체됩니다.
서비스에서 Kuryr 종료자를 제거하려면 다음 명령을 입력합니다.
(venv) $ REMFIN services kuryr.openstack.org/service-finalizer
(venv) $ if $(oc get -n openshift-kuryr service service-subnet-gateway-ip &>/dev/null); then oc -n openshift-kuryr delete service service-subnet-gateway-ip fi
Octavia에서 태그가 지정된 모든 RHOSP 로드 밸런서를 제거하려면 다음 명령을 입력합니다.
(venv) $ for lb in $(openstack loadbalancer list --tags $CLUSTERTAG -f value -c id); do openstack loadbalancer delete --cascade $lb done
(venv) $ REMFIN kuryrloadbalancers.openstack.org kuryr.openstack.org/kuryrloadbalancer-finalizers
(venv) $ oc delete namespace openshift-kuryr
라우터에서 Kuryr 서비스 서브넷을 제거하려면 다음 명령을 입력합니다.
(venv) $ openstack router remove subnet $ROUTERID ${CLUSTERID}-kuryr-service-subnet
Kuryr 서비스 네트워크를 제거하려면 다음 명령을 입력합니다.
(venv) $ openstack network delete ${CLUSTERID}-kuryr-service-network
모든 Pod에서 Kuryr 종료자를 제거하려면 다음 명령을 입력합니다.
(venv) $ REMFIN pods kuryr.openstack.org/pod-finalizer
(venv) $ REMFIN kuryrports.openstack.org kuryr.openstack.org/kuryrport-finalizer
네트워크 정책에서 Kuryr 종료자를 제거하려면 다음 명령을 입력합니다.
(venv) $ REMFIN networkpolicy kuryr.openstack.org/networkpolicy-finalizer
나머지 네트워크 정책에서 Kuryr 종료자를 제거하려면 다음 명령을 입력합니다.
(venv) $ REMFIN kuryrnetworkpolicies.openstack.org kuryr.openstack.org/networkpolicy-finalizer
트렁크에서 Kuryr가 생성한 하위 포트를 제거하려면 다음 명령을 입력합니다.
(venv) $ read -ra trunks <<< $(python -c "import openstack; n = openstack.connect().network; print(' '.join([x.id for x in n.trunks(any_tags='$CLUSTERTAG')]))") && \ i=0 && \ for trunk in "${trunks[@]}"; do i=$((i+1)) echo "Processing trunk $trunk, ${i}/${#trunks[@]}." subports=() for subport in $(python -c "import openstack; n = openstack.connect().network; print(' '.join([x['port_id'] for x in n.get_trunk('$trunk').sub_ports if '$CLUSTERTAG' in n.get_port(x['port_id']).tags]))"); do subports+=("$subport"); done args=() for sub in "${subports[@]}" ; do args+=("--subport $sub") done if [ ${#args[@]} -gt 0 ]; then openstack network trunk unset ${args[*]} $trunk fi done
(venv) $ mapfile -t kuryrnetworks < <(oc get kuryrnetwork -A --template='{{range $i,$p := .items}}{{ $p.status.netId }}|{{ $p.status.subnetId }}{{"\n"}}{{end}}') && \ i=0 && \ for kn in "${kuryrnetworks[@]}"; do i=$((i+1)) netID=${kn%%|*} subnetID=${kn##*|} echo "Processing network $netID, ${i}/${#kuryrnetworks[@]}" # Remove all ports from the network. for port in $(python -c "import openstack; n = openstack.connect().network; print(' '.join([x.id for x in n.ports(network_id='$netID') if x.device_owner != 'network:router_interface']))"); do ( openstack port delete $port ) & # Only allow 20 jobs in parallel. if [[ $(jobs -r -p | wc -l) -ge 20 ]]; then wait -n fi done wait # Remove the subnet from the router. openstack router remove subnet $ROUTERID $subnetID # Remove the network. openstack network delete $netID done
Kuryr 보안 그룹을 제거하려면 다음 명령을 입력합니다.
(venv) $ openstack security group delete ${CLUSTERID}-kuryr-pods-security-group
태그가 지정된 서브넷 풀을 모두 제거하려면 다음 명령을 입력합니다.
(venv) $ for subnetpool in $(openstack subnet pool list --tags $CLUSTERTAG -f value -c ID); do openstack subnet pool delete $subnetpool done
(venv) $ networks=$(oc get kuryrnetwork -A --no-headers -o custom-columns=":status.netId") && \ for existingNet in $(openstack network list --tags $CLUSTERTAG -f value -c ID); do if [[ $networks =~ $existingNet ]]; then echo "Network still exists: $existingNet" fi done
명령에서 기존 네트워크를 반환하는 경우 계속하기 전에 Intestigate를 수행합니다.
네트워크 정책과 관련된 보안 그룹을 제거하려면 다음 명령을 입력합니다.
(venv) $ for sgid in $(openstack security group list -f value -c ID -c Description | grep 'Kuryr-Kubernetes Network Policy' | cut -f 1 -d ' '); do openstack security group delete $sgid done
(venv) $ REMFIN kuryrnetworks.openstack.org kuryrnetwork.finalizers.kuryr.openstack.org
Kuryr 라우터를 제거하려면 다음 명령을 입력합니다.
(venv) $ if $(python3 -c "import sys; import openstack; n = openstack.connect().network; r = n.get_router('$ROUTERID'); sys.exit(0) if r.description != 'Created By OpenShift Installer' else sys.exit(1)"); then openstack router delete $ROUTERID fi
25.7.4. 추가 리소스
- etcd 백업
- 네트워크 정책 정의
OVN-Kubernetes 기능에 대한 자세한 내용은 다음을 참조하십시오.