node
|
|
identity
(keystone)
|
image
(glance)
|
compute
(nova)
|
network (neutron)
|
network
(nova-network)
|
block storage
(cinder)
|
object storage
(swift)
|
controller-node
|
mysql -u root -p |
CREATE DATABASE
keystone;
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' \
IDENTIFIED BY 'KEYSTONE_DBPASS';
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' \
IDENTIFIED BY 'KEYSTONE_DBPASS';
|
CREATE DATABASE
glance;
GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' \
IDENTIFIED BY 'GLANCE_DBPASS';
GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' \
IDENTIFIED BY 'GLANCE_DBPASS';
|
CREATE DATABASE
nova;
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' \
IDENTIFIED BY 'NOVA_DBPASS';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' \
IDENTIFIED BY 'NOVA_DBPASS'; |
CREATE DATABASE
neutron;
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' \
IDENTIFIED BY 'NEUTRON_DBPASS';
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' \
IDENTIFIED BY 'NEUTRON_DBPASS';
|
|
CREATE DATABASE
cinder;
GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' \
IDENTIFIED BY 'CINDER_DBPASS';
GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'%' \
IDENTIFIED BY 'CINDER_DBPASS';
|
|
source admin-openrc.sh |
- export OS_SERVICE_TOKEN=ADMIN_TOKEN
- export OS_SERVICE_TOKEN=294a4c8a8a475f9b9836
- export
OS_SERVICE_ENDPOINT=http://controller:35357/v2.0
|
|
|
|
|
|
|
- keystone tenant-create
--name admin --description "Admin Tenant"
- keystone user-create
--name admin --pass ADMIN_PASS --email EMAIL_ADDRESS
- keystone role-create
--name admin
- keystone user-role-add
--user admin --tenant admin --role admin
- keystone tenant-create
--name demo --description "Demo Tenant"
- keystone user-create
--name demo --tenant demo --pass DEMO_PASS --email EMAIL_ADDRESS
- keystone tenant-create
--name service --description "Service Tenant"
|
- keystone user-create
--name glance --pass GLANCE_PASS
- keystone user-role-add
--user glance --tenant service --role admin
|
- keystone user-create
--name nova --pass NOVA_PASS
- keystone user-role-add
--user nova --tenant service --role admin
|
- keystone user-create
--name neutron --pass NEUTRON_PASS
- keystone user-role-add
--user neutron --tenant service --role admin
|
|
- keystone user-create
--name cinder --pass CINDER_PASS
- keystone user-role-add
--user cinder --tenant service --role admin
|
- keystone user-create
--name swift --pass SWIFT_PASS
- keystone user-role-add
--user swift --tenant service --role admin
|
- keystone service-create
--name keystone --type identity --description "OpenStack Identity"
- keystone endpoint-create
--service-id $(keystone service-list | awk '/ identity / {print
$2}') --publicurl http://controller:5000/v2.0 --internalurl
http://controller:5000/v2.0 --adminurl http://controller:35357/v2.0
--region regionOne
|
- keystone service-create
--name glance --type image --description "OpenStack Image Service"
- keystone endpoint-create
--service-id $(keystone service-list | awk '/ image / {print $2}')
--publicurl http://controller:9292 --internalurl http://controller:9292
--adminurl http://controller:9292 --region regionOne
|
- keystone service-create
--name nova --type compute --description "OpenStack Compute"
- keystone endpoint-create
--service-id $(keystone service-list | awk '/ compute / {print $2}')
--publicurl http://controller:8774/v2/%\(tenant_id\)s --internalurl
http://controller:8774/v2/%\(tenant_id\)s --adminurl
http://controller:8774/v2/%\(tenant_id\)s --region regionOne
|
- keystone service-create
--name neutron --type network --description "OpenStack Networking"
- keystone endpoint-create
--service-id $(keystone service-list | awk '/ network / {print $2}')
--publicurl http://controller:9696 --adminurl http://controller:9696
--internalurl http://controller:9696 --region regionOne
|
|
- keystone service-create
--name cinder --type volume --description "OpenStack Block Storage"
- keystone service-create
--name cinderv2 --type volumev2 --description "OpenStack Block Storage"
- keystone endpoint-create
--service-id $(keystone service-list | awk '/ volume / {print
$2}')
--publicurl http://controller:8776/v1/%\(tenant_id\)s
--internalurl http://controller:8776/v1/%\(tenant_id\)s
--adminurl http://controller:8776/v1/%\(tenant_id\)s
--region regionOne
- keystone endpoint-create
--service-id $(keystone service-list | awk '/ volumev2 / {print
$2}')
--publicurl http://controller:8776/v2/%\(tenant_id\)s
--internalurl http://controller:8776/v2/%\(tenant_id\)s
--adminurl http://controller:8776/v2/%\(tenant_id\)s --region
regionOne
|
- keystone service-create
--name swift --type object-store --description "OpenStack Object
Storage"
- keystone endpoint-create
--service-id $(keystone service-list | awk '/ object-store / {print
$2}') --publicurl 'http://controller:8080/v1/AUTH_%(tenant_id)s'
--internalurl 'http://controller:8080/v1/AUTH_%(tenant_id)s'
--adminurl http://controller:8080--region regionOne
|
yum install |
- yum install openstack-keystone
python-keystoneclient
|
- yum install openstack-glance
python-glanceclient
|
yum install
openstack-nova-api openstack-nova-cert openstack-nova-conductor \
openstack-nova-console openstack-nova-novncproxy
openstack-nova-scheduler \
python-novaclient |
- yum install openstack-neutron
openstack-neutron-ml2 python-neutronclient which
|
|
- yum install openstack-cinder
python-cinderclient python-oslo-db
|
- yum install openstack-swift-proxy
python-swiftclient python-keystone-auth-token python-keystonemiddleware
memcached
|
/etc/*/*.conf |
...
|
...
|
...
|
- /etc/neutron/neutron.conf
- [database]
...
connection = mysql://neutron:NEUTRON_DBPASS@controller/neutron
- [DEFAULT]
...
rpc_backend = rabbit
rabbit_host = controller
rabbit_password = RABBIT_PASS
- [DEFAULT]
...
auth_strategy = keystone
[keystone_authtoken]
...
auth_uri = http://controller:5000/v2.0
identity_uri = http://controller:35357
admin_tenant_name = service
admin_user = neutron
admin_password = NEUTRON_PASS
- [DEFAULT]
...
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = True
- [DEFAULT]
...
notify_nova_on_port_status_changes = True
notify_nova_on_port_data_changes = True
nova_url = http://controller:8774/v2
nova_admin_auth_url = http://controller:35357/v2.0
nova_region_name = regionOne
nova_admin_username = nova
nova_admin_tenant_id = SERVICE_TENANT_ID
nova_admin_password = NOVA_PASS
- [DEFAULT]
...
verbose = True
- /etc/neutron/plugins/ml2/ml2_conf.ini
- [ml2]
...
type_drivers = flat,gre
tenant_network_types = gre
mechanism_drivers = openvswitch
- [ml2_type_gre]
...
tunnel_id_ranges = 1:1000
- [securitygroup]
...
enable_security_group = True
enable_ipset = True
firewall_driver =
neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
- /etc/nova/nova.conf
- [DEFAULT]
...
network_api_class = nova.network.neutronv2.api.API
security_group_api = neutron
linuxnet_interface_driver =
nova.network.linux_net.LinuxOVSInterfaceDriver
firewall_driver = nova.virt.firewall.NoopFirewallDriver
- [neutron]
...
url = http://controller:9696
auth_strategy = keystone
admin_auth_url = http://controller:35357/v2.0
admin_tenant_name = service
admin_username = neutron
admin_password = NEUTRON_PASS
- [neutron]
...
service_metadata_proxy = True
metadata_proxy_shared_secret = METADATA_SECRET
|
- /etc/nova/nova.conf
- [DEFAULT]
...
network_api_class = nova.network.api.API
security_group_api = nova
|
- /etc/cinder/cinder.conf
- [database]
...
connection = mysql://cinder:CINDER_DBPASS@controller/cinder
- [DEFAULT]
...
rpc_backend = rabbit
rabbit_host = controller
rabbit_password = RABBIT_PASS
- [DEFAULT]
...
auth_strategy = keystone
[keystone_authtoken]
...
auth_uri = http://controller:5000/v2.0
identity_uri = http://controller:35357
admin_tenant_name = service
admin_user = cinder
admin_password = CINDER_PASS
- [DEFAULT]
...
my_ip = 10.0.0.11
- [DEFAULT]
...
verbose = True
|
- curl -o /etc/swift/proxy-server.conf
https://raw.githubusercontent.com/openstack/swift/stable/juno/etc/proxy-server.conf-sample
- /etc/swift/proxy-server.conf
- [DEFAULT]
...
bind_port = 8080
user = swift
swift_dir = /etc/swift
- [pipeline:main]
pipeline = authtoken cache healthcheck keystoneauth proxy-logging
proxy-server
- [app:proxy-server]
...
allow_account_management = true
account_autocreate = true
- [filter:keystoneauth]
use = egg:swift#keystoneauth
...
operator_roles = admin,_member_
- [filter:authtoken]
paste.filter_factory = keystonemiddleware.auth_token:filter_factory
...
auth_uri = http://controller:5000/v2.0
identity_uri = http://controller:35357
admin_tenant_name = service
admin_user = swift
admin_password = SWIFT_PASS
delay_auth_decision = true
- [filter:cache]
...
memcache_servers = 127.0.0.1:11211
|
populate db
|
su -s /bin/sh -c
"keystone-manage db_sync" keystone
|
su -s /bin/sh -c
"glance-manage db_sync" glance
|
su -s /bin/sh -c
"nova-manage db sync" nova |
|
|
su -s /bin/sh -c
"cinder-manage db sync" cinder
|
|
systemctl
|
- systemctl enable openstack-keystone.service
- systemctl start openstack-keystone.service
|
- systemctl enable
openstack-glance-api.service openstack-glance-registry.service
- systemctl start
openstack-glance-api.service openstack-glance-registry.service
|
- systemctl enable openstack-nova-api.service
openstack-nova-cert.service
openstack-nova-consoleauth.service
openstack-nova-scheduler.service openstack-nova-conductor.service
openstack-nova-novncproxy.service
- systemctl start openstack-nova-api.service
openstack-nova-cert.service openstack-nova-consoleauth.service
openstack-nova-scheduler.service openstack-nova-conductor.service
openstack-nova-novncproxy.service
|
|
- systemctl restart
openstack-nova-api.service openstack-nova-scheduler.service
openstack-nova-conductor.service
|
- systemctl enable
openstack-cinder-api.service openstack-cinder-scheduler.service
- systemctl start
openstack-cinder-api.service openstack-cinder-scheduler.service
|
|
initial rings |
|
|
|
|
|
|
- cd /etc/swift
- swift-ring-builder account.builder create 10 3 1
- swift-ring-builder account.builder add r1z1-10.0.0.51:6002/sdb1 100
- swift-ring-builder account.builder add r1z1-10.0.0.51:6002/sdc1 100
- swift-ring-builder account.builder add r1z1-10.0.0.52:6002/sdb1 100
- swift-ring-builder account.builder add r1z1-10.0.0.52:6002/sdc1 100
- swift-ring-builder account.builder
- swift-ring-builder account.builder rebalance
- swift-ring-builder container.builder create 10 3 1
- swift-ring-builder container.builder add r1z1-10.0.0.51:6001/sdb1 100
- swift-ring-builder container.builder add r1z1-10.0.0.51:6001/sdc1 100
- swift-ring-builder container.builder add r1z1-10.0.0.52:6001/sdb1 100
- swift-ring-builder container.builder add r1z1-10.0.0.52:6001/sdc1 100
- swift-ring-builder container.builder
- swift-ring-builder container.builder rebalance
- swift-ring-builder object.builder create 10 3 1
- swift-ring-builder object.builder add r1z1-10.0.0.51:6000/sdb1 100
- swift-ring-builder object.builder add r1z1-10.0.0.51:6000/sdc1 100
- swift-ring-builder object.builder add r1z1-10.0.0.52:6000/sdb1 100
- swift-ring-builder object.builder add r1z1-10.0.0.52:6000/sdc1 100
- swift-ring-builder object.builder
- swift-ring-builder object.builder rebalance
- scp account.ring.gz root@10.0.0.51:/etc/swift
- scp account.ring.gz root@10.0.0.52:/etc/swift
- scp container.ring.gz root@10.0.0.51:/etc/swift
- scp container.ring.gz root@10.0.0.52:/etc/swift
- scp object.ring.gz root@10.0.0.51:/etc/swift
- scp object.ring.gz root@10.0.0.52:/etc/swift
|
|
finalize swift installation
|
|
|
|
|
|
|
- curl -o /etc/swift/swift.conf https://raw.githubusercontent.com/openstack/swift/stable/juno/etc/swift.conf-sample
- /etc/swift/swift.conf
- [swift-hash]
...
swift_hash_path_suffix = HASH_PATH_PREFIX
swift_hash_path_prefix = HASH_PATH_SUFFIX
- [storage-policy:0]
...
name = Policy-0
default = yes
- scp swift.conf root@10.0.0.51:/etc/swift
- scp swift.conf root@10.0.0.52:/etc/swift
- chown -R swift:swift /etc/swift
- systemctl enable openstack-swift-proxy.service memcached.service
- systemctl start openstack-swift-proxy.service memcached.service
|
compute-node |
yum install |
|
|
- yum install openstack-nova-compute
sysfsutils
|
- yum install openstack-neutron-ml2
openstack-neutron-openvswitch
|
|
|
|
/etc/*/*.conf |
|
|
|
- /etc/neutron/neutron.conf
- [database]
- [DEFAULT]
...
rpc_backend = rabbit
rabbit_host = controller
rabbit_password = RABBIT_PASS
- [DEFAULT]
...
auth_strategy = keystone
[keystone_authtoken]
...
auth_uri = http://controller:5000/v2.0
identity_uri = http://controller:35357
admin_tenant_name = service
admin_user = neutron
admin_password = NEUTRON_PASS
- [DEFAULT]
...
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = True
- [DEFAULT]
...
verbose = True
- /etc/neutron/plugins/ml2/ml2_conf.ini
- [ml2]
...
type_drivers = flat,gre
tenant_network_types = gre
mechanism_drivers = openvswitch
- [ml2_type_gre]
...
tunnel_id_ranges = 1:1000
- [securitygroup]
...
enable_security_group = True
enable_ipset = True
firewall_driver =
neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
- [ovs]
...
local_ip = INSTANCE_TUNNELS_INTERFACE_IP_ADDRESS
enable_tunneling = True
- [agent]
...
tunnel_types = gre
- /etc/nova/nova.conf
- [DEFAULT]
...
network_api_class = nova.network.neutronv2.api.API
security_group_api = neutron
linuxnet_interface_driver =
nova.network.linux_net.LinuxOVSInterfaceDriver
firewall_driver = nova.virt.firewall.NoopFirewallDriver
- [neutron]
...
url = http://controller:9696
auth_strategy = keystone
admin_auth_url = http://controller:35357/v2.0
admin_tenant_name = service
admin_username = neutron
admin_password = NEUTRON_PASS
|
|
|
|
systemctl |
|
|
- systemctl enable libvirtd.service
openstack-nova-compute.service
- systemctl start libvirtd.service
openstack-nova-compute.service
|
- systemctl enable openvswitch.service
- systemctl start openvswitch.service
|
|
|
|
network-node
|
prerequisites
|
|
|
|
- /etc/sysctl.conf
- net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
- sysctl -p
|
|
|
|
yum install
|
|
|
|
- yum install openstack-neutron
openstack-neutron-ml2 openstack-neutron-openvswitch
|
|
|
|
/etc/*/*.conf |
|
|
|
- /etc/neutron/neutron.conf
- [database]
- [DEFAULT]
...
rpc_backend = rabbit
rabbit_host = controller
rabbit_password = RABBIT_PASS
- [DEFAULT]
...
auth_strategy = keystone
[keystone_authtoken]
...
auth_uri = http://controller:5000/v2.0
identity_uri = http://controller:35357
admin_tenant_name = service
admin_user = neutron
admin_password = NEUTRON_PASS
- [DEFAULT]
...
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = True
- [DEFAULT]
...
verbose = True
- /etc/neutron/plugins/ml2/ml2_conf.ini
- [ml2]
...
type_drivers = flat,gre
tenant_network_types = gre
mechanism_drivers = openvswitch
- [ml2_type_flat]
...
flat_networks = external
- [ml2_type_gre]
...
tunnel_id_ranges = 1:1000
- [securitygroup]
...
enable_security_group = True
enable_ipset = True
firewall_driver =
neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
- [ovs]
...
local_ip = INSTANCE_TUNNELS_INTERFACE_IP_ADDRESS
enable_tunneling = True
bridge_mappings = external:br-ex
- [agent]
...
tunnel_types = gre
- /etc/neutron/l3_agent.ini
- [DEFAULT]
...
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
use_namespaces = True
external_network_bridge = br-ex
router_delete_namespaces = True
- [DEFAULT]
...
verbose = True
- /etc/neutron/dhcp_agent.ini
- [DEFAULT]
...
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
use_namespaces = True
dhcp_delete_namespaces = True
- [DEFAULT]
...
verbose = True
- /etc/neutron/metadata_agent.ini
- [DEFAULT]
...
auth_url = http://controller:5000/v2.0
auth_region = regionOne
admin_tenant_name = service
admin_user = neutron
admin_password = NEUTRON_PASS
- [DEFAULT]
...
nova_metadata_ip = controller
- [DEFAULT]
...
metadata_proxy_shared_secret = METADATA_SECRET
- [DEFAULT]
...
verbose = True
|
|
|
|
OVS+conf
|
|
|
|
- systemctl enable openvswitch.service
- systemctl start openvswitch.service
- ovs-vsctl add-br br-ex
- ovs-vsctl add-port br-ex INTERFACE_NAME
|
|
|
|
block1-node
|
LVM
|
|
|
|
|
|
- systemctl enable lvm2-lvmetad.service
- systemctl start lvm2-lvmetad.service
- pvcreate /dev/sdb1
- vgcreate cinder-volumes /dev/sdb1
- /etc/lvm/lvm.conf
- devices {
...
filter = [ "a/sdb/", "r/.*/"]
|
|
yum install |
|
|
|
|
|
yum install
openstack-cinder targetcli python-oslo-db MySQL-python
|
|
/etc/*/*.conf
|
|
|
|
|
|
- /etc/cinder/cinder.conf
- [database]
...
connection = mysql://cinder:CINDER_DBPASS@controller/cinder
- [DEFAULT]
...
rpc_backend = rabbit
rabbit_host = controller
rabbit_password = RABBIT_PASS
- [DEFAULT]
...
auth_strategy = keystone
[keystone_authtoken]
...
auth_uri = http://controller:5000/v2.0
identity_uri = http://controller:35357
admin_tenant_name = service
admin_user = cinder
admin_password = CINDER_PASS
- [DEFAULT]
...
my_ip = MANAGEMENT_INTERFACE_IP_ADDRESS
- [DEFAULT]
...
glance_host = controller
- [DEFAULT]
...
iscsi_helper = lioadm
- [DEFAULT]
...
verbose = True
|
|
systemctl
|
|
|
|
|
|
- systemctl enable
openstack-cinder-volume.service target.service
- systemctl start
openstack-cinder-volume.service target.service
|
|
object1-node
object2-node
|
prerequisites
(disc addicional)
|
|
|
|
|
|
|
- yum install xfsprogs rsync
- mkfs.xfs /dev/sdb1
- mkfs.xfs /dev/sdc1
- mkdir -p /srv/node/sdb1
- mkdir -p /srv/node/sdc1
- /etc/fstab
- /dev/sdb1
/srv/node/sdb1 xfs noatime,nodiratime,nobarrier,logbufs=8 0 2
/dev/sdc1 /srv/node/sdc1 xfs noatime,nodiratime,nobarrier,logbufs=8 0 2
- mount /srv/node/sdb1
- mount /srv/node/sdc1
- /etc/rsync.d
- uid = swift
gid = swift
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
address = MANAGEMENT_INTERFACE_IP_ADDRESS
[account]
max connections = 2
path = /srv/node/
read only = false
lock file = /var/lock/account.lock
[container]
max connections = 2
path = /srv/node/
read only = false
lock file = /var/lock/container.lock
[object]
max connections = 2
path = /srv/node/
read only = false
lock file = /var/lock/object.lock
- systemctl enable rsyncd.service
- systemctl start rsyncd.service
|
yum install |
|
|
|
|
|
|
- yum install openstack-swift-account
openstack-swift-container openstack-swift-object
|
conf
|
|
|
|
|
|
|
- curl -o /etc/swift/account-server.conf
https://raw.githubusercontent.com/openstack/swift/stable/juno/etc/account-server.conf-sample
- /etc/swift/account-server.conf
- [DEFAULT]
...
bind_ip = MANAGEMENT_INTERFACE_IP_ADDRESS
bind_port = 6002
user = swift
swift_dir = /etc/swift
devices = /srv/node
- [pipeline:main]
pipeline = healthcheck recon account-server
- [filter:recon]
...
recon_cache_path = /var/cache/swift
- curl -o /etc/swift/container-server.conf
https://raw.githubusercontent.com/openstack/swift/stable/juno/etc/container-server.conf-sample
- /etc/swift/container-server.conf
- [DEFAULT]
...
bind_ip = MANAGEMENT_INTERFACE_IP_ADDRESS
bind_port = 6001
user = swift
swift_dir = /etc/swift
devices = /srv/node
- [pipeline:main]
pipeline = healthcheck recon container-server
- [filter:recon]
...
recon_cache_path = /var/cache/swift
- curl -o /etc/swift/object-server.conf
https://raw.githubusercontent.com/openstack/swift/stable/juno/etc/object-server.conf-sample
- /etc/swift/object-server.conf
- [DEFAULT]
...
bind_ip = MANAGEMENT_INTERFACE_IP_ADDRESS
bind_port = 6000
user = swift
swift_dir = /etc/swift
devices = /srv/node
- [pipeline:main]
pipeline = healthcheck recon object-server
- [filter:recon]
...
recon_cache_path = /var/cache/swift
|
postrequisites
|
|
|
|
|
|
|
- chown -R swift:swift /srv/node
- mkdir -p /var/cache/swift
- chown -R swift:swift /var/cache/swift
|
finalize installation
|
|
|
|
|
|
|
- chown -R swift:swift /etc/swift
- systemctl enable openstack-swift-account.service openstack-swift-account-auditor.service \
openstack-swift-account-reaper.service openstack-swift-account-replicator.service
- systemctl start openstack-swift-account.service openstack-swift-account-auditor.service \
openstack-swift-account-reaper.service openstack-swift-account-replicator.service
- systemctl enable openstack-swift-container.service openstack-swift-container-auditor.service \
openstack-swift-container-replicator.service openstack-swift-container-updater.service
- systemctl start openstack-swift-container.service openstack-swift-container-auditor.service \
openstack-swift-container-replicator.service openstack-swift-container-updater.service
- systemctl enable openstack-swift-object.service openstack-swift-object-auditor.service \
openstack-swift-object-replicator.service openstack-swift-object-updater.service
- systemctl start openstack-swift-object.service openstack-swift-object-auditor.service \
openstack-swift-object-replicator.service openstack-swift-object-updater.service
|
|
|
identity
(keystone) |
image
(glance) |
compute
(nova) |
network
(neutron) |
network
(nova-network) |
block storage
(cinder)
|
object storage
(swift)
|