K5 Enrutamiento Inter-Proyecto – Despliegue de API de Servicios Compartidos Totalmente Automatizado
2017-01-18
Machine-translated — the English original is authoritative.
En publicaciones anteriores he mencionado una característica de red específica de K5 llamada enrutamiento inter-proyecto. Dado que K5 es una nube pública basada en OpenStack en lugar de una nube privada tradicional de OpenStack, los Propietarios de Contratos (también conocidos como administradores de dominios de OpenStack) no tienen permiso para crear redes compartidas por diseño. Sin embargo, muchos propietarios de contratos a menudo encuentran la necesidad de compartir recursos entre proyectos y es aquí donde entra en juego el Enrutamiento Inter-Proyecto de K5. Tomemos las publicaciones anteriores sobre Servicios Compartidos: todo esto es posible gracias a esta característica.
Nota: Estamos hablando de enrutamiento entre subredes de proyectos dentro de la misma zona de disponibilidad y contrato; los enlaces entre zonas de disponibilidad también son posibles y se han discutido en publicaciones anteriores.

Para que las máquinas virtuales (VM) en las subredes del Proyecto A anterior puedan alcanzar las VM en AMBAS las subredes del Proyecto B, es necesario crear un enlace Inter-Proyecto para CADA una de las subredes del Proyecto B. ¡Eso son dos enlaces inter-proyecto para el escenario anterior!
Pasos requeridos por Subred
- Obtener un token regional de k5 vinculado al Proyecto B
Este archivo contiene texto Unicode oculto o bidireccional que puede interpretarse o compilarse de manera diferente a lo que aparece a continuación. Para revisarlo, abra el archivo en un editor que revele caracteres Unicode ocultos.
Más información sobre caracteres Unicode bidireccionales
| def get_scoped_token(adminUser, adminPassword, contract, projectid, region): | |
| """Resumen – Obtener un token de proyecto regional vinculado usando un nombre de usuario y contraseña | |
| Devuelve: | |
| Objeto: Objeto de Token de Proyecto Vinculado Regionalmente | |
| Args: | |
| adminUser (TYPE): nombre de usuario | |
| adminPassword (TYPE): contraseña | |
| contract (TYPE): nombre del contrato | |
| projectid (TYPE): id del proyecto | |
| region (TYPE): región | |
| """ | |
| identityURL = 'https://identity.' + region + \ | |
| '.cloud.global.fujitsu.com/v3/auth/tokens' | |
| try: | |
| response = requests.post(identityURL, | |
| headers={'Content-Type': 'application/json', | |
| 'Accept': 'application/json'}, | |
| json={"auth": | |
| {"identity": | |
| {"methods": ["password"], "password": | |
| {"user": | |
| {"domain": | |
| {"name": contract}, | |
| "name": adminUser, | |
| "password": adminPassword | |
| }}}, | |
| "scope": | |
| {"project": | |
| {"id": projectid | |
| }}}}) | |
| return response | |
| except: | |
| return 'Fallo al vincular Token de Proyecto Regional' |
ver raw
Get_Scoped_Token.py
alojado con ❤ por GitHub
- Crear un puerto en la subred del Proyecto B
Este archivo contiene texto Unicode oculto o bidireccional que puede interpretarse o compilarse de manera diferente a lo que aparece a continuación. Para revisarlo, abra el archivo en un editor que revele caracteres Unicode ocultos.
Más información sobre caracteres Unicode bidireccionales
| def create_port(k5token, name, netid, sg_id, az, region): | |
| portURL = 'https://networking.' + region + \ | |
| '.cloud.global.fujitsu.com/v2.0/ports' | |
| try: | |
| response = requests.post(portURL, | |
| headers={ | |
| 'X-Auth-Token': k5token, 'Content-Type': 'application/json', 'Accept': 'application/json'}, | |
| json={"port": | |
| {"network_id": netid, | |
| "name": name, | |
| "admin_state_up": True, | |
| "availability_zone": az, | |
| "security_groups": | |
| [sg_id]}}) | |
| return response | |
| except: | |
| return ("\nError inesperado:", sys.exc_info()) |
ver raw
CreatePortonK5Subnet.py
alojado con ❤ por GitHub
- Capturar el port_id del puerto recién creado
- Vincular de nuevo su token K5 al Proyecto A
Este archivo contiene texto Unicode oculto o bidireccional que puede interpretarse o compilarse de manera diferente a lo que aparece a continuación. Para revisarlo, abra el archivo en un editor que revele caracteres Unicode ocultos.
Más información sobre caracteres Unicode bidireccionales
| def get_rescoped_token(k5token, projectid, region): | |
| """Obtener un token de proyecto regional – rescoped | |
| Devuelve: | |
| STRING: Token de Proyecto Vinculado Regionalmente | |
| Args: | |
| k5token (TYPE): token regional válido | |
| projectid (TYPE): id del proyecto al que vincular | |
| region (TYPE): región k5 | |
| """ | |
| identityURL = 'https://identity.' + region + \ | |
| '.cloud.global.fujitsu.com/v3/auth/tokens' | |
| try: | |
| response = requests.post(identityURL, | |
| headers={'Content-Type': 'application/json', | |
| 'Accept': 'application/json'}, | |
| json={ | |
| "auth": { | |
| "identity": { | |
| "methods": [ | |
| "token" | |
| ], | |
| "token": { | |
| "id": k5token | |
| } | |
| }, | |
| "scope": { | |
| "project": { | |
| "id": projectid | |
| } | |
| } | |
| } | |
| }) | |
| return response | |
| except: | |
| return 'Fallo al rescoped de Proyecto Regional' |
ver raw
ReScope_K5_Token.py
alojado con ❤ por GitHub
- Utilice la llamada API de Neutron mejorada de Fujitsu K5, no disponible en OpenStack upstream, para realizar la conexión inter-proyecto. Esta llamada API permite al administrador del proyecto agregar una interfaz desde una subred en un proyecto diferente al router en el proyecto del administrador.
Este archivo contiene texto Unicode oculto o bidireccional que puede interpretarse o compilarse de manera diferente a lo que aparece a continuación. Para revisarlo, abra el archivo en un editor que revele caracteres Unicode ocultos.
Más información sobre caracteres Unicode bidireccionales
| def inter_project_connection_create(k5token, router, port, region): | |
| routerURL = 'https://networking-ex.' + region + \ | |
| '.cloud.global.fujitsu.com/v2.0/routers/' + \ | |
| router + '/add_cross_project_router_interface' | |
| try: | |
| response = requests.put(routerURL, | |
| headers={'X-Auth-Token': k5token, | |
| 'Content-Type': 'application/json'}, | |
| json={"port_id": port}) | |
| return response | |
| except: | |
| return ("\nError inesperado:", sys.exc_info()) |
ver raw
AddInterPojectRoute.py
alojado con ❤ por GitHub
- Vincular de nuevo el token K5 al Proyecto B (la llamada API de rescoped de token se detalla anteriormente en la publicación)
- Agregar las rutas de retorno estáticas para las redes en el Proyecto A al router en el Proyecto B (Nota: si su diseño no tiene un router en el Proyecto B, puede agregar estas rutas a las subredes en el Proyecto B y reiniciar sus servidores para recibir la nueva información de enrutamiento)
- Rutas del formato [{“destination”: CIDR-1, “nexthop”: interProject-Port-IP},{“destination”: CIDR-2, “nexthop”: interProject-Port-IP} ]
Actualización del Router
Este archivo contiene texto Unicode oculto o bidireccional que puede interpretarse o compilarse de manera diferente a lo que aparece a continuación. Para revisarlo, abra el archivo en un editor que revele caracteres Unicode ocultos.
Más información sobre caracteres Unicode bidireccionales
| def update_router_routes(k5token, routerid, routes, region): | |
| # ej. routes = [{'destination': '192.168.10.0/24', 'nexthop': u'192.168.100.2'}, {'destination': '192.168.11.0/24', 'nexthop': u'192.168.100.2'}] | |
| try: | |
| routerURL = 'https://networking-ex.' + region + \ | |
| '.cloud.global.fujitsu.com/v2.0/routers/' + routerid | |
| response = requests.put(routerURL, | |
| headers={'X-Auth-Token': k5token, | |
| 'Content-Type': 'application/json'}, | |
| json={"router": {"routes": routes}}) | |
| return response | |
| except: | |
| return ("\nError inesperado:", sys.exc_info()) |
ver raw
K5-Update-Router-Routes.py
alojado con ❤ por GitHub
Actualización Alternativa de Subred
Este archivo contiene texto Unicode oculto o bidireccional que puede interpretarse o compilarse de manera diferente a lo que aparece a continuación. Para revisarlo, abra el archivo en un editor que revele caracteres Unicode ocultos.
Más información sobre caracteres Unicode bidireccionales
| def add_static_route_to_subnet(k5token, subnetid, routes, region): | |
| # ej. routes = = [{'destination': '192.168.101.0/24', 'nexthop': u'192.168.100.2'},{'destination': '192.168.100.0/24', 'nexthop': u'192.168.100.2'}] | |
| subnetURL = 'https://networking.' + region + \ | |
| '.cloud.global.fujitsu.com/v2.0/subnets/' + subnetid | |
| try: | |
| response = requests.put(subnetURL, | |
| headers={'X-Auth-Token': k5token, | |
| 'Content-Type': 'application/json'}, | |
| json={"subnet": {"host_routes": routes}}) | |
| return response | |
| except: | |
| return ("\nError inesperado:", sys.exc_info()) |
ver raw
K5-Subnet-Route-Update.py
alojado con ❤ por GitHub
¡Y eso es todo! Ahora deberías poder enrutar entre tus proyectos.
Entonces, ¿dónde está la automatización, pensarás...
Bueno, rápidamente 'hackeé' los siguientes dos scripts de python para una demostración de cliente. El código python no es en absoluto eficiente (también conocido como DRY), pero es adecuado para el propósito de este tutorial:
Repositorio : https://github.com/allthingsclowd/K5-InterProject-Demo
K5-InterProject-Demo
Despliegue de API de Servicios Compartidos Totalmente Automatizado en Fujitsu K5
Objetivo – Plataforma de Nube IaaS Fujitsu K5
Autor: Graham Land
Fecha: 18/1/17
Twitter: @allthingsclowd
Github: https://github.com/allthingscloud
Blog: https://allthingscloud.eu
Los scripts de python en este repositorio se pueden utilizar para crear el modelo de servicios compartidos a continuación auto-mágicamente 🙂
Pasos:
- Copie todos estos archivos al mismo directorio
- Edite k5contractsettingsv10.py para incluir los detalles de su contrato K5
Advertencia: Asegúrese de usar dos proyectos 'desechables' dentro de su contrato y agregue sus nombres e ids al archivo anterior.
Todos los recursos en estos proyectos se purgarán, así que asegúrese de no compartirlos con otros usuarios. - Lance el script build_multi_project_demo.py y relájese! Todas las claves SSH, ips públicas, etc. se devuelven a la consola.
- Cuando haya terminado de jugar con el enrutamiento, puede usar purge_project.py para restablecer todo.
¡Feliz Apilamiento!
ver raw
MultiProjectAPIDemo.md
alojado con ❤ por GitHub
¡Feliz Apilamiento!
withk5youcan
Originally published on allthingscloud.eu (2017-01-18).
