{"id":74,"date":"2023-11-28T13:52:21","date_gmt":"2023-11-28T18:52:21","guid":{"rendered":"https:\/\/chrisj.cloud\/?p=74"},"modified":"2023-11-28T13:52:21","modified_gmt":"2023-11-28T18:52:21","slug":"distributed-private-cloud-infrastructure-dcn-edge","status":"publish","type":"post","link":"https:\/\/chrisj.cloud\/index.php\/2023\/11\/28\/distributed-private-cloud-infrastructure-dcn-edge\/","title":{"rendered":"Distributed Private Cloud Infrastructure &#8211; DCN \/ Edge"},"content":{"rendered":"\n<p>I have hesitated to post anything about Red Hat OpenStack Edge since it got introduced in OSP13 simply because I found it quite difficult to consume. Also the storage situation back then was .. not complete. Things improved overtime and now with OSP16.1 we can deploy our private cloud with the following features (which imho finally makes it production ready.):<\/p>\n\n\n\n<p>&#8211; ceph storage at the edge \/ dcn<\/p>\n\n\n\n<p>&#8211; one stack per site for better management and lifecycle<\/p>\n\n\n\n<p>&#8211; improved routed networking configuration<\/p>\n\n\n\n<p>&#8211; image caching at the edge<\/p>\n\n\n\n<p>So why would anyone do this? I find 3 distinctive <strong>benefits<\/strong>:<\/p>\n\n\n\n<p><strong>1. Simplified Management and Lifecycle &#8211; of rather complex architectures<\/strong><\/p>\n\n\n\n<p><strong>2.&nbsp;Efficiency of distributed compute\/storage and no control overhead<\/strong><\/p>\n\n\n\n<p><strong>3.&nbsp;High availability and high performance at the edge<\/strong><\/p>\n\n\n\n<p>And for once, I don&#8217;t know of any other Infrastructure software that could do it in a supportable way.<\/p>\n\n\n\n<p><strong>Demo:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler wp-embed-aspect-4-3 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Distributed Private Cloud Infrastructure - OSP16.1 - Edge \/ DCN\" width=\"640\" height=\"480\" src=\"https:\/\/www.youtube.com\/embed\/bsQ-ORy37wk?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>So now we know why. Let&#8217;s focus on how.<\/p>\n\n\n\n<p><strong>I. Official Documents<\/strong><\/p>\n\n\n\n<p>I have been referencing 3 separate&nbsp;documents to come out with my architecture:<\/p>\n\n\n\n<p>DCN Docs:<\/p>\n\n\n\n<p><a href=\"https:\/\/access.redhat.com\/documentation\/en-us\/red_hat_openstack_platform\/16.1\/html\/distributed_compute_node_and_storage_deployment\/index\">https:\/\/access.redhat.com\/documentation\/en-us\/red_hat_openstack_platform\/16.1\/html\/distributed_compute_node_and_storage_deployment\/index<\/a><\/p>\n\n\n\n<p>Leaf Spine Docs:<\/p>\n\n\n\n<p><a href=\"https:\/\/access.redhat.com\/documentation\/en-us\/red_hat_openstack_platform\/16.1\/html\/spine_leaf_networking\/index\">https:\/\/access.redhat.com\/documentation\/en-us\/red_hat_openstack_platform\/16.1\/html\/spine_leaf_networking\/index<\/a><\/p>\n\n\n\n<p>Upstream DCN Docs:<\/p>\n\n\n\n<p><a href=\"https:\/\/docs.openstack.org\/project-deploy-guide\/tripleo-docs\/latest\/features\/distributed_compute_node.html\">https:\/\/docs.openstack.org\/project-deploy-guide\/tripleo-docs\/latest\/features\/distributed_compute_node.html<\/a><\/p>\n\n\n\n<p><strong>II. Relevant artifacts from my lab:<\/strong><\/p>\n\n\n\n<p><strong>1. Deployment scripts:<\/strong><\/p>\n\n\n\n<p>(undercloud) [stack@chrisj-dcn2-undercloud ~]$ cat<strong> deploy-central.sh&nbsp;<\/strong><br>#!\/bin\/bash<br>source ~\/stackrc<\/p>\n\n\n\n<p>cd ~\/<br>time openstack overcloud deploy &#8211;templates &#8211;stack chrisjdcn-central \\<br>&nbsp; &nbsp; &nbsp;-n templates\/network_data_spine_leaf.yaml \\<br>&nbsp; &nbsp; &nbsp;-r templates\/central_roles.yaml \\<br>&nbsp; &nbsp; &nbsp;-e \/usr\/share\/openstack-tripleo-heat-templates\/environments\/ceph-ansible\/ceph-ansible.yaml \\<br>&nbsp; &nbsp; &nbsp;-e \/usr\/share\/openstack-tripleo-heat-templates\/environments\/network-isolation.yaml \\<br>&nbsp; &nbsp; &nbsp;-e \/usr\/share\/openstack-tripleo-heat-templates\/environments\/network-environment.yaml \\<br>&nbsp; &nbsp; &nbsp;-e \/usr\/share\/openstack-tripleo-heat-templates\/environments\/services\/neutron-ovs.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/node-info.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/ceph-custom-config.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/network-environment.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/spine-leaf-ctlplane.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/spine-leaf-vips.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/host-memory.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/site-name.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/inject-trust-anchor-hiera.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/containers-prepare-parameter.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/glance_update.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/dcn_ceph.yaml \\<br>&nbsp; &nbsp; &nbsp;&#8211;log-file chrisj-dcn_deployment.log \\<br>&nbsp; &nbsp; &nbsp;&#8211;ntp-server 10.10.0.10<br>&nbsp;<\/p>\n\n\n\n<p>(undercloud) [stack@chrisj-dcn2-undercloud ~]$ cat <strong>deploy-dcn1.sh&nbsp;<\/strong><br>#!\/bin\/bash<br>source ~\/stackrc<br>cd ~\/<br>time openstack overcloud deploy &#8211;templates &#8211;stack chrisj-dcn1 \\<br>&nbsp; &nbsp; &nbsp;-n templates\/network_data_spine_leaf.yaml \\<br>&nbsp; &nbsp; &nbsp;-r templates\/dcn1\/dcn1_roles.yaml \\<br>&nbsp; &nbsp; &nbsp;-e \/usr\/share\/openstack-tripleo-heat-templates\/environments\/ceph-ansible\/ceph-ansible.yaml \\<br>&nbsp; &nbsp; &nbsp;-e \/usr\/share\/openstack-tripleo-heat-templates\/environments\/network-isolation.yaml \\<br>&nbsp; &nbsp; &nbsp;-e \/usr\/share\/openstack-tripleo-heat-templates\/environments\/network-environment.yaml \\<br>&nbsp; &nbsp; &nbsp;-e \/usr\/share\/openstack-tripleo-heat-templates\/environments\/services\/neutron-ovs.yaml \\<br>&nbsp; &nbsp; &nbsp;-e \/usr\/share\/openstack-tripleo-heat-templates\/environments\/dcn-hci.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/host-memory.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/dcn1\/site-name.yaml \\<br>&nbsp; &nbsp; &nbsp;-e dcn-common\/central-export.yaml \\<br>&nbsp; &nbsp; &nbsp;-e dcn-common\/central_ceph_external.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/dcn1\/tuning.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/dcn1\/glance.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/inject-trust-anchor-hiera.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/containers-prepare-parameter.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/dcn1\/dcn1-images-env.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/dcn1\/node-info.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/dcn1\/ceph.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/network-environment.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/spine-leaf-ctlplane.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/spine-leaf-vips.yaml \\<br>&nbsp; &nbsp; &nbsp;&#8211;log-file chrisj-dcn_deployment.log \\<br>&nbsp; &nbsp; &nbsp;&#8211;ntp-server 10.10.0.10<\/p>\n\n\n\n<p>(undercloud) [stack@chrisj-dcn2-undercloud ~]$ cat <strong>deploy-dcn2.sh&nbsp;<\/strong><br>#!\/bin\/bash<br>#############################<br># This is not fully dynamic file and it might have not been populated with all right information. This is a template. You might still want to verify this is what you want before executing it<br>##############################<\/p>\n\n\n\n<p>source ~\/stackrc<br>cd ~\/<br>time openstack overcloud deploy &#8211;templates &#8211;stack chrisj-dcn2 \\<br>&nbsp; &nbsp; &nbsp;-n templates\/network_data_spine_leaf.yaml \\<br>&nbsp; &nbsp; &nbsp;-r templates\/dcn2\/dcn2_roles.yaml \\<br>&nbsp; &nbsp; &nbsp;-e \/usr\/share\/openstack-tripleo-heat-templates\/environments\/network-isolation.yaml \\<br>&nbsp; &nbsp; &nbsp;-e \/usr\/share\/openstack-tripleo-heat-templates\/environments\/network-environment.yaml \\<br>&nbsp; &nbsp; &nbsp;-e \/usr\/share\/openstack-tripleo-heat-templates\/environments\/services\/neutron-ovs.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/dcn2\/site-name.yaml \\<br>&nbsp; &nbsp; &nbsp;-e dcn-common\/central-export.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/inject-trust-anchor-hiera.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/containers-prepare-parameter.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/dcn2\/node-info.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/network-environment.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/spine-leaf-ctlplane.yaml \\<br>&nbsp; &nbsp; &nbsp;-e templates\/spine-leaf-vips.yaml \\<br>&nbsp; &nbsp; &nbsp;&#8211;log-file chrisj-dcn2_deployment.log \\<br>&nbsp; &nbsp; &nbsp;&#8211;ntp-server 10.10.0.10<br>&nbsp;<\/p>\n\n\n\n<p><strong>2. Central location yaml files<\/strong><\/p>\n\n\n\n<p>(undercloud) [stack@chrisj-dcn2-undercloud templates]$ <strong>cat node-info.yaml<\/strong>&nbsp;<br>parameter_defaults:<br>&nbsp; OvercloudControllerFlavor: control<br>&nbsp; OvercloudComputeFlavor: compute<br>&nbsp; OvercloudComputeLeaf1Flavor: compute-leaf1<br>&nbsp; OvercloudComputeLeaf2Flavor: compute-leaf2<br>&nbsp; ComputeLeaf1Count: 0<br>&nbsp; ComputeLeaf2Count: 0<br>&nbsp; ControllerCount: 3<br>&nbsp; ComputeCount: 3<\/p>\n\n\n\n<p>(undercloud) [stack@chrisj-dcn2-undercloud templates]$ <strong>cat ceph-custom-config.yaml&nbsp;<\/strong><br>parameter_defaults:<br>&nbsp; CephAnsibleDisksConfig:<br>&nbsp; &nbsp; devices:<br>&nbsp; &nbsp; &nbsp; &#8211; \/dev\/vdb<br>&nbsp; &nbsp; osd_scenario: lvm<br>&nbsp; &nbsp; osd_objectstore: bluestore<br>&nbsp; CephPoolDefaultPgNum: 16<br>&nbsp; CephPoolDefaultSize: 1<br>&nbsp; CephClusterName: central<br>&nbsp; CephAnsibleExtraConfig:<br>&nbsp; &nbsp; public_network: &#8216;10.40.0.0\/24,10.40.1.0\/24&#8217;<br>&nbsp; &nbsp; cluster_network: &#8216;10.50.0.0\/24,10.50.1.0\/24&#8217;<\/p>\n\n\n\n<p>&nbsp; GlanceEnabledImportMethods: web-download,copy-image<br>&nbsp; GlanceBackend: rbd<br>&nbsp; GlanceStoreDescription: &#8216;central rbd glance store&#8217;<br>&nbsp; GlanceBackendID: central<br>&nbsp; CephClusterName: central<br>&nbsp;<\/p>\n\n\n\n<p>(undercloud) [stack@chrisj-dcn2-undercloud templates]$ <strong>cat network-environment.yaml&nbsp;<\/strong><br>resource_registry:<br>&nbsp; OS::TripleO::Compute::Net::SoftwareConfig:<br>&nbsp; &nbsp; .\/nic-config\/compute-hci.yaml<br>&nbsp; OS::TripleO::ComputeLeaf1::Net::SoftwareConfig:<br>&nbsp; &nbsp; .\/nic-config\/compute-hci-leaf1.yaml<br>&nbsp; OS::TripleO::ComputeLeaf2::Net::SoftwareConfig:<br>&nbsp; &nbsp; .\/nic-config\/compute-leaf2.yaml<br>&nbsp; OS::TripleO::Controller::Net::SoftwareConfig:<br>&nbsp; &nbsp; .\/nic-config\/controller.yaml<br>&nbsp; OS::TripleO::CephStorage::Net::SoftwareConfig:<br>&nbsp; &nbsp; .\/nic-config\/ceph-storage.yaml<\/p>\n\n\n\n<p>parameter_defaults:<br>&nbsp; DnsServers: [&#8220;10.9.71.7&#8243;,&#8221;8.8.8.8&#8221;]<br>&nbsp; NeutronFlatNetworks: &#8216;datacentre,provider0,provider1,provider2&#8217;<br>&nbsp; ControllerParameters:<br>&nbsp; &nbsp; NeutronBridgeMappings: &#8220;datacentre:br-ex,provider0:br-provider&#8221;<br>&nbsp; ComputeParameters:<br>&nbsp; &nbsp; NeutronBridgeMappings: &#8220;provider0:br-provider&#8221;<br>&nbsp; ComputeLeaf1Parameters:<br>&nbsp; &nbsp; NeutronBridgeMappings: &#8220;provider1:br-provider&#8221;<br>&nbsp; ComputeLeaf2Parameters:<br>&nbsp; &nbsp; NeutronBridgeMappings: &#8220;provider2:br-provider&#8221;<br>&nbsp; BondInterfaceOvsOptions: &#8220;bond_mode=active-backup&#8221;<br>&nbsp; TimeZone: &#8216;US\/Eastern&#8217;<br>&nbsp; NtpServer: 10.10.0.10<br>&nbsp; NeutronEnableIsolatedMetadata: true<br>&nbsp;<\/p>\n\n\n\n<p>(undercloud) [stack@chrisj-dcn2-undercloud templates]$ <strong>cat spine-leaf-ctlplane.yaml&nbsp;<\/strong><br>parameter_defaults:<br>&nbsp; ControllerControlPlaneSubnet: leaf0<br>&nbsp; ComputeControlPlaneSubnet: leaf0<br>&nbsp; ComputeLeaf1ControlPlaneSubnet: leaf1<br>&nbsp; ComputeLeaf2ControlPlaneSubnet: leaf2<br>(undercloud) [stack@chrisj-dcn2-undercloud templates]$ <strong>cat spine-leaf-vips.yaml&nbsp;<\/strong><br>parameter_defaults:<br>&nbsp; VipSubnetMap:<br>&nbsp; &nbsp; ctlplane: leaf0<\/p>\n\n\n\n<p>(undercloud) [stack@chrisj-dcn2-undercloud templates]$ <strong>cat site-name.yaml&nbsp;<\/strong><br>parameter_defaults:<br>&nbsp; &nbsp; NovaComputeAvailabilityZone: central<br>&nbsp; &nbsp; ControllerExtraConfig:<br>&nbsp; &nbsp; &nbsp; &nbsp; nova::availability_zone::default_schedule_zone: central<br>&nbsp; &nbsp; NovaCrossAZAttach: false<br>&nbsp; &nbsp; CinderStorageAvailabilityZone: central<br>&nbsp; &nbsp; GlanceBackendID: central<br>&nbsp;<\/p>\n\n\n\n<p><strong>3. DCN1 location yaml files<\/strong><\/p>\n\n\n\n<p>(undercloud) [stack@chrisj-dcn2-undercloud templates]$ cat<strong> dcn1\/ceph.yam<\/strong>l&nbsp;<br>parameter_defaults:<br>&nbsp; CephAnsibleDisksConfig:<br>&nbsp; &nbsp; devices:<br>&nbsp; &nbsp; &nbsp; &#8211; \/dev\/vdb<br>&nbsp; &nbsp; osd_scenario: lvm<br>&nbsp; &nbsp; osd_objectstore: bluestore<br>&nbsp; CephPoolDefaultPgNum: 16<br>&nbsp; CephPoolDefaultSize: 1<br>&nbsp; CephClusterName: dcn1<br>(undercloud) [stack@chrisj-dcn2-undercloud templates]$ cat <strong>dcn1\/glance.yaml&nbsp;<\/strong><br>parameter_defaults:<br>&nbsp; GlanceEnabledImportMethods: web-download,copy-image<br>&nbsp; GlanceBackend: rbd<br>&nbsp; GlanceStoreDescription: &#8216;dcn1 rbd glance store&#8217;<br>&nbsp; GlanceBackendID: dcn1<br>&nbsp; GlanceMultistoreConfig:<br>&nbsp; &nbsp; central:<br>&nbsp; &nbsp; &nbsp; GlanceBackend: rbd<br>&nbsp; &nbsp; &nbsp; GlanceStoreDescription: &#8216;central rbd glance store&#8217;<br>&nbsp; &nbsp; &nbsp; CephClientUserName: &#8216;openstack&#8217;<br>&nbsp; &nbsp; &nbsp; CephClusterName: central<br>(undercloud) [stack@chrisj-dcn2-undercloud templates]$ cat<strong> dcn1\/node-info.yaml&nbsp;<\/strong><br>parameter_defaults:<br>&nbsp; ControllerCount: 0<br>&nbsp; ComputeCount: 0<br>&nbsp; OvercloudControllerFlavor: control<br>&nbsp; OvercloudComputeFlavor: compute<br>&nbsp; OvercloudComputeLeaf1Flavor: compute-leaf1<br>&nbsp; OvercloudComputeLeaf2Flavor: compute-leaf2<br>&nbsp; ComputeLeaf1Count: 3<br>&nbsp; ComputeLeaf2Count: 0<\/p>\n\n\n\n<p>(undercloud) [stack@chrisj-dcn2-undercloud templates]$ cat <strong>dcn1\/site-name.yaml&nbsp;<\/strong><br>parameter_defaults:<br>&nbsp; &nbsp; NovaComputeAvailabilityZone: dcn1<br>&nbsp; &nbsp; NovaCrossAZAttach: false<br>&nbsp; &nbsp; CinderStorageAvailabilityZone: dcn1<br>&nbsp; &nbsp; CinderVolumeCluster: dcn1<\/p>\n\n\n\n<p>&nbsp; &nbsp; ComputeLeaf1ExtraConfig:<br>&nbsp; &nbsp; &nbsp; neutron::agents::dhcp::availability_zone: &#8216;dcn1&#8217;<br>&nbsp;<\/p>\n\n\n\n<p><strong>4. DCN2&nbsp;location yaml files<\/strong><\/p>\n\n\n\n<p>(undercloud) [stack@chrisj-dcn2-undercloud templates]$ <strong>cat dcn2\/node-info.yaml&nbsp;<\/strong><br>parameter_defaults:<br>&nbsp; ControllerCount: 0<br>&nbsp; ComputeCount: 0<br>&nbsp; OvercloudControllerFlavor: control<br>&nbsp; OvercloudComputeFlavor: compute<br>&nbsp; OvercloudComputeLeaf1Flavor: compute-leaf1<br>&nbsp; OvercloudComputeLeaf2Flavor: compute-leaf2<br>&nbsp; ComputeLeaf1Count: 0<br>&nbsp; ComputeLeaf2Count: 1<\/p>\n\n\n\n<p>(undercloud) [stack@chrisj-dcn2-undercloud templates]$ <strong>cat dcn2\/site-name.yaml&nbsp;<\/strong><br>parameter_defaults:<br>&nbsp; &nbsp; NovaComputeAvailabilityZone: dcn2<br>&nbsp; &nbsp; NovaCrossAZAttach: false<br>&nbsp; &nbsp; RootStackName: dcn2<br>&nbsp; &nbsp; ManageNetworks: false<\/p>\n\n\n\n<p>&nbsp; &nbsp; ComputeLeaf2ExtraConfig:<br>&nbsp; &nbsp; &nbsp; neutron::agents::dhcp::availability_zone: &#8216;dcn2&#8217;<br>&nbsp;<\/p>\n\n\n\n<p><strong>5. YAML files added to central location post DCN deployment<\/strong><\/p>\n\n\n\n<p>(undercloud) [stack@chrisj-dcn2-undercloud templates]$ <strong>cat glance_update.yaml<\/strong><br>parameter_defaults:<br>&nbsp; GlanceEnabledImportMethods: web-download,copy-image<br>&nbsp; GlanceBackend: rbd<br>&nbsp; GlanceStoreDescription: &#8216;central rbd glance store&#8217;<br>&nbsp; GlanceBackendID: central<br>&nbsp; CephClusterName: central<br>&nbsp; GlanceMultistoreConfig:<br>&nbsp; &nbsp; dcn1:<br>&nbsp; &nbsp; &nbsp; GlanceBackend: rbd<br>&nbsp; &nbsp; &nbsp; GlanceStoreDescription: &#8216;dcn1 rbd glance store&#8217;<br>&nbsp; &nbsp; &nbsp; CephClientUserName: &#8216;openstack&#8217;<br>&nbsp; &nbsp; &nbsp; CephClusterName: dcn1<br>&nbsp; &nbsp; &nbsp; GlanceBackendID: dcn1<\/p>\n\n\n\n<p>(undercloud) [stack@chrisj-dcn2-undercloud templates]$ <strong>cat dcn_ceph.yaml&nbsp;<\/strong><br>parameter_defaults:<br>&nbsp; CephExternalMultiConfig:<br>&nbsp; &#8211; ceph_conf_overrides:<br>&nbsp; &nbsp; &nbsp; client:<br>&nbsp; &nbsp; &nbsp; &nbsp; keyring: \/etc\/ceph\/dcn1.client.openstack.keyring<br>&nbsp; &nbsp; cluster: dcn1<br>&nbsp; &nbsp; dashboard_enabled: false<br>&nbsp; &nbsp; external_cluster_mon_ips: 10.40.1.82,10.40.1.141,10.40.1.158<br>&nbsp; &nbsp; fsid: secret<br>&nbsp; &nbsp; keys:<br>&nbsp; &nbsp; &#8211; caps:<br>&nbsp; &nbsp; &nbsp; &nbsp; mgr: allow *<br>&nbsp; &nbsp; &nbsp; &nbsp; mon: profile rbd<br>&nbsp; &nbsp; &nbsp; &nbsp; osd: profile rbd pool=vms, profile rbd pool=volumes, profile rbd pool=images<br>&nbsp; &nbsp; &nbsp; key: secret<br>&nbsp; &nbsp; &nbsp; mode: &#8216;0600&#8217;<br>&nbsp; &nbsp; &nbsp; name: client.openstack<\/p>\n\n\n\n<p><strong>III. Summary<\/strong><\/p>\n\n\n\n<p>I must admit that I had a lot of fun exploring&nbsp;the Edge\/DCN capabilities in OSP 16.1. Getting to the MVP was not easy mostly due to lack of or incomplete documentation, but once I got it fully up it was &#8220;no brainer&#8221; to add or adjust it&#8217;s features.<\/p>\n\n\n\n<p>I hope this additional documentation helps someone get it up in their private&nbsp;cloud. It&#8217;s definitely&nbsp;worth the try.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I have hesitated to post anything about Red Hat OpenStack Edge since it got introduced in OSP13 simply because I found it quite difficult to consume. Also the storage situation back then was .. not","protected":false},"author":1,"featured_media":75,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[1],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/chrisj.cloud\/index.php\/wp-json\/wp\/v2\/posts\/74"}],"collection":[{"href":"https:\/\/chrisj.cloud\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/chrisj.cloud\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/chrisj.cloud\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/chrisj.cloud\/index.php\/wp-json\/wp\/v2\/comments?post=74"}],"version-history":[{"count":1,"href":"https:\/\/chrisj.cloud\/index.php\/wp-json\/wp\/v2\/posts\/74\/revisions"}],"predecessor-version":[{"id":77,"href":"https:\/\/chrisj.cloud\/index.php\/wp-json\/wp\/v2\/posts\/74\/revisions\/77"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/chrisj.cloud\/index.php\/wp-json\/wp\/v2\/media\/75"}],"wp:attachment":[{"href":"https:\/\/chrisj.cloud\/index.php\/wp-json\/wp\/v2\/media?parent=74"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/chrisj.cloud\/index.php\/wp-json\/wp\/v2\/categories?post=74"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/chrisj.cloud\/index.php\/wp-json\/wp\/v2\/tags?post=74"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}