Auto-Scaling-Infrastruktur als Code – Elastische Compute-Ressourcen auf K5 IaaS
2017-10-10
Machine-translated — the English original is authoritative.
In diesem Artikel werden wir durchgehen, wie man die AutoScaling-Funktion von Fujitsu’s K5 IaaS bereitstellt und testet.
Überblick
Was meine ich also mit der K5 AutoScaling-Funktion? Stellen Sie sich vor, Sie haben einen virtuellen Server, der Schwankungen in der Nachfrage aufweist. Nehmen wir das Beispiel des Ticket-Master-Webservers: 99 % der Zeit brütet der Server vor sich hin und hat eine Auslastung von nur 5 %. Wenn jedoch Westlife sich wieder zusammenfinden (und das werden sie) und den Ticketverkauf für ihre neue Tour starten, wird der Ticket-Master-Server überlastet, während all die einstigen Teenies, heute dreißigjährige mit viel Geld, gleichzeitig versuchen, sich einzuloggen und Tickets zu kaufen. [Ersetzen Sie Westlife durch den iPhoneX-Launch, wenn das für Sie verständlicher ist].
Da kommt Auto-Scaling zur Rettung – auch oft als elastische Compute-Ressourcen bezeichnet. Wenn der Ticket-Master-Server mit der AutoScaling-Funktion von K5 erstellt wurde, baut K5 automatisch einen neuen Server, sobald die Last auf dem Server steigt und einen vordefinierten Schwellenwert überschreitet, und fügt ihn in Ihren Lastenausgleichs-Instanzpool ein – und das alles ohne jeglichen Aufwand Ihrerseits.
Und es wird noch besser: Sobald alle ihre Tickets haben und die Lastenausgleichs-Server nicht mehr stark ausgelastet sind, fährt K5 die Infrastruktur automatisch wieder herunter, um sie an die aktuelle Nachfrage anzupassen.
Klingt nach viel Arbeit – die gute Nachricht ist, dass K5 HEAT bereits erweitert hat und K5’s OpenStack Ceilometer nutzt, um all diese Arbeit für Sie zu erledigen – diese Erweiterungen sind im K5 Heat Guide dokumentiert, der hier zu finden ist.
Alles, was Sie tun müssen, ist, einen Heat-Stack wie diesen zu konfigurieren und bereitzustellen:
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
| # Grundlegendes K5-Template zur Demonstration von Fujitsus HEAT AutoScaling-Erweiterungen | |
| # Autor: Graham J Land | |
| # Datum: 10/10/2017 | |
| heat_template_version: 2013-05-23 | |
| description: | |
| Fujitsu Cloud Service K5 IaaS AutoScaling Beispiel-Template. | |
| # Die Voraussetzungen für eine erfolgreiche Bereitstellung | |
| parameters: | |
| # Ziel-Verfügbarkeitszone | |
| az: | |
| type: string | |
| default: uk-1b | |
| # Zu skalierender Server – in diesem Demo eine einfache Nodejs-App | |
| param_image_id: | |
| type: string | |
| default: bc4d2c64-1694-4488-80e2-e089bd18fc42 | |
| # Zu verwendende Servergröße (T-Shirt-Size) | |
| param_flavor: | |
| type: string | |
| default: S-1 | |
| # SSH-Schlüssel, die in die skalierten Server eingefügt werden | |
| key_name: | |
| type: string | |
| description: SSH-Schlüssel zur Verbindung mit den Servern | |
| default: LEMP-KP-AZ2 | |
| # Vorhandener Router im Projekt mit konfiguriertem externem Gateway | |
| autoscale_router: | |
| type: string | |
| default: 5b29b682-df94-4178-b1b4-9bf487055787 | |
| # Was tatsächlich erstellt wird | |
| resources: | |
| # Erstellt ein privates Netzwerk | |
| autoscale_private_net_az: | |
| type: OS::Neutron::Net | |
| properties: | |
| availability_zone: { get_param: az } | |
| name: "autoscale_private_net" | |
| # Erstellt ein neues Subnetz auf dem oben genannten privaten Netzwerk | |
| autoscale_private_subnet_az: | |
| type: OS::Neutron::Subnet | |
| depends_on: autoscale_private_net_az | |
| properties: | |
| availability_zone: { get_param: az } | |
| name: "autoscale_private_subnet_az" | |
| network_id: { get_resource: autoscale_private_net_az } | |
| cidr: "192.168.200.0/24" | |
| gateway_ip: "192.168.200.254" | |
| allocation_pools: | |
| – start: "192.168.200.100" | |
| end: "192.168.200.150" | |
| dns_nameservers: ["62.60.42.9", "62.60.42.10"] | |
| # Verbindet eine Schnittstelle im Subnetz des Netzwerks mit dem vorhandenen Router | |
| az_router_interface: | |
| type: OS::Neutron::RouterInterface | |
| depends_on: [autoscale_private_subnet_az] | |
| properties: | |
| router_id: { get_param: autoscale_router } | |
| subnet_id: { get_resource: autoscale_private_subnet_az } | |
| # Erstellt eine neue Sicherheitsgruppe für den Zugriff Ihres PCs | |
| # Suchen Sie einfach bei Google nach „what's my ip“, um Ihre öffentliche NAT-Adresse zu ermitteln | |
| # Meine war während des unten stehenden Demos 31.53.253.24 | |
| security_group_01: | |
| type: OS::Neutron::SecurityGroup | |
| properties: | |
| description: Fügt Sicherheitsgruppenregeln für den Server hinzu | |
| name: AutoScaleServer | |
| rules: | |
| # Erlaubt SSH-Verbindung (Port 22) von meinem PC | |
| – remote_ip_prefix: 31.53.253.24/32 | |
| protocol: tcp | |
| port_range_min: 22 | |
| port_range_max: 22 | |
| # Erlaubt Ping-Pakete von meinem PC | |
| – remote_ip_prefix: 31.53.253.24/32 | |
| protocol: icmp | |
| # Erstellt eine offene Sicherheitsgruppe, damit jeder auf das öffentliche LBaaS zugreifen kann | |
| security_group_02: | |
| type: OS::Neutron::SecurityGroup | |
| properties: | |
| description: Fügt Sicherheitsgruppenregeln für den Server hinzu | |
| name: AutoScaleLBaaS | |
| rules: | |
| # Erlaubt HTTP-Verkehr (Port 80) vom „ganzen Internet“ | |
| – remote_ip_prefix: 0.0.0.0/0 | |
| protocol: tcp | |
| port_range_min: 80 | |
| port_range_max: 80 | |
| # Definiert den skalierbaren Server-Pool | |
| web_server_group: | |
| depends_on: [ az_router_interface ] | |
| type: FCX::AutoScaling::AutoScalingGroup | |
| properties: | |
| AvailabilityZones: [{get_param: az}] | |
| LaunchConfigurationName: {get_resource: launch_config} | |
| MinSize: '1' | |
| MaxSize: '3' | |
| VPCZoneIdentifier: [ {get_resource: autoscale_private_subnet_az} ] | |
| LoadBalancerNames: [ {get_resource: eLBint} ] | |
| # Dies ist die eigentliche skalierbare Einheit der Bereitstellung – der Webserver | |
| launch_config: | |
| type: FCX::AutoScaling::LaunchConfiguration | |
| depends_on: [ security_group_01, az_router_interface ] | |
| properties: | |
| ImageId: { get_param: param_image_id } | |
| InstanceType: { get_param: param_flavor } | |
| KeyName: {get_param: key_name} | |
| SecurityGroups: [ {get_resource: security_group_01}, {get_resource: security_group_02} ] | |
| BlockDeviceMappingsV2: [{source_type: 'image', destination_type: 'volume', boot_index: '0', device_name: '/dev/vda', volume_size: '3',uuid: {get_param: param_image_id}, delete_on_termination: true}] | |
| UserData: | |
| #!/bin/bash | |
sudo hostname hostname |
|
| echo "Rebooting Hack" | |
| sudo reboot | |
| # Erstellt den Lastenausgleich, der verwendet wird, um | |
| # die skalierenden Instanzen zu verwalten | |
| eLBint: | |
| type: FJ::ExpandableLoadBalancer::LoadBalancer | |
| depends_on: [ security_group_01, az_router_interface ] | |
| properties: | |
| Subnets: [ {get_resource: autoscale_private_subnet_az} ] | |
| Listeners: | |
| – {LoadBalancerPort: '80', InstancePort: '80', Protocol: 'HTTP', InstanceProtocol: 'HTTP' } | |
| HealthCheck: {Target: 'HTTP:80/', HealthyThreshold: '2', UnhealthyThreshold: '3', Interval: '5', Timeout: '5'} | |
| Version: 2014-09-30 | |
| Scheme: public | |
| LoadBalancerName: autoscaler | |
| SecurityGroups: [ {get_resource: security_group_02} ] | |
| # Erstellt die Skalierungsrichtlinie zum Hochskalieren | |
| web_server_scaleout_policy: | |
| type: FCX::AutoScaling::ScalingPolicy | |
| properties: | |
| AdjustmentType: ChangeInCapacity | |
| AutoScalingGroupName: {get_resource: web_server_group} | |
| Cooldown: '10' | |
| ScalingAdjustment: '1' | |
| # Erstellt die Skalierungsrichtlinie zum Herunterskalieren | |
| web_server_scalein_policy: | |
| type: FCX::AutoScaling::ScalingPolicy | |
| properties: | |
| AdjustmentType: ChangeInCapacity | |
| AutoScalingGroupName: {get_resource: web_server_group} | |
| Cooldown: '10' | |
| ScalingAdjustment: '-1' | |
| # Erstellt das ALARM-Ereignis, das ausgelöst wird, wenn | |
| # der Server überlastet ist | |
| cpu_alarm_high: | |
| type: OS::Ceilometer::Alarm | |
| properties: | |
| description: Skaliere hoch, wenn die durchschnittliche CPU > 50 % für 1 Minute | |
| meter_name: fcx.compute.cpu_util | |
| statistic: avg | |
| period: '60' | |
| evaluation_periods: '1' | |
| threshold: '50' | |
| alarm_actions: | |
| – {get_attr: [web_server_scaleout_policy, AlarmUrl]} | |
| matching_metadata: {'metadata.user_metadata.groupname': {get_resource: web_server_group}} | |
| comparison_operator: gt | |
| # Erstellt das „Reset“-ALARM-Ereignis, wenn Dienste wieder normal | |
| # arbeiten | |
| cpu_alarm_low: | |
| type: OS::Ceilometer::Alarm | |
| properties: | |
| description: Skaliere runter, wenn die durchschnittliche CPU < 15 % für 1 Minute | |
| meter_name: fcx.compute.cpu_util | |
| statistic: avg | |
| period: '60' | |
| evaluation_periods: '1' | |
| threshold: '15' | |
| alarm_actions: | |
| – {get_attr: [web_server_scalein_policy, AlarmUrl]} | |
| matching_metadata: {'metadata.user_metadata.groupname': {get_resource: web_server_group}} | |
| comparison_operator: lt | |
Rohansicht
K5AutoScaling.yml
Gehostet mit ❤ von GitHub
Versuchen wir das also jetzt –
Voraussetzungen für das Template:
az: Geben Sie die Ziel-Verfügbarkeitszone ein, in meinem Fall uk-1b
param_image_id:
Wenn Sie keinen eigenen Server zum Testen haben, ist das Build-Image, das ich verwende, ein einfacher Ubuntu-Server, auf dem Nodejs mit der folgenden Anwendung installiert ist: /var/helloworld/helloworld.js (vergessen Sie nicht, „npm install –save express“ auszuführen) –
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
| const express = require('express') | |
| const app = express() | |
| const serverName = require('os').hostname(); | |
| const messageTop = ' \ |
|
Hello from ' |
|
| const messageTail = '\ | |
\ |
|
| \ | |
| ' | |
| app.get('/', function (req, res) { | |
| res.send(messageTop + serverName + messageTail) | |
| }) | |
| app.listen(80, function () { | |
| console.log('Example app listening on port 80') | |
| }) |
Rohansicht
helloworld.js
Gehostet mit ❤ von GitHub
Um diese Anwendung als Dienst unter Ubuntu auszuführen, kopieren Sie die folgende helloworld.conf-Datei nach /etc/init auf dem Server. Stellen Sie sicher, dass Sie den Dateinamen und den Pfad in der unten stehenden Datei anpassen, um sowohl den Namen als auch den Speicherort der oben genannten Datei zu entsprechen –
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
| description "Fujitsu K5 IaaS AutoScaling Demo Node.js Server" | |
| author "Graham J Land" | |
| start on started mountall | |
| stop on shutdown | |
| respawn | |
| respawn limit 99 5 | |
| script | |
| export HOME="/root" | |
| exec /usr//bin/nodejs /var/helloworld/helloworld.js >> /var/log/node.log 2>&1 | |
| end script | |
| post-start script | |
| echo "Started HelloWorld Demo NodeJS Webserver" | |
| end script |
Rohansicht
helloworld.conf
Gehostet mit ❤ von GitHub
param_flavor: T-Shirt-Servergröße, S-1
key_name: Ihr öffentlicher SSH-Schlüssel, ich habe LEMP-KP-AZ2 verwendet
autoscale_router: Dies ist die ID eines vorhandenen Routers in Ihrem Projekt, der über ein konfiguriertes externes Gateway verfügt.
Template starten:
Sobald Sie die oben genannten Voraussetzungen erfüllt und das Template mit Ihrer lokalen Konfiguration angepasst haben, ist es an der Zeit, unsere Infrastruktur bereitzustellen. Ich werde hier im Beispiel das K5-Portal verwenden, Sie könnten jedoch auch die nativen K5-APIs oder sogar den OpenStack-Client verwenden.
Sehen Sie sich den Film – kostenlos hier – an, um zu sehen, wie alles zusammenkommt.
Viel Spaß beim Stacking!
Graham.
Originally published on allthingscloud.eu (2017-10-10).