K5 Inter-Projekt-Routing – Vollautomatisierte Bereitstellung einer Shared-Services-API
2017-01-18
Machine-translated — the English original is authoritative.
In früheren Beiträgen habe ich eine K5-spezifische Netzwerkfunktion erwähnt, die als Inter-Projekt-Routing bezeichnet wird. Da K5 eine öffentliche, auf OpenStack basierende Cloud ist und keine traditionelle private OpenStack-Cloud, haben Vertragsbesitzer (auch bekannt als OpenStack-Domain-Administratoren) aus Designgründen keine Berechtigung, gemeinsame Netzwerke zu erstellen. Viele Vertragsbesitzer stellen jedoch häufig fest, dass sie Ressourcen zwischen Projekten teilen müssen, und genau hier kommt das K5 Inter-Projekt-Routing ins Spiel. Nehmen wir die früheren Blogbeiträge über Shared Services – all dies ist dank dieser Funktion möglich.
Hinweis: Wir sprechen hier über das Routing zwischen Projekt-Subnetzen innerhalb derselben Verfügbarkeitszone und desselben Vertrags. Cross-Verfügbarkeitszonen-Verbindungen sind ebenfalls möglich und wurden in früheren Beiträgen diskutiert.

Damit die virtuellen Maschinen (VMs) in den Subnetzen in Projekt A oben die VMs in BEIDEN Subnetzen in Projekt B erreichen können, ist es notwendig, eine Inter-Projekt-Verbindung zu JEDEM der Subnetze in Projekt B zu erstellen. Das bedeutet für das obige Szenario zwei Inter-Projekt-Verbindungen!
Pro Subnetz erforderliche Schritte
- Einen K5-Regional-Token abrufen, der auf Projekt B beschränkt ist
Diese Datei enthält versteckte oder bidirektionale Unicode-Zeichen, die anders interpretiert oder kompiliert werden könnten als das, was unten angezeigt wird. Um sie zu überprüfen, öffnen Sie die Datei in einem Editor, der versteckte Unicode-Zeichen anzeigt.
Mehr über bidirektionale Unicode-Zeichen erfahren
| def get_scoped_token(adminUser, adminPassword, contract, projectid, region): | |
| """Zusammenfassung – Einen regionalen, projektbeschränkten Token mit Benutzername und Passwort abrufen | |
| Gibt zurück: | |
| Objekt: Regional beschränktes Projekt-Token-Objekt | |
| Argumente: | |
| adminUser (TYPE): Benutzername | |
| adminPassword (TYPE): Passwort | |
| contract (TYPE): Vertragsname | |
| projectid (TYPE): Projekt-ID | |
| region (TYPE): Region | |
| """ | |
| 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 'Fehler beim regionalen Projekt-Token-Scoping' |
Raw anzeigen
Get_Scoped_Token.py
Gehostet mit ❤ von GitHub
- Einen Port im Subnetz in Projekt B erstellen
Diese Datei enthält versteckte oder bidirektionale Unicode-Zeichen, die anders interpretiert oder kompiliert werden könnten als das, was unten angezeigt wird. Um sie zu überprüfen, öffnen Sie die Datei in einem Editor, der versteckte Unicode-Zeichen anzeigt.
Mehr über bidirektionale Unicode-Zeichen erfahren
| 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 ("\nUnerwarteter Fehler:", sys.exc_info()) |
Raw anzeigen
CreatePortonK5Subnet.py
Gehostet mit ❤ von GitHub
- Die port_id des neu erstellten Ports erfassen
- Ihren K5-Token erneut auf Projekt B beschränken (Rescoping)
Diese Datei enthält versteckte oder bidirektionale Unicode-Zeichen, die anders interpretiert oder kompiliert werden könnten als das, was unten angezeigt wird. Um sie zu überprüfen, öffnen Sie die Datei in einem Editor, der versteckte Unicode-Zeichen anzeigt.
Mehr über bidirektionale Unicode-Zeichen erfahren
| def get_rescoped_token(k5token, projectid, region): | |
| """Einen regionalen Projekt-Token abrufen – neu beschränkt | |
| Gibt zurück: | |
| STRING: Regional beschränkter Projekt-Token | |
| Argumente: | |
| k5token (TYPE): gültiger regionaler Token | |
| projectid (TYPE): Projekt-ID, auf die beschränkt werden soll | |
| region (TYPE): K5-Region | |
| """ | |
| 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 'Fehler beim regionalen Projekt-Rescoping' |
Raw anzeigen
ReScope_K5_Token.py
Gehostet mit ❤ von GitHub
- Verwenden Sie den Fujitsu K5 Neutron erweiterten API-Aufruf, der in der Upstream-OpenStack-Version nicht verfügbar ist, um die Inter-Projekt-Verbindung herzustellen. Dieser API-Aufruf ermöglicht es dem Projektadministrator, eine Schnittstelle aus einem Subnetz in einem anderen Projekt zum Router im Admin-Projekt hinzuzufügen.
Diese Datei enthält versteckte oder bidirektionale Unicode-Zeichen, die anders interpretiert oder kompiliert werden könnten als das, was unten angezeigt wird. Um sie zu überprüfen, öffnen Sie die Datei in einem Editor, der versteckte Unicode-Zeichen anzeigt.
Mehr über bidirektionale Unicode-Zeichen erfahren
| 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 ("\nUnerwarteter Fehler:", sys.exc_info()) |
Raw anzeigen
AddInterPojectRoute.py
Gehostet mit ❤ von GitHub
- Den K5-Token erneut auf Projekt B beschränken (API-Aufruf zum Token-Rescoping, weiter oben im Beitrag detailliert beschrieben)
- Fügen Sie die statischen Rückrouten für die Netzwerke in Projekt A zum Router in Projekt B hinzu (Hinweis: Wenn Ihr Design keinen Router in Projekt B hat, können Sie diese Routen zu den Subnetzen in Projekt B hinzufügen und Ihre Server neu starten, um die neuen Routing-Informationen zu erhalten)
- Routen im Format [{“destination”: CIDR-1, “nexthop”: interProject-Port-IP},{“destination”: CIDR-2, “nexthop”: interProject-Port-IP} ]
Router-Aktualisierung
Diese Datei enthält versteckte oder bidirektionale Unicode-Zeichen, die anders interpretiert oder kompiliert werden könnten als das, was unten angezeigt wird. Um sie zu überprüfen, öffnen Sie die Datei in einem Editor, der versteckte Unicode-Zeichen anzeigt.
Mehr über bidirektionale Unicode-Zeichen erfahren
| def update_router_routes(k5token, routerid, routes, region): | |
| # z.B. 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 ("\nUnerwarteter Fehler:", sys.exc_info()) |
Raw anzeigen
K5-Update-Router-Routes.py
Gehostet mit ❤ von GitHub
Alternative Subnetz-Aktualisierung
Diese Datei enthält versteckte oder bidirektionale Unicode-Zeichen, die anders interpretiert oder kompiliert werden könnten als das, was unten angezeigt wird. Um sie zu überprüfen, öffnen Sie die Datei in einem Editor, der versteckte Unicode-Zeichen anzeigt.
Mehr über bidirektionale Unicode-Zeichen erfahren
| def add_static_route_to_subnet(k5token, subnetid, routes, region): | |
| # z.B. 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 ("\nUnerwarteter Fehler:", sys.exc_info()) |
Raw anzeigen
K5-Subnet-Route-Update.py
Gehostet mit ❤ von GitHub
Und das war’s! Sie sollten nun zwischen Ihren Projekten routen können.
Wo ist also die Automatisierung, werden Sie sich jetzt fragen…
Nun, ich habe für eine Kunden-Demo schnell die folgenden zwei Python-Skripte „zusammengehackt“. Der Python-Code ist keineswegs effizient (a.k.a. DRY), aber er erfüllt den Zweck dieses Tutorials:
Repo : https://github.com/allthingsclowd/K5-InterProject-Demo
K5-InterProject-Demo
Vollautomatisierte Bereitstellung einer Shared-Services-API auf Fujitsu K5
Ziel – Fujitsu K5 IaaS-Cloud-Plattform
Autor: Graham Land
Datum: 18.1.17
Twitter: @allthingsclowd
Github: https://github.com/allthingscloud
Blog: https://allthingscloud.eu
Die Python-Skripte in diesem Repository können verwendet werden, um das folgende Shared-Services-Modell auto-magisch zu erstellen 🙂
Schritte:
- Kopieren Sie alle diese Dateien in dasselbe Verzeichnis
- Bearbeiten Sie die k5contractsettingsv10.py, um Ihre K5-Vertragsdetails einzufügen
Warnung: Stellen Sie sicher, dass Sie zwei „einweg“-Projekte innerhalb Ihres Vertrags verwenden und deren Namen und IDs in die obige Datei einfügen.
Alle Ressourcen in diesen Projekten werden gelöscht, also stellen Sie sicher, dass Sie diese nicht mit anderen Benutzern teilen. - Starten Sie das build_multi_project_demo.py-Skript und entspannen Sie sich! Alle SSH-Schlüssel, öffentlichen IPs usw. werden an die Konsole zurückgegeben.
- Wenn Sie mit dem Routing fertig gespielt haben, können Sie purge_project.py verwenden, um alles zurückzusetzen.
Happy Stacking!
Raw anzeigen
MultiProjectAPIDemo.md
Gehostet mit ❤ von GitHub
Happy Stacking!
withk5youcan
Originally published on allthingscloud.eu (2017-01-18).
