Spinnaker

De meesten van jullie kennen Netflix waarschijnlijk wel. In 1997 begon het bedrijf nog met het rondsturen van dvd’s, maar inmiddels zijn ze de grootste aanbieder van online films en series. Sterker nog, Netflix is inmiddels verantwoordelijk voor een groot gedeelte van het internetverkeer. Desondanks werkt het meestal goed en stabiel. Het mooie is dat Netflix een aantal van de softwareprojecten (die het zelf gemaakt heeft en ook zelf gebruikt) open source heeft gemaakt. Daardoor kan iedereen gebruikmaken van de lessen, die ze bij Netflix geleerd hebben. Onlangs heeft Netflix een nieuwe continuous delivery applicatie, genaamd Spinnaker, uitgebracht. In dit artikel leer je meer over Spinnaker, waarna je het eventueel zelf in kunt gaat zetten.

Figuur 1: Het Netflix Spinnaker logo

 

Inleiding

Netflix heeft inmiddels al vele open source projecten. Zelf maken we al geruime tijd gebruik van Hystrix, dat erg goed werkt. Recent heeft Netflix (in samenwerking met Google, Microsoft en Pivotal) Spinnaker open source gemaakt. Ik was dan ook benieuwd of Spinnaker net zo interessant als Hystrix is. Spinnaker is zoals ze het zelf noemen een “cloud deployment and management tool” en het is de opvolger van Asgard. In Figuur 2 kun je zien in welke stappen van het continuous delivery proces Spinnaker gebruikt kan worden. Spinnaker is opgebouwd op basis van een flink aantal microservices in combinatie met een singlepage AngularJS voorkant.

Voor degenen die zich afvragen waar Spinnaker voor staat: een spinnaker is een voorzeil, dat wordt gebruikt met zeilen. Dat verklaart ook het logo van Spinnaker.

Figuur 2: Voor deze stappen van de continuous delivery pipeline kun je Spinnaker gebruiken

Met behulp van Spinnaker is het mogelijk om op Amazon Web Services, Google Cloud Platform en Cloud Foundry te deployen en clusters te beheren. Daarnaast is men ook bezig om ondersteuning voor de Microsoft Azure cloud in te bouwen. Spinnaker is eigenlijk een soort van schil bovenop de bestaande cloud-provider applicaties. Met Spinnaker is het mogelijk om gelijktijdig over meerdere cloud-providers heen te deployen. Dat kan voor een hogere beschikbaarheid zorgen, maar het maakt het ook gemakkelijker om te wisselen van cloud-provider.

Boze tongen beweren dat Netflix deze richting is ingeslagen, omdat ze bang zijn dat Amazons aanbod van films en series een te grote concurrent wordt. Op dit moment draait Netflix namelijk bijna alles in de Amazon cloud. Dit is enigszins opmerkelijk, aangezien het inmiddels concurrenten zijn.

 

Starten met Spinnaker

Mijn verwachting was dat het opzetten van Spinnaker relatief eenvoudig zou zijn, omdat het een soort laag bovenop de bestaande cloud-provider applicaties is. Toch moeten er nog steeds de nodige handmatige stappen uitgevoerd worden om Spinnaker op te zetten. Gelukkig zijn daarvoor al een aantal handleidingen beschikbaar. Als je zelf aan de slag wilt gaan, dan kun je dit aan het einde van dit artikel vinden.

Er zijn wel twee nadelen aan de handleidingen: je moet heel veel stappen handmatig uitvoeren en er staan fouten in. Hopelijk wordt dit beter, zodat het gemakkelijker is om met Spinnaker aan de slag te gaan. Als je al ervaring hebt met één van de ondersteunde cloud-providers, dan is het relatief eenvoudig om met Spinnaker aan de slag te gaan. Ga je Spinnaker op een voor jouw onbekende cloud-provider installeren, dan zal je wat langer bezig zijn om alle concepten te doorgronden.

De stappen, die uitgevoerd moeten worden, zijn namelijk met name stappen in de al bestaande applicaties van de cloud-provider. Nadat die stappen uitgevoerd zijn, kun je gebruikmaken van Spinnaker. Spinnaker zelf is eenvoudig te gebruiken en is uiteindelijk een uniforme applicatie, die hetzelfde werkt op de verschillende cloud-providers.

 

De verschillende onderdelen

De functionaliteit van Spinnaker is eigenlijk op te delen in twee stukken. Enerzijds is er het beheergedeelte waarmee je de infrastructuur, zoals loadbalancers, clusters en security groups (soort van firewall regels) kunt beheren. Eigenlijk is dat een schil bovenop de bestaande software van de verschillende cloud-providers, zoals bijvoorbeeld de Amazon AWS console. Daarnaast kun je met Spinnaker deployments uitvoeren op basis van een deployment pipeline.

In figuur 3 zie je een voorbeeld van hoe Spinnaker gebruikt kan worden. De benodigde stappen worden hieronder uitgelegd.

Figuur 3: Voorbeeld opstelling van Spinnaker

Managementonderdeel

Allereerst dient er een applicatie aangemaakt te worden. In deze applicatie wordt de deployment pipeline vastgelegd. Daarnaast wordt in de applicatie ook de infrastructuur geconfigureerd. In Figuur 3 zie je een aantal van de managementonderdelen aangegeven met groene strepen. Het gaat dan om:

  1. Definieer een ‘Security Group’ (soort van firewall regels) om je applicatie/machines af te schermen tegen de boze buitenwereld.
  2. Definieer een ‘Load Balancer’
  3. Optioneel kun je ook nog de clusters beheren en ze vergroten, uitschalen of verwijderen.

Deployment pipeline

De verschillende stappen, die nodig zijn om van code naar een productie applicatie te gaan, worden vastgelegd in een deployment pipeline. In Figuur 3 is een voorbeeld daarvan te zien, waarbij de zwarte pijlen de volgende stappen illustreren:

  1. Maak een project in Jenkins dat het continuous integration proces uitvoert. Hierin wordt het project gebouwd, testen uitgevoerd en andere kwaliteitcontroles gedaan. Dit Jenkins project kan het GitHub project pollen of GitHub kan direct na een push een build van het Jenkins project starten door middel van Webhooks. De laatste optie klinkt in eerste instantie mooier, maar het zorgt er wel voor dat je Jenkins inloggegevens in GitHub op moet slaan. Vanuit veiligheidsoverwegingen kan pollen dus een betere optie zijn.

  2. In Figuur 4 is te zien hoe de trigger is geconfigureerd in Spinnaker. Na de Jenkins bouwpoging krijgt Spinnaker een trigger en wordt de deployment pipeline in Spinnaker gestart. De daadwerkelijke deployment pipeline van Spinnaker is in Figuur 5 te zien.

  3. Vervolgens start de eerste Spinnaker stap en roept Spinnaker een Jenkins build aan om een ‘deb’ file te maken. Een ‘deb’ file is een Debian package. Dit package wordt gebruikt om uiteindelijk een image te maken, dat gedeployed kan worden. Het is aan te raden om voor deze stap een ander Jenkins project te maken dan het Jenkins project voor de continuous integration stap. Anders worden taken namelijk onnodig vaker uitgevoerd.

  4. Nadat Jenkins de ‘deb’ file heeft gemaakt, moet deze ook ergens opgeslagen worden. In dit geval hebben we ervoor gekozen om de ‘deb’ file in een Amazon S3 Bucket op te slaan. Dat is een plek om ‘deb’ files in op te slaan, maar je zou de ‘deb’ files ook op de Jenkins server kunnen opslaan.

  5. Spinnaker haalt vervolgens de ‘deb’ file op en maakt er een image voor, dat gedeployed kan worden op een Amazon EC2 instantie.

  6. Daarna wordt de applicatie (of eigenlijk het image) afhankelijk van de instellingen op één of meerdere Amazon EC2 instanties geïnstalleerd.

Figuur 4: Jenkins trigger configuratie om automatisch een build van de deployment pipeline te starten na een Jenkins build

Figuur 5: Voorbeeld deployment pipeline die momenteel uitgevoerd wordt.

Het starten van een deployment pipeline kan via een trigger. Die trigger kan een voltooide Jenkins job zijn, een cron expressie, een andere pipeline of handmatig. In het bovenstaande voorbeeld hebben we gekozen voor een Jenkins trigger. Dit zorgt ervoor dat Spinnaker direct start na het uitvoeren van het continuous integration gedeelte door Jenkins.

 

Deployment pipeline in Spinnaker

In Figuur 5 is een voorbeeld bouwpoging van een deployment pipeline te zien. In deze bouwpoging is de ‘Build’ stap al afgerond en is de ‘Bake’ stap nog bezig. Waarbij ‘Build’ in dit geval betekent, dat een build gestart wordt van het Jenkins project dat een ‘deb’ file oplevert. ‘Bake’ maakt vervolgens met die ‘deb’ file een image voor de specifieke regio. Als laatste zorgt de ‘Deploy’ stap ervoor, dat de images uitgerold worden over het aantal EC2 instanties dat je opgegeven hebt. Zo is het mogelijk om direct twee of nog meer EC2 instanties te starten met daarop de nieuwste versie van je applicatie.

Figuur 6 laat een overzicht zien van de verschillende bouwpogingen, die zijn uitgevoerd binnen deze specifieke deployment pipeline.

Figuur 6: Overzicht van de verschillende bouwpogingen van deze deployment pipeline

 

Het echte werk

Bovenstaand voorbeeld is natuurlijk leuk, maar dat zou je ook relatief eenvoudig met andere tools kunnen implementeren. Wat Spinnaker interessant maakt, dat zijn features zoals de ‘Deployment Cluster Strategy’. Met deze strategie kan makkelijk aangegeven worden hoe de nieuwe applicatie uitgerold moet worden. Daarvoor zijn een aantal strategieën beschikbaar:

  • Highlander: verwijder de vorige servergroep als de healthchecks van de nieuwe servergroep slagen;
  • None: maak een nieuwe servergroep zonder iets met de oude servergroep te doen;
  • Red/Black: schakel de vorige servergroep uit als de healthchecks van de nieuwe servergroep slagen;
  • Custom: een zelfgemaakte deployment-strategie.

Met behulp van deze strategieën is het dus mogelijk om simpel te wisselen van keuze. Loopt alles soepel, dan wil je wellicht direct je oude servers vervangen voor nieuwe servers met je nieuwe applicatie. Is er een grote release of verwacht men problemen, dan is het makkelijk om de oude servers te bewaren voor het geval de nieuwe niet goed werken.

Daarnaast is het ook mogelijk om geavanceerdere deployment pipelines te maken. Daarbij kunnen stappen ook parallel uitgevoerd worden. De stappen in de deployment pipeline worden ‘stages’ genoemd. In figuur 7 is een voorbeeld hiervan te zien. Allereerst is er de ‘Configuration’ voor de Jenkins trigger. ‘Check Preconditions’ voert een aantal controles vooraf uit. Vervolgens wordt in ‘Build’ de ‘deb’ file opgeleverd. Daarna kan parallel een image gemaakt en gedeployed worden in twee verschillende Amazon cloudregio’s. Als alles goed is gegaan, dan kan in de ‘Manual Judgement’ stap aangegeven worden, dat de rest van de pipeline uitgevoerd kan worden. In ‘Shrink Cluster’ wordt dan vervolgens de grootte van het cluster teruggebracht.

 

Figuur 7: Geavanceerdere deployment pipeline

 

Jenkins

Spinnaker is met name gericht op de continuous delivery van applicaties. Voor het bouwen en testen van de applicaties wordt Jenkins aangeraden. Het makkelijkste is om binnen Jenkins twee projecten aan te maken, zoals eerder in het artikel beschreven staat.

In de handleiding wordt beschreven hoe het opslaan van de ‘deb’ file in S3 gedaan kan worden met behulp van Ruby. Dat is echter wat omslachtig, aangezien er ook een S3 plugin beschikbaar is voor Jenkins. In Figuur 8 is de algemene configuratie van de Jenkins S3 plugin te zien. Het belangrijkste hier is dat ‘Use IAM Role’ is aangevinkt. Vervolgens is in Figuur 9 te zien hoe met Gradle een ‘deb’ file gemaakt wordt. Daarna wordt de ‘deb’ file naar de gespecificeerde S3 Bucket gestuurd.

Let er wel op, dat je niet de standaardregio (bijvoorbeeld Frankfurt) van je S3 Bucket gebruikt in Jenkins. Je moet de regio van je endpoint gebruiken (bijvoorbeeld eu-central-1), die je onder ‘Static Website Hosting’ in je S3 Bucket in de AWS console kunt vinden.

 

Figuur 8: Configureer een S3 profiel en geef aan dat de IAM role gebruikt moet worden

Figuur 9: Bouw de 'deb' file en sla die op in de S3 Bucket

 

Conclusie

Het vergt de nodige inspanningen om Spinnaker en alles eromheen op te zetten in de Amazon cloud. Daarnaast lijken er nog wel wat bugs in te zitten. Dropdowns worden soms niet gevuld en sommige acties zorgen voor een eindeloos draaiende spinner. Een aantal van de problemen staan ook in de ‘Troubleshooting Guide’. Sommige issues kon ik oplossen door een herstart van Spinnaker en andere dingen werkten op een magische manier de volgende dag gewoon weer.

De documentatie en ondersteuning komt langzaam op gang en het is mooi dat er een Slack kanaal is waar je met vragen terecht kunt.

Mocht je momenteel in een eigen datacenter deployen of een relatief eenvoudige deployment pipeline hebben, dan is Spinnaker wellicht wat overkill. Jenkins is bijvoorbeeld een prima alternatief om “simpele” deployment pipelines op te zetten. Maak je echter al gebruik van één van de door Spinnaker ondersteunde cloud-providers, dan kan het een logische vervolgstap zijn om Spinnaker te gaan gebruiken. Zeker als je wat meer geavanceerde deployments wilt doen, zoals bijvoorbeeld red/black deployments, dan is Spinnaker een absolute aanrader.

 

Bronnen: