DCN(Distributed Compute Node) 아키텍처 배포


Red Hat OpenStack Services on OpenShift 18.0

Openshift에서 Red Hat OpenStack Services의 엣지 및 스토리지 구성

OpenStack Documentation Team

초록

원격 위치에서 에지 사이트에 대한 DCN(Distributed Compute Node) 아키텍처를 사용하여 OpenShift(RHOSO)에 Red Hat OpenStack Services를 배포할 수 있습니다. 각 사이트에는 Image 서비스(glance)에 대한 자체 Red Hat Ceph Storage 백엔드가 있을 수 있습니다.

Red Hat 문서에 관한 피드백 제공

문서 개선을 위한 의견을 보내 주십시오. Red Hat이 어떻게 더 나은지 알려주십시오.

Create Issue 양식을 사용하여 OpenShift (RHOSO) 또는 이전 Red Hat OpenStack Platform (RHOSP)의 Red Hat OpenStack Services 문서에 대한 피드백을 제공합니다. RHOSO 또는 RHOSP 문서에 대한 문제를 생성할 때 RHOSO Jira 프로젝트에 문제가 기록되어 피드백의 진행 상황을 추적할 수 있습니다.

문제 생성 양식을 완료하려면 Jira에 로그인해야 합니다. Red Hat Jira 계정이 없는 경우 https://issues.redhat.com 에서 계정을 생성할 수 있습니다.

  1. 다음 링크를 클릭하여 문제 생성 페이지를 엽니다. https://issues.redhat.com/secure/CreateIssueDetails!init.jspa?pid=12336920&summary=Documentation%20feedback:%20%3CAdd%20summary%20here%3E&issuetype=1&description=<Include+the+documentation+URL,+the%20chapter+or+section+number,+and+a+detailed+description+of+the+issue.>&components=12391143&priority=10300
  2. 요약설명 필드를 작성합니다. 설명 필드에 문서 URL, 장 또는 섹션 번호, 문제에 대한 자세한 설명을 포함합니다. 양식의 다른 필드를 수정하지 마십시오.
  3. 생성을 클릭합니다.

1장. DCN 이해

참고

RHOSP(Red Hat OpenStack Platform) 17.1에서 OpenShift(RHOSO) 18.0.3의 Red Hat OpenStack Services로 업그레이드는 현재 DCN(Distributed Compute Node) 배포에는 지원되지 않습니다.

DCN(Distributed Compute node) 아키텍처는 중앙 집중식 컨트롤 플레인을 공유하는 동안 컴퓨팅 및 스토리지 노드를 원격으로 배포해야 하는 에지 사용 사례입니다. DCN 아키텍처를 사용하면 성능 향상을 위해 운영 요구에 보다 전략적으로 워크로드를 배치할 수 있습니다.

중앙 위치는 최소한 Red Hat OpenShift Container Platform (RHOCP) 클러스터에 설치된 RHOSO 컨트롤 플레인으로 구성됩니다. 컴퓨팅 노드는 중앙 위치에 배포할 수도 있습니다. 에지 위치는 컴퓨팅 및 선택적 스토리지 노드로 구성됩니다.

DCN 아키텍처는 OpenStack 리소스의 사이트별 스케줄링을 보장하기 위해 여러 가용성 영역(AZ)으로 구성됩니다.

각 사이트를 고유한 AZ로 구성합니다. 이 가이드에서는 중앙 사이트에서 az0 을 사용하고 첫 번째 에지 위치는 az1 을 사용합니다. 이름 지정 규칙을 사용하여 AZ 이름이 사이트별로 고유하도록 할 수 있습니다.

DCN 아키텍처는 hub-and-spoke 라우팅 네트워크 배포입니다. DCN은 RHOSO를 사용한 라우팅된 프로비저닝 및 컨트롤 플레인 네트워킹을 위한 스파인-리프트 배포와 비교됩니다.

  • 허브는 핵심 라우터 및 데이터 센터 게이트웨이(DC-GW)가 있는 중앙 사이트입니다. 허브는 지리적으로 분산된 사이트를 관리하는 컨트롤 플레인을 호스팅합니다.
  • 발표자는 원격 에지 사이트입니다. 각 사이트는 OpenStackDataPlaneNodeSet 사용자 정의 리소스를 사용하여 정의됩니다. RHCS(Red Hat Ceph Storage)는 스토리지 백엔드로 사용됩니다. RHCS를 하이퍼컨버지드 구성으로 배포하거나 독립 실행형 스토리지 백엔드로 배포할 수 있습니다.
489 OpenStack 엣지 0825

에지 사이트에서 인스턴스를 시작하면 필요한 이미지가 로컬 Image 서비스(glance) 저장소에 자동으로 복사됩니다. 인스턴스 시작 중에 시간을 절약하기 위해 glance multistore를 사용하여 중앙 이미지 저장소의 이미지를 에지 사이트로 복사할 수 있습니다.

1.1. DCN 아키텍처에 필요한 소프트웨어

다음 표는 DCN(Distributed Compute Node) 아키텍처의 OpenShift(RHOSO)에 Red Hat OpenStack Services를 배포하는 데 필요한 소프트웨어 및 최소 버전을 보여줍니다.

Expand
플랫폼버전선택 사항

Red Hat OpenShift Container Platform

4.16

없음

Red Hat Enterprise Linux

9.2

없음

Red Hat OpenStack Platform

18.0.3

없음

Red Hat Ceph Storage

7 또는 8

제공됨

1.2. DCN 스토리지

중앙 위치 또는 에지 사이트를 다음 세 구성 중 하나로 배포할 수 있습니다.

  • 스토리지 없음.
  • 하이퍼컨버지드 Ceph 스토리지 사용.
  • RHCS(Red Hat Ceph Storage)를 독립 실행형 스토리지 백엔드로 사용합니다.

배포하는 스토리지는 배포하는 사이트 전용입니다. DCN 아키텍처는 Red Hat OpenShift Container Platform (RHOCP) 클러스터의 중앙 위치에 배포된 각 사이트의 Image 서비스(glance) Pod 및 Block Storage 서비스(cinder) Pod를 사용합니다.

스토리지 없이 배포된 에지 사이트의 경우 집계 캐시 명령을 사용하여 Compute 서비스(nova) 캐시에 이미지를 저장할 수 있습니다. Compute 서비스에서 이미지 서비스 이미지를 캐싱하면 WAN 링크에서 이미지를 다운로드하는 프로세스를 방지하여 인스턴스의 부팅 시간이 단축됩니다.

예제:

$ openstack aggregate cache image <dcn0> <myimage>
  • & lt;dcn0& gt;을 가용성 영역의 이름으로 바꿉니다.
  • & lt;myimage >를 이미지 이름으로 바꿉니다.
참고

Red Hat OpenStack Services on OpenShift(RHOSO)는 Red Hat Ceph Storage 7 및 8의 외부 배포를 지원합니다. Red Hat Ceph Storage를 참조하는 구성 예제에서는 릴리스 7 정보를 사용합니다. Red Hat Ceph Storage 8을 사용하는 경우 그에 따라 구성 예제를 조정합니다.

2장. DCN(Distributed Compute Node) 배포 계획

DCN 아키텍처를 계획할 때 필요한 기술이 사용 가능하고 지원되는지 확인하십시오.

2.1. DCN 아키텍처의 스토리지 고려 사항

DCN(Distributed Compute Node) 아키텍처를 사용하여 OpenShift의 Red Hat OpenStack Services on OpenShift(RHOSO) 배포에 연결된 스토리지는 보다 일반적인 아키텍처와 비교할 때 특정 자선 및 지원 차이점이 있습니다.

다음 기능은 현재 DCN 아키텍처에서 지원되지 않습니다.

  • 에지 사이트 간에 볼륨을 복사합니다. 볼륨에서 이미지를 생성하고 Image 서비스(glance)를 사용하여 이미지를 복사하여 이 문제를 해결할 수 있습니다. 이미지가 복사되면 이미지에서 볼륨을 생성할 수 있습니다.
  • 에지 사이트의 Ceph Rados Gateway(RGW).
  • 에지 사이트의 CephFS입니다.
  • 에지 사이트의 HA(인스턴스 고가용성)입니다.
  • 에지 사이트 간 RBD 미러링.
  • 에지 사이트 또는 중앙 위치에서 에지 사이트로 실시간 또는 콜드 인스턴스 마이그레이션. 사이트 경계 내에서만 인스턴스를 마이그레이션할 수 있습니다. 사이트 간에 이미지를 이동하려면 이미지를 스냅샷을 작성하고 glance image-import 를 사용해야 합니다.

또한 다음을 고려해야 합니다.

  • 이미지를 에지 사이트에 복사하기 전에 중앙 위치에 업로드해야 합니다. 각 이미지의 사본은 중앙 위치의 이미지 서비스에 있어야 합니다.
  • 이미지, 컴퓨팅 및 블록 스토리지 서비스에 RBD 스토리지 드라이버를 사용해야 합니다.
  • 중앙 위치를 포함한 각 사이트에 대해 고유한 가용성 영역을 할당합니다.
  • 에지 사이트에서 중앙 위치로 오프라인 볼륨을 마이그레이션하거나 그 반대의 경우도 마찬가지입니다. 에지 사이트 간에 직접 볼륨을 마이그레이션할 수 없습니다.

2.2. DCN 아키텍처의 네트워킹 고려 사항

DCN(Distributed Compute Node) 아키텍처를 사용하는 RHOSO 배포에는 더 일반적인 아키텍처와 비교했을 때 특정 자선 및 지원 차이점이 있습니다.

다음 기능은 현재 DCN 아키텍처에서 지원되지 않습니다.

  • DPDK 노드의 DHCP
  • TC Flower Hardware Offload

다음 ML2/OVN 네트워킹 기술이 완전히 지원됩니다.

  • 라우팅된 공급자 네트워크
  • Neutron AZ가 지원되는 OVN GW(네트워크 노드)

또한 다음을 고려해야 합니다.

  • 네트워크 대기 시간: RTT(Round-trip Time)로 측정된 대기 시간을 조정하여 허용 가능한 성능을 유지하기 위해 예상되는 동시 API 작업 수를 조정합니다. 최대 TCP/IP 처리량은 RTT에 비례하지 않습니다. 커널 TCP 매개변수를 조정하여 높은 대역폭으로 대기 시간이 높은 연결로 일부 문제를 완화할 수 있습니다. 사이트 간 통신이 100ms를 초과하면 Red Hat 지원팀에 문의하십시오.
  • 네트워크 중단: 에지 사이트에서 중앙 사이트에 일시적으로 연결이 끊어지면 중단 기간 동안 영향을 받는 에지 사이트에서 컨트롤 플레인 API 또는 CLI 작업을 실행할 수 없습니다. 예를 들어 에지 사이트의 컴퓨팅 노드는 결과적으로 인스턴스의 스냅샷을 생성하거나 인증 토큰을 발행하거나 이미지를 삭제할 수 없습니다. 일반 컨트롤 플레인 API 및 CLI 작업은 이 중단 중에 계속 작동하고 작동 중인 다른 에지 사이트를 계속 제공할 수 있습니다.
  • 이미지 유형: Ceph 스토리지를 사용하여 DCN 아키텍처를 배포할 때 원시 이미지를 사용해야 합니다.
  • 이미지 크기 조정:

    • 컴퓨팅 이미지: 컴퓨팅 이미지는 중앙 위치에서 다운로드합니다. 이러한 이미지는 프로비저닝 중에 중앙 사이트에서 에지 사이트로 필요한 모든 네트워크를 통해 전송되는 대용량 파일입니다.
    • 인스턴스 이미지: 에지에 블록 스토리지가 없는 경우 이미지 서비스 이미지는 처음 사용하는 동안 WAN을 통과합니다. 이미지는 나중에 사용할 수 있도록 대상 에지 노드에 로컬로 복사되거나 캐시됩니다. 이미지에 크기 제한이 없습니다. 전송 시간은 사용 가능한 대역폭 및 네트워크 대기 시간에 따라 다릅니다.
  • 공급자 네트워크는 DCN 배포를 위한 가장 일반적인 접근 방식입니다. Networking 서비스(neutron)는 사용 가능한 네트워크를 연결할 수 있는 위치를 확인하지 않습니다. 예를 들어 에지 사이트 A에서만 "site-a"라는 공급자 네트워크를 사용하는 경우 네트워킹 서비스는 작동하지 않는 사이트 B의 인스턴스에 "site-a"를 연결할 수 없습니다.
  • 사이트별 네트워크: 특정 사이트에 특정 네트워크를 사용하는 경우 DCN 네트워킹의 제한이 발생합니다. 컴퓨팅 노드에 중앙 집중식 중성자를 배포할 때 네트워킹 서비스에 특정 컴퓨팅 노드를 원격 노드로 식별하는 트리거가 없습니다. 결과적으로 컴퓨팅 노드는 다른 컴퓨팅 노드 목록을 수신하고 서로 자동으로 터널을 형성합니다. 터널은 중앙 위치를 통해 에지에서 에지로 구성됩니다. VXLAN 또는 GENEVE를 사용하는 경우 모든 사이트의 모든 컴퓨팅 노드는 로컬 또는 원격지 여부에 관계없이 다른 모든 컴퓨팅 노드와 터널을 형성합니다. 어디에서나 동일한 네트워크를 사용하는 경우에는 문제가 되지 않습니다. VLAN을 사용하면 Networking 서비스에 모든 컴퓨팅 노드에 동일한 브릿지 매핑이 있고 모든 VLAN을 모든 사이트에서 사용할 수 있어야 합니다.
  • 에지 서버가 사전 프로비저닝되지 않은 경우 라우팅된 세그먼트에서 인트로스펙션 및 프로비저닝을 위해 DHCP 릴레이를 구성해야 합니다.
  • 라우팅은 클라우드 또는 각 에지 사이트를 허브에 연결하는 네트워킹 인프라에 구성해야 합니다. 각 RHOSO 클러스터 네트워크(외부, 내부 API 등)에 L3 서브넷을 할당하는 네트워킹 설계를 구현해야 합니다. BGP를 사용하는 경우 RHOSO 컨트롤 플레인 및 데이터 플레인 노드에서 알리는 경로를 알아보려면 이러한 위치의 라우터에 BGP를 구성해야 합니다.

2.3. internalapi 네트워크의 IP 주소 풀 크기 조정

이미지 서비스 Operator는 glance-az0-internal.openstack.svc:9292 와 같은 자체 DNS 이름을 사용하여 각 이미지 서비스 Pod에 대한 끝점을 생성합니다. 각 가용성 영역의 각 Compute 서비스 및 블록 스토리지 서비스는 동일한 가용성 영역의 Image 서비스(glance) API 서버를 사용합니다. 예를 들어 OpenStackControlPlane CR(사용자 정의 리소스)에서 cinderVolumes 필드를 업데이트할 때 customServiceConfig 아래에 glance_api_servers 라는 필드를 추가합니다.

      cinderVolumes:
        az0:
          customServiceConfig: |
            [DEFAULT]
            enabled_backends = az0
            glance_api_servers = https://glance-az0-internal.openstack.svc:9292

이미지 서비스 끝점 DNS 이름은 내부 메타데이터 주석으로 표시된 대로 internalapi 주소 풀의 로드 밸런서 IP 주소에 매핑됩니다.

            [glance_store]
            default_backend = ceph
            [ceph]
            rbd_store_ceph_conf = /etc/ceph/ceph.conf
            store_description = "ceph RBD backend"
            rbd_store_pool = images
            rbd_store_user = openstack
            rbd_thin_provisioning = True
          networkAttachments:
          - storage
          override:
            service:
              internal:
                metadata:
                  annotations:
                    metallb.universe.tf/address-pool: internalapi
                    metallb.universe.tf/allow-shared-ip: internalapi
                    metallb.universe.tf/loadBalancerIPs: 172.17.0.80

이 주소 풀의 주소 범위는 DCN 사이트 수에 따라 크기가 지정되어야 합니다. 예를 들어 다음은 internalapi 네트워크에서 사용 가능한 주소 10개만 보여줍니다.

$ oc get ipaddresspool -n metallb-system
NAME          AUTO ASSIGN   AVOID BUGGY IPS   ADDRESSES
ctlplane      true          false             ["192.168.122.80-192.168.122.90"]
internalapi   true          false             ["172.17.0.80-172.17.0.90"]
storage       true          false             ["172.18.0.80-172.18.0.90"]
tenant        true          false             ["172.19.0.80-172.19.0.90"]

Glance Operator가 서비스 엔드포인트 및 경로를 생성했는지 확인하려면 OpenStackControlPlane CR의 glance 섹션을 업데이트한 후 다음과 같은 명령을 사용합니다.

$ oc get svc | grep glance
glance-az0-internal             LoadBalancer   172.30.217.178   172.17.0.80      9292:32134/TCP                                   24h
glance-az0-public               ClusterIP      172.30.78.47     <none>           9292/TCP                                         24h
glance-az1-internal             LoadBalancer   172.30.52.123    172.17.0.81      9292:31679/TCP                                   23h
glance-c1ca8-az0-external-api   ClusterIP      None             <none>           9292/TCP                                         24h
glance-c1ca8-az0-internal-api   ClusterIP      None             <none>           9292/TCP                                         24h
glance-c1ca8-az1-edge-api       ClusterIP      None             <none>           9292/TCP                                         23h

$ oc get route | grep glance
glance-az0-public              glance-az0-public-openstack.apps.ocp.openstack.lab                     glance-az0-public              glance-az0-public              reencrypt/Redirect   None
glance-default-public          glance-default-public-openstack.apps.ocp.openstack.lab                 glance-default-public          glance-default-public          reencrypt/Redirect   None

3장. Operator 설치 및 준비

OpenShift(RHOSO) OpenStack Operator(openstack-operator)에 Red Hat OpenStack Services를 설치하고 작동 중인 Red Hat OpenShift Container Platform(RHOCP) 클러스터에 RHOSO 컨트롤 플레인을 생성합니다. Cryostat 웹 콘솔을 사용하여 OpenStack Operator를 설치합니다. workstation에서 컨트롤 플레인 설치 작업 및 모든 데이터 플레인 생성 작업을 수행합니다.

RHOSO 버전을 OpenStack Operator 및 OpenStackVersion CR(사용자 정의 리소스)에 매핑하는 방법에 대한 자세한 내용은 https://access.redhat.com/articles/7125383 에서 Red Hat 기술 자료 문서를 참조하십시오.

3.1. 사전 요구 사항

3.2. OpenStack Operator 설치

RHOCP(Red Hat OpenShift Container Platform) 웹 콘솔에서 OperatorHub를 사용하여 Cryostat 클러스터에 OpenStack Operator(openstack-operator)를 설치합니다. Operator를 설치한 후 클러스터에서 OpenStack Operator를 시작하도록 OpenStack Operator 초기화 리소스의 단일 인스턴스를 구성합니다.

프로세스

  1. cluster-admin 권한이 있는 사용자로 Cryostat 웹 콘솔에 로그인합니다.
  2. Operators → OperatorHub 를 선택합니다.
  3. 키워드로 필터링 필드에 OpenStack 을 입력합니다.
  4. Red Hat source 레이블을 사용하여 OpenStack Operator 타일을 클릭합니다.
  5. Operator에 대한 정보를 확인하고 Install을 클릭합니다.
  6. Operator 설치 페이지의 설치된 네임스페이스 목록에서 "Operator 권장 네임스페이스: openstack-operators" 선택합니다.
  7. Operator 설치 페이지의 업데이트 승인 목록에서 "수동"을 선택합니다. 보류 중인 Operator 업데이트를 수동으로 승인하는 방법에 대한 자세한 내용은 Cryostat Operator 가이드에서 보류 중인 Operator 업데이트를 수동으로 승인 합니다.
  8. openstack-operators 네임스페이스에서 Operator를 사용할 수 있도록 설치를 클릭합니다. 상태가 성공이면 OpenStack Operator가 설치됩니다.
  9. Create OpenStack 을 클릭하여 OpenStack 만들기 페이지를 엽니다.
  10. OpenStack 생성 페이지에서 생성 을 클릭하여 OpenStack Operator 초기화 리소스의 인스턴스를 생성합니다. openstack 인스턴스의 StatusConditions: Ready 인 경우 OpenStack Operator를 사용할 준비가 되었습니다.

4장. DCN 컨트롤 플레인 배포

DCN(Distributed Compute Node) 아키텍처를 사용하여 OpenShift(RHOSO)에 Red Hat OpenStack Services를 배포하려면 RHOCP(Red Hat OpenShift Container Platform)를 설치하고 RHOSO 컨트롤 플레인을 설치합니다. RHOSO 컨트롤 플레인 준비에 대한 자세한 내용은 OpenShift 에서 Red Hat OpenStack Services 용 Red Hat OpenShift Container Platform 준비를 참조하십시오.

컨트롤 플레인을 배포하기 전에 Cryostat 네트워크도 구성해야 합니다. RHOSO의 DCN 배포에는 더 많은 수의 서브넷을 관리해야 합니다. 사용하는 서브넷은 사용자 환경에 따라 다릅니다. 이 문서에서는 각 예제에서 다음 구성을 사용합니다.

Expand
 중앙 위치 (AZ-0)AZ-1AZ-2

컨트롤 플레인

192.168.122.0/24

192.168.133.0/24

192.168.144.0/24

외부

10.0.0.0/24

10.0.10.0/24

10.0.20.0/24

내부

172.17.0.0/24

172.17.10.0/24

172.17.20.0/24

스토리지

172.18.0.0/24

172.18.10.0/24

172.18.20.0/24

테넌트

172.19.0.0/24

172.19.10.0/24

172.19.20.0/24

스토리지 관리

172.20.0.0/24

172.20.10.0/24

172.20.20.0/24

4.1. DCN의 스파인-리프 네트워크 토폴로지 생성

DCN(Distributed Compute Node) 아키텍처의 지리적으로 분산된 노드는 라우팅된 스파인-리프 네트워크 토폴로지를 사용하여 상호 연결됩니다.

다음 CR을 구성해야 합니다.

NodeNetworkConfigurationPolicy
NodeNetworkConfigurationPolicy CR을 사용하여 Cryostat 클러스터의 각 작업자 노드에서 각 격리된 네트워크의 인터페이스를 구성합니다.
NetworkAttachmentDefinition
NetworkAttachmentDefinition CR을 사용하여 서비스 Pod를 격리된 네트워크에 연결합니다.
L2Advertisement
L2Advertisement 리소스를 사용하여 VIP(가상 IP)의 발표 방법을 정의합니다.
IPAddressPool
IPAddressPool 리소스를 사용하여 VIP로 사용할 수 있는 IP를 구성합니다.
NetConfig
NetConfig CR을 사용하여 데이터 플레인 네트워크의 서브넷을 지정합니다.
OpenStackControlPlane
OpenStackControlPlane 를 사용하여 OpenShift에서 OpenStack 서비스를 정의하고 구성합니다.

4.2. DCN 네트워킹 준비

분산 컴퓨팅 노드 아키텍처를 배포할 때 중앙 위치 컨트롤 플레인을 먼저 배포합니다. RHOSO(Red Hat OpenStack Services on OpenShift) 서비스는 RHOCP(Red Hat OpenShift Container Platform) 워크로드로 실행됩니다.

사전 요구 사항

  • OpenStack Operator 설치

프로세스

  1. OpenStack 서비스를 호스팅하는 Cryostat 클러스터의 각 작업자 노드에 대해 워크스테이션에 NodeNetworkConfigurationPolicy (nncp) CR 정의 파일을 생성합니다.
  2. nncp CR 파일에서 각 격리된 네트워크의 인터페이스를 구성합니다. 각 서비스 인터페이스에는 고유한 주소가 있어야 합니다.

    apiVersion: nmstate.io/v1
    kind: NodeNetworkConfigurationPolicy
    metadata:
      labels:
        osp/nncm-config-type: standard
      name: worker-0
      namespace: openstack
    spec:
      desiredState:
        dns-resolver:
          config:
            search: []
            server:
            - 192.168.122.1
        interfaces:
        - description: internalapi vlan interface
          ipv4:
            address:
            - ip: 172.17.0.10
              prefix-length: "24"
            dhcp: false
            enabled: true
          ipv6:
            enabled: false
          mtu: 1496
          name: internalapi
          state: up
          type: vlan
          vlan:
            base-iface: enp7s0
            id: "20"
        - description: storage vlan interface
          ipv4:
            address:
            - ip: 172.18.0.10
              prefix-length: "24"
            dhcp: false
            enabled: true
          ipv6:
            enabled: false
          mtu: 1496
          name: storage
          state: up
          type: vlan
          vlan:
            base-iface: enp7s0
            id: "21"
        - description: tenant vlan interface
          ipv4:
            address:
            - ip: 172.19.0.10
              prefix-length: "24"
            dhcp: false
            enabled: true
          ipv6:
            enabled: false
          mtu: 1496
          name: tenant
          state: up
          type: vlan
          vlan:
            base-iface: enp7s0
            id: "22"
        - description: ctlplane interface
          mtu: 1500
          name: enp7s0
          state: up
          type: ethernet
        - bridge:
            options:
              stp:
                enabled: false
            port:
            - name: enp7s0
              vlan: {}
          description: linux-bridge over ctlplane interface
          ipv4:
            address:
            - ip: 192.168.122.10
              prefix-length: "24"
            dhcp: false
            enabled: true
          ipv6:
            enabled: false
          mtu: 1500
          name: ospbr
          state: up
          type: linux-bridge
  3. 각 원격 위치의 네트워크에 route-rules 속성 및 경로 구성을 각 nncp CR 파일에 추가합니다.

        route-rules:
          config: []
        routes:
          config:
          - destination: 192.168.133.0/24
            next-hop-address: 192.168.122.1
            next-hop-interface: ospbr
            table-id: 254
          - destination: 192.168.144.0/24
            next-hop-address: 192.168.122.1
            next-hop-interface: ospbr
            table-id: 254
          - destination: 172.17.10.0/24
            next-hop-address: 172.17.0.1
            next-hop-interface: internalapi
            table-id: 254
          - destination: 172.18.10.0/24
            next-hop-address: 172.18.0.1
            next-hop-interface: storage
            table-id: 254
          - destination: 172.19.10.0/24
            next-hop-address: 172.19.0.1
            next-hop-interface: tenant
            table-id: 254
          - destination: 172.17.20.0/24
            next-hop-address: 172.17.0.1
            next-hop-interface: internalapi
            table-id: 254
          - destination: 172.18.20.0/24
            next-hop-address: 172.18.0.1
            next-hop-interface: storage
            table-id: 254
          - destination: 172.19.20.0/24
            next-hop-address: 172.19.0.1
            next-hop-interface: tenant
            table-id: 254
      nodeSelector:
        kubernetes.io/hostname: worker-0
        node-role.kubernetes.io/worker: ""
    참고

    각 서비스 네트워크는 각 원격 위치에서 동일한 네트워크로 라우팅됩니다. 예를 들어, internapi 네트워크(172.17.0.0/24)에는 172.17.0.1의 로컬 라우터를 통해 각 원격 위치(172.17.10.0/24 및 172.17.20.0/24)에서 internalapi 네트워크에 대한 경로가 있습니다.

  4. 클러스터에 nncp CR을 생성합니다.

    $ oc create -f worker0-nncp.yaml
    $ oc create -f worker1-nncp.yaml
    $ oc create -f worker2-nncp.yaml
  5. 각 네트워크에 대한 NetworkAttachmentDefinition CR 정의 파일을 생성합니다. 동일한 기능의 네트워크에 대한 각 원격 위치에 대한 경로를 포함합니다. 예를 들어 internalapi NetworkAttachmentDefinition은 자체 서브넷 범위와 원격 사이트의 internalapi 네트워크에 대한 경로를 지정합니다.

    1. internalapi 네트워크에 대한 NetworkAttachmentDefinition CR 정의 파일을 생성합니다.

      apiVersion: k8s.cni.cncf.io/v1
      kind: NetworkAttachmentDefinition
      metadata:
        labels:
          osp/net: internalapi
          osp/net-attach-def-type: standard
        name: internalapi
        namespace: openstack
      spec:
        config: |
          {
            "cniVersion": "0.3.1",
            "name": "internalapi",
            "type": "macvlan",
            "master": "internalapi",
            "ipam": {
              "type": "whereabouts",
              "range": "172.17.0.0/24",
              "range_start": "172.17.0.30",
              "range_end": "172.17.0.70",
              "routes": [
                  { "dst": "172.17.10.0/24", "gw": "172.17.0.1" },
                  { "dst": "172.17.20.0/24", "gw": "172.17.0.1" }
                ]
            }
          }
    2. 제어 네트워크에 대한 NetworkAttachmentDefinition CR 정의 파일을 생성합니다.

      apiVersion: k8s.cni.cncf.io/v1
      kind: NetworkAttachmentDefinition
      metadata:
        labels:
          osp/net: ctlplane
          osp/net-attach-def-type: standard
        name: ctlplane
        namespace: openstack
      spec:
        config: |
          {
            "cniVersion": "0.3.1",
            "name": "ctlplane",
            "type": "macvlan",
            "master": "ospbr",
            "ipam": {
              "type": "whereabouts",
              "range": "192.168.122.0/24",
              "range_start": "192.168.122.30",
              "range_end": "192.168.122.70",
              "routes": [
                  { "dst": "192.168.133.0/24", "gw": "192.168.122.1" },
                  { "dst": "192.168.144.0/24", "gw": "192.168.122.1" }
                ]
            }
          }
    3. 스토리지 네트워크에 대한 NetworkAttachmentDefinition CR 정의 파일을 생성합니다.

      apiVersion: k8s.cni.cncf.io/v1
      kind: NetworkAttachmentDefinition
      metadata:
        labels:
          osp/net: storage
          osp/net-attach-def-type: standard
        name: storage
        namespace: openstack
      spec:
        config: |
          {
            "cniVersion": "0.3.1",
            "name": "storage",
            "type": "macvlan",
            "master": "storage",
            "ipam": {
              "type": "whereabouts",
              "range": "172.18.0.0/24",
              "range_start": "172.18.0.30",
              "range_end": "172.18.0.70",
              "routes": [
                  { "dst": "172.18.10.0/24", "gw": "172.18.0.1" },
                  { "dst": "172.18.20.0/24", "gw": "172.18.0.1" }
                ]
            }
          }
    4. 테넌트 네트워크에 대한 NetworkAttachmentDefinition CR 정의 파일을 생성합니다.

      apiVersion: k8s.cni.cncf.io/v1
      kind: NetworkAttachmentDefinition
      metadata:
        labels:
          osp/net: tenant
          osp/net-attach-def-type: standard
        name: tenant
        namespace: openstack
      spec:
        config: |
          {
            "cniVersion": "0.3.1",
            "name": "tenant",
            "type": "macvlan",
            "master": "tenant",
            "ipam": {
              "type": "whereabouts",
              "range": "172.19.0.0/24",
              "range_start": "172.19.0.30",
              "range_end": "172.19.0.70",
              "routes": [
                  { "dst": "172.19.10.0/24", "gw": "172.19.0.1" },
                  { "dst": "172.19.20.0/24", "gw": "172.19.0.1" }
                ]
            }
          }
  6. NetworkAttachmentDefinition CR을 생성합니다.

    $ oc create -f internalapi-net-attach-def.yaml
    $ oc create -f control-net-attach-def.yaml
    $ oc create -f storage-net-attach-def.yaml
    $ oc create -f tenant-net-attach-def.yaml
  7. NetConfig CR 정의 파일을 만들어 VIP(가상 IP)로 사용할 수 있는 IP를 정의합니다. dnsDomain 필드에 정의된 각 네트워크는 각 지역에 대한 allocationRanges 를 사용합니다. 이러한 범위는 Whereabouts IPAM 범위와 중복될 수 없습니다.

    1. 다음과 유사한 컨트롤 플레인 네트워킹에 대해 추가된 할당 범위를 사용하여 파일을 생성합니다.

      apiVersion: network.openstack.org/v1beta1
      kind: NetConfig
      metadata:
        name: netconfig
        namespace: openstack
      spec:
        networks:
        - dnsDomain: ctlplane.example.com
          mtu: 1500
          name: ctlplane
          subnets:
          - allocationRanges:
            - end: 192.168.122.120
              start: 192.168.122.100
            - end: 192.168.122.170
              start: 192.168.122.150
            cidr: 192.168.122.0/24
            gateway: 192.168.122.1
            name: subnet1
            routes:
            - destination: 192.168.133.0/24
              nexthop: 192.168.122.1
            - destination: 192.168.144.0/24
              nexthop: 192.168.122.1
          - allocationRanges:
            - end: 192.168.133.120
              start: 192.168.133.100
            - end: 192.168.133.170
              start: 192.168.133.150
            cidr: 192.168.133.0/24
            gateway: 192.168.133.1
            name: subnet2
            routes:
            - destination: 192.168.122.0/24
              nexthop: 192.168.133.1
            - destination: 192.168.144.0/24
              nexthop: 192.168.133.1
          - allocationRanges:
            - end: 192.168.144.120
              start: 192.168.144.100
            - end: 192.168.144.170
              start: 192.168.144.150
            cidr: 192.168.144.0/24
            gateway: 192.168.144.1
            name: subnet3
            routes:
            - destination: 192.168.122.0/24
              nexthop: 192.168.144.1
            - destination: 192.168.133.0/24
              nexthop: 192.168.144.1
    2. internalapi 네트워크의 할당 범위를 추가합니다.

        - dnsDomain: internalapi.example.com
          mtu: 1496
          name: internalapi
          subnets:
          - allocationRanges:
            - end: 172.17.0.250
              start: 172.17.0.100
            cidr: 172.17.0.0/24
            name: subnet1
            routes:
            - destination: 172.17.10.0/24
              nexthop: 172.17.0.1
            - destination: 172.17.20.0/24
              nexthop: 172.17.0.1
            vlan: 20
          - allocationRanges:
            - end: 172.17.10.250
              start: 172.17.10.100
            cidr: 172.17.0.0/24
            name: subnet2
            routes:
            - destination: 172.17.0.0/24
              nexthop: 172.17.10.1
            - destination: 172.17.20.0/24
              nexthop: 172.17.10.1
            vlan: 30
          - allocationRanges:
            - end: 172.17.20.250
              start: 172.17.20.100
            cidr: 172.17.20.0/24
            name: subnet3
            routes:
            - destination: 172.17.0.0/24
              nexthop: 172.17.20.1
            - destination: 172.17.10.0/24
              nexthop: 172.17.20.1
            vlan: 40
    3. 외부 네트워크의 할당 범위를 추가합니다.

        - dnsDomain: external.example.com
          mtu: 1500
          name: external
          subnets:
          - allocationRanges:
            - end: 10.0.0.250
              start: 10.0.0.100
            cidr: 10.0.0.0/24
            name: subnet1
            vlan: 22
        - dnsDomain: external.example.com
          mtu: 1500
          name: external
          subnets:
          - allocationRanges:
            - end: 10.0.10.250
              start: 10.0.10.100
            cidr: 10.0.10.0/24
            name: subnet2
            vlan: 22
        - dnsDomain: external.example.com
          mtu: 1500
          name: external
          subnets:
          - allocationRanges:
            - end: 10.0.20.250
              start: 10.0.20.100
            cidr: 10.0.20.0/24
            name: subnet3
            vlan: 22
        - dnsDomain: storage.example.com
          mtu: 1496
          name: storage
          subnets:
          - allocationRanges:
            - end: 172.18.0.250
              start: 172.18.0.100
            cidr: 172.18.0.0/24
            name: subnet1
            routes:
            - destination: 172.18.10.0/24
              nexthop: 172.18.0.1
            - destination: 172.18.20.0/24
              nexthop: 172.18.0.1
            vlan: 21
          - allocationRanges:
            - end: 172.18.10.250
              start: 172.18.10.100
            cidr: 172.18.10.0/24
            name: subnet2
            routes:
            - destination: 172.18.0.0/24
              nexthop: 172.18.10.1
            - destination: 172.18.20.0/24
              nexthop: 172.18.10.1
            vlan: 31
          - allocationRanges:
            - end: 172.18.20.250
              start: 172.18.20.100
            cidr: 172.18.20.0/24
            name: subnet3
            routes:
            - destination: 172.18.0.0/24
              nexthop: 172.18.20.1
            - destination: 172.18.10.0/24
              nexthop: 172.18.20.1
            vlan: 41
    4. 테넌트 네트워크의 할당 범위를 추가합니다.

        - dnsDomain: tenant.example.com
          mtu: 1496
          name: tenant
          subnets:
          - allocationRanges:
            - end: 172.19.0.250
              start: 172.19.0.100
            cidr: 172.19.0.0/24
            name: subnet1
            routes:
            - destination: 172.19.10.0/24
              nexthop: 172.19.0.1
            - destination: 172.19.20.0/24
              nexthop: 172.19.0.1
            vlan: 22
          - allocationRanges:
            - end: 172.19.10.250
              start: 172.19.10.100
            cidr: 172.19.10.0/24
            name: subnet2
            routes:
            - destination: 172.19.0.0/24
              nexthop: 172.19.10.1
            - destination: 172.19.20.0/24
              nexthop: 172.19.10.1
            vlan: 32
          - allocationRanges:
            - end: 172.19.20.250
              start: 172.19.20.100
            cidr: 172.19.20.0/24
            name: subnet3
            routes:
            - destination: 172.19.0.0/24
              nexthop: 172.19.20.1
            - destination: 172.19.10.0/24
              nexthop: 172.19.20.1
            vlan: 42
    5. storagemgmt 네트워크의 할당 범위를 추가합니다.

        - dnsDomain: storagemgmt.example.com
          mtu: 1500
          name: storagemgmt
          subnets:
          - allocationRanges:
            - end: 172.20.0.250
              start: 172.20.0.100
            cidr: 172.20.0.0/24
            name: subnet1
            routes:
            - destination: 172.20.10.0/24
              nexthop: 172.20.0.1
            - destination: 172.20.20.0/24
              nexthop: 172.20.0.1
            vlan: 23
          - allocationRanges:
            - end: 172.20.10.250
              start: 172.20.10.100
            cidr: 172.20.10.0/24
            name: subnet2
            routes:
            - destination: 172.20.0.0/24
              nexthop: 172.20.10.1
            - destination: 172.20.20.0/24
              nexthop: 172.20.10.1
            vlan: 33
          - allocationRanges:
            - end: 172.20.20.250
              start: 172.20.20.100
            cidr: 172.20.20.0/24
            name: subnet3
            routes:
            - destination: 172.20.0.0/24
              nexthop: 172.20.20.1
            - destination: 172.20.10.0/24
              nexthop: 172.20.20.1
            vlan: 43
  8. NetConfig CR을 생성합니다.

    oc create -f netconfig

4.3. DCN 컨트롤 플레인 생성

RHOSO(Red Hat OpenStack Services on OpenShift) 컨트롤 플레인에는 클라우드를 관리하는 RHOSO 서비스가 포함되어 있습니다. RHOSO 서비스는 Red Hat OpenShift Container Platform (RHOCP) 워크로드로 실행됩니다.

사전 요구 사항

  • OpenStack Operator(openstack-operator)가 설치되어 있습니다.
  • Cryostat 클러스터는 RHOSO 네트워크를 위해 준비되었습니다.
  • Cryostat 클러스터는 openstack-operators 네임스페이스와 컨트롤 플레인 네임스페이스(기본 openstack) 간의 통신을 방지하는 네트워크 정책으로 구성되지 않습니다. 다음 명령을 사용하여 클러스터의 기존 네트워크 정책을 확인합니다.

    $ oc get networkpolicy -n openstack
  • cluster-admin 권한이 있는 사용자로 Cryostat 클러스터에 액세스할 수 있는 워크스테이션에 로그인되어 있습니다.

프로세스

  1. openstack_control_plane.yaml 이라는 워크스테이션에 파일을 생성하여 OpenStackControlPlane CR을 정의합니다.

    apiVersion: core.openstack.org/v1beta1
    kind: OpenStackControlPlane
    metadata:
      name: openstack-control-plane
      namespace: openstack
  2. spec 필드를 사용하여 Pod에 대한 보안 액세스 권한을 제공하기 위해 생성한 Secret CR과 Red Hat OpenShift Container Platform(RHOCP) 클러스터 스토리지 백엔드에 대해 생성하는 storageClass 를 지정합니다.

    apiVersion: core.openstack.org/v1beta1
    kind: OpenStackControlPlane
    metadata:
      name: openstack-control-plane
      namespace: openstack
    spec:
      secret: osp-secret
      storageClass: <RHOCP_storage_class>
    • <RHOCP_storage_class>를 Cryostat 클러스터 스토리지 백엔드용으로 생성한 스토리지 클래스로 바꿉니다.
  3. 서비스 구성을 추가합니다. 필요한 모든 서비스에 대한 서비스 구성을 포함합니다.

    • Block Storage 서비스(cinder):

        cinder:
          uniquePodNames: false
          apiOverride:
            route: {}
          template:
            customServiceConfig: |
              [DEFAULT]
              storage_availability_zone = az0
            databaseInstance: openstack
            secret: osp-secret
            cinderAPI:
              replicas: 3
              override:
                service:
                  internal:
                    metadata:
                      annotations:
                        metallb.universe.tf/address-pool: internalapi
                        metallb.universe.tf/allow-shared-ip: internalapi
                        metallb.universe.tf/loadBalancerIPs: 172.17.0.80
                    spec:
                      type: LoadBalancer
            cinderScheduler:
              replicas: 1
            cinderVolumes:
              az0:
                networkAttachments:
                - storage
                replicas: 0
      참고

      RHOSO 18.0.3에서 secret의 전파를 허용하려면 uniquePodNames 필드를 false 값으로 설정해야 합니다. 자세한 내용은 OSPRH-11240 에서 참조하십시오.

      참고
      • replicas 필드를 0 으로 설정합니다. 복제본 수가 변경되고 스토리지가 구성된 후 추가 cinderVolume 서비스가 추가됩니다.
      • template 섹션의 storage_availability_zone 필드를 az0 로 설정합니다. 모든 블록 스토리지 서비스(cinder) Pod는 cinderBackup,cinderVolume 등과 같은 이 값을 상속합니다. backend_availability_zone 을 지정하여 cinderVolume 서비스에 대해 이 AZ를 덮어쓸 수 있습니다.
    • 컴퓨팅 서비스(nova):

        nova:
          apiOverride:
            route: {}
          template:
            apiServiceTemplate:
              replicas: 3
              override:
                service:
                  internal:
                    metadata:
                      annotations:
                        metallb.universe.tf/address-pool: internalapi
                        metallb.universe.tf/allow-shared-ip: internalapi
                        metallb.universe.tf/loadBalancerIPs: 172.17.0.80
                    spec:
                      type: LoadBalancer
            metadataServiceTemplate:
              replicas: 3
              override:
                service:
                  metadata:
                    annotations:
                      metallb.universe.tf/address-pool: internalapi
                      metallb.universe.tf/allow-shared-ip: internalapi
                      metallb.universe.tf/loadBalancerIPs: 172.17.0.80
                  spec:
                    type: LoadBalancer
            schedulerServiceTemplate:
              replicas: 3
              override:
                service:
                  metadata:
                    annotations:
                      metallb.universe.tf/address-pool: internalapi
                      metallb.universe.tf/allow-shared-ip: internalapi
                      metallb.universe.tf/loadBalancerIPs: 172.17.0.80
                  spec:
                    type: LoadBalancer
            cellTemplates:
              cell0:
                cellDatabaseAccount: nova-cell0
                cellDatabaseInstance: openstack
                cellMessageBusInstance: rabbitmq
                hasAPIAccess: true
              cell1:
                cellDatabaseAccount: nova-cell1
                cellDatabaseInstance: openstack-cell1
                cellMessageBusInstance: rabbitmq-cell1
                noVNCProxyServiceTemplate:
                  enabled: true
                  networkAttachments:
                  - ctlplane
                hasAPIAccess: true
            secret: osp-secret
    • 데이터 플레인의 DNS 서비스:

        dns:
          template:
            options:
            - key: server
              values:
              - 192.168.122.1
            - key: server
              values:
              - 192.168.122.2
            override:
              service:
                metadata:
                  annotations:
                    metallb.universe.tf/address-pool: ctlplane
                    metallb.universe.tf/allow-shared-ip: ctlplane
                    metallb.universe.tf/loadBalancerIPs: 192.168.122.80
                spec:
                  type: LoadBalancer
            replicas: 2
    • Galera

        galera:
          templates:
            openstack:
              storageRequest: 5000M
              secret: osp-secret
              replicas: 3
            openstack-cell1:
              storageRequest: 5000M
              secret: osp-secret
              replicas: 3
    • Identity 서비스(keystone)

        keystone:
          apiOverride:
            route: {}
          template:
            override:
              service:
                internal:
                  metadata:
                    annotations:
                      metallb.universe.tf/address-pool: internalapi
                      metallb.universe.tf/allow-shared-ip: internalapi
                      metallb.universe.tf/loadBalancerIPs: 172.17.0.80
                  spec:
                    type: LoadBalancer
            databaseInstance: openstack
            secret: osp-secret
            replicas: 3
    • Image 서비스(glance):

        glance:
          apiOverrides:
            default:
              route: {}
          template:
            databaseInstance: openstack
            storage:
              storageRequest: 10G
            secret: osp-secret
            keystoneEndpoint: default
            glanceAPIs:
              default:
                replicas: 0
                override:
                  service:
                    internal:
                      metadata:
                        annotations:
                          metallb.universe.tf/address-pool: internalapi
                          metallb.universe.tf/allow-shared-ip: internalapi
                          metallb.universe.tf/loadBalancerIPs: 172.17.0.80
                      spec:
                        type: LoadBalancer
                networkAttachments:
                - storage
      참고

      처음에 replicas 필드를 값 0 으로 설정해야 합니다. 복제본 수가 변경되고 스토리지가 구성된 후 추가 glanceAPI 서비스가 추가됩니다.

    • 키 관리 서비스(barbican):

        barbican:
          apiOverride:
            route: {}
          template:
            databaseInstance: openstack
            secret: osp-secret
            barbicanAPI:
              replicas: 3
              override:
                service:
                  internal:
                    metadata:
                      annotations:
                        metallb.universe.tf/address-pool: internalapi
                        metallb.universe.tf/allow-shared-ip: internalapi
                        metallb.universe.tf/loadBalancerIPs: 172.17.0.80
                    spec:
                      type: LoadBalancer
            barbicanWorker:
              replicas: 3
            barbicanKeystoneListener:
              replicas: 1
    • Memcached

        memcached:
          templates:
            memcached:
               replicas: 3
    • Networking 서비스(neutron):

        neutron:
          apiOverride:
            route: {}
          template:
            customServiceConfig: |
            [DEFAULT]
            network_scheduler_driver = neutron.scheduler.dhcp_agent_scheduler.AZAwareWeightScheduler
            default_availability_zones = az0
            [ml2_type_vlan]
            network_vlan_ranges = datacentre:1:1000
            [neutron]
            physnets = datacentre
            replicas: 3
            override:
              service:
                internal:
                  metadata:
                    annotations:
                      metallb.universe.tf/address-pool: internalapi
                      metallb.universe.tf/allow-shared-ip: internalapi
                      metallb.universe.tf/loadBalancerIPs: 172.17.0.80
                  spec:
                    type: LoadBalancer
            databaseInstance: openstack
            secret: osp-secret
            networkAttachments:
            - internalapi
    • DHCP 에이전트가 배포된 경우 network_scheduler_driverneutron.scheduler.dhcp_agent_scheduler.AZAwareWeightScheduler 값으로 설정합니다.
    • OVN

        ovn:
          template:
            ovnController:
              external-ids:
                availability-zones:
                - az0
                enable-chassis-as-gateway: true
                ovn-bridge: br-int
                ovn-encap-type: geneve
                system-id: random
              networkAttachment: tenant
              nicMappings:
                datacentre: ospbr
            ovnDBCluster:
              ovndbcluster-nb:
                replicas: 3
                dbType: NB
                storageRequest: 10G
                networkAttachment: internalapi
              ovndbcluster-sb:
                replicas: 3
                dbType: SB
                storageRequest: 10G
                networkAttachment: internalapi
            ovnNorthd:
              networkAttachment: internalapi
    • 배치 서비스(장자리)

        placement:
          apiOverride:
            route: {}
          template:
            override:
              service:
                internal:
                  metadata:
                    annotations:
                      metallb.universe.tf/address-pool: internalapi
                      metallb.universe.tf/allow-shared-ip: internalapi
                      metallb.universe.tf/loadBalancerIPs: 172.17.0.80
                  spec:
                    type: LoadBalancer
            databaseInstance: openstack
            replicas: 3
            secret: osp-secret
    • RabbitMQ

        rabbitmq:
          templates:
            rabbitmq:
              replicas: 3
              override:
                service:
                  metadata:
                    annotations:
                      metallb.universe.tf/address-pool: internalapi
                      metallb.universe.tf/loadBalancerIPs: 172.17.0.85
                  spec:
                    type: LoadBalancer
            rabbitmq-cell1:
              replicas: 3
              override:
                service:
                  metadata:
                    annotations:
                      metallb.universe.tf/address-pool: internalapi
                      metallb.universe.tf/loadBalancerIPs: 172.17.0.86
                  spec:
                    type: LoadBalancer
  4. 컨트롤 플레인을 생성합니다.

    oc create -f openstack_control_plane.yaml -n openstack

4.4. Ceph 비밀 키 사이트 배포

여러 Ceph 백엔드가 있는 DCN(Distributed Compute Node) 환경을 배포할 때 각 백엔드에 대해 Ceph 키를 생성합니다. 보안을 위해 최소 Ceph 키 수를 각 사이트에 배포합니다. 각 위치에 대해 하나의 시크릿을 생성합니다.

  • 각 Ceph 백엔드의 키를 기본 위치의 보안에 추가합니다.
  • 기본 Ceph 백엔드의 키와 추가 위치마다 로컬 ceph 백엔드를 추가합니다.

세 위치( az0,az1, az2 )의 경우 세 가지 시크릿이 있어야 합니다. 위치 az1az2 각각 로컬 백엔드에 대한 키와 az0 의 키가 있습니다. 위치 az0 에는 모든 Ceph 백엔드 키가 포함되어 있습니다.

Ceph가 각 에지 위치에 배포된 후 필요한 시크릿을 생성하고 각각에 대한 인증 키 및 구성 파일을 수집합니다. 또는 필요에 따라 각 Ceph 백엔드를 배포하고 각 에지 배포로 시크릿을 업데이트할 수 있습니다.

프로세스

  1. az0 위치에 대한 시크릿을 생성합니다.

    1. 스토리지가 필요한 모든 에지 사이트에 RHCS(Red Hat Ceph Storage)를 이미 배포한 경우 모든 인증 키 및 conf 파일이 포함된 az0 의 시크릿을 생성합니다.

      oc create secret generic ceph-conf-az-0 \
      --from-file=az0.client.openstack.keyring \
      --from-file=az0.conf \
      --from-file=az1.client.openstack.keyring \
      --from-file=az1.conf \
      --from-file=az2.client.openstack.keyring \
      --from-file=az2.conf -n openstack
    2. RHCS를 모든 에지 사이트에 배포하지 않은 경우 az0 의 인증 키와 conf 파일이 포함된 az0 의 시크릿을 생성합니다.

      oc create secret generic ceph-conf-az-0 \
      --from-file=az0.client.openstack.keyring \
      --from-file=az0.conf -n openstack
  2. 가용성 영역 1(az1)의 에지 위치에 RHCS를 배포할 때 로컬 백엔드의 인증 키 및 conf 파일이 포함된 위치 az1 의 시크릿을 생성합니다.

    oc create secret generic ceph-conf-az-1 \
    --from-file=az0.client.openstack.keyring \
    --from-file=az0.conf \
    --from-file=az1.client.openstack.keyring \
    --from-file=az1.conf -n openstack
  3. 필요한 경우 중앙 위치의 시크릿을 업데이트합니다.

    oc delete secret ceph-conf-az-0 -n openstack
    
    oc create secret generic ceph-conf-az-0 \
    --from-file=az0.client.openstack.keyring \
    --from-file=az0.conf \
    --from-file=az1.client.openstack.keyring \
    --from-file=az1.conf -n openstack
  4. 가용성 영역 2(az2)의 에지 위치에 RHCS를 배포할 때 로컬 백엔드의 인증 키 및 conf 파일이 포함된 위치 az2 의 시크릿을 생성합니다.

    oc create secret generic ceph-conf-az-2 \
    --from-file=az0.client.openstack.keyring \
    --from-file=az0.conf \
    --from-file=az2.client.openstack.keyring \
    --from-file=az2.conf -n openstack
  5. 필요한 경우 중앙 위치의 시크릿을 업데이트합니다.

    oc delete secret ceph-conf-az-0 -n openstack
    
    oc create secret generic ceph-conf-az-0 \
    --from-file=az0.client.openstack.keyring \
    --from-file=az0.conf \
    --from-file=az1.client.openstack.keyring \
    --from-file=az1.conf \
    --from-file=az1.client.openstack.keyring \
    --from-file=az1.conf \
    --from-file=az2.client.openstack.keyring \
    --from-file=az2.conf
  6. [선택 사항] 필요한 키 생성을 완료하면 openstack 네임스페이스에 표시되는지 확인할 수 있습니다.

    oc get secret -n openstack -o name | grep ceph-conf

    출력 예:

    secret/ceph-conf-az-0
    secret/ceph-conf-az-1
    secret/ceph-conf-az-2
  7. OpenStackDataPlaneNodeSet 을 생성할 때 extraMounts 필드에서 적절한 키를 사용합니다.

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneNodeSet
    metadata:
      name: openstack-edpm-dcn-0
      namespace: openstack
    spec:
      ...
      nodeTemplate:
        extraMounts:
        - extraVolType: Ceph
          volumes:
          - name: ceph
            secret:
              secretName: ceph-conf-az-0
          mounts:
          - name: ceph
            mountPath: "/etc/ceph"
            readOnly: true
  8. 데이터 플레인 NodeSet을 생성할 때 OpenStackControlPlane CR(사용자 정의 리소스)도 시크릿 이름으로 업데이트해야 합니다.

    apiVersion: core.openstack.org/v1beta1
    kind: OpenStackControlPlane
    spec:
      extraMounts:
        - name: v1
          region: r1
          extraVol:
            - propagation:
              - az0
              - CinderBackup
              extraVolType: Ceph
              volumes:
              - name: ceph
                secret:
                  name: ceph-conf-az-0
              mounts:
              - name: ceph
                mountPath: "/etc/ceph"
                readOnly: true
            - propagation:
              - az1
              extraVolType: Ceph
              volumes:
              - name: ceph
                secret:
                  name: ceph-conf-az-1
              mounts:
              - name: ceph
                mountPath: "/etc/ceph"
                readOnly: true
            ...
    참고

    CinderBackup 서비스가 배포의 일부인 경우 포드 이름에 가용성 영역이 없으므로 전파 목록에 포함해야 합니다.

  9. OpenStackControlPlane CR에서 glanceAPIs 필드를 업데이트하면 Image 서비스(glance) Pod 이름이 extraMounts 전파 인스턴스와 일치합니다.

         glanceAPIs:
           az0:
             customServiceConfig: |
             ...
           az1:
             customServiceConfig: |
             ...
  10. OpenStackControlPlane CR에서 cinderVolumes 필드를 업데이트할 때 Block Storage 서비스(cinder) Pod 이름도 extraMounts 전파 인스턴스 s 와 일치해야 합니다.

    kind: OpenStackControlPlane
    spec:
      <...>
      cinder
        <...>
        cinderVolumes:
          az0:
            <...>
          az1:
            <...>

5장. DCN 노드 세트 배포

노드 세트는 중앙 위치에 배포하든 원격 위치에 배포하든 동일한 프로시저를 사용하여 배포됩니다. 각 엣지 위치를 별도의 가용 영역에 배포합니다. 예를 들어 az0 에 설정된 중앙 위치 노드를 배포하고 az1 에 첫 번째 에지 사이트를 배포합니다.

5.1. 데이터 플레인 노드 네트워크 구성

Red Hat Ceph Storage 네트워킹 요구 사항을 수용하도록 데이터 플레인 노드 네트워크를 구성해야 합니다.

사전 요구 사항

  • 컨트롤 플레인 배포가 완료되었지만 Ceph Storage를 사용하도록 수정되지 않았습니다.
  • 데이터 플레인 노드는 운영 체제를 통해 사전 프로비저닝되었습니다.
  • 데이터 플레인 노드는 Ansible에서 사용할 수 있는 SSH 키를 통해 액세스할 수 있습니다.
  • HCI를 사용하는 경우 데이터 플레인 노드에 Ceph OSD로 사용할 수 있는 디스크가 있습니다.
  • 사용 가능한 데이터 플레인 노드가 3개 이상 있어야 합니다. 중복을 위해서는 Ceph Storage 클러스터에 최소 3개의 노드가 있어야 합니다.

프로세스

  1. dcn-data-plane-networks.yaml 이라는 워크스테이션에 파일을 생성하여 데이터 플레인 노드 네트워크를 구성하는 OpenStackDataPlaneNodeSet CR을 정의합니다.

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneNodeSet
    metadata:
      name: dcn-data-plane-networks
      namespace: openstack
    spec:
      env:
        - name: ANSIBLE_FORCE_COLOR
          value: "True"
  2. 노드에 적용할 서비스를 지정합니다.

    spec:
      ...
      services:
        - bootstrap
        - configure-network
        - validate-network
        - install-os
        - ceph-hci-pre
        - configure-os
        - ssh-known-hosts
        - run-os
        - reboot-os
  3. 데이터 플레인에서 edpm_enable_chassis_gw 및 edpm_ovn_availability_zones 필드를 설정합니다.

    spec:
      env:
      - name: ANSIBLE_FORCE_COLOR
        value: "True"
      networkAttachments:
      - ctlplane
      nodeTemplate:
        ansible:
          ansiblePort: 22
          ansibleUser: cloud-admin
          ansibleVars:
            edpm_enable_chassis_gw: true
            edpm_ovn_availability_zones:
              - az0
  4. 선택 사항: ceph-hci-pre 서비스는 edpm_ceph_hci_pre edpm-ansible 역할을 사용하여 네트워크 구성 후 Red Hat Ceph Storage 서비스를 호스팅할 데이터 플레인 노드를 준비합니다. 기본적으로 이 역할의 edpm_ceph_hci_pre_enabled_services 매개변수에는 RBD,RGWNFS 서비스만 포함됩니다. DCN은 DCN 사이트의 RBD 서비스만 지원합니다. HCI를 배포하는 경우 edpm_ceph_hci_pre_enabled_services 매개변수를 추가하고 ceph RBD 서비스만 추가하여 RGW 및 NFS 서비스를 비활성화합니다.

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneNodeSet
    metadata:
      name: openstack-edpm
      namespace: openstack
    spec:
      env:
      - name: ANSIBLE_FORCE_COLOR
    	value: "True"
      networkAttachments:
      - ctlplane
      nodeTemplate:
    	ansible:
      	ansiblePort: 22
      	ansibleUser: cloud-admin
      	ansibleVars:
        	edpm_ceph_hci_pre_enabled_services:
        	- ceph_mon
        	- ceph_mgr
        	- ceph_osd
    ...
    참고

    대시보드와 같은 기타 서비스가 HCI 노드와 함께 배포되는 경우 edpm_ceph_hci_pre_enabled_services 매개 변수 목록에 추가해야 합니다. 이 역할에 대한 자세한 내용은 edpm_ceph_hci_pre 역할을 참조하십시오.

  5. 스토리지 관리를 위해 Red Hat Ceph Storage 클러스터 네트워크를 구성합니다.

    다음 예제에는 3개의 노드가 있습니다. 스토리지 관리가 VLAN23 에 있다고 가정합니다.

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneNodeSet
    metadata:
      name: openstack-edpm
      namespace: openstack
    spec:
      env:
      - name: ANSIBLE_FORCE_COLOR
        value: "True"
      networkAttachments:
      - ctlplane
      nodeTemplate:
        ansible:
          ansiblePort: 22
          ansibleUser: cloud-admin
          ansibleVars:
            edpm_ceph_hci_pre_enabled_services:
            - ceph_mon
            - ceph_mgr
            - ceph_osd
            edpm_fips_mode: check
            edpm_iscsid_image: {{ registry_url }}/openstack-iscsid:{{ image_tag }}
            edpm_logrotate_crond_image: {{ registry_url }}/openstack-cron:{{ image_tag }}
            edpm_network_config_hide_sensitive_logs: false
            edpm_network_config_os_net_config_mappings:
              edpm-compute-0:
                nic1: 52:54:00:1e:af:6b
                nic2: 52:54:00:d9:cb:f4
              edpm-compute-1:
                nic1: 52:54:00:f2:bc:af
                nic2: 52:54:00:f1:c7:dd
              edpm-compute-2:
                nic1: 52:54:00:dd:33:14
                nic2: 52:54:00:50:fb:c3
            edpm_network_config_template: |
              ---
              {% set mtu_list = [ctlplane_mtu] %}
              {% for network in nodeset_networks %}
              {{ mtu_list.append(lookup(vars, networks_lower[network] ~ _mtu)) }}
              {%- endfor %}
              {% set min_viable_mtu = mtu_list | max %}
              network_config:
              - type: ovs_bridge
                name: {{ neutron_physical_bridge_name }}
                mtu: {{ min_viable_mtu }}
                use_dhcp: false
                dns_servers: {{ ctlplane_dns_nameservers }}
                domain: {{ dns_search_domains }}
                addresses:
                - ip_netmask: {{ ctlplane_ip }}/{{ ctlplane_cidr }}
                routes: {{ ctlplane_host_routes }}
                members:
                - type: interface
                  name: nic2
                  mtu: {{ min_viable_mtu }}
                  # force the MAC address of the bridge to this interface
                  primary: true
              {% for network in nodeset_networks %}
                - type: vlan
                  mtu: {{ lookup(vars, networks_lower[network] ~ _mtu) }}
                  vlan_id: {{ lookup(vars, networks_lower[network] ~ _vlan_id) }}
                  addresses:
                  - ip_netmask:
                      {{ lookup(vars, networks_lower[network] ~ _ip) }}/{{ lookup(vars, networks_lower[network] ~ _cidr) }}
                  routes: {{ lookup(vars, networks_lower[network] ~ _host_routes) }}
              {% endfor %}
            edpm_neutron_metadata_agent_image: {{ registry_url }}/openstack-neutron-metadata-agent-ovn:{{ image_tag }}
            edpm_nodes_validation_validate_controllers_icmp: false
            edpm_nodes_validation_validate_gateway_icmp: false
            edpm_selinux_mode: enforcing
            edpm_sshd_allowed_ranges:
            - 192.168.111.0/24
            - 192.168.122.0/24
            - 192.168.133.0/24
            - 192.168.144.0/24
            edpm_sshd_configure_firewall: true
            enable_debug: false
            gather_facts: false
            image_tag: current-podified
            neutron_physical_bridge_name: br-ex
            neutron_public_interface_name: eth0
            service_net_map:
              nova_api_network: internalapi
              nova_libvirt_network: internalapi
            storage_mgmt_cidr: "24"
            storage_mgmt_host_routes: []
            storage_mgmt_mtu: 9000
            storage_mgmt_vlan_id: 23
            storage_mtu: 9000
            timesync_ntp_servers:
            - hostname: pool.ntp.org
        ansibleSSHPrivateKeySecret: dataplane-ansible-ssh-private-key-secret
        managementNetwork: ctlplane
        networks:
        - defaultRoute: true
          name: ctlplane
          subnetName: subnet1
        - name: internalapi
          subnetName: subnet1
        - name: storage
          subnetName: subnet1
        - name: tenant
          subnetName: subnet1
      nodes:
        edpm-compute-0:
          ansible:
            host: 192.168.122.100
          hostName: compute-0
          networks:
          - defaultRoute: true
            fixedIP: 192.168.122.100
            name: ctlplane
            subnetName: subnet1
          - name: internalapi
            subnetName: subnet1
          - name: storage
            subnetName: subnet1
          - name: storagemgmt
            subnetName: subnet1
          - name: tenant
            subnetName: subnet1
        edpm-compute-1:
          ansible:
            host: 192.168.122.101
          hostName: compute-1
          networks:
          - defaultRoute: true
            fixedIP: 192.168.122.101
            name: ctlplane
            subnetName: subnet1
          - name: internalapi
            subnetName: subnet1
          - name: storage
            subnetName: subnet1
          - name: storagemgmt
            subnetName: subnet1
          - name: tenant
            subnetName: subnet1
        edpm-compute-2:
          ansible:
            host: 192.168.122.102
          hostName: compute-2
          networks:
          - defaultRoute: true
            fixedIP: 192.168.122.102
            name: ctlplane
            subnetName: subnet1
          - name: internalapi
            subnetName: subnet1
          - name: storage
            subnetName: subnet1
          - name: storagemgmt
            subnetName: subnet1
          - name: tenant
            subnetName: subnet1
      preProvisioned: true
      services:
      - bootstrap
      - configure-network
      - validate-network
      - install-os
      - ceph-hci-pre
      - configure-os
      - ssh-known-hosts
      - run-os
      - reboot-os
  6. CR을 적용합니다.

    $ oc apply -f <dataplane_cr_file>
    • & lt;dataplane_cr_file& gt;을 파일 이름으로 바꿉니다.

      참고

      Ansible은 OpenStackDataPlaneDeployment CRD가 생성될 때까지 네트워크를 구성하거나 검증하지 않습니다.

  7. OpenShift에 Red Hat OpenStack Services 배포 가이드에 설명된 대로 OpenStack DataPlaneDeployment CRD를 생성합니다. 이 가이드에는 OpenStackDataPlaneNodeSet CRD 파일이 정의되어 데이터 플레인 노드에서 서비스를 구성할 수 있습니다. https://docs.redhat.com/en/documentation/red_hat_openstack_services_on_openshift/18.0/html/deploying_red_hat_openstack_services_on_openshift/assembly_creating-the-data-plane
  8. 네트워크가 구성되었는지 확인하려면 다음 단계를 완료합니다.

    1. 데이터 플레인 노드에 SSH를 수행합니다.
    2. ip a 명령을 사용하여 구성된 네트워크를 표시합니다.
    3. 스토리지 네트워크가 구성된 네트워크 목록에 있는지 확인합니다.

5.2. 하이퍼컨버지드 Red Hat Ceph Storage 구성 및 배포

참고

다음 단계는 특히 RHCS(Red Hat Ceph Storage)의 하이퍼컨버지드 구성용이며 외부 RHCS 클러스터를 배포한 경우에는 필요하지 않습니다.

구성 파일을 편집하고 cephadm 유틸리티를 사용하여 Red Hat Ceph Storage를 구성하고 배포합니다.

프로세스

  1. Red Hat Ceph Storage 구성 파일을 편집합니다.
  2. 스토리지 및 스토리지 관리 네트워크 범위를 추가합니다. Red Hat Ceph Storage는 스토리지 네트워크를 Red Hat Ceph Storage public_network 로 사용하고 스토리지 관리 네트워크를 cluster_network 로 사용합니다.

    다음 예제는 스토리지 네트워크 범위가 172.18.0.0/24 이고 스토리지 관리 네트워크 범위는 172.20.0.0/24 인 구성 파일 항목에 대한 것입니다.

    [global]
    public_network = 172.18.0.0/24
    cluster_network = 172.20.0.0/24
  3. Compute 서비스와 Ceph OSD 서비스 간에 배치 경계를 추가합니다. CPU 및 메모리 경합을 줄이기 위해 배치된 Compute 서비스와 Ceph OSD 서비스 간에 경계를 설정해야 합니다.

    다음은 다음 경계가 설정된 Ceph 구성 파일 항목의 예입니다.

    [osd]
    osd_memory_target_autotune = true
    osd_numa_auto_affinity = true
    [mgr]
    mgr/cephadm/autotune_memory_target_ratio = 0.2

    이 예에서는 OSD 데몬이 osd_memory_target 옵션을 기반으로 메모리 사용을 조정하도록 osd_memory_target_autotune 매개변수가 true 로 설정됩니다. autotune_memory_target_ratio 의 기본값은 Cryostat입니다. 이는 시스템의 전체 RAM의 70%가 자동 조정되지 않은 Ceph 데몬에서 사용하는 메모리를 제거하는 시작점임을 의미합니다. 나머지 메모리는 OSD로 나뉩니다. 모든 OSD에 osd_memory_target_autotune 이 true로 설정되어 있다고 가정합니다. HCI 배포의 경우 Compute 서비스에 더 많은 메모리를 사용할 수 있도록 mgr/cephadm/autotune_memory_target_ratio 를 0.2로 설정할 수 있습니다.

    서비스 배치에 대한 자세한 내용은 NUMA 노드의 HCI 환경에서 서비스 배치를 참조하십시오.

    참고

    배포 후 이러한 값을 조정해야 하는 경우 ceph config set osd <key> <value> 명령을 사용합니다.

  4. 데이터 플레인 노드에 편집된 구성 파일을 사용하여 Ceph Storage를 배포합니다.

    $ cephadm bootstrap --config <config_file> --mon-ip <data_plane_node_ip> --skip-monitoring-stack

    • & lt;config_file& gt;을 Ceph 구성 파일의 이름으로 바꿉니다.
    • & lt;data_plane_node_ip >를 Red Hat Ceph Storage 가 설치될 데이터 플레인 노드의 스토리지 네트워크 IP 주소로 바꿉니다.

      참고

      --skip-monitoring-stack 옵션은 cephadm bootstrap 명령에서 모니터링 서비스 배포를 건너뛰는 데 사용됩니다. 이렇게 하면 모니터링 서비스가 이전에 이전 프로세스의 일부로 배포된 경우 Red Hat Ceph Storage 배포가 성공적으로 완료됩니다.

      모니터링 서비스가 배포되지 않은 경우 모니터링 서비스 활성화에 대한 정보 및 절차는 Red Hat Ceph Storage 설명서를 참조하십시오.

  5. Red Hat Ceph Storage 클러스터가 첫 번째 EDPM 노드에 부트 스트랩된 후 Red Hat Ceph Storage 설치 가이드의 Red Hat Ceph Storage 설치를 참조하여 다른 EDPM 노드를 Ceph 클러스터에 추가합니다.

5.3. DCN 데이터 플레인 구성

Red Hat Ceph Storage는 데이터 플레인 노드에서 사용할 수 있도록 스토리지 솔루션으로 구성해야 합니다.

사전 요구 사항

프로세스

  1. OpenStackDataPlaneNodeSet CR을 편집합니다.
  2. Compute 서비스(nova)에 cephx 키 및 구성 파일을 사용할 수 있도록 하려면 extraMounts 매개변수를 사용합니다.

    다음은 이를 위해 extraMounts 매개변수를 사용하는 예입니다.

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneNodeSet
    spec:
      ...
      nodeTemplate:
        extraMounts:
        - extraVolType: Ceph
          volumes:
          - name: ceph
            secret:
              secretName: ceph-conf-files
          mounts:
          - name: ceph
            mountPath: "/etc/ceph"
            readOnly: true
  3. ConfigMap 을 생성하여 Compute 서비스(nova)에 필요한 구성 세부 정보를 추가합니다. ceph-nova-az0.yaml 이라는 파일을 생성하고 다음과 유사한 내용을 추가합니다. 로컬 가용성 영역의 Image 서비스(glance) 끝점을 추가하고 cross_az_attach 매개변수를 false로 설정해야 합니다.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: ceph-nova-az0
      namespace: openstack
    data:
      03-ceph-nova.conf:
        [libvirt]
        images_type = rbd
        images_rbd_pool = vms
        images_rbd_ceph_conf = /etc/ceph/az0.conf
        images_rbd_glance_store_name = az0
        images_rbd_glance_copy_poll_interval = 15
        images_rbd_glance_copy_timeout = 600
        rbd_user = openstack
        rbd_secret_uuid = 9cfb3a03-3f91-516a-881e-a675f67c30ea
        hw_disk_discard = unmap
        volume_use_multipath = False
        [glance]
        endpoint_override = http://glance-az0-internal.openstack.svc:9292
        valid_interfaces = internal
        [cinder]
        cross_az_attach = False
        catalog_info = volumev3:cinderv3:internalURL
  4. ConfigMap 을 생성합니다.

    oc create -f ceph-nova-az0.yaml
  5. ConfigMap을 사용할 사용자 지정 Compute(nova) 서비스를 생성합니다. nova-custom-az0.yaml 이라는 파일을 생성하고 다음과 유사한 내용을 추가합니다. dataSources 필드에서 방금 생성한 ConfigMap 의 이름을 추가해야 합니다.

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneService
    metadata:
      name: nova-custom-ceph-az0
    spec:
      addCertMounts: false
      caCerts: combined-ca-bundle
      dataSources:
      - configMapRef:
          name: ceph-nova-az0
      - secretRef:
          name: nova-cell1-compute-config
      - secretRef:
          name: nova-migration-ssh-key
      edpmServiceType: nova
      playbook: osp.edpm.nova
      tlsCerts:
        default:
          contents:
          - dnsnames
          - ips
          edpmRoleServiceName: nova
          issuer: osp-rootca-issuer-internal
          networks:
          - ctlplane
  6. 사용자 정의 서비스를 생성합니다.

    oc create -f nova-custom-ceph-az0.yaml
    참고

    각 가용성 영역에 대해 고유한 ConfigMap 및 사용자 지정 Compute 서비스를 생성해야 합니다. 이전 단계에 표시된 대로 이러한 파일 이름의 끝에 가용성 영역을 추가합니다.

  7. CR에서 서비스 목록을 찾습니다.
  8. 서비스 목록을 편집하여 데이터 플레인 노드 네트워크 구성에서 제거된 모든 서비스를 복원합니다. 전체 서비스 목록을 복원하면 나머지 작업을 실행하여 HCI 환경 구성을 완료할 수 있습니다.

    다음은 굵은 추가 서비스가 포함된 전체 서비스 목록의 예입니다.

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneNodeSet
    spec:
      ...
      services:
        - bootstrap
        - configure-network
        - validate-network
        - install-os
        - ceph-hci-pre
        - configure-os
        - ssh-known-hosts
        - run-os
        - reboot-os
        - install-certs
        - ceph-client
        - ovn
        - neutron-metadata
        - libvirt
        - nova-custom-ceph-az0
    참고

    기본 서비스 목록을 복원하는 것 외에도 run-os 서비스 뒤에 ceph-client 서비스가 추가됩니다. ceph-client 서비스는 EDPM 노드를 Red Hat Ceph Storage 서버의 클라이언트로 구성합니다. 이 서비스는 클라이언트가 Red Hat Ceph Storage 서버에 연결하는 데 필요한 파일을 배포합니다. ceph-hci-pre 서비스는 HCI를 배포하는 경우에만 필요합니다.

  9. 선택 사항: 컴퓨팅 노드를 컴퓨팅 서비스(nova) 셀에 다른 환경에서와 동일하게 할당할 수 있습니다. OpenStackDataPlaneNodeSet CR의 nova 서비스를 사용자 정의 nova 서비스로 교체합니다.

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneNodeSet
    metadata:
      name: openstack-cell2
    spec:
      services:
        - download-cache
        - bootstrap
        - configure-network
        - validate-network
        - install-os
        - configure-os
        - ssh-known-hosts
        - run-os
        - ovn
        - libvirt
        - *nova-cell-custom*

    자세한 내용은 OpenStackDataPlaneNodeSetSR을 컴퓨팅 셀에 연결을 참조하십시오.

    참고

    셀을 사용하는 경우 neutron-metadata 서비스는 셀마다 고유하며 별도로 정의됩니다. 예를 들면 neutron-metadata-cell1 입니다.

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneService
    metadata:
     labels:
        app.kubernetes.io/instance: neutron-metadata-cell1
        app.kubernetes.io/name: openstackdataplaneservice
        app.kubernetes.io/part-of: openstack-operator
      name: neutron-metadata-cell1
      ...

    nova-custom-ceph 서비스는 각 가용성 영역마다 고유하며 별도로 정의됩니다. 예를 들면 nova-custom-ceph-az0 입니다.

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneService
    metadata:
      labels:
        app.kubernetes.io/instance: nova-custom-ceph-az0
        app.kubernetes.io/name: openstackdataplaneservice
        app.kubernetes.io/part-of: openstack-operator
      name: nova-custom-ceph-az0
      namespace: openstack
  10. 선택 사항: RHCS(Red Hat Ceph Storage)를 하이퍼컨버지드 솔루션으로 배포하는 경우 다음 단계를 완료합니다.

    1. ConfigMap 을 생성하여 reserved_host_memory_mb 매개변수를 구성에 적합한 값으로 설정합니다.

      다음은 이 목적에 사용되는 ConfigMap의 예입니다.

      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: reserved-memory-nova
      data:
        04-reserved-memory-nova.conf: |
          [DEFAULT]
          reserved_host_memory_mb=75000
      참고

      Compute 서비스 스케줄러가 동일한 서버의 Ceph OSD에 메모리를 제공하지 않도록 reserved_host_memory_mb 매개변수의 값을 설정할 수 있습니다. 이 예제에서는 하이퍼바이저의 기본 예약 메모리 외에 호스트당 OSD당 5GB를 예약합니다. IOPS에 최적화된 클러스터에서는 각 OSD에 더 많은 메모리를 예약하여 성능을 향상시킬 수 있습니다. 5GB 번호는 시작 지점으로 제공되며 필요한 경우 추가로 조정할 수 있습니다.

    2. OpenStackDataPlaneService/nova-custom-ceph-az 파일을 편집합니다. 이전에 생성한 ceph-nova-az0 이라는 OpenStackDataPlaneService CR의 configMaps 목록에 reserved-memory-nova 를 추가합니다.

      kind: OpenStackDataPlaneService
      <...>
      spec:
        configMaps:
        - ceph-nova
        - reserved-memory-nova
  11. CR 변경 사항을 적용합니다.

    $ oc apply -f <dataplane_cr_file>
    • & lt;dataplane_cr_file& gt;을 파일 이름으로 바꿉니다.

      참고

      Ansible은 OpenStackDataPlaneDeployment CRD가 생성될 때까지 네트워크를 구성하거나 검증하지 않습니다.

  12. OpenShift에 Red Hat OpenStack Services 배포 가이드에 설명된 대로 OpenStack DataPlaneDeployment CRD를 생성합니다. 이 가이드에는 OpenStackDataPlaneNodeSet CRD 파일이 정의되어 데이터 플레인 노드에서 서비스를 구성할 수 있습니다. https://docs.redhat.com/en/documentation/red_hat_openstack_services_on_openshift/18.0/html/deploying_red_hat_openstack_services_on_openshift/assembly_creating-the-data-plane

example-node-set-resource

5.4. 노드 세트 리소스 예

다음 예제에는 세 개의 노드가 있습니다. 스토리지 관리 네트워크 범위가 172.20.0.0/24 이고 vlan23 이라고 가정합니다.

apiVersion: dataplane.openstack.org/v1beta1
kind: OpenStackDataPlaneNodeSet
metadata:
  name: openstack-edpm
  namespace: openstack
spec:
  env:
  - name: ANSIBLE_FORCE_COLOR
    value: "True"
  networkAttachments:
  - ctlplane
  nodeTemplate:
    ansible:
      ansiblePort: 22
      ansibleUser: cloud-admin
      ansibleVars:
        edpm_ceph_hci_pre_enabled_services:
        - ceph_mon
        - ceph_mgr
        - ceph_osd
        edpm_fips_mode: check
        edpm_iscsid_image: {{ registry_url }}/openstack-iscsid:{{ image_tag }}
        edpm_logrotate_crond_image: {{ registry_url }}/openstack-cron:{{ image_tag }}
        edpm_network_config_hide_sensitive_logs: false
        edpm_network_config_os_net_config_mappings:
          edpm-compute-0:
            nic1: 52:54:00:1e:af:6b
            nic2: 52:54:00:d9:cb:f4
          edpm-compute-1:
            nic1: 52:54:00:f2:bc:af
            nic2: 52:54:00:f1:c7:dd
          edpm-compute-2:
            nic1: 52:54:00:dd:33:14
            nic2: 52:54:00:50:fb:c3
        edpm_network_config_template: |
          ---
          {% set mtu_list = [ctlplane_mtu] %}
          {% for network in nodeset_networks %}
          {{ mtu_list.append(lookup(vars, networks_lower[network] ~ _mtu)) }}
          {%- endfor %}
          {% set min_viable_mtu = mtu_list | max %}
          network_config:
          - type: ovs_bridge
            name: {{ neutron_physical_bridge_name }}
            mtu: {{ min_viable_mtu }}
            use_dhcp: false
            dns_servers: {{ ctlplane_dns_nameservers }}
            domain: {{ dns_search_domains }}
            addresses:
            - ip_netmask: {{ ctlplane_ip }}/{{ ctlplane_cidr }}
            routes: {{ ctlplane_host_routes }}
            members:
            - type: interface
              name: nic2
              mtu: {{ min_viable_mtu }}
              # force the MAC address of the bridge to this interface
              primary: true
          {% for network in nodeset_networks %}
            - type: vlan
              mtu: {{ lookup(vars, networks_lower[network] ~ _mtu) }}
              vlan_id: {{ lookup(vars, networks_lower[network] ~ _vlan_id) }}
              addresses:
              - ip_netmask:
                  {{ lookup(vars, networks_lower[network] ~ _ip) }}/{{ lookup(vars, networks_lower[network] ~ _cidr) }}
              routes: {{ lookup(vars, networks_lower[network] ~ _host_routes) }}
          {% endfor %}
        edpm_neutron_metadata_agent_image: {{ registry_url }}/openstack-neutron-metadata-agent-ovn:{{ image_tag }}
        edpm_nodes_validation_validate_controllers_icmp: false
        edpm_nodes_validation_validate_gateway_icmp: false
        edpm_selinux_mode: enforcing
        edpm_sshd_allowed_ranges:
        - 192.168.111.0/24
        - 192.168.122.0/24
        - 192.168.133.0/24
        - 192.168.144.0/24
        edpm_sshd_configure_firewall: true
        enable_debug: false
        gather_facts: false
        image_tag: current-podified
        neutron_physical_bridge_name: br-ex
        neutron_public_interface_name: eth0
        service_net_map:
          nova_api_network: internalapi
          nova_libvirt_network: internalapi
        storage_mgmt_cidr: "24"
        storage_mgmt_host_routes: []
        storage_mgmt_mtu: 9000
        storage_mgmt_vlan_id: 23
        storage_mtu: 9000
        timesync_ntp_servers:
        - hostname: pool.ntp.org
    ansibleSSHPrivateKeySecret: dataplane-ansible-ssh-private-key-secret
    managementNetwork: ctlplane
    networks:
    - defaultRoute: true
      name: ctlplane
      subnetName: subnet1
    - name: internalapi
      subnetName: subnet1
    - name: storage
      subnetName: subnet1
    - name: tenant
      subnetName: subnet1
    - name: external
      subnetName: external1
  nodes:
    edpm-compute-0:
      ansible:
        host: 192.168.122.100
      hostName: compute-0
      networks:
      - defaultRoute: true
        fixedIP: 192.168.122.100
        name: ctlplane
        subnetName: subnet1
      - name: internalapi
        subnetName: subnet1
      - name: storage
        subnetName: subnet1
      - name: storagemgmt
        subnetName: subnet1
      - name: tenant
        subnetName: subnet1
      - name: external
        subnetName: external1
    edpm-compute-1:
      ansible:
        host: 192.168.122.101
      hostName: compute-1
      networks:
      - defaultRoute: true
        fixedIP: 192.168.122.101
        name: ctlplane
        subnetName: subnet1
      - name: internalapi
        subnetName: subnet1
      - name: storage
        subnetName: subnet1
      - name: storagemgmt
        subnetName: subnet1
      - name: tenant
        subnetName: subnet1
      - name: external
        subnetName: external1
    edpm-compute-2:
      ansible:
        host: 192.168.122.102
      hostName: compute-2
      networks:
      - defaultRoute: true
        fixedIP: 192.168.122.102
        name: ctlplane
        subnetName: subnet1
      - name: internalapi
        subnetName: subnet1
      - name: storage
        subnetName: subnet1
      - name: storagemgmt
        subnetName: subnet1
      - name: tenant
        subnetName: subnet1
      - name: external
        subnetName: external1
  preProvisioned: true
  services:
  - bootstrap
  - configure-network
  - validate-network
  - install-os
  - ceph-hci-pre
  - configure-os
  - ssh-known-hosts
  - run-os
  - reboot-os
참고

네트워크 연결 키에 스토리지 관리 네트워크를 추가할 필요가 없습니다.

5.5. 컨트롤 플레인 업데이트

중앙 위치에 데이터 플레인을 배포한 후 컨트롤 플레인을 업데이트해야 합니다.

사전 요구 사항

  • OpenShift에서 Red Hat OpenStack 서비스를 사용하여 중앙 위치에 설정된 노드를 배포했습니다.
  • RHCS(Red Hat Ceph Storage)를 배포했습니다.

프로세스

  1. 선택 사항: openstack_control_plane.yaml 파일에서 블록 스토리지 백업 서비스를 구성합니다.

          cinderBackup:
            customServiceConfig: |
              [DEFAULT]
              backup_driver = cinder.backup.drivers.ceph.CephBackupDriver
              backup_ceph_pool = backups
              backup_ceph_user = openstack

    블록 스토리지 백업 서비스 구성에 대한 자세한 내용은 Block Storage 백업 서비스 구성을 참조하십시오.

  2. openstack_control_plane.yaml 파일에서 Block Storage cinder 볼륨 서비스를 업데이트합니다.

          cinderVolumes:
            az0:
              customServiceConfig: |
                [DEFAULT]
                enabled_backends = ceph
                glance_api_servers = https://glance-az0-internal.openstack.svc:9292
                [ceph]
                volume_backend_name = ceph
                volume_driver = cinder.volume.drivers.rbd.RBDDriver
                rbd_ceph_conf = /etc/ceph/az0.conf
                rbd_user = openstack
                rbd_pool = volumes
                rbd_flatten_volume_from_snapshot = False
                rbd_secret_uuid = 795dcbca-e715-5ac3-9b7e-a3f5c64eb89f
                rbd_cluster_name = az0
                backend_availability_zone = az0

    블록 스토리지 볼륨 서비스 구성에 대한 자세한 내용은 볼륨 서비스 구성을 참조하십시오.

  3. openstack_control_plane.yaml 파일에 extraMounts 필드를 추가하여 Red Hat Ceph Storage 보안에 액세스해야 하는 서비스를 정의합니다.

      extraMounts:
      - extraVol:
        - extraVolType: Ceph
          mounts:
          - mountPath: /etc/ceph
            name: ceph
            readOnly: true
          propagation:
          - az0
          - CinderBackup
          volumes:
          - name: ceph
            projected:
              sources:
              - secret:
                  name: ceph-conf-az-0
  4. openstack_control_plane.yaml 파일에서 Image 서비스(glance)를 업데이트하여 Block Storage 서비스를 백엔드로 구성합니다.

          glanceAPIs:
            az0:
              customServiceConfig: |
                [DEFAULT]
                enabled_import_methods = [web-download,copy-image,glance-direct]
                enabled_backends = az0:rbd
                [glance_store]
                default_backend = az0
                [az0]
                rbd_store_ceph_conf = /etc/ceph/az0.conf
                store_description = "az0 RBD backend"
                rbd_store_pool = images
                rbd_store_user = openstack
                rbd_thin_provisioning = True
  5. OpenStackControlPlane CR에 대한 변경 사항을 적용합니다.

    oc apply -f openstack_control_plane.yaml
  6. 호스트 집계에 AZ를 추가합니다. 이를 통해 OpenStack 관리자는 이미지 메타데이터를 기반으로 지리적 위치에 워크로드를 예약할 수 있습니다.

    1. openstackclient pod의 터미널을 엽니다.

      # oc rsh openstackclient
    2. 새 OpenStack 집계를 생성합니다.

      $ openstack aggregate create <aggregate_name>
    3. OpenStack 집계에 AZ 이름으로 레이블을 지정합니다.

      $ openstack aggregate set --zone <availability_zone> <aggregate_name>
    4. AZ의 각 호스트를 집계에 추가합니다.

      $ openstack aggregate add host <aggregate_name> <compute_node_1>
      $ openstack aggregate add host <aggregate_name> <compute_node_2>
      ...

5.6. DCN 에지 위치 배포 후 컨트롤 플레인 업데이트

OpenStackDataPlaneNodeSet CR(사용자 정의 리소스)을 사용하여 추가 노드 세트를 생성할 수 있습니다. 배포 중인 사이트와 관련된 고유한 가용성 영역과 VLAN, NIC 매핑 및 IP 주소를 사용합니다. OpenStackDataPlaneNodeSet 배포에 대한 자세한 내용은 데이터 플레인 생성을 참조하십시오.

스토리지를 사용하여 DCN 노드 세트를 배포할 때 중앙 위치에서 OpenStackControlPlane CR의 두 필드를 업데이트해야 합니다.

  • cinderVolumes
  • glanceAPIs
  • Neutron
  • OVN
참고

셀을 사용하는 경우 새 DCN 사이트에 대한 셀도 구성해야 합니다.

사전 요구 사항

  • 중앙 위치를 배포했습니다.
  • 추가 OpenStackDataPlane 노드 세트를 배포했습니다.

프로세스

  1. neutron 서비스 구성에서 customServiceConfig 필드를 업데이트하여 새 가용성 영역 및 네트워크 리프를 추가합니다.

            customServiceConfig: |
        	[DEFAULT]
        	router_scheduler_driver = neutron.scheduler.l3_agent_scheduler.AZLeastRoutersScheduler
        	network_scheduler_driver =  neutron.scheduler.dhcp_agent_scheduler.AZAwareWeightScheduler
        	default_availability_zones = az0,az1
        	[ml2_type_vlan]
        	network_vlan_ranges = datacentre:1:1000,leaf1:1:1000
        	[neutron]
        	physnets = datacentre,leaf
  2. OVN 서비스 구성에서 가용성 영역을 업데이트합니다.

          ovnController:
            external-ids:
              availability-zones:
              - az0
              - az1
              enable-chassis-as-gateway
              ovn-bridge: br-int
              onv-enap-type: geneve
              system-id: random
            networkAttachment: tenant
            nicMappings:
              datacentre: ospbr
  3. OpenStackControlPlane CR에서 cinderVolumes 필드를 업데이트하여 원격 위치의 가용성 영역 정의를 추가합니다. 각 가용성 영역의 각 cinder 볼륨 서비스는 가용성 영역에 Glance API 서버를 사용합니다. For example, glance_api_servers = https://glance-az1-internal.openstack.svc:9292:

          cinderVolumes:
            az0:
              customServiceConfig: |
                [DEFAULT]
                ....
            az1:
              customServiceConfig: |
                [DEFAULT]
                enabled_backends = ceph
                glance_api_servers = https://glance-az1-internal.openstack.svc:9292
                [ceph]
                volume_backend_name = az1
                volume_driver = cinder.volume.drivers.rbd.RBDDriver
                rbd_ceph_conf = /etc/ceph/az1.conf
                rbd_user = openstack
                rbd_pool = volumes
                rbd_flatten_volume_from_snapshot = False
                rbd_secret_uuid = 19ccdd60-79a0-5f0f-aece-ece700e514f8
                rbd_cluster_name = az1
                backend_availability_zone = az1
  4. Image 서비스(glance) Pod를 ID 서비스(keystone) 카탈로그에 등록합니다.

    DCN에서 이미지 서비스 Pod는 각 노드 세트에 대해 배포됩니다. 단일 이미지 서비스 포드는 언제든지 ID 서비스(keystone) 카탈로그에 등록됩니다. 이러한 이유로 최상위 Glance CR에서 keystoneEndpoint 매개변수가 정의되고 노출됩니다. 단일 인스턴스가 배포되지 않는 한 기본 OpenStackControlPlane CR을 적용하기 전에 operator를 선택할 수 있으며 keystone에 등록해야 하는 인스턴스를 적용할 수 있습니다. 기본 끝점은 az0 glance API이므로 keystoneEndpoint는 az0으로 설정됩니다.

    spec:
       <...>
       glance:
          enabled: true
          keystoneEndpoint: az0
            glanceAPIs:
              az0:
                apiTimeout: 60
  5. glanceAPIs 필드를 업데이트합니다.

    az0 에서 노드 세트의 경우 glanceAPIs 필드는 중앙 위치에 대한 이미지 서비스 Pod를 구성합니다. AZ1에 설정된 추가 노드를 추가하면 glanceAPIs 필드에 AZ0 및 AZ1에 대한 Image 서비스(glance) Pod 정의가 포함되도록 OpenStackControlPlane CR이 업데이트됩니다. 또한 AZ1의 이미지 서비스 Pod는 중앙 위치에 대한 ceph 백엔드를 정의하고 중앙 위치에 대한 AZ0 이미지 서비스 Pod가 AZ1의 ceph 백엔드 정의를 갖도록 업데이트됩니다.

          glanceAPIs:
            az1:
              customServiceConfig: |
                [DEFAULT]
                enabled_import_methods = [web-download,copy-image,glance-direct]
                enabled_backends = az0:rbd,az1:rbd
                [glance_store]
                default_backend = az1
                [az1]
                rbd_store_ceph_conf = /etc/ceph/az1.conf
                store_description = "az1 RBD backend"
                rbd_store_pool = images
                rbd_store_user = openstack
                rbd_thin_provisioning = True
                [az0]
                rbd_store_ceph_conf = /etc/ceph/az0.conf
                store_description = "az0 RBD backend"
                rbd_store_pool = images
                rbd_store_user = openstack
                rbd_thin_provisioning = True
              networkAttachments:
              - storage
              override:
                service:
                  internal:
                    metadata:
                      annotations:
                        metallb.universe.tf/address-pool: internalapi
                        metallb.universe.tf/allow-shared-ip: internalapi
                        metallb.universe.tf/loadBalancerIPs: 172.17.0.81
                    spec:
                      type: LoadBalancer
              replicas: 2
              type: edge
            az0:
              customServiceConfig: |
                [DEFAULT]
                enabled_import_methods = [web-download,copy-image,glance-direct]
                enabled_backends = az0:rbd,az1:rbd
                [glance_store]
                default_backend = az0
                [az0]
                rbd_store_ceph_conf = /etc/ceph/az0.conf
                store_description = "az0 RBD backend"
                rbd_store_pool = images
                rbd_store_user = openstack
                rbd_thin_provisioning = True
                [az1]
                rbd_store_ceph_conf = /etc/ceph/az1.conf
                store_description = "az1 RBD backend"
                rbd_store_pool = images
                rbd_store_user = openstack
                rbd_thin_provisioning = True
              networkAttachments:
              - storage
              override:
                service:
                  internal:
                    metadata:
                      annotations:
                        metallb.universe.tf/address-pool: internalapi
                        metallb.universe.tf/allow-shared-ip: internalapi
                        metallb.universe.tf/loadBalancerIPs: 172.17.0.80
                    spec:
                      type: LoadBalancer
              replicas: 3
              type: split
    참고

    가용성 영역 az0분할 유형이며 다른 모든 가용성 영역은 에지 유형입니다.

    분할 유형은 이미지를 업로드할 때 클라우드 사용자가 사용할 수 있는 것입니다. Cinder 또는 Nova가 Glance와 상호 작용할 때 로컬인 Glance를 구성할 수 있도록 에지 유형이 생성됩니다. Glance Pod에 기본 분할 Glance Pod 및 2개의 복제본에 대해 복제본을 3개 이상 사용하고 워크로드에 비례하여 복제본을 늘립니다.

  6. 선택 사항: 셀 구성을 업데이트합니다.

    기본적으로 모든 가용성 영역(AZ)의 컴퓨팅 노드는 cell1 이라는 공통 셀에 배치됩니다. 컴퓨팅 노드를 별도의 셀로 분할하여 대규모 배포의 성능을 향상시킬 수 있습니다. DCN 배포의 경우 각 가용성 영역을 자체 셀에 배치합니다. 자세한 내용은 컨트롤 플레인에 컴퓨팅 셀 추가를 참조하십시오.

  7. OpenStackControlPlane CR에 대한 변경 사항을 적용합니다.

    oc apply -f openstack_control_plane.yaml
  8. 추가된 각 추가 에지 사이트에 대해 컨트롤 플레인을 계속 업데이트합니다. 필요에 따라 RHCS(Red Hat Storage Service)를 OpenShift 시크릿에 추가합니다.

    1. neutron 서비스 구성에서 customServiceConfig 필드를 업데이트하여 새 가용성 영역 및 네트워크 리프를 추가합니다.

              customServiceConfig: |
          	[DEFAULT]
          	router_scheduler_driver = neutron.scheduler.l3_agent_scheduler.AZLeastRoutersScheduler
          	network_scheduler_driver =  neutron.scheduler.dhcp_agent_scheduler.AZAwareWeightScheduler
          	default_availability_zones = az0,az1,az2
          	[ml2_type_vlan]
          	network_vlan_ranges = datacentre:1:1000,leaf1:1:1000,leaf2:1:1000
          	[neutron]
          	physnets = datacentre,leaf1,leaf2
    2. OVN 서비스 구성에서 가용성 영역을 업데이트합니다.

            ovnController:
              external-ids:
                availability-zones:
                - az0
                - az1
                - az2
                enable-chassis-as-gateway
                ovn-bridge: br-int
                onv-enap-type: geneve
                system-id: random
              networkAttachment: tenant
              nicMappings:
                datacentre: ospbr
    3. cinderVolumes 서비스 필드에 추가 가용성 영역을 추가합니다.

           cinderVolumes:
              az0:
                customServiceConfig: |
                  [DEFAULT]
                  ...
              az1:
                customServiceConfig: |
                  [DEFAULT]
                  ...
              az2:
                customServiceConfig: |
                  [DEFAULT]
                  enabled_backends = ceph
                  glance_api_servers = https://glance-az2-internal.openstack.svc:9292
                  [ceph]
                  volume_backend_name = ceph
                  volume_driver = cinder.volume.drivers.rbd.RBDDriver
                  rbd_ceph_conf = /etc/ceph/az2.conf
                  rbd_user = openstack
                  rbd_pool = volumes
                  rbd_flatten_volume_from_snapshot = False
                  rbd_secret_uuid = 5c0c7a8e-55b1-5fa8-bc5c-9756b7862d2f
                  rbd_cluster_name = az2
                  backend_availability_zone = az2
    4. glanceAPIs 필드에 추가 가용성 영역을 추가합니다.

      AZ를 추가할 때 각 이미지 서비스 포드 정의에 중앙 위치(AZ0)의 스토리지 구성과 자체 로컬 ceph 구성이 포함되어 있는지 확인해야 합니다. 또한 중앙 위치에 다른 모든 사이트의 스토리지 정의가 있는지 확인해야 합니다. 이렇게 하면 중앙 위치 이미지 서비스 Pod와 지리적으로 분산된 노드 세트를 위한 이미지 서비스 Pod 간의 허브 및 대화 상대 관계가 생성됩니다.

            glanceAPIs:
              az0:
                customServiceConfig: |
                  [DEFAULT]
                  enabled_import_methods = [web-download,copy-image,glance-direct]
                  enabled_backends = az0:rbd,az1:rbd,az2:rbd
                  [glance_store]
                  default_backend = az0
                  [az0]
                  rbd_store_ceph_conf = /etc/ceph/az0.conf
                  store_description = "az0 RBD backend"
                  rbd_store_pool = images
                  rbd_store_user = openstack
                  rbd_thin_provisioning = True
                  [az1]
                  rbd_store_ceph_conf = /etc/ceph/az1.conf
                  store_description = "az1 RBD backend"
                  rbd_store_pool = images
                  rbd_store_user = openstack
                  rbd_thin_provisioning = True
                  [az2]
                  rbd_store_ceph_conf = /etc/ceph/az2.conf
                  store_description = "az2 RBD backend"
                  rbd_store_pool = images
                  rbd_store_user = openstack
                  rbd_thin_provisioning = True
                networkAttachments:
                - storage
                override:
                  service:
                    internal:
                      metadata:
                        annotations:
                          metallb.universe.tf/address-pool: internalapi
                          metallb.universe.tf/allow-shared-ip: internalapi
                          metallb.universe.tf/loadBalancerIPs: 172.17.0.80
                      spec:
                        type: LoadBalancer
                replicas: 3
                type: split
              az1:
                customServiceConfig: |
                  [DEFAULT]
                  enabled_import_methods = [web-download,copy-image,glance-direct]
                  enabled_backends = az0:rbd,az1:rbd
                  [glance_store]
                  default_backend = az1
                  [az1]
                  rbd_store_ceph_conf = /etc/ceph/az1.conf
                  store_description = "az1 RBD backend"
                  rbd_store_pool = images
                  rbd_store_user = openstack
                  rbd_thin_provisioning = True
                  [az0]
                  rbd_store_ceph_conf = /etc/ceph/az0.conf
                  store_description = "az0 RBD backend"
                  rbd_store_pool = images
                  rbd_store_user = openstack
                  rbd_thin_provisioning = True
                networkAttachments:
                - storage
                override:
                  service:
                    internal:
                      metadata:
                        annotations:
                          metallb.universe.tf/address-pool: internalapi
                          metallb.universe.tf/allow-shared-ip: internalapi
                          metallb.universe.tf/loadBalancerIPs: 172.17.0.81
                      spec:
                        type: LoadBalancer
                replicas: 2
                type: edge
              az2:
                customServiceConfig: |
                  [DEFAULT]
                  enabled_import_methods = [web-download,copy-image,glance-direct]
                  enabled_backends = az0:rbd,az2:rbd
                  [glance_store]
                  default_backend = az2
                  [az2]
                  rbd_store_ceph_conf = /etc/ceph/az2.conf
                  store_description = "az2 RBD backend"
                  rbd_store_pool = images
                  rbd_store_user = openstack
                  rbd_thin_provisioning = True
                  [az0]
                  rbd_store_ceph_conf = /etc/ceph/az0.conf
                  store_description = "az0 RBD backend"
                  rbd_store_pool = images
                  rbd_store_user = openstack
                  rbd_thin_provisioning = True
                networkAttachments:
                - storage
                override:
                  service:
                    internal:
                      metadata:
                        annotations:
                          metallb.universe.tf/address-pool: internalapi
                          metallb.universe.tf/allow-shared-ip: internalapi
                          metallb.universe.tf/loadBalancerIPs: 172.17.0.82
                      spec:
                        type: LoadBalancer
                replicas: 2
                type: edge
  9. OpenStackControlPlane CR에 대한 변경 사항을 적용합니다.

    oc apply -f openstack_control_plane.yaml
  10. 호스트 집계에 AZ를 추가합니다. 이를 통해 OpenStack 관리자는 --availabliity-zone 인수를 전달하여 지리적 위치에 워크로드를 예약할 수 있습니다.

    1. openstackclient pod의 터미널을 엽니다.

      # oc rsh openstackclient
    2. 새 OpenStack 집계를 생성합니다.

      $ openstack aggregate create <aggregate_name>
    3. OpenStack 집계에 AZ 이름으로 레이블을 지정합니다.

      $ openstack aggregate set --zone <availability_zone> <aggregate_name>
    4. AZ의 각 호스트를 집계에 추가합니다.

      $ openstack aggregate add host <aggregate_name> <compute_node_1>
      $ openstack aggregate add host <aggregate_name> <compute_node_2>
      ...

5.7. DCN 사이트에서 노드 세트에 노드 추가

기존 OpenStackDataPlaneNodeSet CR(사용자 정의 리소스)의 nodes 섹션에 새 노드를 추가하여 사이트의 데이터 플레인을 확장할 수 있습니다.

사전 요구 사항

프로세스

  1. 업데이트할 노드 세트의 OpenStackDataPlaneNodeSet 매니페스트 파일을 엽니다(예: openstack_data_plane.yaml ).
  2. 노드 세트에 새 노드를 추가합니다.

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneNodeSet
    metadata:
      name: openstack-node-set
    spec:
      preProvisioned: True
      nodes:
      ...
        edpm-compute-3:
          hostName: edpm-compute-3
          ansible:
            ansibleHost: 192.168.122.103
          networks:
          - name: CtlPlane
            subnetName: subnet1
            defaultRoute: true
            fixedIP: 192.168.122.103
          - name: InternalApi
            subnetName: subnet1
          - name: Storage
            subnetName: subnet1
          - name: Tenant
            subnetName: subnet1
      ...
  3. OpenStackDataPlaneNodeSet 매니페스트 파일에서 edpm_network_config_os_net_config_mappings 를 편집하여 새 호스트의 mac 주소를 추가합니다.

           ...
           edpm_network_config_os_net_config_mappings:
              edpm-compute-0:
                nic1: 52:54:00:1e:af:6b
                nic2: 52:54:00:d9:cb:f4
              edpm-compute-1:
                nic1: 52:54:00:f2:bc:af
                nic2: 52:54:00:f1:c7:dd
              edpm-compute-2:
                nic1: 52:54:00:dd:33:14
                nic2: 52:54:00:50:fb:c3
              edpm-compute-3:
                nic1: 52:54:12:8b:be:9a
                nic2: 52:54:12:8b:be:9b
  4. (선택 사항) HCI를 사용하여 데이터 플레인 배포에 노드를 추가하는 경우 다음을 완료해야 합니다.

    1. Compute 서비스(nova)의 cephx 키 및 구성 파일을 정의하려면 extraMounts 매개변수가 있어야 합니다. OpenStackDataPlaneNodeSet 매니페스트 파일에 extraMounts 구성이 있는지 확인합니다.

      apiVersion: dataplane.openstack.org/v1beta1
      kind: OpenStackDataPlaneNodeSet
      spec:
        ...
        nodeTemplate:
          extraMounts:
          - extraVolType: Ceph
            volumes:
            - name: ceph
              secret:
                secretName: ceph-conf-files
            mounts:
            - name: ceph
              mountPath: "/etc/ceph"
              readOnly: true
    2. 노드에 적용할 추가 서비스를 지정합니다.

      apiVersion: dataplane.openstack.org/v1beta1
      kind: OpenStackDataPlaneNodeSet
      spec:
        ...
        services:
          - bootstrap
          - configure-network
          - validate-network
          - install-os
          - ceph-hci-pre
          - configure-os
          - ssh-known-hosts
          - run-os
          - reboot-os
          - install-certs
          - ceph-client
          - ovn
          - neutron-metadata
          - libvirt
          - nova-custom-ceph-az0
      참고

      DCN 데이터 플레인을 구성할 때 nova-custom-ceph-az0 서비스가 생성되며 이 단계 중에 있어야 합니다. 자세한 내용은 DCN 데이터 플레인 구성을 참조하십시오.

  5. OpenStackDataPlaneNodeSet 매니페스트 파일을 저장합니다.
  6. 업데이트된 OpenStackDataPlaneNodeSet CR 구성을 적용합니다.

    $ oc apply -f <data-plane-custom-resource-file>
    • & lt;data-plane-custom-resource-file >을 편집한 매니페스트 파일의 이름으로 바꿉니다.
  7. 상태가 SetupReady:인지 확인하여 데이터 플레인 리소스가 업데이트되었는지 확인합니다.

    $ oc wait openstackdataplanenodeset <node-set-name> --for condition=SetupReady --timeout=10m
    • & lt;node-set-name >을 노드를 추가하는 OpenStackDataPlaneNodeSet CR의 이름으로 바꿉니다.

    상태가 SetupReady 이면 명령에서 condition met 메시지를 반환하고, 그렇지 않으면 시간 초과 오류가 반환됩니다. 데이터 플레인 조건 및 상태에 대한 자세한 내용은 OpenShift에 Red Hat OpenStack Services 배포데이터 플레인 조건 및 상태를 참조하십시오.

  8. 워크스테이션에 파일을 생성하여 OpenStackDataPlaneDeployment CR을 정의합니다.

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneDeployment
    metadata:
      name: <node_set_scaling_deployment_name>
    • & lt;node_set_scaling_deployment_name >을 OpenStackDataPlaneDeployment CR 이름으로 바꿉니다. 이름은 고유해야 하며 이전에 생성한 OpenStackDataPlaneDeployment 과 일치할 수 없습니다. 선택한 이름은 소문자 영숫자( - (하이프린) 또는 . (period)로 구성되어야 하며 영숫자 문자로 시작하고 끝나야 합니다.
    작은 정보

    수정된 노드 세트의 목적을 나타내는 정의 파일과 OpenStackDataPlaneDeployment CR에 고유하고 설명이 포함된 이름을 지정합니다.

  9. 수정한 OpenStackDataPlaneNodeSet CR을 추가합니다.

    spec:
      nodeSets:
        - <nodeSet_name>
  10. OpenStackDataPlaneDeployment CR 배포 파일을 저장합니다.
  11. 수정된 OpenStackDataPlaneNodeSet CR을 배포합니다.

    $ oc create -f openstack_data_plane_deploy.yaml -n openstack

    배포가 실행되는 동안 Ansible 로그를 볼 수 있습니다.

    $ oc get pod -l app=openstackansibleee -w
    $ oc logs -l app=openstackansibleee -f --max-log-requests 10

    oc logs 명령에서 다음 오류와 유사한 오류를 반환하는 경우 --max-log-requests 값을 늘립니다.

    error: you are attempting to follow 19 log streams, but maximum allowed concurrency is 10, use --max-log-requests to increase the limit
  12. 수정된 OpenStackDataPlaneNodeSet CR이 배포되었는지 확인합니다.

    $ oc get openstackdataplanedeployment -n openstack
    NAME                  NODESETS                  STATUS  MESSAGE
    openstack-data-plane  ["openstack-data-plane"]  True    Setup Complete
    
    $ oc get openstackdataplanenodeset -n openstack
    NAME                  STATUS  MESSAGE
    openstack-data-plane  True    NodeSet Ready

    반환된 상태의 의미에 대한 자세한 내용은 OpenShift에 Red Hat OpenStack Services 배포데이터 플레인 조건 및 상태를 참조하십시오.

    상태가 데이터 플레인이 배포되지 않았음을 나타내는 경우 배포 문제를 해결합니다. 문제 해결에 대한 자세한 내용은 OpenShift에 Red Hat OpenStack Services 배포를 참조하십시오.

  13. (선택 사항): HCI를 사용하여 데이터 플레인 배포에 노드를 추가하는 경우 노드를 Ceph OSD 노드로 구성하고 배치된 Red Hat Ceph Storage 클러스터를 사용하도록 구성해야 합니다. 자세한 내용은 다음 리소스를 참조하십시오.

  14. 새 노드가 컴퓨팅 노드인 경우 온라인 상태로 전환해야 합니다.

    1. 컴퓨팅 노드를 연결된 컴퓨팅 셀에 매핑합니다.

      $ oc rsh nova-cell0-conductor-0 nova-manage cell_v2 discover_hosts --verbose

      추가 셀을 생성하지 않은 경우 이 명령은 컴퓨팅 노드를 cell1 에 매핑합니다.

    2. openstackclient Pod의 원격 쉘에 액세스하고 배포된 컴퓨팅 노드가 컨트롤 플레인에 표시되는지 확인합니다.

      $ oc rsh -n openstack openstackclient
      $ openstack hypervisor list
      참고

      백엔드에서 Ceph Orchestrator를 사용하여 기존 Red Hat Ceph Storage 클러스터에 호스트를 추가합니다. 자세한 내용은 [Ceph Orchestrator를 사용하여 호스트 추가]를 참조하십시오.

  15. 노드 세트 또는 해당 위치에 해당하는 가용성 영역(AZ)에 새 호스트를 추가합니다.

    1. openstackclient pod의 터미널을 엽니다.

      $ oc rsh openstackclient
    2. AZ 집계에 호스트를 추가합니다.

      $ openstack aggregate add host <availability_zone> <compute_node_3>
      • & lt;availability_zone >을 새 호스트가 있는 AZ 이름으로 바꿉니다.
      • & lt;compute_node_3 >를 노드 세트에 추가하는 호스트 이름으로 바꿉니다.

6장. RHOSO DCN 배포에서 DCN 사이트 제거

DCN 구성에서 사용되지 않는 에지 위치 및 가용성 영역을 제거할 수 있습니다.

6.1. RHOSO DCM 배포에서 에지 사이트 해제

배포된 노드 세트에서 하드웨어를 회수하는 데 더 이상 필요하지 않은 에지 사이트입니다.

사전 요구 사항

  • DCN 사이트의 모든 데이터 및 워크로드는 마이그레이션됩니다.

    중요

    이 절차를 완료한 후 저장되지 않은 데이터와 마이그레이션되지 않은 워크로드가 손실됩니다.

절차

  1. 제거하려는 DCN 사이트의 호스트 집계를 삭제합니다(예: "az2).

    1. 워크스테이션에서 OpenStackClient Pod의 원격 쉘에 액세스합니다.

      $ oc rsh -n openstack openstackclient
    2. 선택 사항: 호스트 집계에 할당된 컴퓨팅 노드를 확인합니다.

      # openstack aggregate show <aggregate_name>
    3. 호스트 집계에서 할당된 컴퓨팅 노드를 제거하려면 각 컴퓨팅 노드에 대해 다음 명령을 입력합니다.

      # openstack aggregate remove host <aggregate_name> \
      <host_name>
      • & lt;aggregate_name >을 제거할 DCN 사이트에 해당하는 집계로 바꿉니다(예: "az2").
      • & lt;host_name >을 제거 중인 집계의 각 호스트로 바꿉니다.
    4. 집계를 제거합니다.

      openstack aggregate delete <aggregate_name>
      • & lt;aggregate_name >을 제거할 DCN 사이트에 해당하는 집계로 바꿉니다(예: "az2").
    5. openstackclient Pod를 종료합니다.

      $ exit
  2. 선택 사항: 셀을 제거합니다.

    1. 워크스테이션에서 OpenStackControlPlane CR 파일 openstack_control_plane.yaml을 엽니다.
    2. cellTemplates 에서 셀 정의를 제거합니다.

            cellTemplates:
              cell0:
                hasAPIAccess: true..
                cellDatabaseAccount: nova-cell0
                cellDatabaseInstance: openstack
                cellMessageBusInstance: rabbitmq
              cell1:
                hasAPIAccess: true
                cellDatabaseAccount: nova-cell1
                cellDatabaseInstance: openstack-cell1
                cellMessageBusInstance: rabbitmq-cell1
              cell2:
                hasAPIAccess: true
                cellDatabaseAccount: nova-cell2
                cellDatabaseInstance: openstack-cell2
                cellMessageBusInstance: rabbitmq-cell2
      -       cell3:
      -         hasAPIAccess: true
      -         cellDatabaseAccount: nova-cell3
      -         cellDatabaseInstance: openstack-cell3
      -         cellMessageBusInstance: rabbitmq-cell3
    3. OpenStackControlPlane CR에서 셀별 RabbitMQ 정의를 삭제합니다.

      spec:
      ...
        rabbitmq:
          templates:
            ...
            rabbitmq-<cellname>:
              ...
    4. 'OpenStackControlPlane CR 파일에서 셀별 Galera 정의를 삭제합니다.

      spec:
      ...
        galera:
          templates:
            ...
            openstack-<cellname>:
              ...
    5. 컨트롤 플레인을 업데이트합니다.

      $ oc apply -f openstack_control_plane.yaml -n openstack
  3. DCN 사이트의 Block Storage(cinder) Pod를 제거합니다.

    1. 볼륨 목록을 가져옵니다.

      $ openstack volume service list

      +------------------+--------------------------+------+---------+-------+----------------------------+
      | Binary           | Host                     | Zone | Status  | State | Updated At                 |
      +------------------+--------------------------+------+---------+-------+----------------------------+
      | cinder-scheduler | cinder-e479e-scheduler-0 | nova | enabled | down  | 2024-11-10T16:29:40.000000 |
      | cinder-scheduler | cinder-scheduler-0       | nova | enabled | up    | 2024-11-12T19:11:08.000000 |
      | cinder-volume    | cinder-volume-az0-0@ceph | az0  | enabled | up    | 2024-11-12T19:11:09.000000 |
      | cinder-backup    | cinder-backup-0          | nova | enabled | up    | 2024-11-12T19:11:08.000000 |
      | cinder-backup    | cinder-backup-1          | nova | enabled | up    | 2024-11-12T19:11:13.000000 |
      | cinder-backup    | cinder-backup-2          | nova | enabled | up    | 2024-11-12T19:11:16.000000 |
      | cinder-volume    | cinder-volume-az1-0@ceph | az1  | enabled | up    | 2024-11-12T19:11:15.000000 |
      | cinder-volume    | cinder-volume-az2-0@ceph | az2  | enabled | up    | 2024-11-12T17:28:28.000000 |
      +------------------+--------------------------+------+---------+-------+----------------------------+
    2. 제거 중인 가용성 영역(AZ)의 블록 스토리지 볼륨 서비스를 비활성화합니다.

      $ openstack volume service set \
      --disable cinder-volume-az2-0@ceph cinder-volume
    3. 블록 스토리지 볼륨이 비활성화되었는지 확인합니다.

      openstack volume service list

      +------------------+--------------------------+------+----------+-------+----------------------------+
      | Binary           | Host                     | Zone | Status   | State | Updated At                 |
      +------------------+--------------------------+------+----------+-------+----------------------------+
      | cinder-scheduler | cinder-e479e-scheduler-0 | nova | enabled  | down  | 2024-11-10T16:29:40.000000 |
      | cinder-scheduler | cinder-scheduler-0       | nova | enabled  | up    | 2024-11-12T19:23:38.000000 |
      | cinder-volume    | cinder-volume-az0-0@ceph | az0  | enabled  | up    | 2024-11-12T19:23:29.000000 |
      | cinder-backup    | cinder-backup-0          | nova | enabled  | up    | 2024-11-12T19:23:38.000000 |
      | cinder-backup    | cinder-backup-1          | nova | enabled  | up    | 2024-11-12T19:23:33.000000 |
      | cinder-backup    | cinder-backup-2          | nova | enabled  | up    | 2024-11-12T19:23:36.000000 |
      | cinder-volume    | cinder-volume-az1-0@ceph | az1  | enabled  | up    | 2024-11-12T19:23:35.000000 |
      | cinder-volume    | cinder-volume-az2-0@ceph | az2  | disabled | up    | 2024-11-12T19:23:24.000000 |
      +------------------+--------------------------+------+----------+-------+----------------------------+
    4. OpenStackControlPlane 매니페스트 파일 openstack_control_plane.yaml 을 엽니다. 다음 예와 같이 제거 중인 사이트의 CinderVolume Pod를 제거합니다.

           cinderVolumes:
              az2:
                customServiceConfig: |
                  [DEFAULT]
                  enabled_backends = ceph
                  glance_api_servers = https://glance-az2-internal.openstack.svc:9292
                  [ceph]
                  volume_backend_name = ceph
                  volume_driver = cinder.volume.drivers.rbd.RBDDriver
                  rbd_ceph_conf = /etc/ceph/az2.conf
                  rbd_user = openstack
                  rbd_pool = volumes
                  rbd_flatten_volume_from_snapshot = False
                  rbd_secret_uuid = 795dcbca-e715-5ac3-9b7e-a3f5c64eb89f
                  rbd_cluster_name = az2
                  backend_availability_zone = az2
  4. 제거하려는 DCN 사이트의 cinder 볼륨 서비스를 제거하십시오.

    1. cinder 스케줄러 Pod에 대한 쉘을 엽니다.

      oc rsh cinder-scheduler-0
    2. cinder 볼륨 서비스를 제거합니다.

      cinder-manage service remove cinder-volume cinder-volume-az2-0@ceph
    3. 쉘 종료

      $ exit
  5. 제거 중인 사이트의 GlanceAPI Pod를 제거합니다.

    1. openstack-control-plane.yaml CR(사용자 정의 리소스) 파일에서 az2 필드와 그 아래의 모든 필드를 제거합니다.

           glanceAPIs:
              az0:
                <...>
              az1:
                <...>
             az2:
                apiTimeout: 60
                customServiceConfig: |
                  [DEFAULT]
                  enabled_import_methods = [web-download,copy-image,glance-direct]
                  enabled_backends = az0:rbd,az2:rbd
                  [glance_store]
                  default_backend = az2
                  [az0]
                  rbd_store_ceph_conf = /etc/ceph/az0.conf
                  store_description = "az0 RBD backend"
                  rbd_store_pool = images
                  rbd_store_user = openstack
                  rbd_thin_provisioning = True
                  [az2]
                  rbd_store_ceph_conf = /etc/ceph/az2.conf
                  store_description = "az2 RBD backend"
                  rbd_store_pool = images
                  rbd_store_user = openstack
                  rbd_thin_provisioning = True
                imageCache:
                  cleanerScheduler: '*/30 * * * *'
                  prunerScheduler: 1 0 * * *
                  size: ""
                networkAttachments:
                - storage
                override:
                  service:
                    internal:
                      metadata:
                        annotations:
                          metallb.universe.tf/address-pool: internalapi
                          metallb.universe.tf/allow-shared-ip: internalapi
                          metallb.universe.tf/loadBalancerIPs: 172.17.0.82
                      spec:
                        type: LoadBalancer
                replicas: 1
                resources: {}
                storage: {}
                tls:
                  api:
                    internal: {}
                    public: {}
                type: edge
    2. 컨트롤 플레인을 다시 적용합니다.

      oc apply -f openstack-control-plane.yaml
    3. Image 서비스(glance) Pod가 제거되었는지 확인합니다.

      $ oc get pods | grep glance | grep -v purge

      glance-e479e-az0-external-api-0           3/3     Running     0             2d
      glance-e479e-az0-external-api-1           3/3     Running     0             2d
      glance-e479e-az0-external-api-2           3/3     Running     0             2d
      glance-e479e-az0-internal-api-0           3/3     Running     0             2d
      glance-e479e-az0-internal-api-1           3/3     Running     0             2d
      glance-e479e-az0-internal-api-2           3/3     Running     0             2d
      glance-e479e-az1-edge-api-0
      참고

      glance-e4793-az2-edge-api-0 이 이 목록에 표시되지 않습니다.

    4. az2 Pod가 제거되었는지 확인합니다.

      $ oc get pods | grep cinder-volume

      cinder-volume-az0-0       2/2     Running     0   2d
      cinder-volume-az1-0       2/2     Running     0   2d
  6. DCN 사이트에서 Ceph 클러스터를 제거합니다.

    1. Ceph 클러스터를 종료하지만 호스트의 전원을 끄지 마십시오. 자세한 내용은 Ceph Orchestrator를 사용하여 클러스터 전원을 끄고 재부팅합니다.

      참고

      다음 단계를 완료하려면 호스트의 전원을 켜야 합니다.

    2. 제거된 Ceph 클러스터에 액세스하는 데 사용된 시크릿을 제거합니다.

      $ oc delete secret ceph-conf-az-2 -n openstack
    3. az2에서 ceph 클러스터의 시크릿을 포함하지 않도록 중앙 사이트의 시크릿을 다시 생성합니다. 예를 들어 세 개의 가용성 영역인 az0,az1az2 가 있고 az2 에 해당하는 에지 위치를 제거하는 경우 다음을 실행합니다.

      oc delete secret cent-conf-az-0 -n openstack
      oc create secret generic ceph-conf-az-0 \
      --from-file=az0.client.openstack.keyring \
      --from-file=az-.conf \
      --from-file=az1.client.openstack.keyring \
      --from-file=az1.conf -n openstack
    4. OpenStackControlPlane에서 extraMounts 를 편집하여 제거 중인 AZ 및 제거된 보안에 대한 참조를 제거합니다. 예를 들어 AZ2의 경우 다음 목록 요소를 제거합니다.

              - propagation:
                - az2
                extraVolType: Ceph
                volumes:
                - name: ceph
                  secret:
                    name: ceph-conf-az-2
  7. 노드 세트를 제거합니다. az2 가용성 영역에 해당하는 노드 세트를 제거하려면 OpenStackDataPlaneNodeSet 리소스 제거 의 단계를 완료합니다.

7장. DCN 노드 제거

DCN 사이트에서 더 이상 필요하지 않은 경우 노드를 제거하여 하드웨어를 다시 사용할 수 있습니다.

7.1. 콜드 마이그레이션 인스턴스

인스턴스를 콜드 마이그레이션하려면 인스턴스를 중지하고 다른 컴퓨팅 노드로 이동합니다. 콜드 마이그레이션은 PCI 패스스루를 사용하는 인스턴스 마이그레이션과 같이 실시간 마이그레이션이 용이할 수 없는 마이그레이션 시나리오를 용이하게 합니다. 스케줄러는 대상 컴퓨팅 노드를 자동으로 선택합니다. 자세한 내용은 마이그레이션 제한 조건 을 참조하십시오.

절차

  1. 워크스테이션에서 OpenStackClient Pod의 원격 쉘에 액세스합니다.

    $ oc rsh -n openstack openstackclient
  2. 인스턴스를 콜드 마이그레이션하려면 다음 명령을 입력하여 전원을 끄고 인스턴스를 이동합니다.

     $ openstack server migrate <instance> --wait
    • & lt;instance& gt;를 마이그레이션할 인스턴스의 이름 또는 ID로 바꿉니다.
    • 로컬에 저장된 볼륨을 마이그레이션하는 경우 --block-migration 플래그를 지정합니다.
    • 마이그레이션이 완료될 때까지 기다려야 함을 나타내려면 --wait 플래그를 지정합니다.
  3. 인스턴스 마이그레이션이 완료될 때까지 기다리는 동안 다른 터미널 창을 열고 마이그레이션 상태를 확인할 수 있습니다. 자세한 내용은 마이그레이션 상태 확인을 참조하십시오.
  4. 인스턴스 상태를 확인합니다.

     $ openstack server list --all-projects

    "VERIFY_RESIZE" 상태는 마이그레이션을 확인하거나 되돌리야 함을 나타냅니다.

    • 마이그레이션이 예상대로 작동한 경우 확인합니다.

       $ openstack server resize --confirm <instance>

      & lt;instance& gt;를 마이그레이션할 인스턴스의 이름 또는 ID로 바꿉니다. "ACTIVE" 상태는 인스턴스를 사용할 준비가 되었음을 나타냅니다.

    • 마이그레이션이 예상대로 작동하지 않으면 되돌립니다.

       $ openstack server resize --revert <instance>

      & lt;instance& gt;를 인스턴스의 이름 또는 ID로 바꿉니다.

  5. 인스턴스를 다시 시작합니다.

     $ openstack server start <instance>

    & lt;instance& gt;를 인스턴스의 이름 또는 ID로 바꿉니다.

  6. 선택 사항: 유지보수를 위해 소스 컴퓨팅 노드를 비활성화한 경우 새 인스턴스를 할당할 수 있도록 노드를 다시 활성화해야 합니다.

     $ openstack compute service set <source> nova-compute --enable

    & lt;source& gt;를 소스 컴퓨팅 노드의 호스트 이름으로 바꿉니다.

  7. OpenStackClient Pod를 종료합니다.

    $ exit

7.2. 호스트 집계에서 컴퓨팅 노드 제거

OpenStackClient Pod를 사용하여 호스트 집계에서 컴퓨팅 노드를 제거할 수 있습니다.

절차

  1. 워크스테이션에서 OpenStackClient Pod의 원격 쉘에 액세스합니다.

    $ oc rsh -n openstack openstackclient
  2. 호스트 집계에 할당된 모든 컴퓨팅 노드 목록을 확인합니다.

    # openstack aggregate show <aggregate_name>
  3. 호스트 집계에서 할당된 컴퓨팅 노드를 제거하려면 다음 명령을 입력합니다.

    # openstack aggregate remove host <aggregate_name> <host_name>
    • 컴퓨팅 노드를 제거하려면 & lt;aggregate_name >을 호스트 집계 이름으로 바꿉니다.
    • & lt;host_name >을 호스트 집계에서 삭제할 컴퓨팅 노드의 이름으로 바꿉니다.

7.3. Ceph Orchestrator를 사용하여 호스트 제거

HCI(하이퍼 컨버지드 인프라)를 실행하는 동안 DCN 클러스터에서 노드를 제거할 수 있습니다.

사전 요구 사항

  • DCN 클러스터에서 HCI를 실행 중입니다.
  • 모든 노드에 대한 루트 수준 액세스 권한이 있습니다.
  • 제거 중인 호스트가 스토리지 클러스터에 추가됩니다.
  • cephadm 은 서비스를 제거할 노드에 배포됩니다.

프로세스

  1. Cephadm 쉘에 로그인합니다.

    [root@host01 ~]# cephadm shell
  2. 호스트 세부 정보를 가져옵니다.

    [ceph: root@host01 /]# ceph orch host ls
  3. 호스트의 모든 데몬을 드레이닝합니다.

    [ceph: root@host01 /]# ceph orch host drain <hostname>
    • & lt;hostname >을 제거할 호스트의 이름으로 바꿉니다.

      Red Hat Ceph Storage 서비스 관리에 대한 자세한 내용은 Red Hat Ceph Storage 7 관리 가이드를 참조하십시오.

  4. OSD 제거 상태를 확인합니다.

    [ceph: root@host01 /]# ceph orch osd rm status

    OSD에 배치 그룹(PG)이 없는 경우 스토리지 클러스터에서 OSD가 해제되어 제거됩니다.

  5. 스토리지 클러스터에서 모든 데몬이 제거되었는지 확인합니다.

    [ceph: root@host01 /]# ceph orch ps <hostname>
    • & lt;hostname >을 제거할 호스트의 이름으로 바꿉니다.
  6. 호스트를 제거합니다.

    [ceph: root@host01 /]# ceph orch host rm <hostname>
    • & lt;hostname >을 제거할 호스트의 이름으로 바꿉니다.

7.4. 데이터 플레인에서 컴퓨팅 노드 제거

데이터 플레인의 노드 세트에서 컴퓨팅 노드를 삭제할 수 있습니다. 노드 세트에서 모든 노드를 제거하는 경우 데이터 플레인에서 노드 세트도 제거해야 합니다.

사전 요구 사항

  • cluster-admin 권한이 있는 사용자로 Cryostat 클러스터에 로그인되어 있습니다.
  • 컴퓨팅 노드의 워크로드가 다른 컴퓨팅 노드로 마이그레이션되었습니다.

프로세스

  1. openstackclient pod의 원격 쉘에 액세스합니다.

    $ oc rsh -n openstack openstackclient
  2. 삭제하려는 컴퓨팅 노드의 IP 주소를 검색합니다.

    $ openstack hypervisor list
  3. 컴퓨팅 노드 목록을 검색하여 삭제하려는 노드의 이름과 UUID를 확인합니다.

    $ openstack compute service list
  4. 제거할 컴퓨팅 노드에서 nova-compute 서비스를 비활성화합니다.

    $ openstack compute service set <hostname> nova-compute --disable
    작은 정보

    --disable-reason 옵션을 사용하여 서비스가 비활성화되는 이유에 대한 간단한 설명을 추가합니다. 이는 Compute 서비스를 재배포하려는 경우에 유용합니다.

  5. OpenStackClient Pod를 종료합니다.

    $ exit
  6. 컴퓨팅 노드에 SSH로 연결하고 ovnnova-compute 컨테이너를 중지합니다.

    $ ssh -i <key_file_name> cloud-admin@<node_IP_address>
    [cloud-admin@<hostname> ~]$ sudo systemctl stop edpm_ovn_controller
    [cloud-admin@<hostname> ~]$ sudo systemctl stop edpm_ovn_metadata_agent
    [cloud-admin@<hostname> ~]$ sudo systemctl stop edpm_nova_compute
    • & lt;key_file_name >을 Ansible에서 RHEL 노드를 관리할 수 있도록 생성한 SSH 키 쌍 파일의 이름 및 위치로 바꿉니다.
    • & lt;node_IP_address >를 2단계에서 검색한 컴퓨팅 노드의 IP 주소로 바꿉니다.
  7. 노드가 재부팅되는 경우 데이터베이스에서 에이전트가 자동으로 시작되고 등록되지 않도록 ovnnova-compute 컨테이너를 관리하는 systemd 장치 파일을 제거합니다.

    [cloud-admin@<hostname> ~]$ sudo rm -f /etc/systemd/system/edpm_ovn_controller
    [cloud-admin@<hostname> ~]$ sudo rm -f /etc/systemd/system/edpm_ovn_metadata_agent
    [cloud-admin@<hostname> ~]$ sudo rm -f /etc/systemd/system/edpm_nova_compute
  8. 컴퓨팅 노드에서 연결을 끊습니다.

    $ exit
  9. openstackclient 의 원격 쉘에 액세스 :

    $ oc rsh -n openstack openstackclient
  10. 컴퓨팅 노드를 제거할 네트워크 에이전트를 삭제합니다.

    $ openstack network agent list [--host <hostname>]
    $ openstack network agent delete <agent_id>
  11. 제거할 컴퓨팅 노드의 nova-compute 서비스를 삭제합니다.

    $ openstack compute service delete <node_uuid>
    • & lt;node_uuid >를 3단계에서 검색한 노드의 UUID로 바꿉니다.
  12. OpenStackClient Pod를 종료합니다.

    $ exit
  13. OpenStackDataPlaneNodeSet CR에서 노드를 제거합니다.

    $ oc patch openstackdataplanenodeset/<node_set_name> --type json --patch '[{ "op": "remove", "path": "/spec/nodes/<node_name>" }]'
    • & lt;node_set_name >을 노드가 속한 OpenStackDataPlaneNodeSet CR의 이름으로 바꿉니다.
    • & lt;node_name >을 OpenStackDataPlaneNodeSet CR의 nodes 섹션에 정의된 노드 이름으로 바꿉니다.
  14. 워크스테이션에 파일을 생성하여 OpenStackDataPlaneDeployment CR을 정의하여 컴퓨팅 노드로 설정된 노드를 업데이트합니다.

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneDeployment
    metadata:
      name: <node_set_deployment_name>
    • & lt;node_set_deployment_name >을 OpenStackDataPlaneDeployment CR 이름으로 바꿉니다. 이름은 고유해야 하며 소문자 영숫자( 하이 프린) 또는 . (period)로 구성되어야 하며 영숫자 문자로 시작하고 끝나야 합니다.
    작은 정보

    수정된 노드 세트의 목적을 나타내는 정의 파일과 OpenStackDataPlaneDeployment CR에 고유하고 설명이 포함된 이름을 지정합니다.

  15. 노드를 제거한 OpenStackDataPlaneNodeSet CR을 추가합니다.

    spec:
      nodeSets:
        - <nodeSet_name>
  16. 나열된 노드 세트를 배포할 때 OpenStackDataPlaneDeployment CR에서 ssh-known-hosts 서비스만 실행하도록 지정합니다.

    spec:
      servicesOverride:
        - ssh-known-hosts
  17. OpenStackDataPlaneDeployment CR 배포 파일을 저장합니다.
  18. ssh-known-hosts 서비스를 배포하여 나머지 노드의 알려진 호스트 목록에서 삭제된 노드를 삭제합니다.

    $ oc create -f openstack_data_plane_deploy.yaml -n openstack

    배포가 실행되는 동안 Ansible 로그를 볼 수 있습니다.

    $ oc get pod -l app=openstackansibleee -w
    $ oc logs -l app=openstackansibleee -f --max-log-requests 10

    oc logs 명령에서 다음 오류와 유사한 오류를 반환하는 경우 --max-log-requests 값을 늘립니다.

    error: you are attempting to follow 19 log streams, but maximum allowed concurrency is 10, use --max-log-requests to increase the limit
  19. 수정된 OpenStackDataPlaneNodeSet CR이 배포되었는지 확인합니다.

    $ oc get openstackdataplanedeployment -n openstack
    NAME                  NODESETS                  STATUS  MESSAGE
    openstack-data-plane  ["openstack-data-plane"]  True    Setup Complete
    
    $ oc get openstackdataplanenodeset -n openstack
    NAME                  STATUS  MESSAGE
    openstack-data-plane  True    NodeSet Ready

    반환된 상태의 의미에 대한 자세한 내용은 OpenShift에 Red Hat OpenStack Services 배포데이터 플레인 조건 및 상태를 참조하십시오.

    상태가 데이터 플레인이 배포되지 않았음을 나타내는 경우 배포 문제를 해결합니다. 자세한 내용은 OpenShift에 Red Hat OpenStack Services 배포를 통해 데이터 플레인 생성 및 배포 문제 해결을 참조하십시오.

8장. 엣지 스토리지 검증

중앙 및 에지 사이트의 배포가 작동하는지 확인하려면 Glance 다중 저장소 및 인스턴스 생성을 테스트합니다. openstackclient pod를 사용하여 OpenStack 관리자로 명령을 테스트할 수 있습니다.

로컬 파일 시스템에서 사용할 수 있거나 웹 서버에서 사용할 수 있는 이미지를 Glance로 가져올 수 있습니다.

참고

중앙 위치에서 이미지를 사용하는 인스턴스가 없는 경우에도 중앙 사이트에 이미지 복사본을 항상 저장합니다.

8.1. DCN 환경에서 이미지 서비스 저장소 보기

glance 다중 저장소를 테스트하기 전에 이미지 서비스 저장소를 사용할 수 있는지 확인합니다.

프로세스

  • glance stores-info 명령을 사용하여 이미지 서비스를 통해 사용할 수 있는 저장소를 확인합니다. 다음 예제에서는 central, dcn1, dcn2의 세 가지 저장소를 사용할 수 있습니다. 이는 각각 중앙 위치 및 에지 사이트의 Glance 저장소에 해당합니다.

      $ glance stores-info
      +----------+----------------------------------------------------------------------------------+
      | Property | Value                                                                            |
      +----------+----------------------------------------------------------------------------------+
      | stores   | [{"default": "true", "id": "az0", "description": "central rbd glance             |
      |          | store"}, {"id": "az1", "description": "z1 rbd glance store"},                    |
      |          | {"id": "az2", "description": "az2 rbd glance store"}]                            |
      +----------+----------------------------------------------------------------------------------+

8.2. 로컬 파일에서 가져오기

이미지를 중앙 위치의 저장소에 먼저 업로드한 다음 이미지를 원격 사이트에 복사해야 합니다.

  1. 이미지 파일이 RAW 형식인지 확인합니다. 이미지가 원시 형식이 아닌 경우 이미지를 이미지 서비스로 가져오기 전에 이미지를 변환해야 합니다.

    $ file cirros-0.5.1-x86_64-disk.img
    cirros-0.5.1-x86_64-disk.img: QEMU QCOW2 Image (v3), 117440512 bytes
    
    $ qemu-img convert -f qcow2 -O raw cirros-0.5.1-x86_64-disk.img cirros-0.5.1-x86_64-disk.raw

    이미지를 중앙 사이트의 기본 백엔드로 가져옵니다.

    openstack image create \
    --disk-format raw --container-format bare \
    --name cirros --file cirros-0.5.1-x86_64-disk.raw \
    --store central

8.3. 웹 서버에서 이미지 가져오기

이미지가 웹 서버에서 호스팅되는 경우 GlanceImageImportPlugins 매개변수를 사용하여 이미지를 여러 저장소에 업로드할 수 있습니다.

이 절차에서는 Image 서비스(glance)에서 기본 이미지 변환 플러그인이 활성화되어 있다고 가정합니다. 이 기능은 QCOW2 파일 형식을 Ceph RBD에 가장 적합한 RAW 이미지로 자동 변환합니다. glance image-show ID | grep disk_format 을 실행하여 Glance 이미지가 RAW 형식인지 확인할 수 있습니다.

절차

  1. glance 명령의 image-create-via-import 매개 변수를 사용하여 웹 서버에서 이미지를 가져옵니다. --stores 매개변수를 사용합니다.

    # glance image-create-via-import \
    --disk-format qcow2 \
    --container-format bare \
    --name cirros \
    --uri http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img \
    --import-method web-download \
    --stores az0,az1

    이 예에서는 qcow2 cirros 이미지가 공식 Cirros 사이트에서 다운로드되고 Glance에 따라 RAW로 변환되고 --stores 매개변수에서 지정하는 대로 중앙 사이트 및 에지 사이트 1로 가져옵니다.

    참고

    또는 --stores--all-stores True 로 교체하여 모든 저장소에 이미지를 업로드할 수 있습니다.

8.4. 이미지를 새 사이트에 복사

기존 이미지를 중앙 위치에서 에지 사이트로 복사할 수 있으므로 새로 설정된 위치에서 이전에 생성된 이미지에 액세스할 수 있습니다.

  1. 복사 작업에 glance 이미지의 UUID를 사용합니다.

    ID=$(openstack image show cirros -c id -f value)
    
    glance image-import $ID --stores az1,az2 --import-method copy-image
    참고

    이 예에서 --stores 옵션은 cirros 이미지가 중앙 사이트인 az0 에서 에지 사이트 az1az2 로 복사되도록 지정합니다. 또는 현재 이미지가 없는 모든 저장소에 이미지를 업로드하는 --all-stores True 옵션을 사용할 수 있습니다.

  2. 이미지 사본이 각 저장소에 있는지 확인합니다. 속성 맵의 마지막 항목인 stores 키는 az0,az1,az2 로 설정됩니다.

    $ openstack image show $ID | grep properties
    
    | properties | os_glance_failed_import=', os_glance_importing_to_stores=', os_hash_algo=sha512, os_hash_value=6b813aa46bb90b4da216a4d19376593fa3f4fc7e617f03a92b7fe11e9a3981cbe8f0959dbebe36225e5f53dc4492341a4863cac4ed1ee0909f3fc78ef9c3e869, os_hidden=False, stores=az0,az1 |
참고

해당 사이트에 사용하는 VM이 없는 경우에도 항상 중앙 사이트에 이미지 사본을 저장합니다.

에지 사이트의 이미지를 사용하여 영구 루트 볼륨을 생성할 수 있습니다.

절차

  1. 볼륨으로 생성할 이미지의 ID를 식별하고 해당 ID를 openstack volume create 명령에 전달합니다.

    IMG_ID=$(openstack image show cirros -c id -f value)
    openstack volume create --size 8 --availability-zone az1 pet-volume-az1 --image $IMG_ID
  2. 새로 생성된 볼륨의 볼륨 ID를 확인하고 openstack server create 명령에 전달합니다.

    VOL_ID=$(openstack volume show -f value -c id pet-volume-az1)
    openstack server create --flavor tiny --key-name az1-key --network az1-network --security-group basic --availability-zone az1 --volume $VOL_ID pet-server-az1
  3. az1 에지 사이트의 ceph-mon 컨테이너에서 rbd 명령을 실행하여 volumes 풀을 나열하여 볼륨이 이미지를 기반으로 하는지 확인할 수 있습니다.

    $ sudo cephadm shell -- rbd -p volumes ls -l
    NAME                                      SIZE  PARENT                                           FMT PROT LOCK
    volume-28c6fc32-047b-4306-ad2d-de2be02716b7 8 GiB images/8083c7e7-32d8-4f7a-b1da-0ed7884f1076@snap   2      excl
    $
  4. 인스턴스의 루트 볼륨의 cinder 스냅샷을 만들 수 있는지 확인합니다. 정리된 스냅샷을 생성하기 위해 서버가 데이터를 정지하도록 중지되었는지 확인합니다. 인스턴스가 꺼져 있을 때 볼륨 상태가 in-use 상태로 유지되므로 --force 옵션을 사용합니다.

    openstack server stop pet-server-az1
    openstack volume snapshot create pet-volume-az1-snap --volume $VOL_ID --force
    openstack server start pet-server-az1
  5. az1 Ceph 클러스터에 volumes 풀의 콘텐츠를 나열하여 새로 생성된 스냅샷을 표시합니다.

    $ sudo cephadm shell -- rbd -p volumes ls -l
    NAME                                                                                      SIZE  PARENT                                           FMT PROT LOCK
    volume-28c6fc32-047b-4306-ad2d-de2be02716b7                                               8 GiB images/8083c7e7-32d8-4f7a-b1da-0ed7884f1076@snap   2      excl
    volume-28c6fc32-047b-4306-ad2d-de2be02716b7@snapshot-a1ca8602-6819-45b4-a228-b4cd3e5adf60 8 GiB images/8083c7e7-32d8-4f7a-b1da-0ed7884f1076@snap   2 yes

8.6. 사이트 간에 이미지 스냅샷을 생성하고 복사할 수 있는지 확인

스냅샷을 암호화하고 glance image-import 를 사용하여 중앙 위치에 복사할 수 있는지 확인합니다.

  1. az1 위치에 새 이미지를 생성할 수 있는지 확인합니다. 데이터를 정지하여 정리된 스냅샷을 생성하기 위해 서버가 중지되었는지 확인합니다.

    NOVA_ID=$(openstack server show pet-server-az1 -f value -c id)
    openstack server stop $NOVA_ID
    openstack server image create --name cirros-snapshot $NOVA_ID
    openstack server start $NOVA_ID
  2. az1 에지 사이트의 이미지를 Glance의 기본 백엔드인 중앙 위치로 다시 복사합니다.

    IMAGE_ID=$(openstack image show cirros-snapshot -f value -c id)
    glance image-import $IMAGE_ID --stores az0 --import-method copy-image

8.7. 엣지 사이트에서 백업 및 복원 테스트

AZ( Edge 사이트 가용 영역) 및 중앙 AZ에서 Block Storage 서비스(cinder) 볼륨을 백업하고 복원할 수 있습니다. cinder-backup 서비스는 중앙 AZ에서 실행되며 백업은 중앙 AZ에 저장됩니다. 블록 스토리지 서비스는 에지 사이트에 백업을 저장하지 않으며 에지 사이트 간에 직접 백업 및 복원 작업을 지원하지 않습니다.

사전 요구 사항

  • 블록 스토리지 백업 서비스는 중앙 AZ에 배포됩니다. 자세한 내용은 컨트롤 플레인 업데이트를 참조하십시오.
  • Block Storage(cinder) REST API 마이크로 버전 3.51 이상
  • 모든 사이트에서 공통 openstack cephx 클라이언트 이름을 사용합니다.

프로세스

  1. 첫 번째 DCN 사이트에 볼륨 백업을 생성합니다.

    $ openstack --os-volume-api-version 3.51 volume backup create \
    --name <volume_backup> --availability-zone <az0> <edge_volume>
    • & lt;volume_backup& gt;을 볼륨 백업의 이름으로 바꿉니다.
    • & lt;az0 >을 cinder-backup 서비스를 호스팅하는 중앙 가용 영역의 이름으로 바꿉니다.
    • & lt;edge_volume >을 백업할 볼륨의 이름으로 바꿉니다.

      참고

      Ceph 인증 키에 문제가 있는 경우 호스트에서 컨테이너로 인증 키를 복사하도록 cinder-backup 컨테이너를 다시 시작해야 할 수 있습니다.

  2. 두 번째 DCN 사이트의 새 볼륨으로 백업을 복원합니다.

    $ openstack --os-volume-api-version 3.47 volume create \
    --backup <volume_backup> --availability-zone <az_2> <new_volume>
    • & lt;az_2 >를 백업을 복원하려는 가용성 영역의 이름으로 바꿉니다.
    • & lt;new_volume >을 새 볼륨의 이름으로 바꿉니다.
    • & lt;volume_backup >을 이전 단계에서 생성한 볼륨 백업 이름으로 바꿉니다.

법적 공지

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

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

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

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

Red Hat 소개

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

Theme

© 2026 Red Hat
맨 위로 이동