26.7.
기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.
Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.
OVN-Kubernetes에 대한 자세한 내용은 OVN-Kubernetes 네트워크 플러그인 정보를 참조하십시오.
26.7.1. OVN-Kubernetes 네트워크 공급자로 마이그레이션
26.7.1.1.
26.7.1.2. 마이그레이션 프로세스의 작동 방식
표 26.9.
| 사용자 시작 단계 | 마이그레이션 활동 |
|---|---|
|
|
|
|
|
|
| 클러스터의 각 노드를 재부팅합니다. |
|
|
|
|
26.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>" }}}}'다음과 같습니다.
mtuportipv4_subnet- IP 주소 범위가 OpenShift Container Platform 설치에 사용된 다른 서브넷과 겹치지 않도록 해야 합니다. IP 주소 범위는 클러스터에 추가할 수 있는 최대 노드 수보다 커야 합니다.
ipv6_subnet- IP 주소 범위가 OpenShift Container Platform 설치에 사용된 다른 서브넷과 겹치지 않도록 해야 합니다. IP 주소 범위는 클러스터에 추가할 수 있는 최대 노드 수보다 커야 합니다.
기본값을 변경할 필요가 없는 경우 패치에서 키를 생략합니다.
$ oc patch Network.operator.openshift.io cluster --type=merge \ --patch '{ "spec":{ "defaultNetwork":{ "ovnKubernetesConfig":{ "mtu":1200 }}}}'다음 명령을 입력하여 머신 구성 풀 상태를 확인합니다.
$ oc get mcp
참고호스트의 새 머신 구성 상태를 확인합니다.
머신 구성 상태 및 적용된 머신 구성 이름을 나열하려면 다음 명령을 입력합니다.
$ 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
머신 구성이 올바른지 확인하려면 다음 명령을 입력합니다.
$ 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
다음 명령을 입력하여 이전 출력에 표시된 첫 번째 머신 구성 데몬 포드에 대한 포드 로그를 표시합니다.
$ 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>
- 중요
마이그레이션 중에 서비스 네트워크 주소 블록을 변경할 수 없습니다.
$ 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 스크립트를 사용할 수 있습니다. 이 스크립트는
ssh를 사용하여 각 호스트에 연결할 수 있고 암호를 묻지 않도록sudo를 구성했다고 가정합니다.#!/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참고SSH 액세스를 사용할 수 없는 경우
openstack명령을 사용할 수 있습니다.$ 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여야 합니다.클러스터 노드가
Ready상태인지 확인하려면 다음 명령을 입력합니다.$ 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의 로그를 확인합니다.중요이전 확인 단계에서 오류가 표시되면 진행하지 마십시오. 정리 중에 제거된 종료자로 인해
Terminating상태가 있는 Pod가 표시될 수 있습니다. 오류 표시가 아닙니다.
마이그레이션이 완료되고 클러스터가 정상 상태인 경우 다음 명령을 입력하여 CNO 구성 오브젝트에서 마이그레이션 구성을 제거합니다.
$ oc patch Network.operator.openshift.io cluster --type='merge' \ --patch '{ "spec": { "migration": null } }'
26.7.3. 마이그레이션 후 리소스 정리
Kuryr 네트워크 플러그인에서 OVN-Kubernetes 네트워크 플러그인으로 마이그레이션한 후 Kuryr가 이전에 생성한 리소스를 정리해야 합니다.
정리 프로세스는 Python 가상 환경을 사용하여 Octavia 오브젝트에 대한 지원 태그를 사용하는 패키지 버전이 있는지 확인합니다. 환경이 최소 사용 중인지 확실하지 않은 경우 가상 환경이 필요하지 않습니다. * openstacksdk 버전 0.54.0 * python-openstackclient 버전 5.5.0 * python-octaviaclient 버전 2.3.0
사전 요구 사항
-
OpenShift Container Platform CLI(
oc)가 설치되어 있어야 합니다. - Python 인터프리터를 설치했습니다.
-
openstacksdkPython 패키지를 설치했습니다. -
openstackCLI를 설치했습니다. - 기본 RHOSP 클라우드에 액세스할 수 있습니다.
-
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있습니다.
프로세스
정리 Python 가상 환경을 생성합니다.
환경에 사용할 임시 디렉터리를 생성합니다. 예를 들면 다음과 같습니다.
$ python3 -m venv /tmp/venv
/tmp/venv디렉터리에 있는 가상 환경은 모든 정리 예제에 사용됩니다.가상 환경을 입력합니다. 예를 들면 다음과 같습니다.
$ source /tmp/venv/bin/activate
다음 명령을 실행하여 가상 환경에서
pip명령을 업그레이드합니다.(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
Kuryr
service-subnet-gateway-ip서비스를 제거하려면 다음 명령을 입력합니다.(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 fiOctavia에서 태그가 지정된 모든 RHOSP 로드 밸런서를 제거하려면 다음 명령을 입력합니다.
(venv) $ for lb in $(openstack loadbalancer list --tags $CLUSTERTAG -f value -c id); do openstack loadbalancer delete --cascade $lb done모든
KuryrLoadBalancerCR에서 Kuryr 종료자를 제거하려면 다음 명령을 입력합니다.(venv) $ REMFIN kuryrloadbalancers.openstack.org kuryr.openstack.org/kuryrloadbalancer-finalizers
openshift-kuryr네임스페이스를 제거하려면 다음 명령을 입력합니다.(venv) $ oc delete namespace openshift-kuryr
라우터에서 Kuryr 서비스 서브넷을 제거하려면 다음 명령을 입력합니다.
(venv) $ openstack router remove subnet $ROUTERID ${CLUSTERID}-kuryr-service-subnetKuryr 서비스 네트워크를 제거하려면 다음 명령을 입력합니다.
(venv) $ openstack network delete ${CLUSTERID}-kuryr-service-network모든 Pod에서 Kuryr 종료자를 제거하려면 다음 명령을 입력합니다.
(venv) $ REMFIN pods kuryr.openstack.org/pod-finalizer
모든
KuryrPortCR에서 Kuryr 종료자를 제거하려면 다음 명령을 입력합니다.(venv) $ REMFIN kuryrports.openstack.org kuryr.openstack.org/kuryrport-finalizer
이 명령은
KuryrPortCR을 삭제합니다.네트워크 정책에서 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 doneKuryrNetworkCR에서 모든 네트워크 및 서브넷을 검색하고 포트, 라우터 인터페이스 및 네트워크 자체를 제거하려면 다음 명령을 입력합니다.(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 doneKuryr 보안 그룹을 제거하려면 다음 명령을 입력합니다.
(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 doneKuryrNetworkCR을 기반으로 하는 모든 네트워크가 제거되었는지 확인하려면 다음 명령을 입력합니다.(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 doneKuryrNetworkCR에서 종료자를 제거하려면 다음 명령을 입력합니다.(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
26.7.4. 추가 리소스
- OVN-Kubernetes 네트워크 플러그인의 구성 매개변수
- etcd 백업
- 네트워크 정책 정의
OVN-Kubernetes 기능에 대한 자세한 내용은 다음을 참조하십시오.