Helion OpenStack 1.1.1 integración con 3PAR Storage
2015-10-22
Machine-translated — the English original is authoritative.
Otro día, otra integración de OpenStack: hoy he integrado el almacenamiento 3PAR a través de iSCSI con HOS 1.1.1 para su uso con el almacenamiento de bloques de cinder (también conocido como volúmenes o almacenamiento persistente). Como siempre, por favor verifica los últimos requisitos previos de hardware aquí – http://docs.hpcloud.com/#commercial/GA1/1.1commercial.install-GA-supportmatrix.html antes de comenzar.
Requisitos previos
Se asume en esta entrada de blog que no sabes nada sobre el almacenamiento 3PAR y que hay un administrador de almacenamiento cerca para configurar el propio 3PAR. El administrador del 3PAR necesitará asegurarse de que la API de Servicios Web (WSAPI) está habilitada y proporcionarte los detalles de configuración [nombre de usuario, contraseña, punto final de la API, puerto]. Pueden habilitar esto conectándose por SSH al controlador de almacenamiento y configurándolo a través de la CLI: no se necesitan expertos en cohetes. También necesitarás al menos un Grupo de Provisión Común (CPG) configurado como el grupo de almacenamiento para que cinder cree los Volúmenes.
Tanto las direcciones IP de gestión como las de iSCSI necesitarán ser accesibles desde la LAN de gestión y los puertos relevantes abiertos en cualquier firewall entre estas redes. La herramienta netcat o nc detallada en mi publicación anterior ayudará si tienes que verificar la conectividad entre estas redes.
El requisito final es que tengas un sistema HOS 1.1.1 completamente instalado y configurado para integrar 🙂
Integración
1. Registrar StoreServ en el inventario de la nube
[Nota: utilicé la opción –debug para más detalles, esto no es necesario]
# 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. Registrar el CPG de StoreServ en el inventario de la nube
En primer lugar, lista los CPGs disponibles – ten mucho cuidado de seleccionar el correcto – como dice Confucio “mide dos veces, corta una” en realidad eso puede haber sido Tim el hombre de las herramientas.
# 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 |
+--------------------------------------+------------------+
#
Ahora registra el/los CPG(s) correcto(s)
# sirius register-cpg --cpgs 137fcaf9-670b-43c2-89c5-1d28247f5847 --storeserv-id e29f3c58-7889-11e5-96e9-0017a477c444
Successfully registered the StoreServ CPG(s)
Verifica los resultados
# sirius cpg-list --storeserv-id e29f3c58-7889-11e5-96e9-0017a477c444
+--------------------------------------+------------------+------------+
| ID | Name | Status |
+--------------------------------------+------------------+------------+
| 137fcaf9-670b-43c2-89c5-1d28247f5847 | CPG_DEMO_Openstack | registered |
+--------------------------------------+------------------+------------+
#
3. Añadir el CPG de StoreServ como un backend para la nube
# 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 |
+---------------------------+-------------------------------------------------------------+
#
Verificar
# 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
#
Listar todos los backends registrados
# sirius storeserv-backend-list
+------------------------------------------+------------------+---------------------+
| Backend ID | CPG Name | Volume Backend Name |
+------------------------------------------+------------------+---------------------+
| CPG_137fcaf9-670b-43c2-89c5-1d28247f5847 | CPG_DEMO_Openstack | 3par_iscsi_1 |
+------------------------------------------+------------------+---------------------+
#
4. Vista previa de la configuración de cinder para el CPG de StoreServ
Esto genera los detalles que se utilizarán para actualizar automágicamente (heat) los archivos cinder.conf en los nodos relevantes (controlador y cómputo) una vez que se ejecute la actualización del overcloud (paso 6 a continuación).
Si hubiera más horas en el día, presentaría un ticket para que esta función cree una salida completa de 'cortar y pegar' que se pueda insertar directamente en el archivo de configuración en lugar de cortar, pegar y potencialmente cometer un error al añadir "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. Actualizar el JSON de configuración del Overcloud (también conocido como kvm-custom-ips.json)
IMPORTANTE: La documentación oficial es confusa aquí ya que hace referencia a un archivo /root/overcloud-config.json pero este archivo no existe si instalaste HOS1.1.1 siguiendo la documentación oficial 🙂 El archivo al que debería hacer referencia es /root/tripleo/configs/kvm-custom-ips.json que se configura al construir la nube.
Así es como se ve el archivo antes de cualquier modificación
{
"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"
}
}
Después de las modificaciones, el archivo debería verse así
# 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. Cargar el archivo anterior y actualizar la configuración del Overcloud
Desde la seedvm - la primera de las nubes de TripleO, carga el nuevo archivo de configuración
source tripleo/tripleo-incubator/scripts/hp_ced_load_config.sh tripleo/configs/kvm-custom-ips.json
Y ahora reconfigura las plantillas de calor del Overcloud y aplícalas usando el instalador de HOS
bash -x tripleo/tripleo-incubator/scripts/hp_ced_installer.sh --update-overcloud |& tee 3ParIntegration.log
La salida se ve así:
+ 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" es Éxito en nuestro caso.
7. Crear VolumeType con el par de clave-valor Extra Spec Key 'volume_backend_name' y '3par_iscsi_1'
Ahora puedes salir de la CLI y saltar a Horizon (Overcloud) para el paso final de configurar un VolumeType y asociarlo con un backend de almacenamiento. Ver http://docs.hpcloud.com/#commercial/GA1/1.1commercial.map.volumetype.html
Ahora deberías tener la capacidad de crear Volúmenes con cinder en tu 3Par - Almacenamiento Persistente Costoso - Investiga Ceph, la alternativa de código abierto para soluciones de bloques/volumen escalables en la nube más asequibles.
Originally published on allthingscloud.eu (2015-10-22).