Auto-Scaling-Infrastruktur als Code – Elastische Compute-Ressourcen auf K5 IaaS

2017-10-10

Auto-Scaling-Infrastruktur als Code – Elastische Compute-Ressourcen auf K5 IaaS

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

Versteckte Zeichen anzeigen

# 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

Versteckte Zeichen anzeigen

const express = require('express')
const app = express()
const serverName = require('os').hostname();
const messageTop = '
\
https://www.fujitsu.com/uk/Images/K5-climber-580x224_tcm23-2619235.jpg&quot; alt="K5 Autoscale">\

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

Versteckte Zeichen anzeigen

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.

Eingebetteter Inhalt

Viel Spaß beim Stacking!

Graham.

Originally published on allthingscloud.eu (2017-10-10).

← All posts