9.2. コントロールプレーンの作成
OpenStackControlPlane カスタムリソース (CR) を定義して、次のタスクを実行します。
- コントロールプレーンを作成します。
- Red Hat OpenStack Services on OpenShift (RHOSO) サービスを有効にします。
次の手順では、各サービスのサンプル設定を使用して初期コントロールプレーンを作成します。この手順は、動作するコントロールプレーン環境の作成に役立ちます。この環境を使用して問題をテストし、トラブルシューティングを行ってから、必要なサービスのカスタマイズを追加できます。最初のデプロイ後に、サービスを追加およびカスタマイズできます。
サービスを設定するには、サービス仕様の CustomServiceConfig フィールドを使用して、OpenStack 設定パラメーターを INI ファイル形式で渡します。使用可能な設定パラメーターの詳細は、設定リファレンス を参照してください。
デプロイ後にコントロールプレーンをカスタマイズする方法の詳細は、Red Hat OpenStack Services on OpenShift デプロイメントのカスタマイズ ガイドを参照してください。
詳細は、OpenStackControlPlane CR の例 を参照してください。
OpenStackControlPlane CRD 定義と仕様スキーマを表示するには、次のコマンドを使用します。
$ oc describe crd openstackcontrolplane
$ oc explain openstackcontrolplane.spec
NFV 環境の場合、Networking サービス (neutron) および OVN サービス設定を追加するときに、次の情報を指定する必要があります。
- ゲートウェイが配置されている物理ネットワーク
- vhost ソケットへのパス
- VLAN の範囲
- NUMA ノードの数
- ゲートウェイネットワークに接続する NIC
SR-IOV を使用する場合は、ネットワークサービス設定に sriovnicswitch メカニズムドライバーも追加する必要があります。
手順
デプロイする RHOSO 環境用の
openstackプロジェクトを作成します。$ oc new-project openstackOpenStack Operator による特権 Pod の作成を有効にするために、
openstacknamespace にラベルが付いていることを確認します。$ oc get namespace openstack -ojsonpath='{.metadata.labels}' | jq { "kubernetes.io/metadata.name": "openstack", "pod-security.kubernetes.io/enforce": "privileged", "security.openshift.io/scc.podSecurityLabelSync": "false" }Security Context Constraint (SCC) が "privileged" でない場合は、次のコマンドを使用して変更します。
$ oc label ns openstack security.openshift.io/scc.podSecurityLabelSync=false --overwrite $ oc label ns openstack pod-security.kubernetes.io/enforce=privileged --overwriteワークステーションに
openstack_control_plane.yamlという名前のファイルを作成して、OpenStackControlPlaneCR を定義します。apiVersion: core.openstack.org/v1beta1 kind: OpenStackControlPlane metadata: name: openstack-control-plane namespace: openstackRed Hat OpenStack Services on OpenShift へのセキュアなアクセスの提供 で、RHOSO サービス Pod へのセキュアなアクセスを提供するために作成した
SecretCR を指定します。apiVersion: core.openstack.org/v1beta1 kind: OpenStackControlPlane metadata: name: openstack-control-plane spec: secret: osp-secretRed Hat OpenShift Container Platform (RHOCP) クラスターストレージバックエンド用に作成した
storageClassを指定します。apiVersion: core.openstack.org/v1beta1 kind: OpenStackControlPlane metadata: name: openstack-control-plane spec: secret: osp-secret storageClass: your-RHOCP-storage-class注記ストレージクラスの詳細は、ストレージクラスの作成 を参照してください。
次のサービス設定を追加します。
- Block Storage サービス (cinder)
cinder: apiOverride: route: {} template: 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 cinderBackup: networkAttachments: - storage replicas: 0 # backend needs to be configured to activate the service cinderVolumes: volume1: networkAttachments: - storage replicas: 0 # backend needs to be configured to activate the service重要この Block Storage サービスの定義はサンプルです。場合によっては、実際の NFV 環境に合わせて変更する必要があります。詳細は、デプロイメントのプランニング の ストレージと共有ファイルシステムのプランニング を参照してください。
注記コントロールプレーンの最初のデプロイでは、
cinderBackupおよびcinderVolumesサービスがデプロイされますが、アクティブ化はされません (replicas: 0)。デプロイ後に、Block Storage サービスとバックアップサービスのバックエンドを使用してコントロールプレーンを設定できます。- Compute サービス (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 schedulerServiceTemplate: customServiceConfig: | [filter_scheduler] enabled_filters = AvailabilityZoneFilter, ComputeFilter, ComputeCapabilitiesFilter, ImagePropertiesFilter, ServerGroupAntiAffinityFilter, ServerGroupAffinityFilter, PciPassthroughFilter, AggregateInstanceExtraSpecsFilter available_filters = nova.scheduler.filters.all_filters 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: cell1: noVNCProxyServiceTemplate: enabled: true networkAttachments: - ctlplane secret: osp-secret注記デフォルトでは、各デフォルトセル (
cell0およびcell1) に対して、Compute サービス (nova) の完全なセット (nova-api、nova-metadata、nova-scheduler、nova-conductor) がデプロイされます。novncproxyサービスも、デフォルトでcell1に対して有効になります。- データプレーンの DNS サービス
dns: template: options: - key: server values: - <IP address for DNS server reachable from dnsmasq pod> 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-
options: キーと値のペアを使用して、各 DNS サーバーに必要なdnsmasqインスタンスを定義します。この例では、リクエストの転送先として設定されている DNS サーバーが 1 つしかないため、定義されているキーと値のペアは 1 つだけです。 key: デプロイするdnsmasqインスタンス用にカスタマイズするdnsmasqパラメーターを指定します。以下の有効な値のいずれかに設定します。-
server -
rev-server -
srv-host -
txt-record -
ptr-record -
rebind-domain-ok -
naptr-record -
cname -
host-record -
caa-record -
dns-rr -
auth-zone -
synth-domain -
no-negcache -
local
-
values: RHOCP クラスターネットワーク上のdnsmasqPod から到達可能な DNS サーバーの値を指定します。値として、汎用 DNS サーバー (例:1.1.1.1) または特定のドメインの DNS サーバー (例:/google.com/8.8.8.8) を指定できます。注記この DNS サービス (
dnsmasq) は、RHOSO データプレーン上のノードに DNS サービスを提供します。dnsmasqは、クラウドテナントに DNS をサービスとして提供する RHOSO DNS サービス (designate) とは異なります。
-
- Galera クラスター
すべての RHOSO サービスで使用するための Galera クラスター (
openstack) と、cell1の Compute サービスで使用するための Galera クラスター (openstack-cell1)。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 # backend needs to be configured to activate the service 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注記コントロールプレーンの最初のデプロイでは、Image サービスがデプロイされますが、アクティブ化はされません (replicas: 0)。デプロイ後に、Image サービスのバックエンドを使用してコントロールプレーンを設定できます。
- Key Management サービス (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: 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 customServiceConfig: | [DEFAULT] global_physnet_mtu = 9000 [ml2] mechanism_drivers = ovn [ovn] vhost_sock_dir = <path> [ml2_type_vlan] network_vlan_ranges = <network_name1>:<VLAN-ID1>:<VLAN-ID2>,<network_name2>:<VLAN-ID1>:<VLAN-ID2>-
mechanism_drivers- SR-IOV を使用する場合は、sriovnicswitchメカニズムドライバーも追加する必要があります (例:mechanism_drivers = ovn,sriovnicswitch)。 -
vhost_sock_dir-<path>は、vhostソケットへの絶対パス (例:/var/lib/vhost_sockets) に置き換えます。 -
network_vlan_ranges-<network_name1>と<network_name2>は、ゲートウェイが配置されている物理ネットワークの名前に置き換えます。(このネットワークは、neutron ネットワークprovider:*nameフィールドで設定します。) -
<VLAN-ID1>-<VLAN-ID1>と <VLAN-ID2> は、使用している VLAN ID に置き換えます。
-
- Object Storage サービス (swift)
swift: enabled: true proxyOverride: route: {} template: swiftProxy: 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: 2 swiftRing: ringReplicas: 3 swiftStorage: networkAttachments: - storage replicas: 3 storageClass: local-storage storageRequest: 100Gi- OVN
ovn: template: ovnDBCluster: ovndbcluster-nb: replicas: 3 dbType: NB storageRequest: 10G networkAttachment: internalapi ovndbcluster-sb: replicas: 3 dbType: SB storageRequest: 10G networkAttachment: internalapi ovnNorthd: {} ovnController: networkAttachment: tenant nicMappings: <network_name>: <NIC_name>-
nicMappings-<network_name>は、ゲートウェイが配置されている物理ネットワークの名前に置き換えます。(このネットワークは、neutron ネットワークprovider:*nameフィールドで設定します。) -
<NIC_name>-<NIC_name>は、ゲートウェイネットワークに接続する NIC の名前に置き換えます。 -
<network_name>: <NIC_name>- オプション: 必要に応じて、nicMappingsの下に<network_name>:<NIC_name>のペアを追加します。
-
- Placement サービス (placement):
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- Telemetry サービス (ceilometer、prometheus)
telemetry: enabled: true template: metricStorage: enabled: true monitoringStack: alertingEnabled: true scrapeInterval: 30s storage: strategy: persistent retention: 24h persistent: pvcStorageRequest: 20G autoscaling: enabled: false aodh: passwordSelectors: databaseAccount: aodh databaseInstance: openstack memcachedInstance: memcached secret: osp-secret heatInstance: heat ceilometer: enabled: true secret: osp-secret logging: enabled: false-
autoscaling- 自動スケーリングが無効になっている場合でも、autoscalingフィールドが存在している必要があります。
-
コントロールプレーンを作成します。
$ oc create -f openstack_control_plane.yaml -n openstack注記コントロールプレーンを作成すると、
OpenStackClientPod も作成されます。この Pod にリモートシェル (rsh) を介してアクセスして、RHOSO CLI コマンドを実行できます。$ oc rsh -n openstack openstackclientRHOCP が
OpenStackControlPlaneCR に関連するリソースを作成するまで待機します。コントロールプレーンのデプロイのステータスを確認します。$ oc get openstackcontrolplane -n openstack- 出力例
NAME STATUS MESSAGE openstack-control-plane Unknown Setup startedステータスが "Setup complete" であれば、
OpenStackControlPlaneリソースが作成されています。ヒントデプロイの進行状況を追跡するには、
getコマンドの末尾に-wオプションを追加します。注記コントロールプレーンを作成すると、
OpenStackClientPod も作成されます。この Pod にリモートシェル (rsh) を介してアクセスして、RHOSO CLI コマンドを実行できます。$ oc rsh -n openstack openstackclient
オプション:
openstacknamespace 内の Pod を確認して、コントロールプレーンがデプロイされていることを確認します。$ oc get pods -n openstackすべての Pod が完了または実行中の状態であれば、コントロールプレーンがデプロイされています。
検証
OpenStackClientPod へのリモートシェル接続を開きます。$ oc rsh -n openstack openstackclient内部サービスエンドポイントが各サービスに登録されていることを確認します。
$ openstack endpoint list -c 'Service Name' -c Interface -c URL --service glance- 出力例
+--------------+-----------+---------------------------------------------------------------+ | Service Name | Interface | URL | +--------------+-----------+---------------------------------------------------------------+ | glance | internal | http://glance-internal.openstack.svc:9292 | | glance | public | http://glance-public-openstack.apps.ostest.test.metalkube.org | +--------------+-----------+---------------------------------------------------------------+
OpenStackClientPod を終了します。$ exit