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.9. Kuryr에서 OVN-Kubernetes 마이그레이션 프로세스
사용자 시작 단계마이그레이션 활동

cluster라는 Network.operator.openshift.io CR(사용자 정의 리소스)의 migration 필드를 OVNKubernetes로 설정합니다.

CNO(Cluster Network Operator)
cluster라는 Network.config.openshift.io CR의 상태를 적절하게 업데이트합니다.
Machine Config Operator (MCO)

Network.config.openshift.io CR의 networkType 필드를 업데이트합니다.

CNO

다음과 같은 작업을 수행합니다.

  • OVN-Kubernetes 컨트롤 플레인 pod를 배포합니다.
  • 새 네트워크 플러그인을 반영하도록 Multus 오브젝트를 업데이트합니다.

클러스터의 각 노드를 재부팅합니다.

Cluster
노드가 재부팅되면 클러스터에서 OVN-Kubernetes 클러스터 네트워크의 Pod에 IP 주소를 할당합니다.

Cluster

25.7.2. OVN-Kubernetes 네트워크 플러그인으로 마이그레이션

클러스터 관리자는 클러스터의 네트워크 플러그인을 OVN-Kubernetes로 변경할 수 있습니다.

중요

마이그레이션하는 동안 클러스터의 모든 노드를 재부팅해야 합니다.

사전 요구 사항

  • OpenShift CLI(oc)를 설치합니다.
  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.

프로세스

  1. $ oc get Network.config.openshift.io cluster -o yaml > cluster-kuryr.yaml
  2. $ CLUSTERID=$(oc get infrastructure.config.openshift.io cluster -o=jsonpath='{.status.infrastructureName}')
  3. $ 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
        }}}}'

  4. 다음 명령을 입력하여 머신 구성 풀 상태를 확인합니다.

    $ oc get mcp

    업데이트된 노드의 상태가 UPDATED=true, UPDATING=false,DEGRADED=false입니다.

    참고

  5. 호스트의 새 머신 구성 상태를 확인합니다.

    1. 머신 구성 상태 및 적용된 머신 구성 이름을 나열하려면 다음 명령을 입력합니다.

      $ 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 필드의 값과 동일합니다.
    2. 머신 구성이 올바른지 확인하려면 다음 명령을 입력합니다.

      $ oc get machineconfig <config_name> -o yaml | grep ExecStart

      다음과 같습니다.

      <config_name>

      머신 구성은 다음 업데이트를 systemd 구성에 포함해야 합니다.

      출력 예

      ExecStart=/usr/local/bin/configure-ovs.sh OVNKubernetes

      1. 포드를 나열하려면 다음 명령을 입력합니다.

        $ 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자 영숫자 순서입니다.

      2. 다음 명령을 입력하여 이전 출력에 표시된 첫 번째 머신 구성 데몬 포드에 대한 포드 로그를 표시합니다.

        $ oc logs <pod> -n openshift-machine-config-operator

        다음과 같습니다.

        <pod>
      3. 이전 명령의 출력에 표시된 로그의 오류를 해결합니다.
  6. 마이그레이션을 시작하려면 다음 명령 중 하나를 사용하여 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 블록을 사용할 수 없습니다.

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

  8. 마이그레이션을 완료하려면 클러스터의 각 노드를 재부팅합니다. 예를 들어 다음 예와 유사한 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 클라이언트를 통해 가상 시스템에 액세스할 수 있는 적절한 기관에 문의하십시오.

검증

  1. 마이그레이션이 성공했는지 확인한 다음 마이그레이션 리소스를 제거합니다.

    1. 네트워크 플러그인이 OVN-Kubernetes인지 확인하려면 다음 명령을 입력합니다.

      $ oc get network.config/cluster -o jsonpath='{.status.networkType}{"\n"}'

      status.networkType의 값은 OVNKubernetes이어야 합니다.

    2. 클러스터 노드가 준비 상태에 있는지 확인하려면 다음 명령을 입력합니다.

      $ oc get nodes
    3. Pod가 오류 상태가 아닌지 확인하려면 다음 명령을 입력합니다.

      $ oc get pods --all-namespaces -o wide --sort-by='{.spec.nodeName}'

      노드의 Pod가 오류 상태인 경우 해당 노드를 재부팅합니다.

    4. 모든 클러스터 Operator가 비정상적인 상태가 아닌지 확인하려면 다음 명령을 입력합니다.

      $ oc get co

      모든 클러스터 Operator의 상태는 AVAILABLE="True", PROGRESSING="False", DEGRADED="False"여야 합니다. 클러스터 Operator를 사용할 수 없거나 성능이 저하된 경우 자세한 내용은 클러스터 Operator의 로그를 확인합니다.

      중요

      이전 확인 단계에서 오류가 표시되면 진행하지 마십시오. 오류 표시가 아닙니다.

  2. 마이그레이션이 완료되고 클러스터가 정상 상태인 경우 다음 명령을 입력하여 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 클라우드에 액세스할 수 있습니다.

프로세스

  1. 정리 Python 가상 환경을 생성합니다.

    1. 환경에 사용할 임시 디렉터리를 생성합니다. 예를 들면 다음과 같습니다.

      $ python3 -m venv /tmp/venv

    2. 가상 환경을 입력합니다. 예를 들면 다음과 같습니다.

      $ source /tmp/venv/bin/activate
    3. (venv) $ pip install pip --upgrade
    4. 다음 명령을 실행하여 필요한 Python 패키지를 설치합니다.

      (venv) $ pip install openstacksdk==0.54.0 python-openstackclient==5.5.0 python-octaviaclient==2.3.0
  2. 터미널에서 다음 명령을 실행하여 변수를 클러스터 및 Kuryr 식별자로 설정합니다.

    1. 클러스터 ID를 설정합니다.

      (venv) $ CLUSTERID=$(oc get infrastructure.config.openshift.io cluster -o=jsonpath='{.status.infrastructureName}')
    2. 클러스터 태그를 설정합니다.

      (venv) $ CLUSTERTAG="openshiftClusterID=${CLUSTERID}"
    3. 라우터 ID를 설정합니다.

      (venv) $ ROUTERID=$(oc get kuryrnetwork -A --no-headers -o custom-columns=":status.routerId"|head -n 1)
  3. 다음 명령을 실행하여 지정된 리소스에서 종료자를 제거하는 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
    }

    함수에는 두 개의 매개 변수가 사용됩니다. 첫 번째 매개 변수는 리소스 이름이고 두 번째 매개 변수는 제거할 종료자입니다. 지정된 리소스는 클러스터에서 제거되고 지정된 종료자를 제외하고 해당 정의는 복사된 데이터로 교체됩니다.

  4. 서비스에서 Kuryr 종료자를 제거하려면 다음 명령을 입력합니다.

    (venv) $ REMFIN services kuryr.openstack.org/service-finalizer
  5. (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
  6. Octavia에서 태그가 지정된 모든 RHOSP 로드 밸런서를 제거하려면 다음 명령을 입력합니다.

    (venv) $ for lb in $(openstack loadbalancer list --tags $CLUSTERTAG -f value -c id); do
        openstack loadbalancer delete --cascade $lb
    done
  7. (venv) $ REMFIN kuryrloadbalancers.openstack.org kuryr.openstack.org/kuryrloadbalancer-finalizers
  8. (venv) $ oc delete namespace openshift-kuryr
  9. 라우터에서 Kuryr 서비스 서브넷을 제거하려면 다음 명령을 입력합니다.

    (venv) $ openstack router remove subnet $ROUTERID ${CLUSTERID}-kuryr-service-subnet
  10. Kuryr 서비스 네트워크를 제거하려면 다음 명령을 입력합니다.

    (venv) $ openstack network delete ${CLUSTERID}-kuryr-service-network
  11. 모든 Pod에서 Kuryr 종료자를 제거하려면 다음 명령을 입력합니다.

    (venv) $ REMFIN pods kuryr.openstack.org/pod-finalizer
  12. (venv) $ REMFIN kuryrports.openstack.org kuryr.openstack.org/kuryrport-finalizer

  13. 네트워크 정책에서 Kuryr 종료자를 제거하려면 다음 명령을 입력합니다.

    (venv) $ REMFIN networkpolicy kuryr.openstack.org/networkpolicy-finalizer
  14. 나머지 네트워크 정책에서 Kuryr 종료자를 제거하려면 다음 명령을 입력합니다.

    (venv) $ REMFIN kuryrnetworkpolicies.openstack.org kuryr.openstack.org/networkpolicy-finalizer
  15. 트렁크에서 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
  16. (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
  17. Kuryr 보안 그룹을 제거하려면 다음 명령을 입력합니다.

    (venv) $ openstack security group delete ${CLUSTERID}-kuryr-pods-security-group
  18. 태그가 지정된 서브넷 풀을 모두 제거하려면 다음 명령을 입력합니다.

    (venv) $ for subnetpool in $(openstack subnet pool list --tags $CLUSTERTAG -f value -c ID); do
        openstack subnet pool delete $subnetpool
    done
  19. (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를 수행합니다.

  20. 네트워크 정책과 관련된 보안 그룹을 제거하려면 다음 명령을 입력합니다.

    (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
  21. (venv) $ REMFIN kuryrnetworks.openstack.org kuryrnetwork.finalizers.kuryr.openstack.org
  22. 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. 추가 리소스

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.