Helion OpenStack 1.1.1 integrazione con 3PAR Storage
2015-10-22
Machine-translated — the English original is authoritative.
Un altro giorno, un'altra integrazione OpenStack: oggi ho integrato lo storage 3PAR tramite iSCSI con HOS 1.1.1 per l'uso con lo storage a blocchi di cinder (alias volumi o storage persistente). Come sempre, prima di iniziare, verifica i prerequisiti hardware più recenti qui – http://docs.hpcloud.com/#commercial/GA1/1.1commercial.install-GA-supportmatrix.html.
Prerequisiti
Si presuppone che questo post del blog non conosca nulla dello storage 3PAR e che ci sia un amministratore dello storage nelle vicinanze per configurare il 3PAR stesso. L'amministratore del 3PAR dovrà assicurarsi che l'API Web Service (WSAPI) sia abilitata e fornirti i dettagli di configurazione [nome utente, password, endpoint API, porta]. Può abilitarla SSHandosi sul controller dello storage e configurandolo tramite la CLi: non serve essere dei geni. Avrai inoltre bisogno di almeno un Common Provisioning Group (CPG) configurato come pool di storage da cui cinder possa ritagliare i Volumi.
Sia gli indirizzi IP di gestione che quelli iSCSI dovranno essere accessibili dalla LAN di gestione e le porte rilevanti dovranno essere aperte su eventuali firewall tra queste reti. Lo strumento netcat o nc, dettagliato nel mio post precedente, sarà utile se dovessi verificare la connettività tra queste reti.
L'ultimo prerequisito è disporre di un sistema HOS 1.1.1 completamente installato e configurato con cui integrarsi 🙂
Integrazione
1. Registra StoreServ nell'inventario della cloud
[Nota: ho utilizzato l'opzione –debug per maggiori dettagli, non è necessaria]
# sirius --debug register-storeserv --name 7200_01 --hostname 10.223.148.158 --username storadm --password bananas --port 8080 --san-ip 10.223.148.158 --san-username storadm --san-password bananas --device-type iscsi --iscsi-ip 10.123.25.250 |& tee 3par_error.log
DEBUG (v2:77) Making authentication request to http://127.0.0.1:5000/v2.0/tokens
INFO (connectionpool:188) Starting new HTTP connection (1): 127.0.0.1
DEBUG (connectionpool:364) "POST /v2.0/tokens HTTP/1.1" 200 3860
DEBUG (iso8601:184) Parsed 2015-10-22T10:55:30Z into {'tz_sign': None, 'second_fraction': None, 'hour': u'10', 'daydash': u'22', 'tz_hour': None, 'month': None, 'timezone': u'Z', 'second': u'30', 'tz_minute': None, 'year': u'2015', 'separator': u'T', 'monthdash': u'10', 'day': None, 'minute': u'55'} with default timezone <iso8601.iso8601.Utc object at 0x7fcb3fc0c090>
DEBUG (iso8601:140) Got u'2015' for 'year' with default None
DEBUG (iso8601:140) Got u'10' for 'monthdash' with default 1
DEBUG (iso8601:140) Got 10 for 'month' with default 10
DEBUG (iso8601:140) Got u'22' for 'daydash' with default 1
DEBUG (iso8601:140) Got 22 for 'day' with default 22
DEBUG (iso8601:140) Got u'10' for 'hour' with default None
DEBUG (iso8601:140) Got u'55' for 'minute' with default None
DEBUG (iso8601:140) Got u'30' for 'second' with default None
DEBUG (http:110) curl -i -X POST -H 'X-Auth-Token: 6dd66fa3130f4ec38fdda6e43e3553be' -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'User-Agent: python-siriusclient' -d '{"username": "storadm", "iscsi_ip": "10.123.25.250", "san_password": "bananas", "hostname": "10.223.148.158", "device_type": "iscsi", "san_username": "storadm", "password": "bananas", "san_ip": "10.223.148.158",
port": "8080", "name": "7200_01"}' http://10.123.25.14:9000/v1/block/device/storeserv
DEBUG (http:120)
HTTP/1.0 200 OK
date: Thu, 22 Oct 2015 06:55:31 GMT
content-length: 439
content-type: application/json; charset=UTF-8
server: WSGIServer/0.1 Python/2.7.8
{"storeserv": {"username": "storadm", "status": "registered", "san_password": "bananas", "deleted": false, "updated_at": "2015-10-22 06:55:31.262364", "device_type": "iscsi", "san_username": "storadm", "password": "bananas", "san_ip": "10.223.148.158", "port": "8080", "name": "7200_01", "iscsi_ip": "10.123.25.250", "created_at": "2015-10-22 06:55:31.262355", "hostname": "10.223.148.158", "id": "e29f3c58-7889-11e5-96e9-0017a477c444"}}
+--------------+--------------------------------------+
| Property | Value |
+--------------+--------------------------------------+
| created_at | 2015-10-22 06:55:31.262355 |
| deleted | False |
| device_type | iscsi |
| hostname | 10.223.148.158 |
| id | e29f3c58-7889-11e5-96e9-0017a477c444 |
| iscsi_ip | 10.123.25.250 |
| name | 7200_01 |
| password | <SANITIZED> |
| port | 8080 |
| san_ip | 10.223.148.158 |
| san_password | bananas |
| san_username | storadm |
| status | registered |
| updated_at | 2015-10-22 06:55:31.262364 |
| username | storadm |
+--------------+--------------------------------------+
#
2. Registra il CPG StoreServ nell'inventario della cloud
Innanzitutto, elenca i CPG disponibili – fai molta attenzione a selezionare quello corretto – come dice Confucio "misura due volte, taglia una volta", anche se forse era Tim il tecnico degli attrezzi.
# sirius storeserv-show e29f3c58-7889-11e5-96e9-0017a477c444 --cpg-list true
+--------------------------------------------------------+------------------+
| UUID | Name |
+--------------------------------------------------------+------------------+
| 137fcaf9-670b-43c2-89c5-1d28247f5847 | CPG_DEMO_Openstack |
| 49671c1e-aee0-4527-9844-a384a4fd28c0 | CPG_ISCSI_R1 |
| fab7065b-ca61-4346-9546-d8631741f5d8 | CPG_ISCSI_R5 |
+--------------------------------------+------------------+
#
Ora registra i CPG corretti
# sirius register-cpg --cpgs 137fcaf9-670b-43c2-89c5-1d28247f5847 --storeserv-id e29f3c58-7889-11e5-96e9-0017a477c444
Successfully registered the StoreServ CPG(s)
Verifica i risultati
# sirius cpg-list --storeserv-id e29f3c58-7889-11e5-96e9-0017a477c444
+--------------------------------------+------------------+------------+
| ID | Name | Status |
+--------------------------------------+------------------+------------+
| 137fcaf9-670b-43c2-89c5-1d28247f5847 | CPG_DEMO_Openstack | registered |
+--------------------------------------+------------------+------------+
#
3. Aggiungi il CPG StoreServ come backend per la cloud
# sirius add-storeserv-backend --storeserv-id e29f3c58-7889-11e5-96e9-0017a477c444 --cpg-id 137fcaf9-670b-43c2-89c5-1d28247f5847 --backend-name 3par_iscsi_1
+---------------------------+--------------------------------------------------------------+
| Property | Value |
+---------------------------+--------------------------------------------------------------+
| backend_id | CPG_137fcaf9-670b-43c2-89c5-1d28247f5847 |
| hp3par_api_url | https://10.223.148.158:8080/api/v1 |
| hp3par_cpg | CPG_DEMO_Openstack |
| hp3par_iscsi_chap_enabled | true |
| hp3par_password | bananas |
| hp3par_username | storadm |
| iscsi_ip_address | 10.123.25.250 |
| san_ip | 10.223.148.158 |
| san_login | storadm |
| san_password | bananas |
| volume_backend_name | 3par_iscsi_1 |
| volume_driver | cinder.volume.drivers.san.hp.hp_3par_iscsi.HP3PARISCSIDriver |
+---------------------------+-------------------------------------------------------------+
#
Verifica
# sirius cpg-show --storeserv-id e29f3c58-7889-11e5-96e9-0017a477c444 --cpg-id 137fcaf9-670b-43c2-89c5-1d28247f5847 --backend-name 3par_iscsi_1
The cinder.conf section preview for the selected CPG:
[CPG_137fcaf9-670b-43c2-89c5-1d28247f5847]
san_password=bananas
hp3par_username=storadm
volume_backend_name=3par_iscsi_1
san_login=storadm
hp3par_api_url=https://10.223.148.158:8080/api/v1
volume_driver=cinder.volume.drivers.san.hp.hp_3par_iscsi.HP3PARISCSIDriver
hp3par_password=bananas
hp3par_cpg=CPG_DEMO_Openstack
hp3par_iscsi_chap_enabled=true
san_ip=10.223.148.158
iscsi_ip_address=10.123.25.250
#
Elencare tutti i backend registrati
# sirius storeserv-backend-list
+------------------------------------------+------------------+---------------------+
| Backend ID | CPG Name | Volume Backend Name |
+------------------------------------------+------------------+---------------------+
| CPG_137fcaf9-670b-43c2-89c5-1d28247f5847 | CPG_DEMO_Openstack | 3par_iscsi_1 |
+------------------------------------------+------------------+---------------------+
#
4. Anteprima della configurazione di cinder per il CPG StoreServ
Questo output mostra i dettagli che verranno utilizzati per aggiornare automaticamente (heat) i file cinder.conf sui nodi rilevanti (controller & compute) una volta eseguito l'aggiornamento dell'overcloud (passaggio 6 di seguito).
Se avessi più ore nella giornata, aprirei un ticket per far sì che questa funzione crei un output completo 'copia-incolla' che possa essere inserito direttamente nel file di configurazione invece di dover tagliare, incollare e potenzialmente commettere un errore aggiungendo "3par :".
# sirius storeserv-backend-list --format json
{
"DEFAULT": {
"enabled_backends": [
"CPG_137fcaf9-670b-43c2-89c5-1d28247f5847"
]
},
"CPG_137fcaf9-670b-43c2-89c5-1d28247f5847": {
"san_password": "bananas",
"hp3par_username": "storadm",
"volume_backend_name": "3par_iscsi_1",
"san_login": "storadm",
"hp3par_api_url": "https://10.223.148.158:8080/api/v1",
"volume_driver": "cinder.volume.drivers.san.hp.hp_3par_iscsi.HP3PARISCSIDriver",
"hp3par_password": "bananas",
"hp3par_cpg": "CPG_DEMO_Openstack",
"hp3par_iscsi_chap_enabled": "true",
"san_ip": "10.223.148.158",
"iscsi_ip_address": "10.123.25.250"
}
}
#
5. Aggiorna il file JSON di configurazione dell'Overcloud (alias kvm-custom-ips.json)
IMPORTANTE: La documentazione ufficiale è confusa qui poiché fa riferimento a un file /root/overcloud-config.json, ma questo file non esiste se hai installato HOS1.1.1 seguendo la documentazione ufficiale 🙂 Il file a cui dovrebbe fare riferimento è /root/tripleo/configs/kvm-custom-ips.json, configurato durante la creazione della cloud.
Questo è l'aspetto del file prima di qualsiasi modifica
{
"cloud_type": "KVM",
"vsa_scale": 0,
"vsa_ao_scale": 0,
"so_swift_storage_scale": 0,
"so_swift_proxy_scale": 0,
"compute_scale": 2,
"bridge_interface": "em1",
"virtual_interface": "eth0",
"fixed_range_cidr": "172.0.100.0/24",
"control_virtual_router_id": "157",
"baremetal": {
"network_seed_ip": "10.123.25.13",
"network_cidr": "10.123.25.0/24",
"network_gateway": "10.123.25.1",
"network_seed_range_start": "10.123.25.14",
"network_seed_range_end": "10.123.25.34",
"network_undercloud_range_start": "10.123.25.35",
"network_undercloud_range_end": "10.123.25.135"
},
"neutron": {
"public_interface_raw_device": "eth0",
"overcloud_public_interface": "vlan1174",
"undercloud_public_interface": "eth0"
},
"dns": {
"overcloud_server": "10.123.121.10",
"undercloud_server": "10.123.121.10",
"seed_server": "10.123.121.10"
},
"ntp": {
"overcloud_server": "10.123.226.30",
"undercloud_server": "10.123.226.30",
"seed_server": "10.123.226.30"
},
"floating_ip": {
"start": "10.123.27.10",
"end": "10.123.27.250",
"cidr": "10.123.27.0/24"
},
"svc": {
"interface": "vlan1173",
"interface_default_route": "10.123.26.1",
"allocate_start": "10.123.26.10",
"allocate_end": "10.123.26.250",
"allocate_cidr": "10.123.26.0/24",
"overcloud_bridge_mappings": "svcnet1:br-svc",
"overcloud_flat_networks": "svcnet1",
"customer_router_ip": "10.123.25.1"
},
"codn": {
"undercloud_http_proxy": "http://fw1.osh.gosh:8080",
"undercloud_https_proxy": "http://fw1.osh.gosh:8080",
"overcloud_http_proxy": "http://fw1.osh.gosh:8080",
"overcloud_https_proxy": "http://fw1.osh.gosh:8080"
}
}
Dopo le modifiche, il file dovrebbe avere questo aspetto
# cat tripleo/configs/kvm-custom-ips.json
{
"cloud_type": "KVM",
"vsa_scale": 0,
"vsa_ao_scale": 0,
"so_swift_storage_scale": 0,
"so_swift_proxy_scale": 0,
"compute_scale": 2,
"bridge_interface": "em1",
"virtual_interface": "eth0",
"fixed_range_cidr": "172.0.100.0/24",
"control_virtual_router_id": "157",
"baremetal": {
"network_seed_ip": "10.123.25.13",
"network_cidr": "10.123.25.0/24",
"network_gateway": "10.123.25.1",
"network_seed_range_start": "10.123.25.14",
"network_seed_range_end": "10.123.25.34",
"network_undercloud_range_start": "10.123.25.35",
"network_undercloud_range_end": "10.123.25.135"
},
"neutron": {
"public_interface_raw_device": "eth0",
"overcloud_public_interface": "vlan1174",
"undercloud_public_interface": "eth0"
},
"dns": {
"overcloud_server": "10.123.121.10",
"undercloud_server": "10.123.121.10",
"seed_server": "10.123.121.10"
},
"ntp": {
"overcloud_server": "10.123.226.30",
"undercloud_server": "10.123.226.30",
"seed_server": "10.123.226.30"
},
"floating_ip": {
"start": "10.123.27.10",
"end": "10.123.27.250",
"cidr": "10.123.27.0/24"
},
"svc": {
"interface": "vlan1173",
"interface_default_route": "10.123.26.1",
"allocate_start": "10.123.26.10",
"allocate_end": "10.123.26.250",
"allocate_cidr": "10.123.26.0/24",
"overcloud_bridge_mappings": "svcnet1:br-svc",
"overcloud_flat_networks": "svcnet1",
"customer_router_ip": "10.123.25.1"
},
"3par": {
"DEFAULT": {
"enabled_backends": [
"CPG_137fcaf9-670b-43c2-89c5-1d28247f5847"
]
},
"CPG_137fcaf9-670b-43c2-89c5-1d28247f5847": {
"san_password": "bananas",
"hp3par_username": "storadm",
"volume_backend_name": "3par_iscsi_1",
"san_login": "storadm",
"hp3par_api_url": "https://10.223.148.158:8080/api/v1",
"volume_driver": "cinder.volume.drivers.san.hp.hp_3par_iscsi.HP3PARISCSIDriver",
"hp3par_password": "bananas",
"hp3par_cpg": "CPG_DEMO_Openstack",
"hp3par_iscsi_chap_enabled": "true",
"san_ip": "10.223.148.158",
"iscsi_ip_address": "10.123.25.250"
}
},
"codn": {
"undercloud_http_proxy": "http://fw1.osh.gosh:8080",
"undercloud_https_proxy": "http://fw1.osh.gosh:8080",
"overcloud_http_proxy": "http://fw1.osh.gosh:8080",
"overcloud_https_proxy": "http://fw1.osh.gosh:8080"
}
}
6. Carica il file sopra e aggiorna la configurazione dell'Overcloud
Dalla seedvm - la prima delle cloud di TripleO, carica il nuovo file di configurazione
source tripleo/tripleo-incubator/scripts/hp_ced_load_config.sh tripleo/configs/kvm-custom-ips.json
E ora riconfigura i template heat dell'Overcloud e applicali utilizzando l'installer HOS
bash -x tripleo/tripleo-incubator/scripts/hp_ced_installer.sh --update-overcloud |& tee 3ParIntegration.log
L'output appare così:
+ set -eu
+ set -o pipefail
++ basename tripleo/tripleo-incubator/scripts/hp_ced_installer.sh
+ SCRIPT_NAME=hp_ced_installer.sh
++ dirname tripleo/tripleo-incubator/scripts/hp_ced_installer.sh
+ SCRIPT_HOME=tripleo/tripleo-incubator/scripts
+ umask 077
+ export LANG=C
+ LANG=C
++ awk -F= '{print $1}'
++ grep '^LC_'
++ env
+ export SKIP_INSTALL_SEED=0
+ SKIP_INSTALL_SEED=0
+ export SKIP_INSTALL_UNDERCLOUD=0
+ SKIP_INSTALL_UNDERCLOUD=0
+ export SKIP_INSTALL_OVERCLOUD=0
+ SKIP_INSTALL_OVERCLOUD=0
+ export UPDATE_UNDERCLOUD=0
+ UPDATE_UNDERCLOUD=0
+ export UPDATE_OVERCLOUD=0
+ UPDATE_OVERCLOUD=0
+ export SKIP_DEMO=0
+ SKIP_DEMO=0
+ export POWER_OFF_NODES_WAIT_INTVL=15
+ POWER_OFF_NODES_WAIT_INTVL=15
+ export TRIPLEO_ROOT=/root/tripleo
+ TRIPLEO_ROOT=/root/tripleo
+ CE_FLAG=/root/tripleo/HP_Helion_OpenStack
+ BUILD_FLAG=/root/tripleo/HP_Helion_Version
+ '[' -e /root/tripleo/HP_Helion_Version ']'
++ cat /root/tripleo/HP_Helion_Version
+ VERSION='jenkins-release-ee-on-hlinux-hp-ee-stable-1.0-100: Thu May 14 07:40:45 UTC 2015'
+ export 'BUILD_TAG=jenkins-release-ee-on-hlinux-hp-ee-stable-1.0-100: Thu May 14 07:40:45 UTC 2015'
+ BUILD_TAG='jenkins-release-ee-on-hlinux-hp-ee-stable-1.0-100: Thu May 14 07:40:45 UTC 2015'
+ echo
.......SKIPPING LOTS OF OUTPUT.......
"value": "true"}, {"option": "rpc_response_timeout", "value": "120"}, {"option": "control_exchange", "value": "cinder"}, {"option": "notification_driver", "value": "messaging"}, {"comment": "Common hostname to avoid singleton limitation of Cinder volume manager", "option": "host", "value": "ha-volume-manager"}, {"option": "enabled_backends", "value": "CPG_137fcaf9-670b-43c2-89c5-1d28247f5847"}]}, {"section": "lvm-1", "values": [{"option": "volume-group", "value": "cinder-volumes"}, {"option": "lvm_type", "value": "thin"}, {"option": "volume_driver", "value": "cinder.volume.drivers.lvm.LVMISCSIDriver"}, {"option": "volume_backend_name", "value": "LVM_iSCSI"}]}, {"section": "CPG_137fcaf9-670b-43c2-89c5-1d28247f5847", "values": [{"option": "san_password", "value": "bananas"}, {"option": "hp3par_username", "value": "storadm"}, {"option": "volume_backend_name", "value": "3par_iscsi_1"}, {"option": "san_login", "value": "storadm"}, {"option": "hp3par_api_url", "value": "https://10.223.148.158:8080/api/v1"}, {"option": "volume_driver", "value": "cinder.volume.drivers.san.hp.hp_3par_iscsi.HP3PARISCSIDriver"}, {"option": "hp3par_password", "value": "bananas"}, {"option": "hp3par_cpg", "value": "CPG_DEMO_Openstack"}, {"option": "hp3par_iscsi_chap_enabled", "value": "true"}, {"option": "san_ip", "value": "10.223.148.158"}, {"option": "iscsi_ip_address", "value": "10.123.25.250"}]}]}, "swift": {"config": [{"section": "storage-policy:0", "values": [{"option": "name", "value": "Policy-0"}, {"option": "default", "value": "yes"}]}]}, "ceilometer_pipeline": {"sources": [{"interval": 604800, "meters": [{"name": "instance"}, {"name": "image"}, {"name": "image.size"}, {"name": "image.upload"}, {"name": "image.delete"}, {"name": "volume"}, {"name": "volume.size"}, {"name": "snapshot"}, {"name": "snapshot.size"}, {"name": "ip.floating"}, {"name": "network.*"}, {"name": "compute.instance.create.end"}, {"name": "compute.instance.delete.end"},
.......SKIPPING LOTS OF OUTPUT.......
UNDERCLOUD Endpoint: "http://10.123.25.14:5000/v2.0"
UNDERCLOUD IP: "10.123.25.14"
OVERCLOUD Endpoint: "https://10.123.25.35:5000/v2.0/"
OVERCLOUD IP: "10.123.25.35"
++ date
+ echo 'HP - completed - Thu Oct 22 08:49:18 UTC 2015'
HP - completed - Thu Oct 22 08:49:18 UTC 2015
+ exit 0
"exit 0" è Success nel nostro caso.
7. Crea VolumeType con Extra Spec Key Value Pair 'volume_backend_name' e '3par_iscsi_1'
Ora puoi lasciare la CLi e passare a Horizon (Overcloud) per l'ultimo passo di configurazione di un VolumeType e associandolo a un backend di storage. Vedi http://docs.hpcloud.com/#commercial/GA1/1.1commercial.map.volumetype.html
Ora dovresti avere la capacità di creare Volumi con cinder sul tuo 3Par - Costly Persistent Storage - Dai un'occhiata a Ceph, l'alternativa open source per soluzioni di block/volume più convenienti per la scalabilità cloud.
Originally published on allthingscloud.eu (2015-10-22).