Minor DevOps - AIM & InfoSupport
Quicklinks
Inleiding
In deze minor leren ICT-studenten moderne ICT-technieken voor Continuous Delivery volgens een DevOps aanpak. Studenten bouwen in teamverband samen een geintegreerd software product, waarbij ze kijken naar zowel software en de onderliggende software architectuur als de te gebruiken infrastructuur (hardware) en de architectuur en configuratie daarvan.
Minor DevOps: je leert DevOps tools en DevOps concepten
In de volgende sectie een kort overzicht, aan de hand van enkele kreten. De sectie daarna licht de fasering van de minor toe en toetsing. De tot slot volgende secties werken deze drie fases uit.
Figuur 1: Promo video minor DevOps HAN i.s.m. InfoSupport
Minor DevOps: Let's do some major DevOps!
Dev en Ops studenten leren in deze minor samenwerken aan applicaties door een 'containerized' aanpak, die het mogelijk maakt veel Ops processen te automatiseren, op grote(re) schaal te werken vanuit een gedeelde backlog en hierbij oude silo's te doorbreken voor een snellere 'time to market' ('shift left').
Dus onthoud: DevOps is Cooperation (zie figuur 2).
Concreet aan de slag met non-functional requirements
Het kijken naar het geheel van software én infrastructuur en het hanteren van DevOps principes en -tools stelt studenten in staat om naast functionaliteit voor eindgebruikers ook te kijken naar non-functionele eisen (NFR's) zoals schaalbaarheid, betrouwbaarheid en onderhoudbaarheid. NFR's noemen sommigen liever 'quality attributes' (QA's) omdat bv. goede performance wel degelijk heel functioneel kan zijn voor eindgebruikers, of zelfs essentieel ('performance as a feature').
...met deployment pipelines
Studenten leren om een DevOps proces op te zetten en te werken met een CI/CD pipeline voor geautomatiseerde deployment naar productie en andere runtime omgevingen op basis van de 'desired state' in versiebeheer (GitOps). De resulterende makkelijkere en meer frequente updates maken een focus op betere security ook mogelijk (DevSecOps) en tot slot verbetert goede logging en monitoring (SlackOps) het zicht op prestaties, early warning van fouten en zelfs live bijhouden of je bedrijfsdoelen haalt. Dit gebeurt via applicatiespecifieke KPI's. Er zijn zelfs monitoring tools die inzicht geven of je met klanten gemaakte afspraken (SLA's - Service Level Agreement) nakomt.
...en je verder ontwikkelen als "T-shaped professional"
Figuur 3: 'T-shaped DevOps professional' (plaatje: agilescrumgroup.com)
Dit is zowel een verdiepende als een verbredende minor. Instroom is alleen mogelijk voor ICT studenten die ofwel een Operations achtergrond hebben (Infrastructuur, Security) of een Development achtergrond (Software Development, Web Development of Data Solutions Development. Al deze studenten verbreden hun kennis en leren elkaars taal spreken om interdisciplinair te kunnen werken, maar verdiepen ook hun specialisme door te leren werken in moderne wereld van containers, cloud providers, microservices en Agile systeem development.
De kern van DevOps is samenwerking tussen Dev en Ops. Dus niet per se alles kunnen, zowel Dev als Ops, maar in hetzelfde team werken en vooral voldoende kennis over elkaars werk en veld hebben om tijdig te gaan communiceren. Welbeschouwd is de term 'T-shaped DevOps professional' (figuur 3) dus een pleonasme, om een 'duur woord' te gebruiken.
Fasering: courses en project
Het semester bestaat uit 2 blokken: een course blok en een project blok (zie figuur 4).
Figuur 4: Overzicht minor DevOps (NB Ops course nog Work in Progress)
Dev en DevOps volg je tegelijkertijd voor acht weken en in week negen is een week van presentaties en eindbeoordelingen, met de herkanstoets en het orienteren op de praktijkopdracht in het 2e blok.
Hieronder de beschrijving van de verschillende fasen. Nog meer details voor degenen die de minor meedoen staan in de subsecties die je via het menu kunt bekijken.
A. Week 1 t/m 5 - Courses: 'DevOps school'
Wekelijkse theorie, oefeningen en huiswerkopdrachten rondom een thema.
In de eerste vijf weken leer je basiskennis DevOps als voorbereiding op de afsluitende twee vrijere opdrachten. Dit verloopt volgens het flipped classroom model, waarbij student zelf verantwoordelijk is bij te blijven en te zorgen voor voldoende leerervaring. Hierbij bestudeer je zelfstandig thuis online documentatie, blog posts, video's van YouTube of PluralSight of andere online leerplatformen. Deze zijn opgegeven in het huiswerk.
In de les maak je opdrachten en is er kans voor uitwisseling. Hier zijn ook af en toe korte discussies aan de hand van vantevoren bedachte stellingen. Ook zijn er een aantal workshops van InfoSupport. Voor details zie het 'Lesoverzicht'.
B. Week 6 - Onderzoeksopdracht
Individuele Onderzoeksopdracht met als deliverable een blogpost van 800-1500 woorden (2 tot 4 A4).
De blogpost schrijf je als eindtoets voor de course Dev of Ops en doe je individueel. NB: De individueel onderzochte technologie pas je hierna toe in beroepsproduct voor course DevOps. Het onderwerp en te onderzoeken vragen stem je daartoe wel af met docent en beoogd groepsgenoten.
Zie details onder Week 6 - Onderzoek.
C. Week 7 & 8 - Eindopdracht: Beroepsproduct
Grotere programmeeropdracht van een (uitbreiding van) een software systeem, inclusief configuratie, images, dependencies, CI/CD config, db en/of seed scripts en documentatie
De eindopdracht geldt voor de course DevOps en doe je in een groep van 4 a 5 personen zoveel mogelijk vergelijkbaar ambitieniveau. Meer info over eisen voor dit beroepsproduct zie onder Week 7 & 8 Beroepsproduct.
D. Week 9 - Eindpresentatie course fase
Eindpresentaties, herkansing, bezoeken van en bespreken project opdrachtgevers.
In week 9 is de definitieve beoordeling en heb je een groepspresentatie met Demo van je in week 7 en 8 gebouwde product (zie 7.3) en toelichting op jullie proces (zie 7.4). Tevens is er een aparte sessie met je groep met toelichting en verantwoording van de individuele bijdrage per teamlid aan het product (zie 7.5).
De beoordelingscriteria hoor je tijdens project en er staat een beoordelingsmodel in iSAS. Maar dit gaat grofweg over kwaliteit en kwantiteit van werk en het toepassen van geleerde DevOps 'Way of Working' (WoW) en DevOps maturity. Conform de DevOps ways proberen beoordelaars dit 'iteratief' en 'incrementeel' te houden. De beoordeling is gebaseerd op observaties van begeleiders en het gemaakte werk, backlog en documentatie gedurende de weken. Maar een zekere mate van WaterScrumFall is hierbij toch niet te vermijden i.v.m. het plannen.
E. Blok 2 - DevOps project...
Totaal 9 weken aan de slag voor een echte klant met begeleiding en beoordeling vanuit InfoSupport (HAN eindverantwoordelijk eindbeoordeling)
Na de courses volgt natuurlijk het project in blok 2. Doel van de hele course fase is ook om je voldoende bagage te geven voor dit project. Hierbij heb je te maken met een echte opdrachtgever. Het is de bedoeling snel iets op te leveren naar een productie omgeving volgens de DevOps principes, en dit hierna in de lucht te houden, en verder te ontwikkelen zowel functionaliteit als implementatie van non functional requirements (realisatie quality attributes).
De volledige formele eisen, competenties en beoordelingscriteria staan in de de OWE. Voor een korte introductie zie opdrachtbeschrijving. Meer informatie over het project in blok 2 en de eisen en beoordeling hierbij volgt in week 9 van de course, waarin je ook kennismaakt met de opdrachtgever. Zie ook de punten onder 8. De beoordelingsmethode is vergelijkbaar als bij de 2-weekse BP opdracht, maar nu in een langer project met een eigen 'microservice applicatie' i.p.v. 'brown field project' in een demo applicatie.
Figuur 7: Het course eindproject is slechts een 'PitStop' naar het grote DevOps 'green field' project in blok 2
Voor meer info kun je nog de eisen eindproject in blok 2 op deze website bekijken
Berekening van de Cijfers
DEV
- Theorie Test - 50% van het cijfer
- 2 deeltoetsen (gemiddelde moet hoger dan 5,5 zijn)
- Herkansing: 1 grote toets
- Beroepsproduct - 50% van het cijfer
- Blogpost
- Weekopdrachten (huisopdrachten)
- Je moet alleen een vinkje krijgen
DEVOPS
- Theorie Test
- 2 deeltoetsen (gemiddelde moet hoger dan 5,5 zijn)
- Herkansing: 1 grote toets
- Beroepsproduct - 50% van het cijfer
- 2 weken code
- Weekopdrachten
- 2 weekopdrachten (Linux + RabbitMQ)
- Alleen een vinkje nodig
Groepsvorming voor wekelijkse opdrachten
Het vormen van paren en inleveren van werk in versiebeheer en iSAS is beschreven op de pagina 'Werkwijze weekopdrachten' op deze website.
Project rooster
Hieronder het rooster voor het project. Meer details in het .pdf
rooster op Slack.
Toelichting hieronder. Als je inconsistentie tussen dit rooster en de .pdf opmerkt, meld dit dan bij de docent!
Week | Maandag | Dinsdag | Woens | Donder | Vrijdag |
---|---|---|---|---|---|
Week 1 11-15 nov | Kick-off (A'doorn) | DoR/WoW opst. | Planning 1 | ..ops | Status update 1 USM check + Prod (V'daal) 🥪 |
Week 2 18-22 nov | Vragenuur DevOps | Q&A 1 PO (Teams) | dev.. | ..ops | Tech Review 1 + Staging (Utrecht) |
Week 3 25-29 nov | Planning 2 | Review 1 (A'doorn) | Retro 1* | ..ops | Status update 2 (Arnhem) |
Week 4 2-6 de | Vragenuur DevOps | Q&A 2 PO (Teams) | dev.. | ..ops | Tech Review 2 (Utrecht) |
Week 5 9-13 dec | Review 2: Groep TT (V'daal) 🥪 | Retro 2 | ..ops | Ind TT (Arnhem) | |
Week 6 16-20 dec | Vragenuur DevOps | Q&A 3 PO (Teams) | dev.. | ..ops | Tech Review 3 (Utrecht) |
Kerst vakantie | |||||
Kerst vakantie | |||||
Week 7 6-10 jan | Planning 4 Vragenuur DevOps | Review 3 (V'daal) 🥪 | SR3 dev.. | ..ops | Status update 4 (Arnhem) |
Week 8 13-17 jan | Vragenuur DevOps | Q&A PO 4 (Teams) | dev.. | ..ops | Tech Review 4 (Utrecht) |
Week 9 20-24 jan | Ind EIND (Arnhem) | Review 4: Groep EIND 🥪(A'doorn) | |||
Week 10 27-31 jan | Herkansingen toetsen courses |
Toelichting
Het project bestaat uit 4 sprints van 2 weken. In week 5 is de tussentijdse (TT) en in week 9 de eindbeoordeling (EIND). Beoordeling gebeurt in groepsverband (Sprint Reviews 2 en 4 met PO) en individueel met de HAN-begeleider (zie beoordeling individueel). Sessies zijn verspreid over Apeldoorn, Veenendaal, Utrecht en Arnhem, of studenten werken thuis.
- Projectduur: 40 uur per week
- Er is een korte PreGame van 2 dagen waarin je User Storymap opstelt en je orienteert op ontwikkelomgeving (Overige gebeurt in Sprint 1).
- Teams doen zelf de Scrum ceremonies zoals Daily Standup (DSU), en elke sprint:
- Sprint Planning (SPC)
- Sprint Retrospective (SR)
- en voorbereiding hiervoor.
- HAN Begeleiders begeleiden tijdens verder korte status updates op vrijdag, verder via mail of Slack of evt. korte Teams call
- Sprint Reviews zijn met de Product Owner op dinsdag in week 3, 5, 7 en 9
- De 'andere week' is er een online Vragenuur met de PO is op dinsdag in de even weken (via Teams).
- Stel hier vragen, en bereid dit voor! Verzamel vragen over de week.
- Vraag je opdrachtgever om keuzes, maar geef deze ook logische voorstellen en alternatieven waar mogelijk of geef een concreet sprintvoorstel.
- Zie ook de groepsbeoordeling.
- Om de week is hier ook een Tech Review, met technische focus op meer DevOps aspecten, zowel technische als cultuur zoals:
- inrichten (OTAP) RunTime omgevingen,
- CI/CD pipeline,
- monitoring,
- build for failure etc.
- code kwaliteit, test coverage, linting, reviews
- In wk 5 en 9 vind na de Sprint Review ook becijfering plaats door HAN docenten
- Dit is o.b.v. observaties en werk tot dan en input PO en InfoSupport begeleiders
- De maandagen in wk5 en 9 ervoor is 'groepssessie individuele verantwoording'
- Op maandag, woensdag en donderdag werken jullie zelfstandig aan Dev/Ops taken thuis of op de HAN.
- Maar ook dagen op locatie ontwikkelen Dev jullie of doen OPS; want presentaties/ceremonies duren meestal maar een half uur.
- Bij Sprint Review 4 in week 9 presenteren alle groepen voor opdrahtgevers, maar ook voor elkaar
Eisen aan eindproject van DevOps minor
De opdrachtomschrijving voor het project in blok 2 volgt tijdens dat blok zelf. De requirements moet je 'agile' afstemmen met de klant/opdrachtgever.
De totale beoordeling bestaat uit een oordeel over jullie DevOps teamproduct en een oordeel over je individuele bijdrage op basis van je eigen verantwoording. De beoordeling over het teamproduct staat hieronder beschreven. De individuele beoordeling is volgens hetzelde model als die voor de Course BP.
Beoordeling groepscijfer
Hieronder de eisen en beoordelingscriteria voor het teamproduct. Onderstaand de 6 eisen met korte samenvatting, maar verdere secties geven de details hiervan:
- een ingevuld self assessment
- CDMM checkpoints met toelichtingen + cijfer indicatie 5 hoofdcategorieën
- a. Omgang Technologie
- techstack, devops tools, monitoring/metrics
- b. Jullie 'Way of Working'
- Scrum, Storymap, etc.
- c. Build en Deployment
- ontwikkelstraat, Azure DevOps, etc.
- d. Documentatie
- C4, continuous documentation, ADR's, etc.
- e. Soft Skills
- effectief Agile werken, communiceren en presenteren aan technische+niet technische stakeholders
De checkpoints gelden hierbij als vereisten en dus knock-outs voor het teamcijfer. De beoordelingsniveaus zijn beperkt tot onderstaande 5; dit ter beoordeling aan de begeleiders en opdrachtgever. Als één punt onvoldoende is, is het gehele eindcijfer een onvoldoende (e.g. het zijn knock-outs). Als er Twijfel is kun je het compenseren met Goed of Uitmuntend op andere beoordelingscriteria, om totaal boven de minimale 5.5 te komen om het project succesvol af te sluiten.
- O=knOck-out, 2.0, niet gedaan
- T=Tsja (Twijfelachtig), 4.0, twijfel of serieuze tekortkomingen
- V=Pass (Voldoende), 6.0, punt voldaan
- G=Goed , 8.0, met veel kwaliteit of kwantiteit en afgestemd met begeleiders/opdrachtgever
- U=Uitmuntend 10.0, je ging 'above and beyond' de vereisten
Self assessment
Bij je oplevering (tussentijds en eind) hoort ook een zelf als team samen opgesteld self assessment met het CDMM model (net als bij het beroepsproduct aan het einde van de course). Houdt vanaf het begin hiermee ook al in de gaten of je voldoende variatie in werkzaamheden hebt en op je 'DevOps volwassenheid'. Het CDMM is hierbij niet alleen het beoordelingsmodel, er zijn ook concretere eisen opgesteld onder de volgende vijf beoordelingscriteria A tot en met E hieronder.
A. Technologie
- ⛪ Design & Architecture
- 📈 Information & Reporting
- Je werkt met de technologiestack zoals de klant die gebruikt (of hebt een goede onderbouwing waarom je daar van afgeweken bent)
- De applicatie is opgedeeld in (Docker) containers en draait in een Kubernetes (cluster)
- Je hebt monitoring ingericht die de beschikbaarheid van de (onderdelen van de) applicatie inzichtelijk maakt
B. Way of Working
- 🧑🤝🧑 Culture & Organization
- Je hebt nauw contact met opdrachtgever/Product Owner (meer malen per week)
-
Je werkt volgens Scrum met een- of tweeweekse sprints, Scrum ceremonies en wekelijks contactmomenten
- Elke week een Review met demo
- met werkende software, uiterlijk week 2 à 3
- met monitoring, uiterlijk week 3 of 4
- Opleveren: Een overzicht van verbeterpunten uit de retrospectives (minimaal 1, liever meer, zinvolle procesverbetering per week en het resultaat van de verbetering)
- Elke week een Review met demo
-
In week 1 oriënteer je je op het project en legt je werkwijze als team vast (binnen gegeven kaders project)
- Een Definition of Ready
- Opleveren: Definition of Ready
-
Je week 1 maak je ook een User Story Map
- User story map en overige zaken
- Verdeeld in zinvolle slices die je gebruikt in de communicatie met de opdrachtgever en bijhoudt gedurende het project.
- High level user stories met prioritering en waar mogelijk onderliggende acceptatiecriteria, persona's e.d.
- Initiele backlog
- Opleveren: Gevulde backlog, User story map, elke week een foto of afbeelding van de bijgewerkte map
-
Je past code reviews toe
- Je hebt een systeem van pull requests ingericht met reviewopmerkingen in Azure DevOps (of ander gekozen Code management systeem)
- Bij persoonlijke beoordelingen (na 4 en 8 weken) tenminste 1 review laten zien van jouw over andermans code.
C. Build en Deployment
- 🏗️ Build & Deploy
- Je hebt na sprint 1 een 'productie omgeving' en werkt deze daarna bij
- Je hebt na sprint 2 à 3 werkende software in productie staan en bouwt daar vervolgens op voort
- Je denkt na over meerdere omgevingen, dus naast productie bv. een develop, QA of staging omgeving
- Je levert vanaf sprint 5 à 6 aantoonbaar vaker op dan enkel einde sprint, middels automatische uitrol
- Je hebt automatische tests in een build pipeline
D. Documentatie
- ⛪ Design & Architecture
- Je hebt je product gedocumenteerd met:
- Een goede README voor developers (volgens Microsoft richtlijnen)
- C4-diagram: minstens een Context en Container diagram, inlcusief toelichting op elk, als documentatie van je Software Architectuur
- Architectuurbeslissingen in de vorm van ADR’s
- Specificaties in de vorm van given-when-then’s (Gherkin)
-
Je hebt zelf een beeld van je DevOps volwassenheid via een self assessment van het CDDM
- met een realistisch deelcijfer/niveau op elk van de 5 categorieën
- en per cijfer/categorie ook eigen toelichting* over hoe je 'checkpunten' hebt gehaald en waar dit zichtbaar is in eigen werk (of (net) niet hebt behaald (wellicht met goede reden),
- Opleveren: Een overzicht van de (runtime) omgevingen, hoe ze zijn ingericht, en beheerd worden (incl. de koppeling met versiebeheer).
E. Soft skills
- 🧑🤝🧑 Culture & Organization
- Je werkt prettig samen met de opdrachtgever en geeft een professionele indruk
- Je werkt goed samen als team en creëert een goede werksfeer
- Je valt de opdrachtgever niet lastig met technische details, maar kunt issues en werkzaamheden vertalen naar bedrijfstermen
- Je schermt als team de opdrachtgever af van kleine afwijkingen van de planning
- Maar bij grote(re) tegenslagen communiceer je tijdig, zodat opdrachtgever kan meedenken over alternatieve richtingen
- Bij extra tijd en evt. opraken van werk denk je pro actief mee met business over mogelijk waardevolle features
Toelichting
Merk op dat dat bovenstaande punten grofweg knock-outs zijn van het minimale verwachte werk, de te gebruiken werkwijze en de op te leveren zaken (deliverables). Voor het komen tot een concreet cijfer kijken begeleiders naar de hoeveelheid en de kwaliteit van met team gemaakte product, en ook omgang en goed hanteren van Agile proces en samenwerken als team. Bedenk hierbij dat het gemaakte product een DevOps product is, dus focus niet alleen op code en functionaliteit, maar toon DevOps volwassenheid. Andersom, focus je niet alleen op pipelines, build bakeries etc. maar maak ook een product wan zonder nieuwe features en requirements heb je geen DevOps nodig.
Hoe ga ik naar ruim voldoende, goed, zeer goed of uitmuntend?
Voor het aantonen van hogere 'Devops volwassenheid' (en dus eindcijfer boven een 6) kun je — net als in de coursefase — het CDMM er weer bij pakken en jezelf hiermee assessen. Hou het niet bij alleen afvinken, maar argumenteer per checkpunt onder de verschillende niveaus van de beoordelingscriteria waarom je het wel of niet of deels hebt. Om je beschrijving enigszins kort te houden helpt het wel om ook te linken naar concreet werk in je code management systeem. Dus een goede linktekst op te nemen vergelijkbaar met je dit in individuele fact sheet doet.
En zeker bij de hogere punten XX-30X en XX-40X moet je behalve zeggen DAT je het doet ook uitleggen/beargumenteren HOE je hier dan aan voldoet. Voor het afvinken van deze criteria moet je ook 'bewust bekwaam' zijn en dit aantonen. Anders kan een beoordelaar aanvoeren dat het een 'toevalstreffer is'. Ook is het zelden voldoende om te zeggen 'Dit checkpunt hebben we omdat we Tool X gebruiken'. Bijvoorbeeld 'Cross Silo analysis voldoen we aan omdat we Prometheus en Grafana gebruiken'. Geef of beschrijf in plaats daarvan een concreet scenario van een 'cross silo analysis'. Lees ook de toelichting bij verschillende checkpoints in de 'lijst van devops concepten'.
Een goede redenering en argumentatie is dus ook nodig voor een goed cijfer. Je kunt ook een checkpunt afvinken, maar aangeven dat je er deels nog niet aan voldoet, maar wel een oplossingsrichting geven. Dus maai liever het gras voor de voeten weg van mogelijke kritiek of vragen)
Figuur 1: Het Continuous Delivery Maturity Model van infoq.com
Merk overigens op dat het CDMM van InfoQ is, iets anders is dan InfoSupport. Als je zelf een ander moderner, simpeler, passender of anderszins beter maturity model weten of vinden dan het CDMM uit de coursefase, dan kun je deze in overleg met de begeleiders ook gebruiken voor dit self assessment! Plumlogix model is wat simpel en enkel 'cretologie' zonder onderscheid tussen niveaus, dus dit moet je allemaal zelf definiëren en beargumenteren. Het Nederlandse NISI heeft bijvoorbeeld ook een recenter maturity model, CD3M genaamd, maar de term 'continuous intelligence' hierin is nogal vaag. Het CDMM van InfoQ (feb 2013) is nog van (net) voor de tijd dat veel huidige DevOps tools ontstonden (bijvoorbeeld Docker (1.0 in maart 2013 uit dotCloud) of Kubernetes (2014, open-source versie onder de naam 'Borg') bestonden of gemeengoed waren). Zelfs microservices werden net iets later pas hot. Maar het CDMM bevatte conceptueel al wel heel veel zaken zoals een 'Build bakery' (dit idee zit in de base images uit Docker) en 'microservices' zijn de 'componenten' uit OA205: 'Modules omzetten naar componenten' (e.g. van modulaire monolith naar microservices, waar OA-101 'Systeem opsplitsen in modules' nog te zien is als de stap is van een niet-modulaire monoliet naar een wel-modulaire).
Figuur 2: Een alternatief DevOps Maturity Model van plumlogix.com
Lesoverzicht 2024/2025
Hier het lesoverzicht van de minor. Tijdens de minor volgen wellicht nog wat wijzigingen. Onder de tabel verdere toelichting.
Ma DevOps | Di DevOps | DiMi Dev | Vr DevOps Toets | Vr Deadline wk. opdr. | Thema / buzzword | |
---|---|---|---|---|---|---|
Week 1 2 t/m 6/9 | Kick-off: Intro + Overview | git 201 | Linux 101 | git workflows (.NET/TDD) | P2P Opdracht 1 | GitOps |
Week 2 9 t/m 13/9 | Alleen Ochtend Docker 101 | ORM EvoDB | Linux bash script | Container optimization & debugging | Opdracht 2 Toets 1 DevOps & Dev | Containerization |
Week 3 16 t/m 20/9 | Domain Driven Design | BDD | Micro front-ends (Do ochtend 19-9 i.p.v. dimi!) | Recap: CD vs DevOps | Opdracht 3 | Continuous Delivery |
Week 4 23 t/m 27/9 | Event Driven Architecture | K8s 101: Architecture | RabbitMQ | Opdracht RabbitMQ Dev | Orchestration/DevSecOps | |
Week 5 30/9 t/m 4/10 | Alleen Ochtend K8S 201: Ingress, etcd Hands-on K8S | C4 + Continuous Documentation | Monitoring | Toetsen 2 DevOps & Dev Do 3-10! | Opdracht 5 | SlackOps |
Week 6 7 t/m 11/10 | Onderzoeksplan/ Prompt Engineering | Voorbereiden Teampresentatie | Peer review | Team onderzoeks overleg | Eindpresentaties onderzoek | Onderzoek individueel |
Week 7 14 t/m 18/10 | Workshop Story mapping Sprint 1 planning | -> Staging | -> Prod | ... | Sprint review + self assessment | BP (sprint 1) |
Herfstvakantie | ||||||
Week 8 28 t/m 1/11 | Sprint 2 planning | Peer assessment | ... | Op bezoek opdrachtgever | Sprint review Deadline BP incl. docz | BP (sprint 2) |
Week 9 4 t/m 8/11 | Productdemo's groepen | Review sessies groepen | Herkansing (totaal)toets(en) | Azure DevOps/MCPS | Demo's + beoordelingen / Herkansing |
Verschil tussen Dev en DevOps
In deze cursus maken we het volgende onderscheid:
- Dev: 1 sessie per week met een gastdocent, gericht op ontwikkelingsconcepten.
- DevOps: 3 sessies per week met de cursusdocent, gericht op operationele aspecten.
Deze structuur biedt een balans tussen expertinzichten en praktische, hands-on leerervaringen.
Toelichting
Bovenstaand het hoofdschema. Als je begint met de minor is het goed even overzicht te krijgen van de stof. En naast inhoud ook even te kijken naar vorm van de lessen en hoe je gaat leren (Figuur 1: "Begin with the end in mind" - Stephen Covey):
- Elke lesdag bestaat uit een halve dag zelfstudie met theorie en opdrachten en een halve dag les (ca. 3 uur contacttijd).
- In de les presenteert de docent wat, maar kun je met medestudenten onderling ook informatie uitwisselen, vragen stellen en/of verder gaan met opdrachten.
- Op vrijdag is er wekelijks een deadline voor de huiswerk opdracht van die week.
- In weken 1 t/m 5 is er telkens een DevOps gerelateerd thema waar de lessen over gaan
- In week 6 doe je individueel onderzoek (voor 'Dev' course) en in week 7 en 8 maak je een DevOps beroepsproduct (BP) in een klein team. De lesuren in deze weken blijven op hetzelfde aanvangsmoment, en zijn bedoelde voor vragen, ophalen tussentijdse feedback, evt. korte workshops.
- In week 9 zijn geen lessen, maar start de week met afsluitende assessments en is er 'uitje' naar opdrachtgever en kun je verder orienteren met je groep het project in blok 2 (contact opdrachtgever).
Figuur 1: "Begin with the end in mind" - Stephen Covey, The seven habits of highly effective people
Week 1 - GitOps
GitOps Definitie
GitOps is reconciling a desired state in Git with a runtime environment
Everett Toews 10-2-2020, deloitte.com
Week 1 Opdracht
Je krijgt de 1e opdracht via GitHub Classrooms. Je kiest/vindt hierbij zelf een partner en bouwt samen een klein software project. Het is meer "Hello world" dan echte functionaliteit, omdat de focus NIET op code licht, maar op DevOps technieken. Bij het begin van het project zet je het project uit GitHub over naar GitLab. Hiervoor maken jullie samen een tweede remote repository naar self hosted gitlab.
Het project bevat unit tests, en de tutorial laat dit je test first opzetten (TDD). Dit is de moderne standaard. Hierbij heeft je programma eigenlijk nog geen echt entrypoint. Want de tutorial geeft aan een classlib aan te maken in .NET. Laat dit voor nu zo, dit ga je volgende week refactoren/uitbreiden naar wel een entry point (main
) en ook een .NET web api project, zoals de docent als het goed bespreekt (anders naar vragen!). En nog later kun je de webapplicatie continuous deployment of delivery toepassen.
Neem het project aan het begin samen door, verdeel taken en schrijf op het eind een self assessment op basis van CDMM en een reflectie zoals de werkwijze bij weekopdrachten vraagt.
Het is aan te raden enkele eigen unit tests toe te voegen, en evt. te experimenteren met 'parameterized tests'. In ieder geval geen code vol met unit testing anti patterns (zie video David Farley) i.v.m. met .
Plenair einde les
Lees het overzichtsartikel over gitops op gitops.tech. Schrijf interessant/onbekende termen op. Bekijk hierna ook naar lessen overzicht van deze minor.
- Wat betekent de term reconcilliation?
- Geef drie voorbeelden van toepassen van reconcilliation in een software project denk aan
- a) een feature release
- b) dependency management/update en
- c) infrastructure as code
- Wat is het verschil tussen declaratief en imperatief?
- (kun je koppelen aan term 'reconcilliation')
- Wat is het idee van pull-based vs push-based GitOps?
- Is 1 van de 2 beter?
- (Welke gebruikt InfoSupport?)
- Welke onderdelen moeten we in de komende weken nog bekijken?
- Welke onderdelen gaan we NIET behandelen (maar zijn wel kandidaat voor eigen onderzoek voor week 5)
- Wat is een run time environment? Geef 3 voorbeelden
- Hoe verloopt een applicatie wijziging binnen GitOps en wat is het verschil met andere (oudere) aanpakken?
Leerdoelen
- Je kent Git, kunt het gebruiken op command line en GUI en weet wat je hierin opslaat en wat niet
- Je kent de rol van branches in Git en erbuiten en enkele alternatieven voor feature branching die beter matchen met Continuous Integration
- Je kent twee Git workflows om in een team software producten te bouwen
- Je kunt een Git hook maken, en kent de mogelijkheden en beperkingen ervan
- Je kunt commits doen in (Git) versiebeheer en kent de git basics zoals 4 area's, branches, .gitignore en omgang met Git's 'gedistribueerde karakter'
- Je kunt markdown gebruiken en een UML diagram in tekst opstellen
- Je kunt de definitie van GitOps en kunt de term uitleggen en hebt een onderbouwd oordeel of het een buzzword is of meer dan dat
- Je kunt de termen reconcilliation en runtime environment uit de GitOps definitie uitleggen en van elk 3 voorbeelden geven
- Je kent het verschil tussen code en software en de relatie met 'source control'
- Je kent verschil tussen git en git platforms als GitHub of GitLab en kunt ermee werken
Les 1 - Intro Minor
DevOps is een cultuur van samenwerking tussen software developers en infrastructuur beheerders (=operations) en eventueel nog andere specialisten
Het doel van DevOps is om eindgebruikers waardevolle software te leveren en snel en succesvol in te kunnen spelen op veranderingen in het domein van deze software.
Voorbereiding
Geen voorbereiding, omdat dit introductie les is. Wel voor volgende lessen!
Lesprogramma
Ochtend
- Aanwijzingen Registratie
- Vergeet niet om de volgende les bij te wonen, want het is belangrijk om duo's te vormen voor de opdracht die aan het einde van week 1 moet worden ingeleverd. We organiseren deze groepen tijdens de tweede les, dus je aanwezigheid is essentieel.
- Samen kijken naar de video-introductie voor de minor.
- .pdf slides/presentatie van de minor.
- InfoSupport Project Periode 2 presentatie.
PAUZE - 15 min.
- Eenvoudige spellen in de klas, in groepen werken en elkaars namen leren.
PAUZE - 15 min.
- Lesoverzicht - Samen controleren
- Introductie van de wekelijkse opdracht en hoe deze is georganiseerd.
- Hoe cijfers worden berekend voor Dev en DevOps
EIND - Mentimeter
Middag
- 'T-shaped professional'
- Microservices in 9 Stappen
- STAP 1 - Geen Monolith maar Microservices Architecture
- Keywords:
- Modulaire Monolith
- Strangle Monolithic Application
- BFF: Backend For Frontend
- Keywords:
- STAP 2 - Message Bus
- STAP 3 - Containerization Microservices
- STAP 4 - Naar Kubernetes met pods, services, ingress, etc.
- STAP 5 - Kubernetes Orchestration
- STAP 6 - Pipeline Code Bouwen
- STAP 7 - Image Registry
- STAP 8 - GitOps → Reconciliation
- STAP 9 - Monitoring (analytics, SlackOps)
- STAP 1 - Geen Monolith maar Microservices Architecture
Leerdoelen ▲
- Je hebt een idee van DevOps cultuur, wat een T-shaped professional is en de relatie ertussen
- Je hebt al een idee van wat een MicroService Architecture (MSA) is waar we naar toe werken in deze minor en de onderdelen hiervan
- Je kent het verschil tussen MSA en een monoliet en kent het idee van het 'Strangler' pattern
Quiz ▲
Test je kennis over T-shaped professionals met deze multiple choice quiz:
Les 2 - Recap DevOps en 'getting git'
Bron: https://xkcd.com/1597/
Voorbereiding
Reminder: De voorbereiding is niet optioneel. Zonder voorbereiding wordt het lastig om mee te doen met de les en dat is een verspilling van zowel je eigen tijd, tijd van je mede studenten en tijd van de docent. Niet aardig.
- Lees de opdrachtbeschrijving van deze week.
- Accepteer 1e weekopdracht via de GitHub Classroom link die docent je geeft.
- Zorg dat je de laatste (LTS) versie van Git lokaal geinstalleerd hebt.
- Review Git
- Uitgangspunt is al enige ervaring met Git uit eerdere projecten, zowel theorie als prakijk. Als Git nieuw is, of heel lang geleden kun je deze korte 15 minuten git intro op YouTube van een zekere Colt Steele kijken.
- Maak de online oefeningen van module 1 (introduction sequence) van Learn git branching
- Lees [dit artikel van Priyam Singh (2020) over de 'four area's'
- Haal uit de officiele 'git reset' documentatie het verschil tussen hard, soft en mixed git reset.
- Beantwoord de volgende vragen (hier komen wij in de les op terug)
- Schrijf uit je hoofd op wat de 'four area's' van Git zijn.
- Hoe past de
remote
repository bij deze four area's? - Hoe commit je het verwijderen van een file?
- Hoe commit je het veranderen van een bestandsnaam?
- Kun je een Git commit message later nog aanpassen via de command line? (Zo ja, hoe? Als niet, waarom niet?)
- Wanneer heb je langere 'commit trail'? Bij gebruik van
merge
of vanrebase
? - Wat is de standaard 'mode' van git reset (mixed)?
- Wat zou een toepassing kunnen zijn van
git reset soft
?
Bron: www.theserverside.com
Lesprogramma
Figuur 1: GitOps in a nutshell (Bron: vocal.media)
- GitOps Betekenis
- Reconciliation
- Wekelijkse Opdracht
- Discussie over het vormen van groepen
- Introductie tot cursus rubrics CDMM — Nodig voor Wekelijkse Opdracht reflectie
- Introductie deze week Opdracht
PAUZE — 15 min.
- Doornemen huiswerk vragen
- Maak de online oefeningen van module 2 en 3 van Learn git branching (4 en 5 optioneel)
- Ramping up
- Moving work around
- Bespreken "advanced" termen
- De staging area (en hoe
git reset
nou precies werkt) - Het netjes maken van commit messages en hergroeperen van commits
- De stash
- Cherry picking
- remotes
- Changes rebasen i.p.v. mergen
- De staging area (en hoe
Vooruitblik
Volgende DevOps les over Git workflows, alternatieven voor git branches en GitOps. Bekijk het huiswerk ook!
Leerdoelen
- Je kunt uitleggen wat GitOps is, de rol die Git hierin speelt en de betekenis van woorden 'runtime', 'reconcilliation' en 'desired state' hierbij
- Je kent de basis Git commando's, als
add
,commit
,push
,pull
,stash
en concepten als Git's four area's - Je kent ook enkele geavanceerdere Git commando's en werkwijzen zoals
git reset
,git cherry-pick
, rebasing en het manipuleren van de historie metamend
enrevert
- Je kunt uitleggen hoe Git branching 'goedkoop' heeft gemaakt
Bronnen
- Singh, P. (January 17, 2020) Git - The Four Areas devsecopsgirl.in Geraadpleegd november 2024 op https://www.devsecopsgirl.in/devsecops/Git%20-%20four%20areas
- Git (z.d.) git-reset Documentation. git-scm.com. Geraadpleegd december 2024 op https://git-scm.com/docs/git-reset
- McKenzie, C. (23-8-2024) Git reset hard vs. soft: What's the difference? theserverside.com Geraadpleegd december 2024 op https://www.theserverside.com/blog/Coffee-Talk-Java-News-Stories-and-Opinions/Git-reset-hard-vs-soft-Whats-the-difference
Les 3 - Linux 1/2 (Dev)
Geen voorbereiding
Lesintroductie
We zijn verheugd om Rene Grijsbach als gastspreker te hebben, die de sessie zal leiden. Het beste nieuws? Er is geen voorbereiding nodig van jouw kant—gewoon meedoen en genieten van de leerervaring.
Om de presentatie te volgen, kun je de .pdf van de slides downloaden via de volgende link: NDG Linux Unhatched.pdf.
Lesnotities
Voor deze Linux les ga je aan de slag met de Cisco 'Linux unhatched' course. Deze is online beschikbaar op netacad.com, maar in 2024/2025 minor zal workshop docent een eigen variant 'on premise - private cloud' draaien.
The DevOps way is ook 'embracing the command line', zoals je bv. op de DevOps roadmap op roadmap.sh kunt zien (zie figuur 1). We volgen deze roadmap zeker NIET geheel in deze minor, maar wel paar hoofdpunten.
Deze roadmap geeft aan dat je als je een programmeertaal kent — zoals voor alle developers geldt — dat dan Operating System (OS) kennis en specifiek Linux kennis de volgende stap is. Dus ook kennis van het gebruik van de command line ('learn to live in the terminal') en bash scripting (wk 2). En daarna door met Git en versiebeheer (onderdeel van GitOps). Opvallend is dat 'creator of Linux' Linus Torvalds (Wikimedia, 2023) ook de auteur was van Git. Dus zijn naam moet je als DevOps professional zeker kennen!
In deze les is er ook al introductie van de Linux opdracht die je in week 2 af moet hebben. Tevens demonstreert de docent hoe je een VPS kunt gebruiken/krijgen in de private cloud. Alsmede de VPN client ['Tunnelblick](https://tunnelblick.net/) die je moet installeren op je laptop/pc om vandaar bij deze omgeving te komen (i.v.m. security). Deze VPS gebruik je ook de weekopdracht 3 van de DevOps course.
Op deze omgeving is wel beperkte support, dus als hiermee problemen zijn, vallen we terug op VPS'en aan te vragen bij HAN/AIM ICT ([martin.jacobs@han.nl](mailto:martin.jacobs@han.nl martin.jacobs@han.nl)) (documenteer en meldt wel de error).
Iets over de Linux kernel, verschillende distributies en de link met Docker
Figuur 1: DevOps roadmap (deels, rode pijlen toegevoegd; (roadmap.sh, 2023))
Figuur 2: Enkele Linux distributies (roadmap.sh, 2023))
Belangrijke achtergrondinformatie voor een Linux les is ook wel te weten dat 'Linux' eigenlijk niet bestaat. Bij Linux denken we vooral aan de Linux shell die je als eindgebruiker gebruikt, de command line. Maar feitelijk is de shell de 'user interface' van de Linux software zelf: het operating system. En dat 'operating system' is weer een abstractie van de hardware die in je computer zit, e.g. CPU, geheugen, harddisk en netwerk. Deze vormen samen de 'infrastructuur' van je laptop/desktop of wat dan ook (Linux draait op heel veel devices, ook PDA's, TomTom's en ook Android wat op veel mobiele telefoons draait is Linux-based).
Figuur 2 toont een boom met hierin enkele Linux distributies. Of eigenlijk is het een omgekeerde boom ;) (tree, een relevante/veelgebruikte datastructuur in de ICT). De basis van de boom is de Linux Kernel. Dit is de gedeelde functionaliteit die alle Linux distributies delen. Maar iemand die 'Linux draait' gebruikt altijd een specifieke distributie. Dit diagram gemaakt met behulp van ChatGPT, en geeft naast naam van een distributie . Dus garantie tot de deur, maar hier is de originele 'prompt' en bron.
De '2005' Alpine is in ieder geval wel gecheckt. Dit is opvallend genoeg een aantal jaar voor het ontstaan van Docker (geboorte bij dotCloud 2010, Docker launch in 2013). Deze Alpine distributie is vooral bekend uit de Docker wereld, maar 'predate' deze dus blijkbaar wel:
“The idea was that the system was installed in memory during boot from a read-only media and that you could remove the boot media once it was booted,” explained Natanael Copa, the creator of Alpine Linux, in an interview." - TheNewstack.io
Opdracht
- Maak een Cisco account, neem de stof door en oefen. Maak tot slot de oefenvragen. Bekijk de onderwerpen waar je evt. fouten had nog een keer beter. Maak vragen totdat je denkt dat je stof beheerst. Schrijf probleempunten op voor navragen bij de docent.
Opmerkingen
Gebruik hier de online command line die Cisco je biedt. Voor een wat 'echtere' ervaring en als je op Windows werkt is het ook handig om lokaal Linux te kunnen draaien (we gaan even uit van veelgebruikte Linux distributie Ubuntu (zelf weer afgeleid van Debian)).
Twee opties:
- Installeer Docker Desktop
- Start daarmee (bv. Ubuntu) Linux via
docker run -it ubuntu:latest
(je kunt deze — na experimenteren — afsluiten met commandoexit
)
- Start daarmee (bv. Ubuntu) Linux via
- Door het gebruik en installatie/activeren van WSL 2.
- Dit is een heel stappenplan, maar huidige Docker Desktop versies werken hier ook goed mee samen, dus wel aan te raden
Opmerking: In DevOps lessen van week 2 ga je verder werken met Docker.
Quiz
Test je kennis over Linux met deze multiple choice quiz.
Hieronder een deel van de README.md
van de tool featmap op GitHub, die terug komt in één van de vragen.
Building from source and running with docker-compose
Clone the repository
git clone https://github.com/amborle/featmap.git
Navigate to the repository.
cd featmap
Let's copy the configuration files
cp config/.env .
cp config/conf.json .
Now let's build it.
docker-compose build
Startup the services, the app should now be available on the port you defined in you configuration files (default 5000).
docker-compose up -d
Leerdoelen
- Je kent de basis Linux command line commandos uit de Cisco unhatched cursus/vragenset
- Je weet wat de Linux kernel en Linux 'distro's' zijn en kunt er enkele noemen
- Je kent de naam van de originele ontwikkelaar van Linux en weet wat voor een 'git' hij is ;)
Les 4 - Git workflows
Voorbereiding
Reminder: De voorbereiding is niet optioneel. Zonder voorbereiding wordt het lastig om mee te doen met de les en dat is een verspilling van zowel je eigen tijd, tijd van je mede studenten en tijd van de docent. Niet aardig.
Neem de 2 artikelen en diagrammen door:
- Over GitHub flow
- Over git flow.
- Vragen over verschillen en eigen keuze:
- 3.1: Beschrijf eerst beide methoden in eigen woorden. Geef daarna een lijstje met verschillen tussen beiden.
- 3.2: Welk van deze methode ken jij al (een beetje)?
- 3.3: Voor welk van de twee zou je kiezen?
- 3.4: Welke van de twee methoden 1. Git flow of 2. GitHub flow zou jij kiezen in project A respectevelijk B:
- Project A: Een command line tool die door medewerker van een 'WebShop' gebruikt wordt om een JSON bestellijst van die dag om te zetten naar 2 aparte lijsten voor order picken door medewerkers in hun 2 magazijnen 'Vloerbedekking en Laminaat' en 'Gordijnen en vitrages'
- Project B: Een online video website met Agile ontwikkelmethode, waarin product owner onderkent dat deze de wensen van eindgebruikers niet geheel kent, en jullie experimenteren om nieuwe functionaliteit door eindgebruikers thuis te laten Beta testen?
Lesprogramma
- Doornemen lesvragen.
- Vraag: Waar heb jij 'branch by abstraction toegepast' in weekopdracht 1? (komen we verderop op terug)
- Samen doornemen van highlights uit video van David Farley over Continuous Integration vs Feature Branch Workflow dik kwartier (als genoeg tijd dan integraal samen kijken)
- Schrijf tijdens het kijken highlights op en minstens 2 vragen.
- Opdelen in duo's. Beantwoord elkaars vragen. Bespreek erna plenair (met docent) zaken waar je ook samen niet uitkwam.
- Kijken 'werkwijze bij weekopdrachten'
- Doornemen gemaakte weekopdrachten via enkele steekproefen, onderlinge feedback
- Bespreken vragen/knelpunten/onduidelijkheden
- Doornemen reflecties/self assessments
- Bespreken CO-304 uit het CDMM) - Deploy losgekoppeld van release
- Kijken naar OA-202 - Branch by abstraction en andere alternatieven voor Git branches (zie kopje hieronder)
- Toepassen Branch by abstraction op code om PrimeService/Priemtester werkend te krijgen voor alle getallen
- Als eerder klaar en opdracht 1 al veel af, doornemen en uitdelen opdracht week 2
- Vooruitblik volgende week en huiswerk les 2-1
Alternatieven voor git branches
Introductie term Branch by abstraction en andere alternatieven voor feature branching die beter bij Continuous Integration passen zoals feature toggles, of een dark release. Git heeft branching 'goedkoop' gemaakt t.o.v. andere versiebeheersystemen, maar branchen moet je zo kortdurend en minimaal mogelijk doen binnen DevOps. Geen 'long lived branches'.
Figuur 1: De branch uit branch by abstraction is GEEN 'Git branch', maar een conceptuele branch (bron: Fowler, 2014)
Er is ook zoiets als een 'Dark release' zoals Dave Farley het noemt (op 11:50 min in het filmpje). Martin Fowler defininieert deze term overigens net anders definieren en noemt wat Farley een 'Dark Launch' zelf meer een Keystone Interface (2020). Hij en anderen gebruiken 'Dark Release' als een synoniem voor een 'Canary Release' :S (split.io, z.d.). Een Canary release is een release die wel voo gebruikers beschikbaar is, maar voor slechts een deel daarvan, bijvoorbeeld Beta testers. Daar kijken we in week 4 verder naar, want bv. de Ingress uit KuberneteS maakt Canary releases makkelijker. Maar in dit vak hanteren we de terminologie van
Figuur 2: Keystone interface dankt zijn naam aan het concept 'keystone' een sluitsteen die een boog afmaakt.
Leerdoelen
- Je weet dat veelvuldig en - vooral - langdurig gebruik van meerdere Git branches NIET past bij een aanpak volgens Continuous Integration en waarom
- Je kunt drie alternatieven voor Git branches noemen en elke hiervan uitleggen
- Je weet waarom je (Git) branching toepast en op welke manier dit wel acceptabel is
- Je weet manieren 'to decouple release from deploy' (conform CDMM 'gevorderd' niveau)
- Je weet wat 'trunk based development' is (Gemmail, 2018)
Bronnen
Dit zijn in deze les aangehaalde gebruikte bronnen.
- GitHub flow* Geraadpleegd september 2024 op https://guides.github.com/introduction/flow/
- Farley, D. ()
- Hendriks, V. (5-1-2010) update on 5-3-2020 A successful Git branching model. Geraadpleegd september 2024 op https://nvie.com/posts/a-successful-git-branching-model/
- Fowler, M. (7-1-2014). Branch by abstraction. Geraadpleegd 7 december 2023 op https://martinfowler.com/bliki/BranchByAbstraction.html
- Fowler, M. (29 April 2020). Keystone Interface. Geraadpleegd 7 december 2023 op https://martinfowler.com/bliki/KeystoneInterface.html
- Gemmail, R. (Apr 22, 2018) Trunk Based Development as a Cornerstone for Continuous Delivery Geraadpleegd op 5 september 2024 op https://www.infoq.com/news/2018/04/trunk-based-development/
- split.io (z.d.) Dark Launch Geraadpleegd op 5 september 2024 op https://www.split.io/glossary/dark-launch/
Week 2 - Containerization
Lesoverzicht
- Les 1 - Docker 101
- Les 2 - ORM (EF core)
- Les 3 - Linux Bash (VPN/VPS)
- Les 4 - Toetsen 1 + nabespreken
Containerization Definition
Containerization is packaging software with the OS and other dependencies required to run the code to create a container that runs consistently on any infrastructure. IBM
Docker kwam in 2013 en maakte enkele krachtige maar obscure features uit Linux simpeler om te gebruiken. Met hun containers geven ze operations mensen de 'best of both worlds' van
- a) virtuele machines (isolatie en beheer via software) en
- b) de performance van OS processen direct op hardware ('metal).
Ze geven developers de mogelijkheid hun applicatie te containerizen met het OS en ook de hele tussenliggende stack van software (middleware zoals applicatie servers, webservers, message busen, en database servers en data caches e.d.). Zo werd het verschil tussen development omgeving en productie kleiner zodat je het 'works on my machine' probleem kan aanpakken.
*Figuur 1: Docker - Oplossing voor het 'works on my machine' probleem?
Week 2 Opdracht
De opdracht staat weer op (private) GitHub AIM organization. Je doet een laatste git opdracht/puzzel en containerized daarna je vorige week gemaakte applicatie in een Docker container. Deze test je lokaal en zet dan zelf docker op externe VPS en runt hierop de container. Werk weer samen in een (nieuw) duo via git en gitlab en let naast opdracht ook weer op algemene werkwijze zoals taakverdeling vooraf en eindigen met (gezamenlijke) self assessment in je README met betrekken relevante CDMM checkpunten en een reflectie zoals de [werkwijze bij weekopdrachten]vraagt.
In deze opdracht komt ook refactoring terug, en heb je nog een kans 'branch by abstraction' toe te passen/te identificeren. Het voorbeeld met vertaling van pipeline diagram van vorige opdracht is voor sommige zo klein/triviaal dat ze het daar nog missen.
Wellicht helpt (code) op onderstaande foto nog bij 1e stappen opdracht:
Toelichting: Wellicht heb je een docent wel eens horen zeggen dat als je kunt programmeren het daarna niet uitmaakt of je nou een webapplicatie, of desktop applicatie of console applicatie of mobiele app of webservice maakt. Dat is wat kort door de bocht; maar zit wel kern van waarheid in. In .NET kun je al zulke applicaties maken, en je gaat de simpele code uit je classlib nu beschikbaar stellen voor zowel web project als een console project.
Hiervoor moet je naast op code niveau met import ...
statements (dit is using
in .NET) nu ook op project niveau instellen voor de projecten in je solution. .NET heeft module systeem (net als Java vanaf v 9). Dus kijk even terug naar dotnet cli commando's die je bij de 1e opdracht wellicht domweg hebt nagespeeld.
Leerdoelen deze week
Check met onderstaande leerdoelen of je de behandelde stof begrepen hebt en toetsvragen kunt beantwoorden.
- Je kent de 'Docker architectuur' (met concepten als images, containers, de docker engine en buildkit)
- Je kunt lokaal een container runnen
- Je kunt een eigen container maken
- Je kent de term ephemeral en het nut, en de 'oplossing' voor data persistentie in containers
- Je snapt het nut van een ORM en welke drie zaken je moet veranderen bij gewenste wijziging data schema
- Je snapt hoe Docker containers en images 'immutable' zijn en kunt termen als 'union file system' en 'copy on write' uitleggen
- Je begrijpt het begrip multi-stage container
- Je kunt een container optimaliseren en kent het concept van container layers
- Je kunt een container registry gebruiken en snapt het begrip
- Je kunt docker compose gebruiken en kent de relatie tussen Docker en docker compose
- Je kunt Docker installeren op een Linux VPS en deze gebruiken via een Docker context
Les 1 - Docker 101
Gastdocent: Jaap Papavoine
Een nieuwe technologie toe-eigenen hoort bij je werk. Je hebt ondertussen in de opleiding veel technologieën leren kennen, meestal met begeleiding van lesmateriaal en een docent. Tijdens je afstuderen en in je werk hierna zal je ongetwijfeld veel nieuwe technologieën gaan gebruiken die we je niet geleerd hebben, en op dat moment is er geen materiaal of docent beschikbaar. Om hier alvast mee te oefenen maken we in de lessen over Docker zo veel mogelijk gebruik van online bronnen.
Voorbereiding
Reminder: De voorbereiding is niet optioneel. Zonder voorbereiding wordt het lastig om mee te doen met de les en dat is een verspilling van zowel je eigen tijd, tijd van je mede studenten en tijd van de docent. Niet aardig.
Installeer Docker Desktop - Zorg dat je het commando 'docker container run hello-world' kunt uitvoeren.
In het Docker desktop learning center (in de UI van Docker Desktop) zitten een aantal walkthroughs. Doorloop de volgende walkthroughs:
- What is a container?
- How do I run a container?
De rest mag je gerust ook maken als je geïnspireerd bent!
Lees alvast 'Part 1: Overview' van de Get started guide op https://docs.docker.com/get-started/. We gaan in de les verder met deze getting started guide, en je kunt al zover door werken als je kunt.
Lees het eerste hoofdstuk (van 'Minor Devops: Lets do...' tot 'Fasering, project etc..') van het DevOps course materiaal (nog eens?) door, maar ga specifiek op zoek naar raakvlakken met containers. Welke requirements / uitdagingen / concepten / technieken genoemd in de DevOps minor hebben iets te maken met software containers? Maak een lijstje van alle raakvlakken die je hebt gevonden en neem dit lijstje mee naar de les.
Tijdens het maken van de voorbereiding kom je waarschijnlijk dingen tegen die je niet precies begrijpt. Logisch, je bent tenslotte een nieuwe technologie aan het leren. Schrijf de vragen die je hebt en de concepten die je niet kent op!
Loop je vast tijdens het voorbereiden, schrijf dan de volgende dingen op:
- Bij welke stap loop je vast?
- Wat heb je geprobeerd?
- Hebben je collega's hetzelfde probleem?
- Waar denk je zelf dat het misgaat?
- Heeft stackoverflow een oplossing voor je probleem?
Misschien is er tijd om voor de les je probleem te bekijken met de docent en/of medestudenten.
Lesprogramma / Lesmateriaal
Bestudeer de theorie die zowel in de lesdia's als in de Docker Workshop wordt gepresenteerd. Lees voor de Docker Workshop de README-bestanden zorgvuldig door, voltooi de oefeningen en experimenteer verder op eigen houtje.
- Lesdia's: Docker_In_A_Nutshell.pdf
- Docker Workshop
Les 2 - ORM (EF core)
In de workshop zijn kort 'volumes' behandeld in Docker, die nodig zijn voor persistent opslag. Althans als je data langer moet bestaan dat de container, wat op productie het geval is, als je een database gebruikt.
Neem de Docker documentatie []`Volumes'(https://docs.docker.com/engine/storage/volumes/) (negeer de oude constructie 'mounts' e.d. dit is alleen voor oudere containers die dit gebruikten).
Lees het artikel DevOps for databases van Christian Melendez. Als oefening kun je evt. de Contonso voorbeeld code downloaden, de dotnet ef tools installeren zoals het artikel aangeeft en de besproken oefening meedoen.
“Database refactorings […] involve three different changes that have to be done together
- Changing the database schema
- Migrating the data in the database
- Changing the database access code”
Quote 1: Bron: Martin Fowler, 2016, geraadpleegd 21-2-2022 op https://www.martinfowler.com/articles/evodb.html
Van de 3 wijzigingen uit quote 1 mist in simpele applicaties vaak het echte migreren van bestaande data. Dit vereist ook vaak het nadenken over hoe deze data te migreren en het handmatig schrijven/uitbreiden van de migratie code (de Up()
en Down()
methode in EF core.
Figuur 2: ORM oefening. Het in de les besproken mogelijke klassendiagram voor de database in weekopdracht.
ERM model
Dit ERD diagram geeft het gewenste datamodel van een CDMM Checkpoint.
[CDMMSelfAssessment] Datum Student CDMMCheckpoint
[CDMMEvaluation] CDMMCheckpoint IsChecked Argumentatie
[CDMMCheckpoint] CDMMCategorie CDMMNiveau Code Titel Beschrijving
[CDMMCategorie] Id Beschrijving
[CDMMNiveau] Id Beschrijving Student 1--* CDMMSelfAssessment CDMMSelfAssessment 1--* CDMMEvaluation CDMMEvaluation 1--1 CDMMCheckpoint CDMMCheckpoint 1--* CDMMCategorie CDMMCheckpoint 1--* CDMMNiveau
Op deze manier is het mogelijk voor een student om zelf een self assessment te doen door het CDMM in te vullen voor een bepaalde beroepsproduct en -project.
User stories
- Als docent wil ik dat studenten een self assessment aan de hand van het Continuous Delivery Maturity Model (CDMM) kunnen maken en deze beargumenteren, zodat zij kunnen zien waar zij staan qua DevOps volwassenheid, en zich in DevOps best practices moeten verdiepen
- Als student wil ik makkelijk een CDMM beoordeling kunnen invullen en hierbij achtergrond informatie krijgen over de verschillende CDMM checkpoints zodat ik informatie over bijbehorende en een punt minder snel verkeerd interpreteer
- Als student wil ik iteratief een assessment willen invullen op verschillende data, zodat ik vooruitgang zie.
- Als student wil ik een ingevuld CDMM assessment kunnen exporteren, zodat ik deze , bv. als PDF kan inleveren als bewijslast voor school en als markdown/documentation as code op kan nemen als documentatie in mijn huiswerkopdrachten of beroepsproduct (DevOps BP)
Web applicatie server
In de weekopdracht van deze week moet je de vorige week gemaakte applicatie uitbreiden naar een WEB API en ook hosten met een webapplicatieserver. Een veelgebruikte is nginx
(spreek uit: 'Engine X'). Hiervoor maak je ook kennis met ADR's: Architecture Decision Records.
"What are alternatives to nginx when you want a webapplication server for a .NET application that you also want to containerize?"
Dit is goede video om in de les samen te kijken ter relativering/van ORM's:
- Gormin, Christin (2011) Hibernate should be to programmers what cake mixes are to bakers: beneath their dignity. Vimeo. Ook nu even gecheckt op https://vimeo.com/28885655
Ook 'Continuous Delivery' Dave Farley haalt de video van Gormin aan in zijn boek 'Modern Software Engineering (tip!). Martin Fowler's artikel 'ORM hate' is een meer genuanceerde kijk op deze kwestie. Dat je geen SQL kennis zou hoeven te te hebben bij gebruik ORM is een drogreden, vanwege de ca. 10% gevallen die overblijft (en idd soms slechte performance). Hoewel de hoeveelheid SQL achtige annotaties in Gormin's wel wat hooggekozen is. Maar voor de resterende 10% moet je namelijk inzicht hebben in performance gevolgen. Voor SQL Server bv. van impact van bepaalde join volgorde en handmatige optimalisaties via keys toevoegen of verwijderen met hierachter technische concepten als 'table scan' vs 'index scan', etc. (zie bv. Anvesh 2023). En daarbij vergeleken is SQL syntax a walk in the park. Maar het 'single point of truth' of 'single point of definition' dat een goed ORM framework met ook 'migrations' mogelijkheden je kan geven. Al kom je als student niet snel in aanraking met een situatie waarbij je productie data hebt, die ook gemigreerd moet naast DB schema en applicatiecode, zoals Fowler in zijn artikel/blog 'Evolutionary database design' de big 3 aangeeft.
Leerdoelen
Check met onderstaande leerdoelen of je de behandelde stof begrepen hebt en toetsvragen kunt beantwoorden.
- Je kent de relatie van BDD met TDD, DDD en Agile/DevOps
- met o.a. relevante begrippen als Ubiquitous Language, test-first, red-green-refactor, AAA pattern, given-when-then en collaborative development
- Je kent de BDD three amigo's, en de 3 stappen van het iteratieve BDD proces
- Je kent 2 andere namen van BDD, en kunt deze uitleggen
- Je kent de term 'self testing code' en het onderscheid tussen
.feature
files, glue code en applicatie code en de talen/standaarden die hier achterin zitten - Je kunt de verhouding uitleggen tussen BDD test scenario's, test cases en suites met user stories en acceptatiecriteria uit Scrum
- Je kent de test pyramide, het belang van de verschillende soorten testen hierin en de link met BDD
- Je kunt op basis van een tutorial een project met werkende en relevante BDD tests opstellen m.b.v. Cucumber of Specflow
Bronnen
- Anvesh (1-8-2023). Table Scan vs Index Scan vs Index Seek. medium.com Geraadpleegd 18-4-2024 op https://medium.com/silenttech/table-scan-vs-index-scan-vs-index-seek-f5cbb4e93478
- https://martinfowler.com/bliki/OrmHate.html
- https://martinfowler.com/articles/evodb.html
Les 3 - Linux 2/2 (Dev)
Lesintroductie
We willen Rene Grijsbach opnieuw hartelijk bedanken voor het verzorgen van deze sessie. We zijn blij dat hij weer met ons is om zijn kennis te delen.
Voor deze nieuwe les kun je de .pdf van de presentatie en uitwerkingen van de lesopdrachten hier: Presentatie SSH & BASH (inclusief voorbeeld uitwerkingen)
Lesnotities
Zorg dat je de Cisco 'Linux Unhatched' course van vorige week af hebt en alle testvragen voldoende kunt beantwoorden.
Week Opdracht Dev
- Schrijf een Linux bash script volgens de user stories (=spec) in deze opdracht repo op github
- Zet het bash script in een eigen prive repo op de DevOps gitlab
- Maak een issue aan in GitLab voor de docent om hem na te kijken en assign dit issue aan de docent
- Je mag je eigen bronnen gebruiken om te leren scripten. Er zijn bijvoorbeeld de 3 volgende opties:
- een PluralSight course over Bash scripting binnen PluralSight's free library
- een module over bash scripting binnen de gratis Cisco course 'NDG Linux Essentials'
- of een YouTube video hierover
Figuur 1: Only legends will get this? :P Bron: TwisterByte23@Reddit, 2023
"I'm not sure what the matt-daemon project does yet, but I'm pretty excited about the name." - Justin Searls (2012)
Toetsen 1 & nabespreking
In deze les krijg je de eerste 2 toetsen. Hierna volgt een klassikale nabespreking. Individuele toetsinzage is op een later moment. Ook kijken we vooruit naar weekopdracht 3 en vind je vast een partner voor de opdracht (andere dan opdracht 2, terugwisselen mag, of nog keer afwisseling :).
- 9:00 Lokaal open, intro en regels
- 9:30 TheorieToets Dev
- 10:00 Pauze
- 10:15 Theorietoets DevOps
- 10:45 Pauze & Docent nakijken
- 11:30 Ruimte voor vragen en centrale nabespreking
- ..... Verdeling weekopdracht 3, vragen opdracht 2
Oefendeeltoetsen 1
Hier linkjes naar de oefentoetsen om beter beeld te krijgen van de echte toets op deze dag.
- Oefendeeltoets Dev 1
- Linux vragen uit gedane Cisco course van week 1 en 2 (zelfstudie)
- Oefendeeltoets DevOps 1
- Stof uit DevOps lessen week 1 en week 2:
- Algemene vragen DevOps: Culture, t-shaped professional, CDMM, Microservices architecture
- GitOps: Git commands & Git workflows, CI vs feature branch
- Containerization: Docker, containers, images, volumes, ORM/Evolutionary Database Design
- Stof uit DevOps lessen week 1 en week 2:
Toetsregels
Cesuur 70%: max 12 fout voor voldoende (5,5).
-
Eén punt voor iedere 'multiple choice' vraag (tenzij anders aangegeven).
- Bij multiple choice is slechts 1 antwoord goed (of 1 antwoord is 'het beste').
- Voor open vragen is het aantal punten aangegeven.
-
Er zijn geen hulpmiddelen teogestaan zoals boeken, spiekbriefjes, websites of communicatiemiddelen toegestaan.
- Je mag alleen 1 browser open hebben met 1 tabblad (namelijk die met daarin deze online toets)!
- Voor de start van de toets graag je rugzak of tas met je telefoon, smartwatch en/of andere devices voorin de klas leggen.
- Evt. gebruikt kladpapier moet je bij het verlaten van de klas ook inleveren.
-
Je mag het lokaal verlaten pas na de helft van de toetstijd, en dan laptop en rugzak achter laten in de klas.
-
Mensen met 'extra tijd' regeling kunnen max 50% extra tijd krijgen. I.v.m. bepertke lestijd en nabespreking gaat dit wel ten koste van eventuele pauzetijd tussen 2 toetsen door.
-
Bij Digitale toetsen in Ans gaan via de Schoolyear safe browser
- Sluit de toets na het starten NIET meer af, dit ziet Schoolyear als fraude, en dan sluit deze je buiten
-
De digitale toets is 'Bring your own device', je moet Windows of macOS draaien (dus geen Linux, regel dan 'dual boot' of vraag anders tijdig een leenlaptop aan bij de HAN (dit kan via Osiris))
Nabespreking/vooruitblik week 3
- Reminder InfoSupport etentje 25 sept (aanmelden Slack!)
- Toets bespreken
- Maken duo's voor de week opdracht 3
- Verdeling 'platform' voor opdracht Continuous Delivery over duo's (GitHub Action/GitLab CI)
- Verdelen onderdeel 'stellingen 12factor' theorie-/deelopdracht (evt. bespreken in les)
Week 3 - Continuous Delivery
Lesoverzicht
- Les 1 - InfoSupport Workshop DDD & Microservices (hele dag!)
- Les 2 - BDD: Behaviour Driven Design
- Les 3 - Micro-frontends
- Les 4 - Weekopdracht bespreken + DevOps vs Continuous Delivery
Deze week is het thema Continuous Delivery. We gaan even terug naar het begin: de business waarde en cultuur achter DevOps. Want Continuous Delivery maak je mogelijk door een 'DevOps aanpak' te hanteren.
"Continuous Delivery is the ability to get changes of all types—including new features, configuration changes, bug fixes and experiments—into production, or into the hands of users, safely and quickly in a sustainable way."" Jez Humble, continuousdelivery.com
Lees deze week de reader DevOps H10: 'Code Management' (NB: vragen in theorietoets!)
Week Opdracht week 3
Deze week gaan we de in vorige opdrachten opgezette applicatie geautomatiseerd builden, testen en opleveren door het opzetten van een pipeline zoals je al in de 1e opdracht al tekenden. De opdracht is al iets vrijer; je kunt zelf kiezen tussen Jenkins (2+), GitHub actions, GitLab CI of wellicht nog een andere 'pipeline' technologie. Je verdiept je dan in de bron.
Minimaal build je een container, maar optioneel kun je deze ook live zetten en evt. nog extra lint stappen toevoegen. Blijf ook op security letten. Tevens beantwoord je een theorievraag rondom 12factor app methodology. De docent licht dit kort toe tijdens een les, maar dit is verder zelfstudie.
Nuttige bronnen:
- GitLab: Mastering continuous software development
- Installeren Jenkins lokaal in Docker container
- GitHub Actions
- Mr 'Continuous Delivery' Jez Humble over 'WaterScrumFall en hoe DevOps in verlengde van Agile ligt
- Martin Fowler: ObservedRequirement
- 12factor app principles for SAAS applications ('web applications')
- Wikipedia: Software rot of Software erosion zoals Heroku het noemde en 12factor introduceerde
Les 3-1 - Workshops Microservices & DDD
Link naar sheets (private repo; met de slides en oefeningen).
InfoSupport: Microservices & DDD - Strategic Patterns
Er is geen verplichte voorbereiding voor de workshop in les 1.
Lesprogramma / Lesmateriaal
OCHTEND
- Microservices - Zie Microservices.pdf
- Oefening Microservices van UserStories hier downloaden microservices-oefening.docx
- Domain Driven Design inleiding - Zie H02 - DDD Strategic Patterns.pdf
MIDDAG
- Oefening Domain Driven Design hier downloaden Exercises in Domain-Driven Design.docx.
Leerdoelen
Check met onderstaande leerdoelen of je de behandelde stof begrepen hebt en toetsvragen kunt beantwoorden.
- Je kent de betekenis van de volgende termen in relatie tot Microservices: Cohesion/Coupling, Polyglot Microservices, Scalability
- Je kent de betekenis van de volgende Microservices-principes: Culture of automation, Modelled around business domain (DDD), Highly observable, Isolate failure (Design for Failure), Decentralize all things (freedom for the devops Teams)
Les 3-2 BDD
Huiswerk/opdracht
a. Bestudeer de theorie over Behaviour Driven Development zodat je theorie achter de BDD leerdoelen van deze week haalt. De keuze is afhankelijk van of je Java of .NET hebt gekozen in je weekopdracht:
- Bestudeer het materiaal van de 'Cucumber' (Java)
- Of
SpecFlow (.NET)ReqNRoll (.NET) frameworks.
Edit 2024: De praktijk opdracht van BDD is in 2024 optioneel vanwege problemen overgang SpecFlow naar ReqNRoll en dat de 'Dare2Date' casus pas in week 4 volgt. De theorie van BDD moet je uiteraard wel kennen. Je zult de theorie dan in het Beroepsproduct van week 6&7 en het grote project moeten toepassen.
b. Opdrachten (maak tot en met opdracht 4, de rest in de les):
- Pak uit de Opdracht voor de DevWorkshop de
EuroCard service
, maak hier (eigen keuze) een Java of .NET project voor aan, voeg BDD dependencies en tools toe (zie PluralSight) en voeg volgens BDD stijl Cucumber of Specflow tests toe en realiseer zo test-first de methoden. - Installeer hiervoor IntelliJ als je deze nog niet hebt/had (jaar gratis Ultimate editie voor HAN/AIM studenten) of Microsoft Visual Studio
- Schrijf Gherkin code (
given
,when
,then
) voor 4 testgevallen credit cards nummers:1
,2
,1023
en208724
- Schrijf glue code ('Step definitions')
- Refactor de 4 tests naar één enkele Gherkin 'datatable'
- Schrijf evt. ook dezelfde tests in TDD stijl (JUnit/XUnit).
- Moet er nog een validatie en aparte melding bij voor credit card nummers met ongeldig format? (eigenlijk zouden ze zo moeten zijn:
6703 4444 4444 4449
(bron) en zou je ook een 'issuer check` kunnen doen). - Waarom wel, of waarom niet? En zo ja, hoe documenteer je dit? (want het staat niet in huidige spec)
Lesprogramma / Lesmateriaal
- Doornemen leerdoelen high level
- Behandelen theorie
- Beantwoorden vragen n.a.v. huiswerk en lesvragen
- Zelf verder aan de slag met BDD (optioneel in 2024)
Les inhoud / BDD Theorie
Hier wat korte theorie over BDD uit verschillende bronnen, namelijk over de relatie met TDD en DDD uit de Wikipedia definitie, iets over de Three Amigo's (wie) en het 3-staps proces +1 (hoe). Tot slot iets over verschillende namen BDD, ATDD en SBE en quotes van Martin Fowler en Dave Farley.
BDD definitie en relatie met andere *DD's
We beginnen met de definitie van BDD op Wikipedia (2023):
"In software engineering, behavior-driven development (BDD) is a software development process that goes well with Agile software development process that encourages collaboration among developers, quality assurance experts, and customer representatives in a software project. It encourages teams to use conversation and concrete examples to formalize a shared understanding of how the application should behave.
[...] Behavior-driven development combines:
- the general techniques and principles of TDD
- with ideas from domain-driven design (DDD)
- and object-oriented analysis and design
to provide software development and management teams with shared tools and a shared process to collaborate on software development."
BDD's relatie met andere *DD's: Ook test driven en testen 'inherente complexiteit'
Een belangrijk basisbegrip is 'self testing code'. Het is altijd goed het origine artikel van Martin Fowler hierover te lezen. Zijn onderstaande plaatje vat dit kort samen met beeld van code 'met een knop' die zichzelf kan testen. Maar dit kan een onervaren ICT'er onterecht het beeld geven dat je code kunt maken die op een of andere magische wijze zichzelf test (met een tool ofzo). En dat is natuurlijk niet het geval.
Een iets uitgebreidere samenvatting van 'self testing code' is dat je deze 'knop' realiseert door in een code naast de applicatiecode ook test code op te nemen. Deze test code roept de applicatiecode aan, en controleert dat deze de verwachte output krijgt. Hierbij is ook het doel dat er een hoge 'code coverage' haalt, typisch een line coverage van 80% in onze opleiding. Maar de afspraak hierover verschilt per bedrijf, en is ook afhankelijk van de complexiteit van de codebase (die - bij DDD aanpak - als het goed is vooral afhangt van de complexiteit van het onderliggende domein...). De vereiste code coverage hangt ook af of de codebase een monoliet is, of een microservices architectuur (MSA) heeft. Bij die laatste krijgen integratie testen meer belang en unit tests wat minder, en is code coverage minder van belang (want bij integratie tests is het geautomatiseerd bepalen van code coverage onmogelijk, of in ieder geval ingewikkelder/nog niet standaard).
Hoe dan ook, de interne werking is dus:
Figuur 2: Intern onderscheid tussen test code (grote O 1) en (vangt de 'inherente' complexiteit conform DDD)
Net als TDD gaat BDD een stap verder dan enkel 'self testing code', want BDD is ook 'test driven'. Door eerst de test code te schrijven, denk je meteen vanuit 'client' kant aan welke interface je methode moet hebben, hoe je deze aanroept, en wat deze teruggeeft. Deze 'HOE roep ik het aan?' zit meer aan de WAT kant: "WAT is de interface", omdat de echte 'hoe' kant is: 'Hoe implementeer ik de code zodat deze daadwerkelijk het verwachte resultaat' teruggeeft. TDD grondlegger Kent Beck (van het Agile Manifesto) noemt dit in zijn article 'Canon-TDD' (2022) de 'Interface/Implementation Split':
"The first misunderstanding is that folks seem to lump all design together. There are two flavors:
- How a particular piece of behavior is invoked.
- How the system implements that behavior."
BDD -> Geen unit maar integratie tests!
Laten we in de nieuwe 'AI age' waar we in lijken te zitten, sinds de (hype rondom) de introductie van ChatGPT
Me: Wat voor soort testen doe je bij behaviour driven development (BDD)? Kun je deze kort samenvatten in Jip en Janneke taal!?
ChatGPT: Bij Behavior-Driven Development (BDD) worden verschillende soorten testen gebruikt om softwaregedrag te specificeren en te valideren:
- Acceptatietesten: Test of de software doet wat de baas wil.
- Scenario's: Verhalen schrijven over hoe de software moet werken.
Unit-tests: Kleine stukjes code testen om te zien of ze goed werken.- Integratietests: Controleren of alle stukjes samenwerken zonder problemen.
- Automatisering: Tests laten de computer uitvoeren om tijd te besparen.
- Regression Testing: Kijken of nieuwe veranderingen geen oude fouten veroorzaken.
Figuur 3: De test pyramide (Bron: headspin.io - Open commons licentie)
ChatGPT geeft een mooi overzicht van verschillende soorten tests, die je als developer moet kennen. Maar om unit tests op te nemen in dit overzicht van voor BDD relevante testen is wel een fout van ChatGPT (terzijde: AI modellen/systemen laten zich helaas NIET goed unit testen vanwege hun non-deterministische gedrag). Dus daarom is dit doorgestreept. Want BDD richt zich dus op juist op integratietests of zelfs end-to-end tests (integratie tests over alle lagen/units/functionaliteit heen). Lees bv. op de Cucumber Blog website (z.d.), dat je Cucumber gebruikt voor integratie en end-to-end tests, en NIET voor unit tests:
"BDD should also be used to verify the wanted behaviour using integration tests.
[...] These unit tests will not be validated by a stakeholder as they are written in code, and most stakeholders don't read code. If they did we wouldn't need tools like Cucumber."
De regressie tests die ChatGPT vermeld zijn GEEN wezenlijk verschillende tests van de andere tests die hij eerder noemt. Want je gebruikt je unit-tests en integratie-tests ook als 'regressie tests' om eventuele regressie fouten op te sporen en/of uit te sluiten. Regressiefouten zijn fouten uit stukjes code die 'omvallen' als je later wijzigingen aanbrengt in andere delen van de code waarvan je denkt dat die ongerelateerd zijn, maar die toch aan elkaar gekoppeld blijken (te weinig 'loos coupling').
Je moet de kracht en bedoeling van de verschillende tests kennen:
- Het voordeel van een unit test boven een acceptatietest is dat deze duidelijker aanwijst waar de fout vandaan komt (namelijk 1 specifieke unit).
- Het nadeel van units apart is dat deze soms geen fouten aantonen gaan, maar dat er alsnog integratie errors tussen de units buiten beeld blijft, die een acceptatie test wel aanwijst.
- Het voordeel van een integratie test is dat deze die fout wel laat zien
- Net nadeel van een integratie test is dat deze een fout niet aanweijzen
- En een nadeel is dat deze langzamer zijn, om dat bv. echt de database gebruikt word. Bij een unit test moet je externe dependencies/systemen als database altijd mocken
The Three Amigo's
Figuur 1: The three amigo's en het BDD proces met 3 stappen+1(van Pluralsight)
"The 'Three Amigos' is a meeting that takes user stories and turns them into clean, thorough Gherkin scenarios. It involves three voices (at least):
- The product owner
- The tester
- The developer
https://johnfergusonsmart.com/wp-content/uploads/2017/11/iStock-147318638-1024x683.jpg
Figuur 2: The three amigo's, niet per se 3, niet per se Spaans, maar wel per se >=3, divers en onderling vriendschappelijke omgang :)
BDD: 'Executable specifications' en synonieme acro's voor BDD
Gherkin is the most commonly used plain-text language for writing executable specifications in Given-When-Then-And-But steps. These scenarios are commonly saved as .feature
files.
Feature: Users should be able to book appointments.
Scenario: A user wants to book an appointment.
Given a user has booked an appointment
When the booking status is timed out
Then the appointment will be not confirmed
Bron: 'What are executable specifications?' - Cucumber.io blog, 7-2-2019
... "BDD aims to express requirements unambiguously, not simply create tests. The result may be viewed as an expression of requirements or a test, but the result is the same. Acceptance tests record the decisions made in the conversation between the team and the Product Owner so that the team understands the intended behavior.
There are three alternative labels to this detailing process:
- Behavior Driven Design (BDD)
- Acceptance Test–Driven Development (ATDD)
- Specification by Example (SBE)
Bron & ©: Scaled Agile, Inc.
Lesvragen
Behandelen opgekomen studentenvragen n.a.v. huiswerk of behandelde theorie. Als er geen vragen zijn, dan staan we even stil bij deze vragen:
- Kun je in algemeen zowel TDD als BDD doen in een project, of moet je kiezen?
- Welke CDMM checkpunten zijn relevant voor BDD?
- Voor Java is er Cucumber, voor .NET is erSpecFlow of ReqNRoll, maar welke taal gebruik je wel in beide voor BDD?
- Wat is een test suit? Heeft een applicatie een testsuite?
- Het Gherkin voorbeeld op de pagina toont één feature met één scenario. Is dit typisch, of horen bij één feature vaak meer scenario's, of bij één scenario meerdere features?
Quiz
Check je kennis over BDD met onderstaande korte multiple choice toets.
Leerdoelen
Check met onderstaande leerdoelen of je de behandelde stof begrepen hebt en toetsvragen kunt beantwoorden.
- Je kent de relatie van BDD met TDD, DDD en Agile/DevOps
- met o.a. relevante begrippen als Ubiquitous Language, test-first, red-green-refactor, AAA pattern, given-when-then en collaborative development
- Je kent de BDD three amigo's, en de 3 stappen van het iteratieve BDD proces
- Je kent 2 andere namen van BDD, en kunt deze uitleggen
- Je kent de term 'self testing code' en het onderscheid tussen
.feature
files, glue code en applicatie code en de talen/standaarden die hier achterin zitten - Je kunt de verhouding uitleggen tussen BDD test scenario's, test cases en suites met user stories en acceptatiecriteria uit Scrum
- Je kent de test pyramide, het belang van de verschillende soorten testen hierin en de link met BDD
- Je kunt op basis van een tutorial een project met werkende en relevante BDD tests opstellen m.b.v. Cucumber of Specflow (ReqNRoll)
Bronnen
- Beck, K. (1-12-2023) Canon TDD - Software Design: Tidy First? Substack.com. Geraadpleegd september 2024 op https://tidyfirst.substack.com/p/canon-tdd
- Fowler, M. (1 mei 2014) Self Testing Code martinfowler.com Geraadpleegd september 2024 op https://martinfowler.com/bliki/SelfTestingCode.html
Dev workshop 3 - Micro Frontends
Voorbereiding
-
Lees uit het artikel Micro-Frontends op martinfowler.com (Jackson, 2019) de hoofdstukken:
- Benefits
- The Example
- Integration Approaches
-
Verzin 2 toetsvragen over het onderwerp van Micro-Frontends
- Zet je 2 vragen in de thread hierover op het MS Teams Team van je klas/de minor
- (Als deze er nog niet is, vraag je docent dan, of start deze thread zelf)
- Formuleer bij voorkeur een multiple choice vraag met 4 antwoord opties waarvan 1 goed is (en 2 anderen plausibel zin)
- Verzin een unieke vraag (e.g. hoe sneller je er een post, hoe makkelijker)
- De beste vragen kunnen daadwerkelijk in de toets komen
Figuur 1: De microfront-end architectuur volgt vaak component structuur op het scherm/ontwerp (Jackson, 2019)
Lesprogramma
- Bespreken toetsvragen
- Mentimeter
- In teams uit elkaar
- Build your own MF met create-mf-app
- Plenair samenkomen: benefits & integration approaches
Figuur: Microservices everywhere (bron: Aditya,m 2022))
In teams uit elkaar
-
5 teams. Elk team krijgt één 'integration approach' om te gebruiken en een 'benefit' toegewezen om kort uit te leggen.
- Onderzoek hoe deze integration approach in zijn werk gaat.
- Onderzoek voor- en nadelen.
- Maak of vindt een kleine demo van approach
- Vat de toegewezen 'mf benefit' samen
- Presenteer je resultaten aan de rest van de klas
- Einddiscussie: Zou je MF's gebruiken in project, of niet. Wat is het alternatief? Als MF moet; welke integration approach zou jij het eerst kiezen voor front-end in het project?
Integratie methoden:
- Server-side template composition
- Build-time integration
- iframes
- JavaScript
- Web Components
Voordelen:
- Incremental upgrades
- Simple, decoupled codebases
- Independent deployment
- Autonomous teams
- De 5e: Bonus, niet echt voordeel, maar leg de 'Two Pizza rule of Amazon uit' + hoe dit pizza plaatje aansluit bij onderwerp microfront-ends?
Create-mf-app
Ga nu in tweetallen aan de hand van het artikel van logrocket (Patel, 2024) zelf aan de slag met het maken van een MF-app.
- Maak een simpele applicatie waarin 2 micro-frontends met elkaar moeten communiceren of in ieder geval van de resultaten van een actie gebruik moeten maken. Bijvoorbeeld:
- Zoekbalk, Artikellijst
- Boodschappenmand, Productenoverzicht
- Spreek met je teamgenoot af hoe je tussen de 2 micro-frontends gaat communiceren. Denk na over opties als:
- pub-sub
- externe service
- browser internals
- store/state-manager die beiden applicaties toegang tot hebben (e.g. redux, mobx, vuex, rxjs)
Quiz
Test je kennis over micro front-ends met deze multiple choice quiz:
Leerdoelen
Check met onderstaande leerdoelen of je de behandelde stof begrepen hebt en toetsvragen kunt beantwoorden.
- Je kunt gegeven een opdracht aangeven of een microfrontend een goede keuze is.
- Je kent het concept module federation, en kent twee andere manieren om micro-frontends met elkaar te integreren
- Je weet wat een micro-frontend is wat enkele voordelen ('benefits') hiervan zijn en kent de relatie met microservices.
Continuous Delivery vs DevOps
Huiswerk
- Bekijk het interview met Gene Kim over 'zijn' 3 ways of DevOps
- Bekijk het animatiefilmpje van Rackspace over 'What is DevOps'
- Beantwoord voor jezelf onderstaande vragen over deze bronnen (zet deze in een markdown bestand `<les-cd-antwoorden-mijn-naam.md> in je weekopdracht)
- Lees deze week de reader DevOps H10: 'Code Management' ((Sommerville, 2018) students only acces in GitHub; NB: vragen in theorietoets!)
1 Vragen bij Reader DevOps
- Wat zijn de 3
hoofdpuntenbelangrijkste principes* van DevOps uit Sommerville's hoofdstuk over `DevOps and Code Management'? (p. 307) - Hoe verhouden deze 3 punten zich tot de punten uit de twee filmpjes over DevOps van Gene Kim en RackSpace? Schrijf wat je opvalt, wat verschilt en overeenkomt.
2. Vragen bij interview Gene Kim
Beantwoord de volgende vragen:
- Wat bedoelt Kim precies met zijn 'peeing puppy' analogie? Schrijf een korte paragraaf hierover.
- Hoe moeten jullie straks tijdens het tweeweekse project dat de DevOps course afsluit om gaan met deze 'peeing puppy'? (E.g. wanneer moet deze 'zindelijk' zijn?)
- Kun je beter beschrijvende namen vinden verzinnen voor de three ways dan Kim's cryptische 'First way', 'Second way' en 'Third way'? Geef deze! #namingThings
3. Vragen bij animatie filmpje DevOps
Beantwoord onderstaande vragen bij het filmpje. Dit is een check of je gekeken hebt, maar ook voor activering van je voorkennis en duidelijk krijgen verschil in voorkennis en mening tussen jou en collega studenten.
NB: Het is niet erg als je voorkennis niet hebt, beantwoord wel sowieso de vragen die het filmpje zelf geeft en de mening vragen. Je hoeft niet te gaan googlen o.i.d voor de overige, tenzij een vraag dit expliciet vermeldt.
- Welke 2 typische deploy omgevingen ('environments') worden genoemd in het filmpje? Welke hoort bij Anna en welke bij Dave?
- Ken jij nog meer omgevingen dan deze twee? Hoe noem je deze als ICT'er? Welke hiervan zal of moet elke ICT organisatie in ieder geval hebben?
- Vergelijk deze extra 'tussenliggende' omgevingen met de 2 van vraag 1. Stel dat de software een typische 3-tier webapplicatie is, e.g. website met wat business logica en een database voor persistentie. Welk van deze onderdelen verschilt van de andere? Hoe. En waarom? Geeft dit nog security risico's.
- Welke 3 problemen veroorzaakt de delay die Dave ervaart? Geef voor elk probleem aan of dit een probleem is voor Dave, Anna en/of het hele bedrijf.
- Wat levert Dave eigenlijk precies op aan Anna? Is dit code of software? Wat is eigenlijk het verschil hier tussen?
- Uit welke 2 componenten bestaat DevOps volgens het filmpje? (Niet 'Dev' en 'Ops'; kijk het filmpje!)
- Welke van deze twee denk je dat belangrijker is? Waarmee moet je beginnen? Welke van de twee is het makkelijkst te adopteren?
- Welk van deze twee besteden we de meeste tijd aan in de minor denk je? (En welke zouden we het meeste tijd aan moeten besteden vind je?)
- Welke 3e item/onderdeel blijft impliciet? Kun je nog een 3e onderdeel verzinnen bij DevOps?
- Met welke 3 soorten taken zorgt DevOps voor betere samenwerking en productiviteit?
- Een van deze 3 taken (taaksoorten) heeft met workflows te maken. Wat bedoelt de verteller met workflows?
- Iets verderop geeft het filmpje nog een lijstje van 3. Nu zijn het alle 3 'automatiseer' taken. Welk item is hier verschillend met het vorige lijstje van 3?
- Stel je houdt met DevOps bijvoorbeeld een grote e-shop in de lucht (zoals je zelf zult doen in het beroepsproduct aan het eind van deze course). Dan kun je de zogenoemde 'conversie ratio' bepalen (conversion rate). Leg uit wat dit is, zoek eventueel op.
- Wat heeft 'conversie' ratio met je antwoord op vraag 12 te maken?
- Welk soort code schrijf je in de DevOps role meer dan in een Dev rol?
Les overzicht
- Bespreken stelling
- Behandelen huiswerkvragen
- Bespreken problemen bij weekopdracht 3
- Pauze
- 12Factor app principles (of 15 factor..): Duo ~~presentaties`` pitches (belangrijk voor de toets)
- Video 'The Difference Between DevOps and Continuous Delivery' (13 min) kijken en nabespreken (Farley, 2021)
- Checken leerdoelen
Als er onvoldoende tijd is voor video dan thuis zelf kijken en nu korte samenvatting door docent).
Les inhoud
Stelling:
"Requirements are the things that you should discover before starting to build your product." - Bron...?
12factor app principles
Opsplitsen in duo's en verdelen 12Factor principles.
Elk duo leest beide leden de introductie op de 12factor.net website. Het beantwoorden van onderstaande vragen onderling bespreken helpt je bij het geven van een presentie.
- Waarvoor zijn de 12factor principles? Gebruik in je antwoord de term 'software erosion' en leg uit wat dit is
- Wat is het verschil tussen SaaS, PaaS en IaaS, en welke is relevant voor 12factor principle en waarom?
- Geef een voorbeeld op waarin het principe van toepassing was uit je eigen ervaring als ontwikkelaar of operations werkzaamheden, of verzin er eentje, evt. met hulp van google of ChatGPT.
Leerdoelen Continuous Delivery
Check met onderstaande leerdoelen of je de behandelde stof begrepen hebt en toetsvragen kunt beantwoorden.
- Je kunt iets vertellen over 'Continuous Delivery' en de relatie met DevOps
- Je kent het belang van DevOps cultuur en mindset
- Je kent de 'three ways' van DevOps
- Je kent het Agile manifesto en enkele principes ervan en kunt uitleggen hoe DevOps in het verlengde daarvan ligt
- Je kunt verschillende stadia en vormen noemen hoe DevOps in een bedrijf is doorgevoerd
- Je kent de centrale rol van de CI/CD pipeline binnen DevOps en de aansluiting op versiebeheer
- Je snapt het principe van refactoren en de term technical debt
- Je kunt een (scripted) pipeline inrichten in Gitlab, GitHub of Jenkins (2.x)
- Je kent de 12factor app methodology en kunt toetsen of je software conform een bepaalde factor is
Bronnen
- Farley, D., Continuous Delivery (24-3-2021) The Difference Between DevOps and Continuous Delivery youtube.com Geraadpleegd november 2024 op https://www.youtube.com/watch?v=-sErBqZgKGs
- Fowler, M. (16-9-2008) Observed Requirement martinfowler.com Geraadpleegd november 2024 op https://martinfowler.com/bliki/ObservedRequirement.html
- Kim, G. Hiller, P (6-6-2020) DevOps Gene Kim Defines the 3 Ways of The Phoenix Project Jack Caine op youtube.com, geraadpleegd oktober 2024
- Rackspace Technology (12-12-2013) What is DevOps? - In Simple English YouTube.com, Geraadpleegd oktober 2024 op https://www.youtube.com/watch?v=_I94-tJlovg
- Sommerville, I. (2018) Engineering Software Products H10 Code management
- Wiggins, A. (2017) The Twelve-Factor App. 12factor.net. Geraadpleegd november 2024 op https://12factor.net
Week 4 - Orchestration
Lesoverzicht
- Les 1 (hele dag!) - Workshops Microservices & DDD
- Les 2 C4 & Continuous Documentation
- Les 3 RabbitMQ
- Les 4 SemVer
Les 4 - Bespreken weekopdracht & Kubernetes 101
NB: De Kubernetes 101 les en praktische deel hierachter is in 2024 naar week 5 verplaatst.
"The portability and reproducibility of a containerized process [...] lets us move and scale containerized applications across clouds and datacenters.
We need tooling [...] to help automate maintenance, replacement and rollout of updates of the containers during their lifecycle!"
Docker docs - september 2021
Week 4 Opdracht
De week 4 opdracht in 2024/2025 is de Dev opdracht rondom RabbitMQ. Toepassen van Kubernetes theorie in praktijk zit in week opdracht 5, samen met monitoring/prometheus.
Verder wordt de weekopdracht opengezet, moet iedereen weer een duo partner hebben (en bij oneven aantal één drietal).
Over de gevormde teams verdelen we de 3 te gebruiken techniek om van de in vorige opdracht gebruikte Docker compose naar Kubernetes te gaan:
Leerdoelen
Check met onderstaande leerdoelen of je de behandelde stof begrepen hebt en toetsvragen kunt beantwoorden.
-
DevOps-3 Je kunt werken met containers, gangbare software architecuren vertalen naar een container architectuur en de principes van container orchestration toepassen (Containerization)
-
DevOps-2-3 Kan applicatie onderdelen 'containerizen' en onderling laten communiceren
-
DevOps 2-4 Kent de rol van netwerken bij containers, en principes van een load balancer, firewall en proxy en relavante protocollen/standaarden
-
MDO-DevOps-3 - Containerization/Orchestration "Je kunt werken met containers, gangbare software architecuren vertalen naar een container architectuur en de principes van container orchestration toepassen (containerization)"
-
En de DDD en microservices leerdoelen n.a.v. Workshop InfoSupport. "Kent de basisprincipes van Domain Driven Design en kan deze toepassen en toetsen in DevOps code, configuratie en documentatie"
Workshop Event Driven Architectures (EDA)
Link naar sheets (Dag2Les.pptx
) (private repo; met de slides en oefeningen)
Lesvoorbereiding
Als je stap 3 van het bestand “Exercises in Domain Driven Design” niet hebt voltooid, doe dan het volgende:
- Voltooi het domeinmodel voor de bounded contexts die essentieel zijn voor de gameplay.
- Zet de klassen van het domeinmodel om in code met je voorkeursprogrammeertaal. Focus op het maken van klassen en hun attributen, niet op het implementeren van spelregels.
Lesprogramma / Lesmateriaal
- Web Scale Architecture - Zie web-scale-patterns.pdf
- Chess Game DDD - Zie Git Repo
Leerdoelen
- Moet de student vier vormen van event-driven architecturen (Event Notification, Event-carried State Transfer, Event Sourcing, en CQRS) kunnen uitleggen en de verschillen ertussen benoemen. Daarnaast moet de student in staat zijn om de voor- en nadelen van elke vorm te onthouden en uitleggen.
- Aan het einde van de les moet de student het CAP-theorem kunnen uitleggen en de drie pijlers (Consistency, Availability en Partition Tolerance) beschrijven. De student moet kunnen toelichten waarom een gedistribueerd systeem maximaal twee van deze eigenschappen kan waarborgen.
- Aan het einde van de les moet de student het principe Design for Failure kunnen uitleggen, inclusief het belang van foutdomeinen (Bulkhead pattern). De student moet de 8 fallacies of distributed computing in algemene termen kunnen benoemen en begrijpen hoe deze valkuilen kunnen worden vermeden. Daarnaast moet de student het belang van het Circuit-breaker pattern voor snel falen in gedistribueerde systemen kunnen uitleggen.
C4 & Continuous Documentation
Deze les gaat over een van de 'Continuous Everything' zaken, namelijk Continuous Documentation. We kijken naar het C4 model van Simon Brown: Documentation for developers by developers! Daarna wat highlights van werk van HAN docent-onderzoeker Theo Theunissen rondom documentation in Continuous Software Development. Daarna naar Architecture Decision Records.
Maar eerst doen we een korte recap en aanvulling op InfoSupport's workshop over Domain Driven Design.
1. DDD + Microservices recap
Korte terugblik workshops over DDD respectievelijk microservices.
Samen bespreken DDD's strategic vs. tactical patterns, en korte recap van de 3 hoofd strategic patterns:. Na de bespreking snap je deze termen hopelijk en kun je dit uitleggen. Anders geeft de website infiniot deze korte definitie, en moet je een bron vinden die het uitgebreider uitleggen:
- *Ubiquitous Language – Een taal gestructureerd rond het domeinmodel en gebruikt door alle teamleden om alle activiteiten van het team met de software te verbinden.
- Bounded Context – Een beschrijving van de grens waarbinnen een bepaald model wordt gedefinieerd.
- Context mapping - Hoef je in deze cursus hoef je deze niet te kennen.
Deze laatste hangt wel vrij direct samenahngt met de andere twee, zoals een student al aangaf. En in de PitStop casus uit eindopdracht course fase zit een mooi voorbeeld van een Context Map waar je mee te maken krijgt.
Figuur 1: Ubiquitous betekenis (bron: Google translate)
Wellicht ken je al 'onion' of 'Ports and Adapters' architectuur. Hierbinnen zitten ook DDD tactical patterns als 'Repository' en 'Services' (met onderscheid tussen Application Services (technische glue) en Domain Services (business logica).
Figuur 2: DDD Tactical patterns: Onion architecture with 'lower level' DDD pattern (bron: Jordan Jordanov, J., Petrov P, 2023)
We zoomen in op de andere DDD tactical patterns:
Figuur 3: DDD Tactical patterns: Aggregate met Aggregate root en Entity vs Value object (bron: .NET Microservices Architecture for Containerized .NET Applications Figure 7-9. p. 203
Dit zijn meer 'implementatie in OO' gerichte patterns: Entity, Value Object en Aggregate. Een Aggregate geeft een idee van de minimale 'grootte' van een microservices definieren/beschrijven, Zoals je bv. leest in een online artikel van Microsoft Learn of Dave Taubler op Medium (edit 2024: helaas inmiddels achter paywal/abonnement):
"As a general principle, a microservice should be no smaller than an aggregate, and no larger than a bounded context. First, we’ll review the tactical patterns.” - Microsoft Learn (z.d.)
"... we [..] designed our microservices around Aggregates" - Dave Taubler (2020)
2. Continuous Documentation
Relevante vragen:
- Wat houdt 'Continuous Documentation' in?
- Wat is de relatie met 'Continuous Delivery' (en andere uit 'Continuous Everything'?)
- Kun je een praktijk voorbeeld van Continuous Documentation geven?
- Welke manieren van documenteren van Software ken je? (deliverables, methodes)
- Open vraag: Welke documentatie gebruik je binnen 'Ops werk'?
De 3 fasen van software documentatie volgens Theunissen (2021) (klik via 'Publicaties' onder https://theotheunissen.nl.
Lesopdracht: Maak een opsomming van veel vormen van documentatie die je als ICT'er in je opleiding/werkervaring bent tegengekomen. Verdeel deze daarna onder over de 3 fases;
- Upfront: Acquiring knowledge
- Development: Building knowledge
- Delivery: Transferring knowledge
Zijn er ook types die in meerdere fases horen?
3. Het C4 model
Figuur 1: © Simon Brown, c4model.com
4. ADR's
Software Architectuur is het deel van de (software) design dat moeilijk te veranderen is. Je ontwerp leg je op verschillende niveaus vast met C4 en UML diagrammen en goede toelichtingen hierbij. Om verdere 'onderweg gemaakte' keuzes vast te leggen gebruiken we in deze minor Architecture Decision Records (ADR). ADR's zijn een heel belangrijk iets voor Software Architecten, maar ook Software Developers zoals beargumenteert in dit IEEE explore blog (2022)):
"ADRs’ greatest strength is their low barrier to entry. Since anyone on the team can write an ADR, everyone who wants can fill the role of software architect." - Michael Keeling (2022)
Hoe je deze keuzes vastlegt (documenteert) is weer een keuze op zich. Maar sowieso is het idee 'lichtgewicht' en direct bij de code in een tekst format, typisch markdown. Want de doelgroep is toch: mede developers/architects, kortom ICT'ers (en niet domein/business stakeholders, daar zijn andere docmenten voor). Hierbij is het handig een template te gebruiken. Om de keuze stress op dit niveau wat te beperken, en zo te kunnen focussen op concretere en relevantere keuzes in techniek en domein modelleren beperken we in deze minor de opties hiervoor tot twee:
-
Wellicht wel de best optie is een heel korte en krachtige variant van ADR's genaamd
y-statements
(DocSoc, 2020). Dit is feitelijk een enkele zin, maar hierin zit ook al een stuk 'alternatives': -
Of je gebruikt het template van Nygard, één van de grondleggers, volgens een artikel van Michael Keeling (2022). Omdat een ‘decision’ (=beslissing) ook opties impliceert (anders kies je nergens tussen) nemen we hierin ook alternatieven op. In het template van Nygard zit geen apart kopje, maar zouden alternatieven dan onder kopje 'Decisions' moeten. Of je plaatst ze al direct in de Context' (zoals Nygard zelf deed in het artikel waarin hij ADR's introduceerde (Nygard, 2011). Maar in het kader van het 'single responsibility' principe voeg je ten opzichte van Nygard's template een extra kopje toe: `Alternatieven'. IN het kader van ['The pyramid principle'] (Minto, 2002) plaats je deze sectie ACHTER de 'Decision'
Binnen DevOps mag je echter afwijken van rigide standaarden, als er een goede reden is, het gaat immers om "Individuals and interactions over processes and tools" (Agile Manifesto, Fowler et al., 2001). DevOps over ligt immers in het verlengde van Agile (embrace change).
Dit is een heel stuk korter dan de volledige ADR in Nygard (Henderson, 2023) met kopjes:
- Status: What is the status, such as proposed, accepted, rejected, deprecated, superseded, etc.?
- Context: What is the issue that we're seeing that is motivating this decision or change?
- Decision: What is the change that we're proposing and/or doing?
- Consequences: What becomes easier or more difficult to do because of this change?
Zie voor een voorbeeld voor de PriemChecker casus de docs/ADR
folder in de (PriemChecker
repo) voorbeeld van standaard straks in het project.
"In the context of storing large prime candidates in our SQL database using Entity Framework Core, facing the need to accurately store numbers larger than the built-in SQL data types can handle, we decided for using a Value Converter to convert BigInteger to a string format for storage, and against using decimal or bigint storage formats, to achieve compatibility with extremely large numbers while maintaining database flexibility, accepting that this introduces performance overhead from conversion and adds complexity in the application logic."
Hieronder nog iets over de folderstructuur in dit project.
Folder structuur en toepassen Pyramid principle in documentatie
Qua folder structuur zet je de ADR's in folder /docs/adr
en zet in zowel docs/
als docs/adr
ook een README.md
als 'landingspagina. De README.md onder adr
geeft deze inleiding/leeswijzer en linkt naar alle ADR’s. Dit is ook de DoD (Definition of Done) voor ADR’s, namelijk het Nygard template format dat jullie hanteren (Henderson, z.d.) of Y-statements (Olzzio, 2023)
Ook kun je verbanden leggen tussen verschillende ADR's. Als je bv. in het begin van je project kiest voor dataopslag met SQL Server, en dit vastlegt in een ADR, en gaande het project, bv. vanwege geheugengebruik issues van SQL switcht naar meer light weight database als PostgreSQL kun je deze aan elkaar koppelen. Of juist naar MongoDB vanwege partitioning eisen, of wat dan ook. Ook heb je keuze om hierbij twee technologie specifieke ADR's te maken (e.g. ADR-SqlServer.md
en ADR-PostgreSQL.md
) of een enkele ADR, met een meer functionele/semantische naam Data-Persistence.md
die je aanpast. In de paragraaf hieronder een voorbeeld van een te gebruiken tekst. Zoals hier aangeven gebruik het 'standaard format van Nygard, maar vul deze aan met 'Alternatives'. Of - als je het graag zo kort mogelijk houdt - kijk eens naar 'y-statements' van Olzzio (2023).
Quiz
Test je kennis over continuous documentation en C4 met deze korte multiple choice quiz.
Leerdoelen
Check met onderstaande leerdoelen of je de behandelde stof begrepen hebt en toetsvragen kunt beantwoorden.
- Je kunt uitleggen wat Continuous Documentation is en hoe het zich verhoudt tot Continuous Delivery.
- Je kent praktijkvoorbeelden van Continuous Documentation en kunt verschillende manieren van documenteren van software beschrijven.
- Je kunt het C4 model uitleggen en beschrijven hoe het helpt bij het documenteren van softwarearchitectuur binnen DevOps teams.
- Je kent twee manieren van architectuur beslissingen vastleggen met ADR's die je in het DevOps project gaat gebruiken
- Je kent de belangrijkste strategic DDD patterns zoals Ubiquitous Language, Bounded Context, en Context Mapping, en kunt het onderscheid uitleggen tussen strategic en tactical patterns.
- Je kunt voorbeelden geven van tactical DDD patterns zoals Entity, Value Object, en Aggregate, en weet dat aggregates een indicatie geven van minimale grootte van microservices.
Bronnen
Hier (nogmaals) de bronnen gebruikt op deze pagina in APA format.
- Brown, S. (z.d.). C4 model. Geraadpleegd op 23 september 2024 op https://c4model.com/
- Doc Soc (7-5-2020) Y-Statements - A light template for architectural decision capturing. Medium.com. Geraadpleegd september 2024 op https://medium.com/olzzio/y-statements-10eb07b5a177
- Google. (z.d.). Ubiquitous language betekenis via Google Translate. Geraadpleegd op 23 september 2024 op https://translate.google.com/?hl=nl&sl=en&tl=nl&text=ubiquitous&op=translate
- Jordanov, J., & Petrov, P. (2023). Domain Driven Design Approaches in Cloud Native Service Architecture. Geraadpleegd op 23 september 2024 op https://www.researchgate.net/publication/375982003_Domain_Driven_Design_Approaches_in_Cloud_Native_Service_Architecture/
- Keeling, M, (20 June 2022). Love Unrequited: The Story of Architecture, Agile, and How Architecture Decision Records Brought Them Together IEEE. Geraadpleegd dec 2023 op https://ieeexplore.ieee.org/document/9801811
- Microsoft. (z.d.). Implementing Value Objects with DDD. Geraadpleegd op 23 september 2024 op https://learn.microsoft.com/en-us/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/implement-value-objects
- Theunissen, T. (2021). Csimq: Continuous Software Development Documentation Artifacts. Geraadpleegd op 23 september 2024 op https://theotheunissen.nl/wp-content/uploads/2022/09/csimq.pdf
- Parker Henderson, J. Decision record template by Michael Nygard. Github.com geraadpleegd september 2024 op https://github.com/joelparkerhenderson/architecture-decision-record/blob/main/locales/en/templates/decision-record-template-by-michael-nygard/index.md
- Using tactical DDD to design microservices Microsoft Learn. Geraadpleegd september 2024 op https://learn.microsoft.com/en-us/azure/architecture/microservices/model/tactical-ddd
- de la Torre, C (2023) .NET Microservices Architecture for Containerized .NET Applications v7.0. Microsoft Coorporation. Geraadpleegd september 2023 op https://github.com/dotnet-architecture/eBooks/blob/main/current/microservices/NET-Microservices-Architecture-for-Containerized-NET-Applications.pdf
- Minto, B. (2002) The pyramid principle : logic in writing and thinking 3rd edition, Financial Times Prentice Hall
Dev workshop 4 - RabbitMQ
Lesmateriaal voor deze workshop is te vinden in de repo workshop-rabbitmq
in de besloten gitlab groep rabbit-mq
(alleen voor minor studenten, je moet ingelogd zijn in (AIM hosted) GitLab omgeving).
Quiz
Test je '101 kennis' over Kubernetes met deze korte multiple choice quiz:
Leerdoelen
- Je kunt uitleggen wat een message broker is en de rol beschrijven van RabbitMQ in verbeteren van 'loose coupling' van systemen.
- Je kunt het verschil beschrijven tussen verschillende messaging patterns, zoals work queues, publish-subscribe, routing en topics en gegeven een situatie/toepassing aangeven welke het geschiktst is.
- Je kunt de componenten van het AMQP-protocol beschrijven, zoals exchanges, queues, bindings en routing keys, en uitleggen hoe ze samenwerken in RabbitMQ.
- Je kunt uitleggen hoe RabbitMQ berichten routeert op basis van binding keys en routing keys.
- Je kunt van de verschillende types exchanges in RabbitMQ in ieder geval fanout uitleggen en bijbehorende use-cases benoemen.
- Je kunt een real-world analogie geven voor de werking van RabbitMQ, bijvoorbeeld door het te vergelijken met het sorteer- en bezorgproces van een pakketbezorgdienst.
Semantic Versioning
Figuur 1: Semantic versioning (bron: Surjit Bains, CC BY-SA 4)
NB Dit is in 2024 in week 4 geplaatst als zelf studie om voldoende tijd te hebben voor kubernetes in week 5. Kubernetes zit op het moment van schrijven op versie 1.28.x
. K8s gebruikt semver: semantic versioning
"Kubernetes versions are expressed as x.y.z, where x is the major version, y is the minor version, and z is the patch version, following Semantic Versioning terminology. - kubernetes.io
Opdrachten/zelfstudie
- Lees over Semantic Versioning op semver.org zodat je het begrijpt
- Welke onderdelen je wel of niet leest, mag je zelf bepalen, maar zorg dat je bij plaatje in Figuur 1 een verhaal kan vertellen over wanneer je welke van de 3 delen van een semver versie moet ophogen
- En beantwoord ook waarom de term 'semantisch' in de naam semver zit
- Denk eens na op welke zaken in een DevOps project je allemaal versies kunt geven.
Tijdens het project is semver ook een goede keuze. Je hebt echter de vrijheid om een eigen versienummer systeem te gebruiken. Zolang je dit documenteert/ernaar verwijst. Én er ook een goed idee achterzit. Dus bijvoorbeeld niet een 'anti naming pattern' zoals WendtVer die voor kenners wel vermakelijk is om te lezen.
"Let WendtVer provide you with a “fun” way to release and upgrade packages without having to think, saving you time and thinking."
Je mag er zelf over nadenken of alleen een git commit hash gebruiken als versienummer een goed idee is... :).
Als je een toepassing wilt kijken van semver die in een groot project ook erg handig is kun je eens kijken naar `conventional commits':
"[Conventional commits] dovetails with SemVer, by describing the features, fixes, and breaking changes made in commit messages." - https://www.conventionalcommits.org/en/v1.0.0/
TL; DR
De DDD term 'ubiquitous language' is van belang voor het checkpunt 'IR-201 Gedeeld informatiemodel' uit het CDMM. Dit staat uitgelegd onder de categorie 'Information and reporting'. Zie voor uitleg hiervan de beschrijving op pagina over 'DevOps concepten'. Zoals daar uitgelegd gaat het in CDMM checkpoint 'shared information model' vooral over informatiemodel van het software ontwikkel proces. In plaats van het domeinproces in het domein van je software zelf over gaat.
De term 'domein' is ook een verwarrende term, aangezien soms ook ICT zelf, en dus 'software ontwikkelen' een domein is. Namelijk het domein waar je les in krijgt op het HBO ICT. Het kunnen analyseren van andere domeinen waarbinnen je automatiseert is een van de competenties nodig om goed te kunnen werken in het ICT domein. Binnen dit ICT domein is een belangrijk concept dat van 'semantic versioning': semver. Dit geeft algemene richtlijnen over de betekenis van versienummers van software. Binnen een specifiek domein kun je vervolgens met semver je concrete software ook concrete semver versies toewijzen, waarbij je dan in kaart brengt welke features of bugfixes een bepaalde versie bevat. In termen van de concrete functionaliteit die een applicatie heeft. Maar ook de software tools die je zelf als developer gebruikt, en eindgebruikers geen weet van (hoeven te) hebben kan semver versies hebben.
Quiz
Leerdoelen
- Je kunt uitleggen wat semantic versioning inhoudt en waarom het nuttig is in softwareontwikkeling.
- Je kunt het verschil uitleggen tussen de drie onderdelen van semantic versioning en aangeven welk onderdeel je verhoogt in specifieke situaties.
- Je kunt uitleggen hoe je semantic versioning toepast om compatibiliteit te waarborgen tussen verschillende versies van een project.
Kubernetes 101
NB In 2024 gaat deze les NIET door, en zit onderstaand huiswerk bij workshop Alliander van de maandag erop en de daarin niet behandelde theorie uit deze les behandelen we in de Kubernetes 102 les de dinsdag erop.
Deze les kijken we naar de 'Kubernetes architectuur', en alle componenten van Kubernetes. Formeel Kubernetes 'resources' genoemd, zoals Cluster, Node etc. De les begint echter met een recap van de vorige les en uitstapje over semantic versioning. En hieronder eerst het voorbereidende huiswerk.
Huiswerk
Doe het volgende huiswerk. Dit zijn 2 stukken documentatie over 'orchestration' van Docker en 2 korte opdrachten die hierop doorgaan:
- Lees de Docker: Orchestration, get started... documentatie en zet lokaal Kubernetes aan in Docker Desktop volgens de instructie (je hoeft NIET Docker Stack aan te zetten, dat is deprecated)
- Bekijk de 1e 12 minuten van deze presentatie van Edwin van Wijk (medewerker InfoSupport).
- Als je liever leest dan video's kijkt neem de onderdelen van de 'overview' van de Kubernetes docs op kubernetes.io door,
- Vanaf 2:11 begint het stuk over Kubernetes, na een intro over Docker, maar vanaf het begin kijken is wellicht wel zo relaxed
- Zorg dat je ieder geval de concepten Pods, Deployments en Services duidelijk hebt. Als de video hiervoor te kort/high level is; lees dan de kubernetes docs, of er is ook deze wat uitgebreidere versie om ook intro te krijgen in Pitstop en vergelijking K8S en Docker compose (vanaf ca. 6:00 tot ergens 30 a 40 minuten. Je kunt sowieso stoppen als Edwin Service Mesh gaat behandelen (dat zou mooi onderzoeksonderwerp zijn voor week erna, als je dit interessant vindt).
- De Kube proxy zorgt dat een pod via network bereikt kan worden en Kubernetes higher level concepten als een
NodePort
kan realiseren.
A. Neem Figuur 1 voor jezelf op papier over, en breidt deze tekening met met concepten Cluster, Nodes en Pods uit met de overige Kubernetes resource types. Voeg hierin ook de ReplicaSet
toe en lees hiervoor de volgende bron over ReplicaSets op website bmc.com.
- Merk op dat in deze overview de *Kubelet* voorkomt i.p.v. een pod. Een Kubelet is te zien als 'de Ops kant' van een Pod. Een Kubelet is een daemon programma dat draait op een server en van de server een K8S node maakt. Meestal gaat deze deel uitmaken van de *data plane* zodat de K8S *control plane* node(s) hier een Pod kan gaan draaien. Vanuit de 'Dev' kant heb je liever de pod als abstractie, dan kun je dit 'extra [niveau van indirectie](https://en.wikipedia.org/wiki/Fundamental_theorem_of_software_engineering)' negeren. Maar zeker een mogelijk onderzoek in week 6 om onder de moterkap te kijken naar schalingsmogelijkheden van pods of de Ops side van Nodes:
- Horizontal Pod Autoscaling *HPA)
- Hoe de kubelet een PodSpec te sturen.
- Hoe een Kubelet meer dan één pod beheren, zogenaamde 'side car pods'
Figuur 1: Diagram van een Kubernetes cluster.
B. Kijk naar Figuur 2 en klik er zo nodig op voor een grotere versie.
- Maak een schema/lijstje met opdeling van de Kubernetes commands's in de 'imperatieve' en 'declaratieve' commando's.
- En doe kort onderzoek naar de achtergrond hiernaar. Stel bv. ChatGPT een vraag hierover, en valideer wat je terug krijgt kort door te googlen naar andere bronnen.
- Bijvoorbeeld een relevante stackoverflow post.
Figuur 2: Kubernetes: imperatieve vs declaratieve commando's in Kubernetes
Kubernetes Architecture
Figuur 3 geeft weer een beeld van de K8S resources in de K8S architectuur.
Figuur 3: Kubernetes Resources
Dit zijn er best veel, dus staan we er even bij stil. Gelukkig waren de lessen over Docker (van vorige week) wel een springplank voor veel concepten. Probeer voor je zelf alle objecten op te halen en op te schrijven. Highlight hieronder de tekst om antwoord zichtbaar te maken.
- Cluster?
- Node
- Service
- Deployment
- ReplicaSet
- Pod
- Container?
- Bonus 1: Data plane vs control plane
- Bonus 2: K8S Client, K8S API?, ...
- Bonus 3: Taints vs tolerations
...
Figuur 3: (Een deel van) ChatGPT 4's poging tot een overzicht als Mermaid klassediagram.
Quiz
Test je '101 kennis' over Kubernetes met deze korte multiple choice quiz:
Leerdoelen
- Je kunt uitleggen wat Kubernetes is en dat je het gebruikt voor containerorchestratie.
- Je kent het onderscheid in Kubernetes tussen control plane en data plane.
- Je kunt het verschil uitleggen tussen de node types binnen Kubernetes (master en worker nodes) en hun rol binnen de cluster.
- Je kent Kubernetes resources zoals Pods, ReplicaSets en Deployments en kunt beschrijven hoe deze met elkaar verbonden zijn en welke functie ze vervullen.
- Je herkent de voordelen van declaratieve versus imperatieve Kubernetes commando's en kunt uitleggen hoe je deze toepast in verschillende scenario's.
Week 5 - SlackOps (monitoring)
Lesoverzicht
- Les 1 - Alliander Workshop: K8s & GitOps
- Les 2 - Kubernetes 102
Les 3 - Prometheus + Chaos Engineering- Donderdag: 2e deeltoetsen Dev & DevOps
- Les 4 - Workshop Prompt Engineering & Onderzoeksopdracht
Les 5-1 Alliander workshop: K8S & GitOps
Alliander gastles
Les 5-2 Prometheus/PromQL en Chaos engineering/Load testing
Kijk verder naar les over Prometheus en chaos engineering.
Les 5-3 Todo
Todo.
Leerdoelen
Check met onderstaande leerdoelen of je de behandelde stof begrepen hebt en toetsvragen kunt beantwoorden.
- MDO-DevOps-5 - Slackops "Je kunt goede logging en monitoring realiseren in verschillende omgevingen en zorgen voor applicatiespecifieke rapportages"
- Ops-2-1 Je kent de principes van chaos engineering en de toegevoegde waarde hiervan
Workshop Alliander - DevOps bij Alliander: ArgoCD & GHA & Pax
Het bedrijf Alliander uit (o.a.) Arnhem komt in onze minor een workshop geven over 'DevOps bij Alliander'!
Huiswerk
De informatie uit deze workshop overlapt deels met de Kubernetes 101 les. Maak het huiswerk/de voorbereiding daarvan.
Alliander: netwerkbeheer
Dit zijn de slides van de presentatie van Alliander:
Alliander doet netbeheer, maar is effectief ook een ICT-bedrijf met 100-en ICT'ers in dienst. Slimme ICT is een belangrijk onderdeel van hun bedrijfsvoering en absoluut noodzakelijk in het kader van de energietransitie, wat in de huidige maatschappij erg belangrijk is.
Alliander: ICT
Kortgezegd gebruikt Alliander ook het onderdeel GitOps uit DevOps en hierbij van tools als Kubernetes, GitHub Actions en ArgoCD.
- ArgoCD is een tool voor GitOps volgens een 'pull based model' (voor Continuous Deployment)
Figuur 1: GitOps
Quiz
Test je kennis na deze workshop van Alliander met deze korte multuple choice quiz.
Leerdoelen
Het doel van de workshop is dat je een goed beeld hebt van hoe Alliander bij hun praktijk DevOps in de praktijk invult. Dus welke standaard tools en best practices Alliander gebruikt.
- Je kunt uitleggen hoe Kubernetes en Helm worden gebruikt voor het beheren en deployen van applicaties binnen Alliander.
- Je kunt beschrijven wat GitOps inhoudt en uitleggen hoe het wordt gebruikt om infrastructuur te beheren met Git als single source of truth.
- Je kunt de werking van een GitOps Operator zoals ArgoCD uitleggen en begrijpen hoe deze wordt gebruikt voor continuous delivery.
- Je begrijpt hoe het CI/CD proces bij Alliander is ingericht met GitHub Actions en ArgoCD en kunt het belang hiervan toelichten.
- Je kunt uitleggen hoe AWS Elastic Container Registry (ECR) wordt gebruikt om container images op te slaan en beheren zoals voor software updates of container retentie.
Kubernetes 102
NB In 2024 behandelen we in deze les ook nog niet eerder behandelde onderwerpen uit de Kubernetes-101 les
Deze les geeft Kubernetes verdieping en dient om aan de slag te kunnen met je eigen Kubernetes Rancher cluster onder aimsites.nl
en hierop een kleine microservice applicatie te kunnen runnen (PitStop).
Huiswerk/voorbereiding
Dit is het huiswerk voorafgaand aan de les:
- Neem als recap van de vorige les het artikel Kubernetes 101 door
- En ook de korte blog post 'Difference between a load balancer and an ingress'
- Neem high level de 3opties door voor migratie uit Docker compose in artikel van Milind Chavan (2021)
- Lees de documentatie over Kompose op de Kubernetes docs.
- Beantwoord onderstaande 8 huiswerkvragen. Zoek o.b.v. dingen die hierin onduidelijk zijn zelf relevante stukken uit de volgende bronnen (eigen keuze/leerwegonafhankelijk)
- de Kubernetes documentatie (kubernetes.io) over meer gedetailleerde werking van Deployments, Replicasets, Ingress en Services.
- Of meldt je aan voor de gratis (fremium) Linux Foundation course over Kubernetes en neem hoofdstuk '8. Kubernetes building blocks en '10 Services' door.
Huiswerkvragen
- Noem 3 opties om te upgraden vanaf docker compose naar Kubernetes
- Noem een voordeel van elk van deze 3 opties
- Kun je op productie ook Docker en Docker compose gebruiken? Noem minstens 1 reden waarom je dit zou willen, en 2 waarom niet.
- Wat betekent "Pods are used as the unit of replication in Kubernetes."
- Wat betekent 'round robin'? Google het zo nodig (staat niet in de bronnen) leg het uit
- Wat is DNS en hoe gebruikt Kubernetes dit?
- Op welke (wel/andere) behandelde 'resource' lijkt een Kubernetes
DaemonSet
? - Zelfde vraag voor de (verouderde) K8S resource
ReplicationController
: a. met welke resource(s) hangt deze samen? b. waarom is deReplicationController
gedeprecate? vind in bron, of vraag bijvoorbeeld aan ChatGPT en evalueer diens antwoord en zorg dat je het zelf snapt/kan reproduceren
Les
Kubernetes (K8S) is een te groot onderwerp om geheel in één week te kunnen behandelen. Hier zou je ook een hele minor mee kunnen vullen.
De bedoeling is dat je basis K8s Architectuur en K8S componenten en concepten kent en hier mee om kunt gaan. Zodat je m.b.v. kubectl
en extra benodigde vaardigheden tijdens opdracht en project relatief snel kunt uitzoeken met behulp van deze 'kapstok van kennis' die je al hebt.
In deze les kijken we naar:
- Terugblik Kubernetes architectuur (vragen vorige lessen)
- Het YML format en de relatie met JSON
- K8S advanced onderwerpen 'Ingress'
- K8S advanced onderwerp 'etcd' (en de relatie met High Availability clusters)
- Optioneel: het begrip 'Quality of Service' in algemeen, en specifiek in K8S in verband met mogelijk onderzoek.
- Workshop ArgoICT over Kubernetes (en K8S 'workloads')
1. Lesopdracht/-uitstapje: JSON vs YAML
Bekijk de website https://www.json2yaml.com/ en experimenteer hiermee. Zorg dat je duidelijk krijgt de link tussen JSON en YAML.
2. Lesvragen .yml
-
Is YAML ook JSON?
-
Hoe ziet een JSON array eruit bij omzetten naar YAML?
-
Hoe ziet een JSON object eruit? Wat is het verschil en overeenkomst met een array?
-
Maak een YAML bestand met een lijst van namen van jezelf en 3 studenten die om je heen zitten. Zet erna in het bestand ook de informatie over jezelf qua:
- 'lievelingskleur'
- 'favoriete film'
- 'hobby'
-
Vraag ook een van de 3 klasgenoten deze 3 'properties' en vul in
-
Ken je nog meer talen/formats die onderling zo'n zogenoemde 'superset' zijn van een andere taal/format? Schrijf op welke. Wat is het voordeel?
3. Nog 2 K8S onderwerpen: Ingress en etcd
Interessant én relevant stuk theorie is de werking van etcd, het gedistribueerde opslagsysteem waar K8S de eigen config opslaat. En wat ook een beeld geeft van kwesties rondom 'database sharding' en ook 'clustering' en 'voting. Bekijk deze korte intro:
We bekijken samen de video Kubernetes Ingress in 5 mins - Sai Vennam, IBM (5:40 minuten)
- What is etcd? - Whitney Lee, IBM (6 minuten)
Lesvragen Ingress en etcd
- Wat hebben K8S Ingress en etcd met elkaar te maken? (if any)
- Wat is het verschil tussen een Ingress en een Service?
- Bedenk zelf een toetsvraag over Ingress en zet in Teams
- Wat is een HA cluster in K8S?
- Wat heeft het aantal met het Raft voting systeem te maken?
- Wat is een 'etcd. member' en zit deze in control plane of data plane?
Optioneel: Quality of service in K8S
Een opstapje naar 'advanced Kubernetes' is wel het concept 'Quality of Service' (QoS) en implementatie en werking hiervan in Kubernetes.
Dit zou een mooi onderzoek zijn voor wie deze meer 'Ops side of things' wil verkennen.
Workshop "K8S op Rancher - Kubernetes een beetje praktisch" - Argo ICT
Het bedrijf Argo ICT uit Arnhem, met oud HAN student Murat Castermans geeft een hands-on uitleg bij het gebruik van een Rancher cluster voor de laatste opdrachten in de course fase.
Argo ICT moet je niet te verwarren met de vaak in het blok 2 gebruikt project te gebruiken tool Argo CD :). Argo ICT regelt de complexere ICT benodigheden voor HAN ICT en AIM, maar hebben ook andere klanten.
Samenvatting presentatie
Hier de link naar de presentatie (Google Slides)
Enkele quotes/samenvatting
Kubernetes is 'meer dan alleen maar schaalbaar' "Je hebt iemand die continue over je schouders meekijkt".
- Aantal issues tackled K8S zelf, heeft bv. probes voor detecteren van memory leaks, zodat je 's nachts niet wakker wordt gebeld.
- Je hoeft geen rekening houden met allerlei zaken aan de achterkant, zoals het configureren van Nginx, of OS specifieke zaken.
- Je hebt minder last van vendor lock-in. Zolang het maar 'Certified Kubernetes' is.
Soorten workloads in K8S
Quote uit de Kubernetes docs over 'workloads'
"A workload is an application running on Kubernetes. [...] Kubernetes provides several built-in workload resources:
(Uit de sheets van Murat):
Deployment
- Alles stateless, maakt niet uit welke node en of er storage is, makkelijk schalen, bv. een JavaScript front-end in een Nginx containerStatefulSet
- Wel storage, geisoleerd van andere storage, bv. voor database serverDaemonset
- K8S zorgt dat deze 'service' elke Node zorgt , bijvoorbeeld voor logging services (zoals FlentD)
Verdere highlights
K8S kent 3 soorten probes: Startup, Readiness (traffic) en Liveness (kill)
Gebruik voor testen op je eigen K8S cluster op aimsites een port forward, i.p.v. een NodePort setting (zoals je op localhost wel doet).
RWO = 'Read Write Once', wordt niet getoetst, wel interessant voor onderzoek evt. (access modes van K8S PersistentVolumeClaim)
Quiz
Test je kennis met deze korte multiple choice quiz.
Leerdoelen
Check met onderstaande leerdoelen of je de behandelde stof begrepen hebt en toetsvragen kunt beantwoorden.
- Je kunt uitleggen wat de rol van Pods is als replicatie-eenheid in Kubernetes.
- Je begrijpt hoe Kubernetes Ingress werkt en hoe het verschilt van een Service.
- Je kunt uitleggen hoe een HA cluster werkt in Kubernetes en waarom minstens drie master nodes vereist zijn voor etcd consensus.
- Je kent de voordelen van migreren van Docker Compose naar Kubernetes en weet hoe tools zoals Kompose en Skaffold hierbij helpen.
- Je kunt de functie van een
DaemonSet
in Kubernetes uitleggen - Je kent het voorbeeld van de
ReplicationController
uit de K8S die is gedeprecate en vervangen doorReplicaSet
als voorbeeld van verbeteringen en verandering in Kubernetes historie - Je kunt het verschil tussen JSON en YAML uitleggen aan de hand van hun relatie en voorbeelden en kan uitleggen waarom men
.yml
vaker voor K8S config gebruikt
Prometheus & Chaos engineering
NB Deze les vervalt in 2024 voor dinsdagmiddag 31 september. Vanwege drukte, de toets donderdag en verkortte laatste (course) weekopdracht. Deze les komt in week 6 kort terug als 2 goed onderwerp voor een eigen onderzoek en/of toepassing in PitSop BP/eindopdracht.
Vandaag 2 aparte onderwerpen: monitoring en statistieken via Prometheus en Grafana. En een 'build for failure' aatitude via Chaos engineering in K8S met de tool Chaos mesh.
Huiswerk/voorbereiding Chaos Engineering
- Zorg dat je begrijpt wat Chaos Engineering is én hoe je dit bereikt (Chaos Monkey, bv. link met 'design for failure' uit Event Driven workshop)
- Lees over Chaos Mesh
- Als het goed is ken je al het concept 'shift left', neem deze blog door over het concept 'shift right'
- Optioneel: Doe de 3 stappen van de Quickstart van open source Load test tool K6
- Krijg zelf overzicht van de Prometheus architectuur (zie figuur 1) door de website van Prometheus zelf door te nemen: prometheus.io.
Chaos Mesh
Figuur 1: Chaos Mesh
Figuur 2: Shift left vs shift right
Huiswerkvragen
- Schrijf voor jezelf op wat 'shift left' betekent. Beantwoord in ieder geval:
- waarom term 'left'?
- wat shift je?
- betrek ook het plaatje van software development continuum (of DevOps infinity loop)
- Zelfde voor 'shift right': Wat betekent shift right?
- Betekent 'shift right' dat je test in productie?
- Wat heeft shift right' met SlackOps te maken?
- Kun je een load test ook op een test omgeving doen? Wat is er dan nodig?
Uitstapje: The founder
Figuur 3: 'Founder trailer'
Lesvraag: Wat heeft deze video met DevOps te maken? Link ook aan het concept 'shift right'.
Chaos Engineering in PitStop
Figuur 3: Video: Stukje Chaos engineering in PitStop; demo van Edwin van Wijk
-
Welke tools gebruikt Edwin van Wijk om Chaos Engineering principe toe te passen (het YouTube filmpje start bij stuk over 'Chaos Engineering' op 41 en een halve minuut. Misschien ). Bij welke van de 5 weekthema's uit de minor hoort elke?
-
Welk onderzoeksmethode hoort bij een load test? (if any)
- In welke onderzoeksruimte zit deze methode?
- Wat is het verschil tussen een load test en een performance test? (if any)
- Vindt een alternatieve tool voor K6, schrijf kort verschil in features tussen de twee (nadeel en voordeel t.o.v. elkaar)
Prometheus
Week opdracht 5 bevat het maken van custom metrics in je applicatie en het verzamelen (scrapen) hiervan met Prometheus.
Figuur 1: Prometheus architectuur (bron: prometheus.io)
In deze laatste onderwijsweek testen we meer je eigen attitude.
Attitude
- je bent nieuwsgierig, en vindt zelf geschikte bronnen (je hebt deze minor zelf gekozen, en gaat volgende week ook onderzoek doen)
- je werkt zelfstandig (je gaat na de minor afstuderen)
- kunt *samenwerken ('DevOps is cooperation').
- je bent pragmatisch (je pakt een nuttige rol in de groepsopdracht, bepaalt een einddoel en houdt deze in de gaten)
Vanuit deze attitude zorg je dat een aantal dingen kent (kennis op doet) en kunt (vaardigheden aanleren en oefenen).
Kennen:
- de Prometheus architectuur
- Belangrijke termen: metrics, metrics server, promql, visualizer, service discovery, time series en scraping.
- Ook weet je hoe samenwerking Prometheus is met Grafana of andere broodnodige visualisatie tools als de ELK stack (omdat Prometheus NIET zelf visualisatie doet; zie figuur 2.)
Kunnen:
In de weekopdracht moet je
- enkele algemene metrics tonen
- maar ook applicatiespecifieke metrics.
Figuur 2: Prometheus uitgebreide architectuur (inclusief visualisatie tool als Grafana; bron: DevOpsSchool.com)
Bronnen
TODO: netjes volgens APA.
- Basis architectuur https://prometheus.io
- Uitgebreide architectuur... Geraadpleegd op 3-11-2023 op https://www.devopsschool.com/blog/what-is-prometheus-and-how-it-works/
Deeltoetsen 2
De 2e twee toetsen (Dev + DevOps() nemen externe surveillanten centraal af op 3 oktober, zie Osiris voor locatie. Hieronder tijdsinfo, en helemaal onderaan ook oefentoetsen en iets over de stof.
Disclaimer: Onderstaande informatie is voor het gemak en met enige zorg samengesteld. De officiele toetsregeling van de HAN gaat uiteraard altijd voor, mocht hier iets niet kloppen vergeleken met die regels van CTO (Centrale Toets Organisatie HAN). In het OS/OER staat echter weinig specifieks maar zie bv deze pagina op han.nl.
Indicatief tijdschema
- 9:00 Begintijdstip TheorieToets Dev en DevOps (zelf kiezen welke eerst, max 30 minz (of 37,5 of 45))
- 9:30 Eerste mogelijkheid lokaal te verlaten (en evt. alsnog binnenkomen voor laatkomers)
- 10:00 Einde
- 10:30 Einde Extra tijders
- 10:45 Toetslokaal einde
Combi toetsen
In iSAS staan beide toetsen op het zelfde moment, maar dit is omdat de toetsen veel korter zijn dan het toetsmoment. Circa een half uur. Voor mensen die 'Extra Tijd' regeling hebben (aanvragen via Osiros) dus 25% of 50% langer, dus dan ca./max 3 kwartier. Kom niet te laat, want in verband met de 'rust' mag je daarna pas bepaald tijdstip de toets in op het wisselmoment (typisch een half uur na start toets, dus bv. 9:30 als 9:00 de toets start.)
Tussendoor uitloggen uit Schoolyear
Je kunt zelf de toetsen starten in Ans. Bij start van de toets komt de Schoolyear koppeling, zodat je in een afgesloten omgeving de Ans toets maakt. Zorg dat je deze al installeert bij een oefentoets, of via proberen, en laat hem dan staan. Dit scheelt je wat installatie tijd.
Max. tijd per toets ingeregeld in Ans
Voor de toets is de gehele toetstijd ingesteld qua begintijd, eindtijd, dus 9:00-10:30. Maar voor elke toets is wel een maximale tijd ingesteld. Je moet ook minimaal een half uur in het lokaal blijven zitten, dus mocht je beide toetsen kunnen maken binnen een kwartier, dan moet je nog even geduld hebben. Als je slechts 1 toets komt maken, bv. bij een herkansing, geldt OOK dit half uur.
Merk wel op dat je einde toets, na inleveren en afsluiten ook echt de rode 'EXIT' knop moet gebruiken in Ans, om zo ook de Schoolyear sessie te beeindigen. Voor de volgende toets start je dan Schoolyear weer opnieuw op.
Hoewel je BINNEN de Schoolyear browser in Ans soms ook wel de andere toets kunt zien om op door te klikken, leidt Schoolyear — als je dat doet — je dan alsnog weer terug naar de toets waar je net uitkomt. Dit kan behoorlijk verwarrend zijn. Dus sluit Schoolyear dus einde toets af af, en dan werken linkjes wel zoals je verwacht.
Oefendeeltoets Dev 2/2
Edit minor 2024/'25: De oefenquizzes op specifieke pagina's zijn meer bijgewerkt en hebben minder oververtegenwoordiging van Kubernetes vragen dan onderstaande pdf's (hoewel deel van K8S vragen nog wel relevant zijn):
- Oefendeeltoets Dev 2 (5 minuten)
- Oefendeeltoets DevOps 2
De toetsen gaan over alle stof in week 3 t/m 5 in de course DevOps respectievelijk Dev.
Hieronder voor 2024 een korte samenvatting. Maar het is handiger om zelf een samenvatting te maken tijdens het doornemen/herhalen van de stof uit online materiaal, gelinkte bronnen en slides, etc.
Neem ook de leerdoelen van de weekthema's en lessen door en controleer dat je hierover de kennis ('kent') of vaardigheid ('kan') hebt, door een verhaaltje te vertellen.
Dev toetsstof 2024
- Micro Frontends
- C4 & Continuous Documentation
- RabbitMQ
DevOps toetsstof 2024
- Continuous Delivery (incl. 12factor, IAAS vs PAAS vs DevOps three ways e.d.)
- Domain Driven Design (DDD) + Webscale + Microservices (MSA)
- Behaviour Driven Design (BDD)
- Event Driven Architectures (EDA)
- SemVer
- Orchestration/Kubernetes (etcd)
- CDMM (niet uit hoofd, maar CDMM categorieen en checkpoints hieronder wel herkennen en kunnen uitleggen/toepassen)
SlackOps (Chaos engineering)
Toetsregels
Cesuur 70%: max 12 fout voor voldoende (5,5).
-
Eén punt voor iedere 'multiple choice' vraag (tenzij anders aangegeven).
- Bij multiple choice is slechts 1 antwoord goed (of 1 antwoord is 'het beste').
- Voor open vragen is het aantal punten aangegeven.
-
Er zijn geen hulpmiddelen teogestaan zoals boeken, spiekbriefjes, websites of communicatiemiddelen toegestaan.
- Je mag alleen 1 browser open hebben met 1 tabblad (namelijk die met daarin deze online toets)!
- Voor de start van de toets graag je rugzak of tas met je telefoon, smartwatch en/of andere devices voorin de klas leggen.
- Evt. gebruikt kladpapier moet je bij het verlaten van de klas ook inleveren.
-
Je mag het lokaal verlaten pas na de helft van de toetstijd, en dan laptop en rugzak achter laten in de klas.
-
Mensen met 'extra tijd' regeling kunnen max 50% extra tijd krijgen. I.v.m. bepertke lestijd en nabespreking gaat dit wel ten koste van eventuele pauzetijd tussen 2 toetsen door.
-
Bij Digitale toetsen in Ans gaan via de Schoolyear safe browser
- Sluit de toets na het starten NIET meer af, dit ziet Schoolyear als fraude, en dan sluit deze je buiten
-
De digitale toets is 'Bring your own device', je moet Windows of macOS draaien (dus geen Linux, regel dan 'dual boot' of vraag anders tijdig een leenlaptop aan bij de HAN (dit kan via Osiris))
Workshop Onderzoeksplan + Prompt Eng.
In deze workhop hebben we het over prompt engineering, en stel je een onderzoeksplan op.
Inleiding - Over onderzoek en Prompt engineering
Bij HAN ICT (AIM) vinden we het erg belangrijk dat je onderzoek doet. En een onderzoekende houding hebt. Dit is zelfs noodzakelijk, omdat de ICT sector zo in beweging is, dat je ook na je studie zult moeten blijven bijleren (Leven Lang Ontwikkelen). De opgedane kennis en vaardigheden uit je studie zijn wel een basis en een kapstop waar je nieuwe kennis aan kunt ophangen, en vaardigheden kunt verfijnen. Heel belangrijk hierbij is dat je de juiste vragen kunt stellen, juiste bronnen kunt vinden en de juiste methoden kunt gebruiken.
Wel richten we ons op toegepast onderzoek in plaats van theoretisch onderzoek. Dit laatste gebeurt meer op universiteiten of in Master opleidingen. Sommigen zien het zo dat daar dan het 'echte onderzoek' plaatsvind. Maar feitelijk is het heel nuttig om de uitkomsten van dergelijk theoretisch onderzoek, daadwerkelijk toe te passen, en zo te innoveren en waarde te creëren ('valorisatie').
Naast gestructureerd onderzoek doen, moet je het ook netjes opschrijven met geen of nauwelijks spel- of stijlfouten (max 3 per pagina). Hier kan ChatGPT je bij helpen. Als een AI qua schrijfniveau al snel een 7 of 8 scoort of zelfs hoger, dan kun je eigenlijk niet meer aankomen om dit zelf wel te doen (zie figuur 1). ChatGPT en andere generatieve AI lijken een belangrijke rol te hebben als productiviteitsbooster, maar hebben ook serieuze nadelen, dus dit vraagt een kritische houding.
We zien ChatGPT dus als 'creative technology', een AI met enorm veel kennis, waarschijnlijk meer dan enig mens ooit gehad heeft, en die altijd snel met een antwoord komt. Maar die af en toe ook 'confidently wrong' is, in de woorden van Elon Musk. Ook bekende Nederlandse informaticus Edsger Dijkstra schreef lang geleden al over 'the foolishness of natural language programming':
"some still seem to equate "the ease of programming" with the ease of making undetected mistakes." - Edsger Dijkstra https://www.cs.utexas.edu/users/EWD/transcriptions/EWD06xx/EWD667.html (1979)
Prompt Engineering
"Eén prompt is geen prompt".
Via ChatGPT kun je vrij gemakkelijk vrijwel foutloze teksten laten genereren. Althans, foutloos in die zin, dat de output geen spellingsfouten of stijlfouten bevat. Inhoudelijk verzint ChatGPT af en toe gewoon wat, als het maar goed overkomt. Het klakkeloos overnemen van teksten van ChatGPT is natuurlijk niet wat we willen.
Verder heb je ook nog fouten qua formulering of doelgroep. Het verzinnen kun je voorkomen door ChatGPT hier in je gesprek een algemene prompt te geven:
Lieg niet! Als iets niet zeker is, zet dit er dan bij, of laat feiten geheel weg als ze erg onzeker zijn of niet kloppen.
Ook schrijf je een technische tekst voor een technische doelgroep. Het gebruik van heel veel bijvoeglijke naamwoorden of bijwoorden hierin is niet gepast. Zie Technical writing; 'adjectives and adverbs' is de Engelse term voor bijvoegelijke naamwoorden respectievelijk bijwoorden. Een bijwoord is een soort bijvoeglijk naamwoord, maar dan voor een werkwoord i.p.v. een zelfstandig naamwoord, e.g. "Mooie zinnen (bijv. nw.) lees je vrolijk" (bijwoord))).
"Worse, adjectives and adverbs can make technical documentation sound dangerously like marketing material." - Google Technical Writing (2023)
Zo schrijft ChatGPT standaard snel “jubelende” teksten over de tools en technologieën. ChatGPT heeft kennelijk nogal de neiging om overdrijvingen in de tekst op te nemen. Dit is meer marketing taal dan een technische en kritische tekst zoals gewenst. Voorbeelden:
- “deze essentiële tool ...”
- “dit is voor DevOps-ontwikkelaars absoluut onmisbaar”
- “tool X fungeert als cruciale pijler”
- “tool X is een uiterst waardevol instrument”
- en “van vitaal belang”.
Zulke zinsnede zijn niet acceptabel. Laat ChatGPT dit omschrijven. En als deze dat niet kan of wil, dan moet je het zelf doen. Kennelijk heeft ChatGPT een bias waardoor deze nogal positief uit de hoek komt. Deze toon is niet passend in een blog waarmee je objectiviteit uit wil stralen.
Alleen als je na je onderzoek tot de conclusie komt dat de tool inderdaad fantastisch, geweldig of onmisbaar is, dan kun je dat eventueel zo benoemen in je conclusie, maar als je inleiding al van (op dat moment nog ongefundeerd) enthousiasme aan elkaar hangt, kom je minder geloofwaardig over.
Figuur 1: 3HOOG: ChatGPT. Benieuwd hoe het afloopt?... Zie: sam.han.nl
Onderzoeksmethoden
Over de onderzoeksmethoden is een nog een workshop, maar de HBO ICT onderzoeksmethoden ben je als het goed is eerder in je studie al bekend mee geraakt. Tijdens de workshop kun je mooi nu tijdens je werk nog opkomende vragen stellen. Schrijf deze op, anders vergeet je ze. De onderzoeksmethoden geven suggesties en kwaliteitscriteria voor goed onderzoek, maar zijn geen simpele 1-2-3 of afvinklijst naar goede onderzoeksresultaten.
Ook kun je niet aan ChatGPT toevertrouwen om echt origineel werk te maken of foutloos te zijn. Deze verzint af en toe gewoon wat, dus je moet alles controleren (zie Figuur 2). Als je zelf nog geen expert bent - wat bij onderzoek per definitie zo is - dan zul je dit met andere bronnen dan ChatGPT moeten doen.
Figuur 2: Is ChatGPT veilig voor gebruik? - Aleksandr Tiulkanov on X - Onderzoeker AI & Digitaal beleid.
Als je eenmaal goede antwoorden hebt kun je ChatGPT wel inzetten om een passende inleiding met goede leeswijzer te schrijven. En ook een conclusie. In je conclusie mag je toch "geen nieuwe informatie presenteren" (zie evt. "Do's en Dont's in je conclusie op Scribr (2013)).
Ook is ChatGPT redelijk goed in het schrijven van een (management) samenvatting, als je deze het samen te vatten. Wellicht kan ChatGPT ook een aanzet tot een goede discussie geven. Of een hypothese formuleren. Het is echter wel zaak, alles te controleren. Ook of chat geen hoofdlijnen mist. Of juist heel wollig is gaan schrijven, terwijl dit niks toevoegt, hoogstens goede input verwaterd (zie figuur 3).
Figuur 3: ChatGPT: Lossy compression... of "Too Long, Didn't Write" (bron: marketoonist.com)
Stappenplan voor schrijven onderzoeksplan
Hieronder een heel aantal stappen onderverdeeld in 3 hoofdfasen A, B en C.
A. Setup ChatGPT en repo
- Maak — als je die nog had — een ChatGPT account aan voor je @student.han.nl account
- Maak een repo aan op GitLab waar je je onderzoek (incl. onderzoeksplan) in gaat vastleggen/opslaan/documenteren. Zet in de repository naam je eigen naam, en zorg dat deze private is. Of gebruik een GitHub classroom link van een template repository als je docent deze aanlevert.
- Geef je teamgenoten ook toegang tot deze repository i.v.m. tussentijdse feedback volgens de 'Feedback circle' (PACT: zie opdrachtbeschrijving).
B. Prompt engineering onderzoeksvragen voor onderzoeksplan
- Formuleer wie je doelgroep is (zie opdrachtbeschrijving) en neem dit mee in je prompts aan ChatGPT
- Stel, met behulp van Prompt engineering, hoofdvraag en deelvragen op over je DevOps technologie en het bijbehorende (DevOps) concept.
- Laat ChatGPT deelvragen beantwoorden, en vind relevante andere concepten en/of andere tools en pas eventueel je vragen aan (vooronderzoek/orientatieonderzoek).
- Vind kandidaat onderzoeksmethoden voor elk van de deelvragen (minstens 3, maar liever meer en scherpe deelvragen dan bij het minimum blijven)
- Laat ChatGPT elk van je deelvragen kort beantwoorden (geef deze prompt met max. aantal woorden)
- Vind per deelvraag een of meerdere relevante bronnen (anders dan ChatGPT) voor eerste verificatie
C. Vastleggen, format checks
- Leg de doelgroep de (voorlopige) hoofdvraag en deelvragen en bijbehorende onderzoeksmethoden vast in een
onderzoeksplan.md
in je repository - Voeg hierin ook een korte (APA) bronnenlijst onderaan toe met kopje
## Bronnen
(met iig als bronnen de Research methods, de AIM controlekaart, ChatGPT, en extra bron per deelvraag, dus minstens 7 bronnen) - Zorg hierbij ook dat dat de bron titel cursief zijn in markdown en dat er ook referentie uit de tekst is naar je bron, zoals
- Installeer/activeer ook markdown linter (in bv VS Code), en haal lint fouten uit je
onderzoeksplan.md
, zoals missende witregels rondom kopjes of bullet lijsten
D. Oefenen met markdown en AIM controlekaart
- Zet alvast het logo van de CNCF tool/technologie als markdown afbeelding in je onderzoeksplan, of een ander relevant logo en laat deze rechts alignen (
<img src="plaatjes/plaatje.jpg" width="200>" align="right"
; html is ook markdown) - Neem ook een ander plaatje op, die 'gewoon' links aligned en block, en geef deze ook een 'caption'
*Figuur 1*: <Beschrijving>
en verwijs met dit figuurnr ernaar in je tekst (gebruik niet 'hierboven' of 'plaatje hieronder') - Check dat de URL's van opgenomen bronnen ook in je bronnenlijst staan (
geraadpleegd op jj-mm-jjjj via <url>
), en NIET als links in je hoofdtekst - Zoek ook wat stemmige afbeeldingen om je tekst te ondersteunen. Sla wel meteen de bron URL op, en neem deze ook op bronnen correct volgens APA. Zoek ook met bv. de Google image search met optie voor 'Creative Common werk', zie screenshot (University of Edinburgh, z.d.).
Figuur 4: Gebruik vrije plaatjes uit Google image search of vergelijkbaar
- en dat deze URL's ook NIET onnodig lang zijn, doordat ze bv. nog
#tekst
fragment offbclid
of andere onnodige tracking codes bevat (je moet evt. link tekst zelf IN je tekst zetten als quote of parafrase, en niet in bronnenlijst verstoppen) - Kijk tot slot of ChatGPT erg in de lijdende vorm heeft geschreven, en of je dit kunt laten herschrijven in de actieve vorm zoals de AIM controle kaart vraagt.
- Lees de AIM controlekaart en vink af of je document voldoet aan alle verplichte items. Heeft je onderzoekplan bv. een inleiding, kerntekst en (korte) conclusie? Staan je zinnen in de actieve vorm (weet je überhaupt wat dit inhoudt :S?). Pas dit nog aan. Dit was een mooie oefening voor je onderzoeksverslag, waar je hetzelfde moet doen!
Meldt bevindingen en vragen n.a.v. deze workshop bij de docent. Zorg dat deze dringende vragen beantwoordt.
Figuur 5: De toekomst van AI? - Bron CommitStrip.com
Tot slot
Voorlopig kunnen we AI nog goed gebruiken. Maar wat de toekomst brengt is onbekend. Er zijn grote kansen, maar ook grote risico's. Simpel verbieden kan niet, want er is ook argument te maken dat het onethisch is AI niet te gebruiken, gezien de grote uitdaging waar onze maatschappij nog voorstaat. Maar we moeten wel zorgen dat AI ge-aligned blijft.
PS: Dit stuk is nog geheel zonder hulp van ChatGPT geschreven. Alsnog kan het fouten bevatten; zo ja meldt deze even.
Figuur 6: ChatGPT als 'bullshitter' - Geen tijdbespaarder, maar normverhoger?
Het plaatje van figuur 6 mag je zelf even goed bekijken en over nadenken. Voor beperken grootte van plaatje/screenshot zijn beschrijvingen onder de 4 boeken eruit geknipt, maar verder is het plaatje niet bewerkt. De 2e bron (en dus ook beschrijving erbij) kon ik niet vinden via google, en had Chat verzonnen. Dit gaf deze ook meteen toe... Hieronder nog twee relevante quotes.
"ChatGPT [...] sometimes generates nonsense but overall it provides reasonable and and quite useful answers to our questions. So it’s a smart system; amazingly smart. But it’s also “bullshit”..." (Wikipedia z.d.)
En om de wellicht wat 'popy-jopy' of grof klinkende term 'bullshit' uit deze quote nog wat toe te lichten, want dit is inmiddels ook een in de wetenschap/filosofie onderzocht em beschreven woord.
"'On Bullshit' is een essay van de Amerikaanse filosoof Harry Frankfurt dat in 1986 werd gepubliceerd. [..]. Frankfurt [...] concludeert dat de spreker die zich van bullshit bedient niet geïnteresseerd is in de waarheid, maar alleen een mooi beeld van zichzelf wil scheppen. Volgens Frankfurt is bullshit een grotere bedreiging voor de waarheid dan de leugen" (Feeny 2023)
Figuur 7: XKDC over 'AI methodology'
Bronnen
- Commitstrip.com (april 2016) Meanwhile in a parallel universe. Will humans take our jobs? Geraadpleegd september 2023 op https://www.commitstrip.com/en/2016/04/14/meanwhile-in-a-parallel-universe-3/
- Driessen, Y. (feb 2023). 3 Hoog achter: ChatGPT. Geraadpleegd september 2023 op https://sam.han.nl/achtergrond/strip/3hoog-chatgpt/
- Feeney, P. (1 feb 2023) ChatGPT, “Bullshit” and the State of Artificial Intelligence. Geraadpleegd september 2023 op https://nl.wikipedia.org/wiki/On_Bullshit
- Marketoonist (juni 2023) Impact of ChatGPT. Geraadpleegd september 2023 op https://marketoonist.com/2023/06/impact-of-chatgpt.html
- Scribbr - (15 dec 2022). Scharwächter, V. Zo schrijf je een perfecte conclusie voor je scriptie | Met voorbeeld - Geraadpleegd oktober 2023 op https://www.scribbr.nl/scriptie-structuur/conclusie-scriptie/
- Wikipedia (z.d.) On Bullshit. Geraadpleegd september 2023 op https://medium.com/@patrick_97213/chatgpt-bullshit-and-the-state-of-artificial-intelligence-1b0f9c64079e
- XKDC z.d. AI Methodology. Geraadpleegd september 2023 op https://xkcd.com/2451/
- Google, z.d. - Technical writing. Geraadpleegd 31-10-2023 https://developers.google.com/tech-writing/one/clear-sentences
- The University of Edinburgh (z.d.) How to Google search for Creative Commons licensed resources Geraadpleegd op 2-11-2023 op https://open.ed.ac.uk/how-to-guides-old/how-to-google-search-for-creative-commons-licensed-resources/
- Dijkstra, E. (1979) *On the foolishness of "natural language programming".()
Week 6 - Individueel Onderzoek - Dev
Lesoverzicht onderzoeksweek
- Les 1 - Toelichting opdracht
- Les 2 - Vragenuur onderzoeksopdracht (& presentatie)
- Les 3 - PACT feedback onderzoeksblog, teams presentatie voorbereiden
- (lokaal beschikbaar voor peer assessment en overleg met docent)
- Les 4 - Eindpresentaties: Pitching some major DevOps tools
- (Presentaties in groespformat, jury van docenten en begeleiders)
Deze week doe je zelfstandig je eigen onderzoek, maar er zijn uiteraard wel enkele lessen/sessie om je te helpen in een week iets moois te leveren. Lees hier verdere eisen, tips, ideen voor onderzoeksonderwerpen en meer over indeling van contacturen in de onderzoeksweek.
Figuur 1: De website voor HBO ICT Onderzoeksmethoden: icresearchmethods.nl
Zorg voor variatie in onderzoeksmethoden (triangulatie), combineer methoden (research patterns); zie figuur 1.
Mogelijke onderwerpen, tips en indeling van onderzoeksweek 6
Je doet een week zelfstandig onderzoek en verdiept je in een nieuwe DevOps technologie die in het verlengde ligt van het geleerde in lesweken. Nieuw betekent dat de techniek vrij recent is geintroduceerd, en in verlengde betekent dus onderwerp dat niet in detail tijdens de les is langsgekomen. De techniek kan bv. wel een plugin zijn van een wel behandelde tool/techniek, een nieuwe framework, taal, library. Als deliverable schrijf je een blog voor mede IT'ers (peers e.g. zeg maar je klasgenoten). Deze is van voldoende kwaliteit dat je deze online zou durven/willen publiceren. Als je wil mag je hem zelf online zetten op medium.com, LinkedIn, je eigen website o.i.d., of we zetten ze gewoon allemaal hier op de site.)
De lessen in deze week zijn als ondersteuning, en vragen aan docent, maar ook voor onderlinge feedback met andere studenten. Hierbij hanteer je waar mogelijk de AIM controlekaart.
Opdrachtbeschrijving blog + presentatie
Je vindt hier de opdrachtbeschrijving.
Onderwerp van verslag
Je moet een nieuw onderwerp vinden, die een mede student niet heeft gekozen (ook niet in een evt. vorige jaargang), maar dus wel in het verlengde ligt van een wel behandeld onderwerp. Wel moet het onderwerp een 'hands on' karakter hebben, want je moet je techniek tijdens het beroepsproduct kunnen toepassen.
Kortgezegd moet er ook wat relevante code of configuratie in je blog voorkomen. De lezer moet dit kunnen plaatsen en gebruiken bij zelf naspelen (in kader van beschrijven van je onderzoeksmethode wat je bij goed onderzoek doet). Je kunt verschillende aanpakken gebruiken, bijvoorbeeld
- vergelijken van twee tools, franmeworks, talen in een bepaald gebied
- of een bepaald concept beschrijven en dan een toepassing te vinden
Vorm en inhoud
Hieronder staan wat tips. Deze regels zijn grotendeels ook van toepassing voor grotere documenten dan een blog. Zorg voor:
- een goede en liefst prikkelende/grappige titel (naming things)
- begin met de eindconclusie (Pyramid Principle)
- actieve vorm (er wordt NIET lijdend geschreven :P)
- APA bronnen (vergeet vooral ook referenties in de tekst mét quote of parafrase)
- Inhoudsopgave, goede tekststructuur en leeswijzers
Onderstaande paragrafen lichten dit verder toe.
1. Inhoudelijke en liefst prikkelende titel/naam van je blog
Onder het motto van de eerste van 'two hard things in computer science': naming things (Karlton, Vakil, 199x/2017) is het de bedoeling dat je je blog een interessante of prikkelende titel geeft. Dus niet 'Blog van Jan', maar een titel die iets zegt over de inhoud. Bij 'naming things' gaat veelal over variabele namen of bestandsnamen, waarbij gewoon 'recht toe rechtaan' naam het beste is. Maar in de titel mag je ook nog evt. prikkelend of humoristische titel gebruik. Of een samenvattend concept of idee.
2. Pyramid principle
Onder het motto 'start with the end in mind' van Stephen Covey en de pyramid principle van Barbara Minto geef je in de eerste 1, 2 of 3 alinea's direct een overzicht en de belangrijkste eindconclusie van het artikel. Je blog moet onderhoudend en goed geschreven zoals een normaal boek, maar NIET spannend zijn, of toewerken naar een ontknoping zoals een detective. In een technische tekst draai je deze pyramide om: de lezer leest meteen aan het begin 'who done it', en kan dan doorbladeren naar de onderliggende secties voor details waarover deze nog vragen heeft, zoals 'waar' en 'met welk wapen' zoals in Cluedo ;) (zie figuur 1). Wélke details relevant zijn, en dus de structuur van je tekst maak je zelf ook duidelijk in je tekst via leeswijzers, zie punt 5 'tekststructuur'.
Figuur 2: Vertel in een technische tekst meteen 'who done it', maak het NIET spannend.
Lees meer over de Pyramid Principle op pagina 'Onderzoek: eisen en tips'.
3. Schrijf actief, vermijd de lijdende vorm
Conform de AIM controlekaart mag er niet in de lijdende vorm geschreven worden vermijd je de lijdende vorm! Hier zijn we extra streng op om te oefenen voor het afstuderen. Hoewel sommige docenten in onderzoek (onderzoeksverslagen) de lijdende vorm wat eerder toestaan dan in een puur zakelijke of technische tekst past dit minder bij een meer persoonlijke tekst.
4. AIM-controlekaart punten
Waar mogelijk voldoe je ook aan andere eisen uit de AIM-controlekaart. Er is geen voorblad. Door punt 1 heb je wel een titel die op een voorblad niet zou misstaan. Vermeld ook een datum, of periode (alleen maand, of evt. startdatum, en datum laatst bijgewerkt o.i.d.). Als je herkansing hebt of feedback hebt gehad wellicht korte versietabel met korte beschrijving aanpassingen en/of uitbreidingen.
5. Inhoudsopgave, tekststructuur en APA
In een online blog zijn paginanummers NIET relevant. Wel neem je een Inhoudsopgave op (also known as 'ToC' ='Table of Contents', die je bv. genereert met een markdown plugin (Tran, 2023).
Je zorgt WEL voor structurering van je blog via secties en subsecties.
Je gebruikt in je tekst van je blog minstens 6 bronnen MET APA referenties. Dit zijn GEEN (directe) hyperlinks, maar:
- referenties in de tekst tussen haakjes
- en een Bronnen deel (ZONDER sectienummer) onderaan je blog.
Je referenties zijn volgens APA (en dus GEEN bibliografie). De gelinkte bronnen zijn GEEN voorpagina's van tool met alleen maar marketing en introductie die de lezer ook als 1e google hit zal vinden.
Bv.
"We werken met Kubernetes (Kubernetes, z.d.). Hieronder zie je het gebruikte deployment YAML bestand met een
RollingUpdate
..."
of
"De opdrachtgever gebruikt bij een aantal klanten de Kubernetes tool Argo (Argo, z.d.)"
Streef in plaats hiervan naar deeplinks naar een tutorial of blog over een specifiek onderwerp waaruit je een stuk tekst kunt 'parafraseren' of zelfs een letterlijke quote kunt halen. Met zo'n quote of parafrase heeft de lezer een idee heeft waar het gerefeerde artikel over gaat, en dingen hier kan checken of uitpluizen. Maar niet verplicht is de bron te bekijken om je verhaal te kunnen begrijpen.
"In Kubernetes gebruik je een deployment om te beschrijven hoe je systeem moet draaien. De deployment strategie geeft aan hoe Kubernetes bij afwijkingen tussen de daadwerkelijke situatie en de gewenste situatie weer terug kan komen in die gewenste situatie. Figuur 3 geeft de configuratie weer in het .yaml format. De gebruikte deployment strategie is de standaard
RollingUpdate
zodat 'updates are applied gradually, replacing a few pods at a time instead of reconfiguring the entire deployment all at once" (Bassey, 2024)". Om ook 'Failed update halts' die Bassey (2024) noemt mogelijk te maken heb ik ook health monitoring mogelijk gemaakt via instellen van een Liveness Probe' (Kubernetes, 2024).
Dergelijke stukken (e.g. gedeeplinkte blogs of artikelen) hebben ook eerder een auteur of bedrijf-/organisatieteam die je kunt opvoeren, dan een standaard algemene 'landingspagina'. En ook een datu, (evt. een 'date last updated' mist dit "pertains to the content you are citing" (Texas Medical Center Library, 2024)).
Merk op dat APA-referenties in de tekst VOOR de punt moeten (Scribbr, z.d). Dus NIET erna. Bij de zin waar het bij hoort… (quote of parafrase). Tenzij deze hele paragraaf een quote is, maar dan moet je deze ook laten inspringen. Maar dat doe je alleen bij een hele lange van meer dan 40 woorden, want anders geef je quote altijd binnen... quotes (")) (Project APA7, 2021).
Ook kun je Engelse citaten prima overnemen. Scribbr blogger Bas Swaen schrijft (2023):
"Soms wil je een citaat overnemen uit een anderstalige bron. Een citaat in het Engels kun je vaak zonder problemen overnemen in je Nederlandse scriptie, maar voor andere talen is dit lastiger, omdat lezers die taal mogelijk niet beheersen. Dan kun je ervoor kiezen om het citaat te vertalen.
Volgens de APA-stijl spreek je bij een vertaling niet langer van een citaat, maar van een parafrase. Je behandelt de bron als een normale parafrase en plaatst dus geen dubbele aanhalingstekens."
Over het mixen van Engels en Nederlands in een zin kan ik niet direct wat vinden op Scribbr. Maar analoog aan onze 'DDD' variabele namen zoals 'BushalteController' of 'VerzekeringService' is het binnen deze minor prima toegestaan.
Bronnen
- Bassey, M. (7 Aug 2024) Kubernetes Deployments: A Guide to the Rolling Update Deployment Strategy. Geraadpleegd op 10-6-2024 op https://semaphoreci.com/blog/kubernetes-rolling-update-deployment
- Cluedo Plaatje (Hoekstra, R. - 2004) Spelmagazijn - Spelbeschrijving- Cluedo. Geraadpleegd juni 2024 van http://www.spelmagazijn.nl/nl/spelmag/cluedo.html
- Kubernetes.io (30 aug 2024) Configure Liveness, Readiness and Startup Probes Geraadpleegd 10 oktober 2024 op https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
- Project APA7 (2021). APA-richtlijnen 7e editie: Parafraseren en Citeren. YouTube. Tijdens beoordelen geraadpleegd, gecheckt op https://www.youtube.com/watch?v=I-hrMg6oHGw&t=245s
- Scribbr (z.d.). Moet ik de verwijzing in de tekst voor of na de punt plaatsen?. Scribbr Tijdens beoordelen geraadpleegd, gecheckt op https://www.scribbr.nl/veel-gestelde-vragen/plaatsing-verwijzing-in-tekst/
- Swaen, B. (2023, 03 april). APA-stijl richtlijnen voor uitzonderingen | Uitleg & voorbeelden. Scribbr. Geraadpleegd op 8 oktober 2024 op https://www.scribbr.nl/apa-stijl/uitzonderingen-verwijzingen-de-tekst-volgens-de-apa-regels/#link-Citaatvertalen
- Team Professional Skills (juli 2014). AIM Controlekaart documenten. Geraadpleegd oktober 2018 op https://factlearning.files.wordpress.com/2016/02/controlekaart-documenten-ica.pdf
- Texas Medical Center Library (Feb 19, 2024) Date - APA Citation Style - LibGuides Geraadpleegd op 10-10-2024 op https://libguides.library.tmc.edu/APA/Date
- Tran, H. (22-8-2023), Auto Markdown TOC. Geraadpleegd 10-6-2024 op https://marketplace.visualstudio.com/items?itemName=huntertran.auto-markdown-toc
- Vakil, A.S. (13 mei 2017) The Hardest Problems in Computer Science. speakerdeck.com Geraadpleegd op 10-6-2024 op https://speakerdeck.com/vakila/the-hardest-problems-in-computer-science
Verdere bronnen (incorrect of zonder goede referentie ter illustratie):
- Kubernetes (z.d.) Kubernetes. Geraadpleegd op 2021-09-03 op https://kubernetes.io
- Argo (z.d.), Argo. Geraadpleegd op 2021-09-03 op https://argoproj.github.io
Individueel Blog+Presentatie als team
Introductie/TL; DR
Doe een onderzoek naar een DevOps technologie en schrijf hier (individueel) een blogpost over en geef een korte presentatie (in teamverband). Onderzoek hierbij een DevOps tool die hoort bij een van de onderwerpen van de workshops en lessen uit de course fase. Je mag er zelf een kiezen, waarover je graag nog meer zou willen weten. Kijk hierbij ook vooruit naar de eindopdracht, en technologie die je hierbij kan helpen om een hoger niveau uit het CDMM te halen.
Technologie is een vrij algemene term, maar dit is bewust. Regelmatig is dit een DevOps Tool, zoals CRIO of , maar de technologie mag ook een een framework of library zijn of zelfs programmeertool. Het kan ook een 'standaard' zijn, zoals bv. toml. Maar omdat je onderzoek ook een 'hands-on'/praktisch karakter moet hebben is het wel goed om hier ook een tool bij te zoeken.
Schrijf een blogpost samen met ChatGPT. Verifieer deze daarna met andere bronnen, en zorg dat je zelf het begrijpt. Herschrijf en vul aan met met andere (online) bronnen, en schrap vooral gedeelten die niet kloppen of wollig zijn. Voeg een stuk hands-on toe, in vorm van tutorial volgen en stukken code of config schrijven.
Je geeft ook een korte presentatie waarin je laat zien dat je het begrijpt. Dit is een 'pitch' van deze DevOps technologie. Orienteer je ook of de technologie samenwerkt met andere technologieen die teamgenoten daar gaan gebruiken/introduceren. Bedenk een hoofdvraag en deelvragen en vind hierbij onderzoeksmethoden.
Welke onderwerpen?
Kortgezegd kun je een DevOps tool uit het CNCF landschap pakken. En deze koppelen aan een concept uit CDMM, of ander concept of DevOps credo of buzzword.
- Per groep moet er minstens 1 persoon zijn die een onderwerp rondom SlackOps onderzoekt (wegens vervallen Prometheus)
- Het kan zijn dat er een onderwerp in de workshops was waarover jij niet zo veel nieuws hebt geleerd (omdat je die kennis al in huis had), maar waarvan je toch nog wat meer zou willen weten.
- Het kan ook zijn dat je een workshop hebt gehad waarvan je juist heel veel geleerd heeft, maar die je extra goed duidelijk wilt krijgen en og meer wil weten.
- Het kan ook nog zo zijn dat je in een combinatie van onderwerpen uit de workshops een mogelijkheid ziet om jezelf verder te verdiepen.
Doelgroep
Welk onderwerp je ook kiest: het is de bedoeling dat je je op dat onderwerp verder gaat verdiepen en dat je daarover een blog post (een stuk tekst) produceert die aansluit op het niveau van de minorcourse. De blog post moet te begrijpen zijn door je klasgenoten (peers) en hen ook nieuwe info moeten geven. Maar de tekst ook te begrijpen door buitenstaanders met hetzelfde kennisniveau als je klasgenoten (ICT'ers), maar die de minor niet volgen. Dus geef ook wat korte context van de minor waar je in zit. Dit kan met één zin en een linkje.
Je schrijft dus een verhaal met een kop en een staart: inleiding, kerntekst en conclusie (AIM controlekaart). In een blogpost is dit echter wel wat vrijer, dus — anders dan in een onderzoeksverslag - gebruik je niet letterlijk deze kopjes. Maar je deelt het wel in drieen. Je gebruikt ook bronnen en refereert hiernaar met een quote of parafrasering, zodat je de lezer niet dwingt de bronnen zelf te lezen (alleen als check).
Lijdende vorm
De AIM controlekaart geeft aan dat je NIET in de lijdende vorm moet schrijven. Dit is de laatste regel, en hier doen studenten vaak niks mee, of ze realiseren zich niet eens precies wat het betekent. In de versie van controlekaart op deze site is regel 11 over de lijdende vorm is herschreven in de actieve vorm, in het kader van "eating your own dogfood":
"Je schrijft het document in de actieve vorm. Het bevat nagenoeg geen lijdende zinnen."
Ook in het bedrijfsleven is regelmatig aandacht voor 'actief schrijven'. Google heeft in hun (online) course over Technical writing ook een prominente plaats gegeven (zie figuur 1).
Figuur 1: Google Technical writing - 'Active vs passive voice'
Dit voorbeeld geeft mooi aan dat lijdende vorm niet alleen te voorkomt als 'word/worden' + voltooid deelwoord maar ook als 'is/zijn' + voltooid deelwoord. Wel geldt nog dat als je merkt dat je makkelijker schrijft door wel de lijdende vorm te gebruiken, en regel 11 je dus blokkeert, dat het prima is wel lijdend te zchrijven. Zolang je de tekst maar herschrijft vóórdat je deze inlevert. Zoek een keer op 'word' in je tekst, en als het vaker dan 5 keer voorkomt weet je zeker dat je moet gaan herschrijven en de tekst een stukje korter kan.
Zolang de tekst uiteindelijk maar (overwegend) in de actieve vorm staat. Ander is het wollig en vaak onvoldoende duidelijk. De Google course 'Technical writing' is een nieuwere bron die nog eens het nut van schrijven in de actieve vorm uitlegt: "Je geeft meer context".
In een analogie tussen (natuurlijke) tekst schrijven en (programmeer)code schrijven is het ook belang om actief te schrijven om zo responsability te assignen (denk 'Single Responsability' en 'GRASP', etc.)
Een begin: "Er wordt een controle gedaan dat de ingegeven gebruikersnaam bestaat."
Vraag: Door wie? Ga jij bij al die mensen staan met een lijst en tik je ze op de schouder als ze een al bestaande gebruikersnaam ingeven.
Beter: "Het systeem controleert dat..."
Vraag: Welk deel van 'het systeem'? Is dit een front-end controle, of back-end. Front-end is door hackers makkelijk te omzeilen. Belangrijke checks, zoals bestaande gebruikersnaam moet je sowieso dubbel checken ook op de server.
Nog beter: "Bij inloggen controleert de back-end dat..." Vraag: Hoe ziet de code er dan ongeveer uit, gezien we elders kozen voor JAX-RS Restful endpoints..
Uiteindelijk in SDD: "In het REST endpoint op de back-end doet de aan dit endpoint gekoppelde methode
login()
in deLoginResource
een controle dat..."Nu ga je meer riochting het punt dat een junior developer het met jouw spec moet kunnen implementeren... Oftewel, zoeken naar actieve vorm en expliciet verantwoordelijkheden toewijzen en daarbij je problemen opdelen in deelproblemen helpt je straks in ICT werk ook te gaan richting een team lead, in plaats van een 'code monkey'.
Hands-on karakter
In je blog post moet je ook code en/of configuratie beschrijven, dus je blog bevat ook één of meerdere secties aan de hand waarvan de lezer zelf iets kan programmeren, configureren en/of beschreven stappen van toolgebruik kan naspelen. Kies hierbij wel voor 'configuration as code' en/of 'scripting' in plaats van hele handleiding met veel screenshots van te zetten vinkjes in GUI's, omdat dit laatste sneller verouderd.
Link ook naar je repository. Zet deze repository bij voorkeur op GitLab of GitHub (GitHub als deze publiek moet zijn/bewaard mag blijven).
Zorg wel dat je niet alleen hands-on stuk hebt, maar ook de nodige concepten uitlegt en context en introductie in je blog hebt. En natuurlijk ook een conclusie/recap.
Markdown, format en structuur
De blog is geschreven in markdown, met hierin ook gebruik van plaatjes en afwisseling van vrije tekst en gestructureerde vormen als tabellen, bullet lijsten en eventueel grafieken. Sluit aan bij format van bestaande blogs hier op de site. Gebruik ook afbeeldingen in je blog, en zorg dat deze ondersteunen en geef deze figuurnr's (caption), tenzij ze zuiver illustratief zijn. Verwijs in je tekst o.b.v. deze figuurnummers en schrijf ook toelichting bij zaken die vragen kunnen oproepen. Gebruik wel 'Creative Common' plaatjes om problemen met auteursrecht te voorkomen. Zorg ook dat je attributie doet voor de plaatjes, door 'ook bij het gebruik van afbeeldingen de bron te noemen (hier dan ook APA bron voor gebruiken).
De blogpost heeft ook eens structuur met koppen en subkoppen. Eventueel ook nog subsubkoppen, maar niet 'dieper' dan dat, want wat voor code geldt; geldt ook voor schrijven:
"If you need more than three levels [...], you're screwed anyway" - Linus Torvalds, Linux kernel coding style, z.d.
Schrijf de blogpost (net als vorige opdrachten) weer in een prive repo op gitlab. De blog staat direct in de README.md
of je linkt vanuit de README.md naar je blogpost.md
of <blog-onderwerp-coole-titel-cq-url-slug-voor-seo>
omdat je repo ook een apart onderzoeksplan.md
met je hoofd- en deelvragen en onderzoeksmethoden en toelichting.
Puntsgewijze samenvatting
- Schrijf de resultaten van je onderzoek op in de vorm van een blog-post (in het Nederlands! dus geen Engels of anderszins).
- Het is de bedoeling dat je onderzoek ofwel verbredend is (je betrekt er bijvoorbeeld onderwerpen bij die niet in de workshop zijn behandeld, of je past het onderwerp toe in een heel andere context), ofwel verdiepend is (je gaat dieper in op het onderwerp/de techniek doordat je bijvoorbeeld technischere bronnen aanboort of het onderwerp toepast in een complexere situatie). Een combinatie mag ook. In elk geval moet je duidelijk een toevoeging maken op wat de docent in de lessen behandeld heeft.
- Een korte introductie van je onderwerp hoort bij je blogpost, maar je mag ervan uitgaan dat de lezers geen “beginners” zijn op het gebied van jouw onderwerp. Ga ongeveer uit van je eigen niveau op het moment dat je met het onderzoek begon. Het eindniveau van de workshops dus, ongeveer.
- Een korte beschrijving van je onderzoekmethode (eventueel met verwijzingen naar gebruikte methoden zoals die van ictresearchmethods.nl) hoort ook bij je verslaglegging. We verwachten degelijk onderbouwd, traceerbaar en reproduceerbaar werk in je blog.
- Gebruik bronnen en verwijs hiernaar
- dat mag door links naar websites op te nemen in je tekst (gebruik waar mogelijk en relevant ook anchors om te verwijzen naar specifieke secties)
- maar het moet ook met [APA], dus een Bronnen lijst onderaan met al je bronnen (bij ICT meestal webpagina's) (HAN studiecentra 2021-a)
- en bij APA hoort ook in je blogtekst voor elke bron een quote of parafrase, dus: "in eigen woorden weergeven van andermans werk [...] gevolgd door een verwijzing tussen haakjes met de achternaam van de auteur(s), het jaartal ..." (HAN studiecentra 2021-b).
- Je tekst moet opgemaakt zijn met Markdown. Dat is later eventueel eenvoudig te converteren naar HTML. Je mag eventueel bijlagen bijvoegen. Deze hoeven niet in Markdown te zijn opgemaakt. Wanneer je gebruik maakt van bijlagen, verwijs hier dan duidelijk naar vanuit de tekst. Wanneer je bijvoorbeeld kleine stukjes code wil toevoegen mag je die gewoon “embedded” opnemen. Voeg uiteraard wel bronvermelding toe wanneer de code niet van je eigen hand is!
- Je levert je werk in op iSAS en voegt eventuele bijlagen toe door ze samen met het Markdown-bestand in een zip-bestand te zetten en dat in te leveren.
- We gaan ervan uit dat je in deze week van deze course al je tijd aan deze opdracht besteedt. Dat betekent dus dat het onderzoek, schrijfwerk en voorbereiden presentatie je zo’n 40 uur zou moeten kosten. Dit is inclusief het plannen van je werk, het zoeken naar bronnen, het uitvoeren van experimenten, het uitzoeken en oplossen van technische problemen en het schrijven van je tekst. We verwachten deze tijdsinvestering terug te zien in de complexiteit en/of omvang van je werk.
Beoordelingscriteria onderzoek
Figuur 1:
Hierboven een screenshot van het beoordelingsformulier uit 2021. De beoordelingscriteria zijn onderverdeeld in de volgende drie categorieën:
- Onderwerp, diepgang, theorie/praktijk (KO)
- Helderheid en doelgroepgerichtheid
- Bronvermelding
Kortgezegd schrijf je een blog over je onderzoek naar een onderwerp dat in het verlengde van de minor ligt, met als doelgroep je klasgenoten, dat aansluit bij geleerde theorie en een hands-on karakter waarbij je laat zien dat je goede bronnen hebt geraadpleegden via referentie naar goede bronnen. Maximaal 1500 woorden (ca 3 A4), exclusief bronnen en code, minimaal 800 woorden (2 A4).
Hieronder meer over onderwerp, vorm en inhoud en eisen en werkwijze voor je blogpost en onderzoek.
Onderzochte technologie toepassen in (team!) beroepsproduct
Sta in een eventueel onderzoeksplan ook stil bij de eis voor toepassen van de nu onderzochte technologie in je beroepsproduct de laatste 2 weken. Denk dus vast vooruit naar PitStop en scan hier bv. nog eens doorheen wat er in zit, en bij past.
Overleg idealiter met beoogde teamgenoten voor beroepsproduct. Zij moeten immers ook hun technologie toepassen; dus er moeten een aantal technologieen in de microservces applicatie ‘passen’ die hopelijk ook enigszins aanvullend zijn of ‘orthogonaal’ (onderling onafhankelijk) zijn. Het is nuttig om even over te brainstormen.
Sluit een PACT voor peer feedback in je team
Sluit binnen je team een PACT™ af: dit is de Peer Assessment Circle Tactic™.
Bijvoorbeeld als je team 4 teamleden gaat bevatten:
Teamlid 1
--> Teamlid 2
--> Teamlid 3
--> Teamlid 4
--> `Teamlid 1``
Op deze manier hou je peer assessment binnen je groep om elkaars tech vast te leren kennen, maar zorg je ook voor dat NIET jouw assessee ook jouw assessor is, wat ongewenst 'mooi weer spelen' in de hand zou werken. Zachte heelmeesters maken stinkende wonden... (e.g. alles wat uit peer assessment komt, komt beoordelaar niet meer tegen bij echte beoordeling).
Zet de gekregen feedback van je teamgenoot in je onderzoeks repo. Als je de feedback in een mail kreeg of Slack bericht kun je het copy-paste het onderaan in je onderzoeksplan.md
. Of als teamgenoot feedback in een issue of je GitHub of Gitlab repo zetten, kun je een link hiernaar toe zetten. Geef in je onderzoeksplan zelf ook aan wat je van deze feedback verwerkt hebt en waarom.
Je teamgenoot kan ook het beoordelingsformullier invullen. Als je dit voor een ander doet kun je hier kritischer mee omgaan, en ook het formulier zelf goed leren kennen, ook voor je eigen presentatie.
Teampresentatie
Op basis van je bevindingen bereid je een korte 'pitch' presentatie voor. Je pitch'ed je onderzochte technologie. Of manier van inzet hiervoor. Deze stem je af met teamgenoten op mogelijke punten waar techniek elkaar aanvult, of juist clashen. Je oefent je pitch op teamgenoten en op de docent.
DOMBLR: DevOps Markdown Blog Linting Rules
In 2024 is een eerste aanzet gemaakt tot een set custom Markdown linting rules, met als doel bepaalde kwaliteitscontroles te automatiseren. Deze linting rules zijn een uitbreiding op standaard Markdown lint (van David Anson, 2024), en zijn specifiek afgestemd op de onderzoeksblogs voor de minor DevOps. Deze helpen bij het waarborgen van consistentie en naleving van de opmaakvereisten.
Status: Work in Progress
Deze linting rules bevinden zich in de onderzoeksrepository en zullen onder andere controleren op:
- Check op maximaal 1500 woorden (exclusief code blokken)
- Correcte aanwezigheid van verplichte elementen zoals studentnaam, datum, en startafbeelding.
- Aangepaste teksten in verplichte afbeeldingen (alt- en title-teksten).
- Aanbevolen minimale hoeveelheid illustraties ter ondersteuning van de tekst.
- Structuureisen zoals het gebruik van
-elementen en overzichtelijke blokken.
Deze geautomatiseerde checks vormen een eerste stap naar een volledige review en zijn vooral bedoeld om standaardproblemen te verminderen. Ze zijn niet bedoeld als een volledige kwaliteitsgarantie, maar helpen wel om de basisvoorwaarden op orde te krijgen.
Figuur 2: ChatGPT's illustratie van linting: het verwijderen van fluff als metafoor voor het opschonen van code
Meer over de onderzoeksweek
Gebruikte bronnen
- Anson, D. (2024) markdownlint Geraadpleegd november 2024 op https://www.npmjs.com/package/markdownlint
-
- HAN Studiecentra (2021, 29 september) APA: Bronnenlijst - 5.1 Webpagina Geraadpleegd op 6 oktober 2021 op https://specials.han.nl/sites/studiecentra/auteursrechten/bronnen-vermelden/apa-normen/#comp00005aa289fd0000003b2b1b5c
- HAN Studiecentra (2021, 6 september) APA: In de tekst - Parafraseren. Geraadpleegd op 6 oktober 2021 op https://specials.han.nl/sites/studiecentra/auteursrechten/bronnen-vermelden/apa-normen-citeren-en-par/#comp00004b902de60000000bbf453d
Onderzoek: Toelichting en tips bij schrijven
In week 6 verdiep je je in een DevOps technologie en schrijft hier een eigen blogpost over.
Vanwege het verplicht 'hands-on' karakter kies je als onderwerp dus een redelijke concrete tool, framework en niet een heel algemeen onderwerp. Dus kies bijvoorbeeld 'Google Cloud AI Platform' in plaats van 'Artificial Intelligence'. Je blog post moet een hands-on karakter hebben. Er moet ook (voorbeeld) code of configuratie in je blog post voorkomen.
Maar je geeft elkaar ook onderling feedback. Je vormt ook vast de teams voor de eindopdracht volgende week en zorgt dat de te onderzoeken technologieen op de een of andere manier op elkaar aansluiten. Dat deze ook bruikbaar zijn tijdens realisatie van beroepsproduct in de 2 laatste weken van de course.
Hieronder verdere informatie, zoals knock-outs, suggesties voor onderwerpen/technologieen, tips.
1. Knock-outs
- Je bent niet bij de groepspresentatie of hier blijkt dat je niks hebt onderzocht of voorbereid
- Je hebt geen duidelijke en beschrijvende titel voor je blog (laat staan 'pakkend')
- Blog post NIET in markdown/tekst format, geen (extra) code in je repo (waar je naar verwijst)
- Geen code of configuratie in je blog post (deze moet 'hands-on' zijn)
- Er zit geen goede plaatjes in je blog (zelfs niet een paar)
- Te veel gebruik passieve vorm (zeg >= 5x 'wordt' in je tekst) of toekomende tijd
- Je blog is te veel een reclamepraatje: veel onuitgelegde bijvoeglijke naamwoorden of bijwoorden
- Geen goeie introductie (denk ook aan de leeswijzer hierin (=geen kopje!))
- Geen conclusie/afsluiting
- Als je een onderzoeksverslag hebt geschreven in plaats van een blog
- Geen goede structuur; niet opgesplitst in logische secties en evt. subsecties
- Minder dan 800 woorden, of (veel) meer dan 1500 woorden (exclusief config/code)
- Minder dan 5 referenties naar externe bronnen (en/of niet goed conform APA, zoals geen referenties in de tekst naar (al) je bronnen)
2. Voorbeelden van onderwerpen voor je onderzoek
Hieronder een lijst van mogelijke/geschikte onderwerpen, als er bij je zelf geen inspiratie/prangende onderzoeksvraag is ontstaan tijdens de voorgaande course weken. Kijk ook eens naar de onderwerpen op de 'not list' uit de minor chartering.
OPS
- runc
- ContainerD
- K3S/Rancher
- LXC/LXD
- Portshift, Pod scanning
- Terraform
- Build bakery
Dev
- Istio
- gRPC
- LinkerD
- Grafana
- Event sourcing
- Chaos engineering met Gremlin
- SonarQube
- Helm
- Crio
- Rancher
- K3S
- Prometheus (log/statistics)
- linkerD (service mesh)
Dev of Ops
- Kubernetes Custom Resources
- Services Meshes en Istio (of LinkerD)
- Kubernetes security en container scanning
- Secret management en certificates
- Site Reliability Engineering (SRE)
- AKS vs on premise K8S
3. Onderzoeksplan schrijven (optioneel, maar aangeraden)
Voor de blogpost is de eis dat je je eigen unieke onderwerp kiest binnen de klas. Om echt de volle week te gebruiken en niet te stranden moet je het gewenste onderwerp voor aanvang van de onderzoeksweek al gekozen hebben. En ook een reserve onderwerp. Op maandag, met hulp van een workshop schrijf je hierbij een onderzoeksplan met een concrete hoofdvraag en bijbehorende deelvragen (minimaal 3 en maximaal 7). Je hebt ook nagedacht over de te gebruiken onderzoeksmethode en sluit aan bij de ICT onderzoeksmethoden (die HAN medewerkers mede ontwikkelden).
Dit laatste doe je door voor elke deelvraag een geschikte onderzoeksmethode te vinden/kiezen en te benoemen. Maak hierbij NIET de veelgemaakte fout om onderzoeksmethode te verwarren met onderzoeksruimte ('lab' is bv. GEEN onderzoeksmethode, maar een -ruimte met hierbinnen meerdere methoden zoals 'component test' en 'unit test') (zie figuur 1). Varieer wel in onderzoeksruimte voor de triangulatie (DOT framework). De focus tijdens onderzoek ligt op Lab en Workshop onderzoek. Field onderzoek gebeurt meer tijdens ontwikkelen van beroepsproduct. De zogenaamde 'triangulatie' uit de 'DOT Framework' die achter de de ICT onderzoeksmethoden zit.
Met je onderzoeksplan zorg je dat je ook echt vragen stelt, en beantwoord en trianguleert. Deze kijken we niet per se na, maar bij twijfel over de kwaliteit kan beoordelaar dit erbij pakken. Een prima onderzoeksplan kan een twijfelachtige blogpost toch het voordeel van de twijfel geven.
Figuur 1: Overzicht van onderzoeksmethoden (deel ervan, bron: /methods-overview, 2023)
Je mag ook de joker gebruiken. Je kunt de onderzoeksmethoden een beetje vergelijken met 'patterns', het is een naam voor een aanpak van een veelvoorkomende type probleem. Zorg dat je ook echt iets met deze aanpak doet door ook de ingredienten te gebruiken. Dus in plaats van (alleen) een tabel of bullet list te geven van je onderzoeksvragen en voor elk de gebruikte onderzoeksmethode, schrijf je ook gewoon een stuk vrije tekst om dit uit te leggen
Als je de joker in zet is het het sterkst is natuurlijk als je je eigen onderzoeksmethode dan een naam geeft. Hoewel je in het 1e jaars wellicht nog wel een introductie bij de bibliotheek hebt gehad, gebruikt eigenlijk 100% van de studenten uitsluitend internet als bron. Oftewel googlen. Je kunt ook de CMD onderzoeksmethoden. Maar noem/kies ook concrete 'en relevante ingredienten' uit de gekozen onderzoeksmethode.
De deliverable van je onderzoek is GEEN onderzoeksverslag, maar een blog post. Dus met minder formeel taalgebruik. Een onderzoeksplan is ook niet verplicht, maar kan je zelf wel helpen. En het wel aanwezig zijn (van bv. een onderzoeksplan.md
in je repo) is een goede safeguard mocht je onderzoek toch tegen vallen (ook bewijsmateriaal voor beoordelaar).
4. Vooronderzoek
Voordat je een onderzoek start, moet je wel wat vooronderzoek doen om de goede vraag te kunnen stellen. Om een idee te hebben of je een vraag in een middagje kunt beantwoorden (te klein, wellicht een deelvraag van maken of scope uitbreiden) of dat het wellicht maanden duurt (te groot, deel aspect pakken, onderzoek op een precies framework toe spitsen). Of dat deze precies goed is (goldilocks zonde ;).
5. Peer assessment
De voorlaatste dag van de week doe je onderling peer assessment. Doe dit zowel mondeling als schriftelijk. Schriftelijk voor de aantoonbaarheid, en ook zodat de ander het ook rustig verwerken. Mondeling kun je details verder bespreken en vragen, en dit is goed om de feedback niet té comprehensive te maken.
Je kan het zo aanpakken:
- Geef de ander toegang tot je prive repo en deze maakt een issue aan met hierin feedback.
- Een pull request met suggesties voor verbetering stijl of fixen typo’s van concrete tekst.
- En een beoordeling a.d.h.v. de beoordelingcriteria uit beoordelingsmodel op iSAS. Deze zijn in 3 hoofdcategorieën:
- Onderwerp, diepgang, theorie/praktijk (KO)
- Helderheid en doelgroepgerichtheid
- Bronvermelding
Verwerk de gegeven feedback.
6. Schrijftips
Hieronder enkele schrijftips
- Gebruik zowel vrije tekst als meer gestructureerde elementen als tabellen en bullet lijsten
- Maak je werk reproduceerbaar en verifieerbaar door je werkwijze te beschrijven en bronnen te geven
- Geef je blogpost een logische structuur zodat deze leesbaar is
Hieronder verdere toelichting voor elk van deze punten. Lees ook eens deze blogpost van copyschool.nl (Driel, 2020). De tips 14 tot en met 19 van Jantien kun je negeren, want deze zijn meer voor weekbladen, maar de rest snijdt houdt; ook voor meer technische blogs.
6.1 Afwisseling tussen vrije tekst en gestructureerde elementen
Zorg dat je tekst structuur heeft. Door bijvoorbeeld het gebruik van bullet lijsten en/of tabellen. Maar zorg ook dat je blog niet ALLEEN uit bullet lijsten en tabellen bestaat (wat je veel studenten ziet doen in afstudeerverslagen). Dit doe je door ook vrije tekst toe te voegen. Geef elke bullet lijst een inleidende zin: wat voor soort items staan er in de lijst. Is het een en-en lijst? Of een of-of (e.g. beschrijft deze bv. alternatieve strategieen)? Al dit soort zaken zijn wellicht wel af te leiden door de lezer. Maar in een goed stuk hoeft de lezer weinig na te denken om het te begrijpen en heeft de schrijver juist extra veel nagedacht en/of moeite erin gestopt om de tekst duidelijk te maken. Zie verder ook sectie 'pyramid principle'.
Deze vrije tekst zelf structureer je wel via paragrafen. Paragrafen scheidt je van elkaar door een witregel. Als je enkel een harde enter plaatst kan het zijn dat de laatste zin van je paragraaf net zo lang is dat deze tot het eind van de regel loopt. Waardoor een lezer alsnog geen paragraaf overgang ziet. Bijvoorbeeld als een lezer op een mobiel device je artikel leest, terwijl je hem in desktop zelf hebt ingetikt.
6.2 Reproduceerbaarheid en gebruik bronnen (en conform APA)
Goed onderzoek is reproduceerbaar. Dat wil zeggen dat als iemand anders hetzelfde onderzoek doet dat deze tot dezelfde resultaten leidt. Alleen zulk onderzoek is betrouwbaar, en met de resultaten van zulk onderzoek kunnen anderen ook verder. En op de 'shoulders of giants' staan.
"If I had more time, I would have written you a shorter letter." - Blaise Pascal. (De kritische student onder jullie vraagt zich nu wellicht af waarom een Fransman een Engelse quote krijgt toegedicht. Een goede vraag...)
Binnen het HBO vinden we het belangrijk dat je een 'onderzoekende' mentaliteit hebt. Zeker in ICT leiden we namelijk op voor beroepen die wellicht nu nog helemaal niet bestaan. Wellicht wordt je een DevOps engineer
, wat al wel een gangbare naam is, en tevens goedverdiendende rol ook nog. Maar wellicht verzint een bedrijf een meer of minder 'buzzwordy' titel voor hun vacture.
De internet variant van referenties zijn natuurlijk hyperlinks. En bij HBO ICT zijn 90+% van de bronnen internetbronnen. Voor je blog post moet je echter wel APA gebruiken. Deels om alvast te oefenen voor je afstuderen. Of omdat je begeleidend docent zelf ook echt streng is op precies APA gebruik. Regelmatig gebruiken studenten ook voetnoten bij het geven van APA referenties, maar dit is NIET het idee van APA en dus ook NIET conform APA. Dat wil zeggen: Voetnoten zijn niet verboden, maar voetnoten zijn voor voetnoten, dus een optionele toelichting op iets. Dit is iets anders dan bronvermelding, dit is bij de HAN niet optioneel, maar verplicht!
Een voor veel studenten onbekend issue is het verschil tussen een Literatuurlijst en een Bibliografie. En omdat Word als standaardtitel voor zo'n sectie 'Bibliografie' heeft, wordt dit veelal zo ingeleverd. Maar APA vereist een literatuurlijst, en dat is strikter dan een bibliografie, omdat in een literatuurlijst naar elke bron in deze lijst ook een referentie vanuit je tekst moet zijn.
Een bibliografie is een lijst van alle werken die je hebt gelezen tijdens het schrijven van een stuk. Maar hierbij hoef je niet per se te refereren naar de werken. Je zou bij wijze van spreken het kinderboek 'Pa Pinkelman en tante Pollewop' (Zonderland, D.)
op kunnen nemen in je bibliografie, als dit boek je bijzonder veel ontspanning gaf tijdens een zware afstudeerperiode 😉. Maar omdat dit boek niet relevant past het NIET in een literatuurlijst.
Maar zonder gekheid, APA gaat dus uit van een 'Literatuurlijst', bij de HAN vaak 'Bronnen' genoemd!
6.3 Structureren van je blog post: section by feature (WIP)
Programmeertalen en natuurlijke talen zijn behoorlijk verschillend, maar er zijn ook overeenkomsten. Hierop gaan we hier niet verder in, maar wellicht een leuke oefening voor de lezer hiervan enkele voor zichzelf te noteren. Beiden hebben syntax én semantiek. Bij beiden moet ook een vertaalslag plaatsvinden; hetzij naar concepten in het menselijk brein, hetzij naar machine instructies die een processor kan uitvoeren bij het runnen van het programma.
Zo zijn ook code schrijven en tekst schrijven twee verschillende dingen, maar ook hier kun je overeenkomsten vinden. Een daarvan is dat structuur belangrijk is. Je programma deel je op functies. En in classes en/of modules zodra het enige schaal krijgt.
Hóe je het programma opdeelt is deel van het ontwerp, en zelfs van de (software) architectuur, want deze structuur verander je niet zomaar. Deze gaan dus horen bij de architectuur van je programma.
"Architecture is that part of design that is hard to change."
Een van de meest gestelde vragen van nieuwe programmeurs is: 'Ik heb het werkend, maar waar moet ik deze code neerzetten? In welke folder?'. Als je op dat moment geen duidelijk antwoord hebt, en maar wat gaat doen, creeer je een precedent. Dan gaat iedereen zijn eigen regels volgen. Om dit te voorkomen is het standaard antwoord vaak: de controller moet 'gewoon' bij de andere Controllers
. Er is ook een mapje voor de Views
en de Services
.
Op deze oplossing is nogal wat op af te dingen, vooral als de applicatie over de jaren groeit en zeker als je 'Domain Driven Design' aanhangt (zoals in deze minor). Als je 'opeens' 10 of meer services in één folder hebt staan. Twee van deze services worden vanuit allerlei plekken gebruikt, vanuit de andere services en ook vanuit die ene repository, dat had wellicht netter gemoten, maar ja, het werkt wel. De andere 8 gebruik je slechts vanuit 'hun' controller, die in een heel ander mapje staat.
In een applicatie/repo/project heb je grofweg twee manieren om code te structureren:
- package by type
- package by feature
Dit idee van 'controllers bij controllers' noemt men Package by type . Alles bij zijn eigen type. Dit geeft wel een duidelijk antwoord. Waar plaats ik een service? In de services
folder. En veel CLI's of IDE's geven je zelfs al een services
folder en een controllers
folder etc. om je extra productief te maken en zulke moeilijke vragen als 'waar moet deze klasse?' te voorkomen.
Maar zoals vaak komen de kosten van aan het begin minder nadenken later dubbel terug. De 'package by feature' optie vraagt wat meer denkwerk, want nu moet je zorgen dat de klasse of module een goede naam heeft. Namelijk die van zijn functionaliteit. Gaat deze code over 'rekeningen' (bills) of over voorraadbeheer (inventory)? En is het voorraadbeheer van de producten die je verkoopt (inventory/sales), of voorraadbeheer van spullen die je intern in bedrijf gebruikt en periodiek moet vernieuwen (/inventory/production
). Of kun je folder 'inventory/sales' beter hernoemen naar stock
om aan te sluiten bij woorden die ze in de business gebruiken? Nou dit neigt al naar de Ubiquitous language, zo'n beetje het belangrijkste pattern uit Domein Driven Design.
De package by feature' aanpak betekent in ieder geval dat de folderstructuur is niet meer standaard hetzelfde voor alle projecten, maar de folderstructuur geeft aan wat de applicatie doet. Als de stock
folder 2x zoveel bestanden en/of subdirectories bevat als de inventory
folder, geeft dit duidelijk aan dat hier meer logica in zit. En dat dit deel wellicht voor de core business in het bedrijf ook belangrijker is. En/of dat het complexer is om goed te automatiseren.
Het zal duidelijk zijn dat deze laatste te prefereren valt. Hoewel het vooral bedoeld is voor grotere projecten mag je hier zeker mee experimenteren ook in de wat kleinere projectjes op school. In het echte bedrijfsleven moet je zeker niet zomaar gaan switchen naar andere folder structuur, zonder eerst akkoord van management en/of afstemmen met mede developers. Er is ook nog de middenweg van package-by-type-by feature. Of package-by-feature-by-type. Dit mag je zelf bedenken wat dit is (/stock/controllers/
en stock/services
). Maar als een folder maar een of een paar bestanden bevat, dan is een eigen subfolder NIET nodig.
Om de structuurmethode 'package by feature' te vertalen naar programmacode geldt dus ook dat je je blogpost opdeelt in subsecties. En dat je niet 1 sectie hebt waarin je voor alle deelvragen introduceert. Dan 1 sectie waarin je voor elke deelvraag de onderzoeksmethode berschrijft. En dan 1 sectie waarin je de bevindingen voor elke deelvraag opschrijft. En dan 1 sectie met de conclusie voor alle deelvragen. Je behandelt per al deze onderdelen binnen een sectie per deelvraag.
Wel heb je een introducerende sectie nodig die deze structuur beschrijft, en dus wel alle deelvragen en bijbehorende onderzoeksmethoden bv. kort opsomt. Gebruik verder per sectie ook niet de deelvraag zelf als sectietitel, maar gebruik een kortere variant hiervan. Kopjes is niet de bedoeling dat dit de volledige vraag is, of een volledige zin. Maar meer in een krantenkop stijl. Onder het kopje kun je de deelvraag wel geheel herhalen of parafraseren. NB: Een vraag eindigt altijd op een vraagteken. Dus doe dit ook. Bedenk dat in markdown default een kopje ook niet mag eindigen met een leesteken volgens de mdlint regel. Dit is omdat "Headings are not meant to be full sentences".
Verder lezen:
- Robert C. Martin, yes Uncle Bob himself, over package-by-feature, wat hij 'Screaming Architecture noemt': https://blog.cleancoder.com/uncle-bob/2011/09/30/Screaming-Architecture.html
- De Angular styleguide oorspronkelijk van Microsoft medewerker en PluralSight docent John Papa, met hierin de LIFT principes, inclusief argumentatie 'Waarom?': Locate code simply, Identify code at a glance, Flat folder structure en Try to be DRY: https://angular.io/guide/styleguide#lift
6.4 Pyramid principle
Als je je schrijven echt naar een hoger niveau wilt tillen verdiep je dan eens in de 'Pyramid Principle' van Barbara Minto. Je kunt haar originele boek lezen of wat samenvattende blogposts, maar dat is wellicht wat zwaar. De essentie van haar verhaal is dat je vaak je 'schrijfsel' moet 'omdraaien' t.o.v. hoe je het origineel opschreef. Zie illustratieve plaatje/comic van sketchplanations in figuur 1 (Sketchplanations, z.d.)
Figuur 1: The pyramid principle in 1 plaatje (Bron: sketchplanations.com)
Dat wil dus zeggen dat je je document BEGINT met de eindconclusie die je uiteindelijk bereikt hebt. Of het eindresultaat.
Bijvoorbeeld: Ik heb een kleine webapplicatie gemaakt met een 3-tier architectuur, met front-end en database in een aparte container, en de back-end in het midden opgedeeld in 2 microservices elk draaiend in hun eigen container.
Mensen hebben namelijk standaard de neiging om verhalen chronologisch op te schrijven. Namelijk, eerst deed ik dit, en toen deed ik dat, zodat uiteindelijk... Of een argumentatie: 'omdat A het geval is, en ook B, en natuurlijk niet C1 en C2 — die je samen zou kunnen vatten als C — kom ik tot de conclusie dat D'. Dit is een vereenvoudigd voorbeeld - vandaar de variabelen - maar in werkelijkheid zou deze structuur dus jouw hele blogpost van 2 of meer A4's kunnen zijn. In plaats van de ene zin die het voorbeeld nu is. Of zelfs een heel afstudeerverslag. In de 'Minto' methode zou je dit omdraaien naar 'Ik vind dat D. Dit komt omdat A, B en C, die ik in sectie 2.3, 2.4 en 2.5 verder uitwerk.
Je moet dit niet alleen op de schaal van je hele document doen. Maar ook elk subhoofdstuk intern weer zo opdelen. Want je kent dit wellicht al in de vorm van een 'managementsamenvatting' die je vooraan een verslag zet. Of gewoon een samenvatting, want het management is lang niet altijd je doelgroep. Maar juist op het middelste niveau maakt dit je verslag leesbaarder en toegankelijker. Heel veel studenten stouen hun verslag vol met tabellen met Requirements, of bullet lijsten met user stories. Geef naast de leeswijzer in hoofstuk 1 'Inleiding' die de rest van het document beschrijft, ook elk hoofdstuk zijn eigen leeswijzer. In tegenstelling tot de leeswijzer, die aan het eind van de inleiding staat, staan deze interne leeswijzers juist direct aan het begin van hun hoofdstuk. Gebruik verder ook NIET het kopje 'Leeswijzer' voor deze sectie. En zelfs geen subkopje '3.1 Inleiding'. Gebruik voor sectie kopjes zoveel mogelijk inhoudelijke termen uit je applicatie, die gaan over WAT je beschrijft. En niet HOE je het beschrijft. Dit laatste kun je toelichten in tekst zelf, of wijst zichzelf.
Dus NIET sectie of hoofdstuk '4. MoSCow' (HOE je de prioritering aangeeft), maar '4. Prioriteiten' met daarin 1e paragraaf: "Tabel 4.1 hieronder geeft de prioriteitsindeling van de user stories uit H3 volgens de MoSCoW methode (Mulder, P., 2017), zoals besproken met de product owner."
Bronnen
- Bonestroo, W.J., Meesters, M., Niels, R., Schagen, J.D., Henneke, L., Turnhout, K. van (2018). ICT Research Methods. HBO-i Amsterdam. ISBN/EAN: 9990002067426. Geraadpleegd 2 september 2021 op http://www.ictresearchmethods.nl/
- ictresearchmethods.nl. Oktober 2023. Methods overview Geraadpleegd 24 oktober op https://ictresearchmethods.nl/methods-overview/
- HAN Studiecentra, 28 mei 2018, APA: In de tekst, geraadpleegd 2 september 2021 op https://specials.han.nl/sites/studiecentra/auteursrechten/bronnen-vermelden/apa-normen-citeren-en-par/
- Sketchplanations (z.d.) The Pyramid Principle - Sketchplanations. Geraadpleegd 10 juni 2024 op: https://sketchplanations.com/the-pyramid-principle
- Driel J. van (5-4-2020) 44 schrijftips. copyschool.nl. Geraadpleegd november 2024 op https://www.copyschool.nl/blog/44-schrijftips
Controlekaart documenten AIM*
Een document dient aan al onderstaande criteria te voldoen.
Algemeen
- Het document is op tijd en op de juiste plek en wijze ingeleverd.
-
Het document oogt netjes (geen verspringend lettertype,
geen inktvegen, geen rommelige vormgeving en geen onleesbare stukken tekst). - Het document is voorzien van een titel, studentnaam of -namen (alfabetisch geordend), studentnummers, klas, groepsnummer, docentnaam of -namen, datum, course/semestergegevens en versienummer.
-
Het document is voorzien van een inhoudsopgave
en paginanummers.
Opbouw
- Het stuk is opgebouwd uit hoofdstukken, paragrafen en alinea’s. Het document bevat in ieder geval een inleiding, kerntekst en conclusie.
- Bijlagen, plaatjes en tabellen zijn een zinvolle aanvulling op de hoofdtekst.
- Er is sprake van APA-bronvermelding en er is een APA-literatuurlijst aanwezig.
Stijl, spelling en grammatica
- Het document is doelgericht geschreven en in de schrijfstijl is rekening gehouden met de doelgroep.
- Vervoegingen van werkwoorden zijn correct gespeld. Er staan maximaal drie foutief gespelde werkwoorden op een willekeurige pagina.
- Woorden zijn correct gespeld. Er staan maximaal drie foutief gespelde woorden op een willekeurige pagina.
-
Het document is in de actieve vorm geschreven.Je schrijft het document in de actieve vorm. Het bevat nagenoeg geen lijdende zinnen.
*Noot: Bovenstaande tekst is overgenomen van de 'factlearning' Wordpress site van ICA AIM Professional skills (2016). Dat is niet meest recente, maar op dit moment nog wel dé beste plek om via Google deze controlekaart te vinden :P.
Overzicht en toelichting aanpassingen
In deze 'markdown' versie zijn t.o.v. het origineel:
- de controlepunten ook voorzien van markdown checkboxen om af te vinken voor het inleveren/uploaden:
[ ]
->[x]
- Het punt over vermijden van lijdende vorm ook in de actieve vorm geschreven i.v.m. 'eat your own dogfood'
- irrelevante punten voor markdown/digitaal documenten zoals 'paginanummers' en 'geen inktvegen' doorgestreept
Merk op dat de meeste punten in het digitale tijdperk gewoon nog gelden (een automatische/interactieve inhoudsopgave/TOC kun in markdown kun je makkelijk genereren met tools bv. in Visual Studio Code)
Nu je ChatGPT kunt gebruiken om je te helpen/teksten te herschrijven moet je makkelijk foutloos kunnen schrijven i.p.v. 3 fouten per pagina. Meer moeite heeft ChatGPT met in actieve vorm schrijven, of herschrijven hiernaar. Maar modernere bronnen zoals Google's Technical writing course (Google, 2022) onderstrepen dit punt alleen nog maar, o.a.:
- Passive voice obfuscates your ideas, turning sentences on their head. Passive voice reports action indirectly.
- Some passive voice sentences omit an actor altogether, which forces the reader to guess the actor's identity.
- Active voice is generally shorter than passive voice.
Bart van der Wal - September 2023
Bronnen
- AIM Professional Skills. juni 2016. Controlekaart documenten ICA. Geraadpleegd op 22-9-2023 op https://factlearning.files.wordpress.com/2016/02/controlekaart-documenten-ica.pdf
- Google (sept 2022) Google Technical Writing - Prefer active voice to passive voice Geraadpleegd 2 okt 2023 op https://developers.google.com/tech-writing/one/active-voice#prefer_active_voice_to_passive_voice
DevOps presentaties vrijdag 13 okt 2023
Opdracht
Bereidt een korte pitch presentatie van ca. 3 minuten voor, waarin je de onderzochte DevOps technologie pitched, en mogelijkheden geeft voor toepassing in PitStop of in de opdracht in blok 2.
"Prepare a short presentation (no more than 1–3 minutes) about your product, business proposition or solution direction. Practice the pitch on a wide range of experts to collect feedback and improve it." (HBOi, 2018)
Gebruik ook je blogpost als basismateriaal, bv. de plaatjes uit de blogpost. Desgewenste kun je ook een presentatie maken, met Google Slides of Powerpoint, maar voorkom death by Powerpoint en probeer te 'spreken met impact' (Bossche, 2018)). Koppel in je presentatie je tool ook aan DevOps concepten, zoals:
- CDMM: hoort het bij een van de 5 niveaus/beoordelingscategorieen?
- Bij welk weekthema het hoort GitOps t/m SlackOps
- En/of andere concepten die je tegenkwam in de minor zoals 12factor principes, etc.
Hoe vul je de 2 a 3 minuten?
Bijvoorbeeld zo:
- 1 minuut Intro Geef kort een intro, en de context. Dus koppel het aan de minor zoals hierboven aangegeven. Of maak het nog concreter en beschrijf het probleem dat 'jouw' tool oplost, of nieuwe kans die het biedt.
- 1 minuut Hands-on Geef dan ook kort een hands-on stukje, met code en/of configuratie zodat je publiek voelt dat ze er mee aan de slag kunnen. Hiervoor kunnen ze natuurlijk ook je blog post later lezen.
- 1 minuut Lijm, kwinkslagen (Wikipedia, 2007) Het is een teampresentatie, dus maak ook als team een lopende presentatie. Laat zien dat je weet wat collega studenten hebben voorbereid en bedenk samen een logische volgorde en onderlinge 'hand-offs' en een gedeeld format van de presentatie.
Breng over wat je hebt geleerd, en laat zien dat je je verdiept hebt. Je mag ook best wat humor erin gooien, om de aandacht er bij te houden. Maar hou het ook wel kort.
Figuur 2: Spreek met impact! Dan heb je geen 3D plaatjes nodig ;)
Tijdschema
- 09:00 Lokaal open/introductie
- 09:10 Team Monaco: Sentry, Nuke Build, Zabbix (M), ArgoCD
- 09:30 Einde, vragen/feedback
- 09:35 Team TBD: Dapr, LitmusChaos, Ansible, Terraform, Grafana (M) en Tekton
- 09:55 Einde, vragen/feedback
- 10:00 Team Agile Alliance: Alibaba File Storage, OpenTelemetry, Highlight, FluxCD, Kong
- 10:20 Einde, vragen/feedback
- 10:20-10:40 Pauze
- 10:40 Team Knoppert: Prometheus, Thanos (M), Keycloack, ChaosKube, HPA
- 11:00 Einde, vragen/feedback
- 11:05 Team Luna: SonarQube, Keda, Cloud Custodian, OpenPolicy Agent, Jaeger
- 11:25 Einde, vragen/feedback
- 11:30 Team Horizon: Helm, FluentD, Apollo,
gRPCen ChaosMesh - 11:50 Einde, vragen/feedback
- 12:05 Feedback/eindbeoordelingen
- 12:15 Einde les
Jury: AIM docenten en InfoSupport medewerkers (begeleiders in blok 2)
De jury kiest:
- Beste individuele presentatie
- Beste team presentatie
- Draagt 3 onderwerpen/pitches aan voor 'Coolste tech'. De klas kiest hieruit de winnaar...
Bronnen
- Bossche, A. van (24-9-2018) Arnout Van den Bossche over Powerpoint. youtube.com. Geraadpleegd oktober 2024 op https://www.youtube.com/watch?v=QRn9mIX9-BI
- HBO-i (2018). ICT Research Methods — Methods Pack for Research in ICT. ICT Research Methods. Geraadpleegd okotber 2024 op https://ictresearchmethods.nl/showroom/pitch/
- PA van de K, Baardman, G. Wikipedia. (29-1-2007) Oneliner of Kwinkslag. Wiktionary.Geraadpleegd okober 2024 op https://nl.wikipedia.org/w/index.php?title=Oneliner&oldid=63972079
DevOps Beroepsproduct & beoordelingsmodel
Week 7
- Les 1 - Ma ocht: User Storymap maken + Casus uitwerken (teams backlog vullen en Sprint 1 inrichten)
- Les 2 - Di ocht: Sprint planning 1 (naar productie + ontwikkelen/onderzoek)
- Les 3 - Vr ochtend: 'Tech' reviews & retrospective sprint 1(e week) (naar staging)
Week 8
- Les 1 - Ma ocht: Sprint planning week 2
- Les 2 - Di ocht: Sprint retrospective
- Les 3 - Vr ocht: Eindpresentaties/teambeoordeling
Week 9
- Les 1: Ma ochtend: Indivuele verantwoording/beoordeling
- Les 2: Gaat niet door (donderdag herkansing theorie)
- Les 3: Vr ochtend: InfoSupport Workshop MCPS (Azure DevOps e.d.)
Afsluiter van de course fase is een opdracht om in teamverband een DevOps BeroepsProduct (BP) te realiseren, te deployen en in de lucht te houden en monitoren.
Het is goed om je al een keer op deze eindopdracht en beoordelingscriteria te orienteren aan het begin van de course, zodat je hier gericht naar toe kunt werken. Tijdens de course fase refereert de docent waarschijnlijk ook regelmatig aan de eindopdracht, ivm het CDDM beoordelingsmodel. En in de laatste weekopdracht(en) neem je hierop ook al een voorschotje.
In dit gedeelte voor week 7 en 8 vind je de volgende zaken:
- opdrachtomschrijving van het beroepsproduct
- het beoordelingsmodel van het BP dat je als team maakt (een rubric, uit de DevOps beroepspraktijk).
- uitleg van beoordeling van verantwoording van je individuele bijdrage en het benodigde/in te vullen template hierbij (markdown!).
- een FAQ (work in progress)
Figuur: Ontdek het DevOps 'Secret Ingredient' tijdens de course eindopdracht!
NB Tijdens de course eindopdracht leer je — eindelijk — de secret ingredient van DevOps kennen! (zie figuur; spoiler warning: filmpje NIET aanklikken!)
De DevOps minor is voltijd. Jullie worden geacht om 40 uur per week aan beroepsproduct te ontwikkelen. Dus op maandag bespreken we bovenstaand overzicht en eventuele uitwijkingen hierop. Communcatie verloopt ook via het aangemaakt Slack kanaal en/of Teams (Slack in 2024)/.
Informatie project
Vraag student
"Ik ben een beetje verward door het rooster van ISAS i.c.m het rooster op minordevops.nl. Wat zijn nu precies de lestijden voor het DevOps project volgende week? Ik wil ook netjes verlof boeken met m’n werk."
Reminder: KiesOpmaat geeft/gaf ook aan:
Rooster Er wordt vanuit gegaan dat studenten van maandag t/m vrijdag beschikbaar zijn, dus bijbaantjes of andere vakken van maandag t/m vrijdag (9.00-17.45 uur) volgen is geen optie.”
Er is in de laatste twee weken geen centrale stof meer, en ook geen theorietoetsen. We gaan de geleerde theorie toepassen, en waar nodig nog aanvullen of gaten dichten. Je werkt zelfstandig met je team werken aan de eind opdracht. Dit zijn twee sprints van een week. Hiermee oefenen we ook de vorm vam het eindproject in blok 2. Op de lesmomenten is de docent in het geroosterde lokaal, tenzij anders afgestemd. Begin van de week zijn sprint planning en eind van de week reviews. In week 2 kan begin van de week nog een retrospective met je docent zijn, of je doet dit als team zelfstandig (continuous improvement).
In week 9 is (naast theorie toets herkansing) mogelijk ook nog een bedrijfsbezoek en/of een workshop bij InfoSupport workshop. Details volgen in de lessen.
Voorbeeld tijdschema Scrum Sessie
Hieronder een voorbeeld van Sprint planning, maar dit gaat vergelijkbaar voor andere Scrum ceremonies. Dit schema gaat uit van 6 groepen. Als er minder groepen zijn, bijvoorbeeld 4, dan zijn de sessies iets langer, bv. 40 og 45 minuten. In dit voorbeeld zijn de groepsnamen nog ‘abstract’ gelaten. De daadwerkelijke teamnamen en planning moet je afstemmen met de docent (vraag dit na als deze er zelf niet mee komt!). Hierbij variëert de volgorde tussen sessies, zodat dezelfde teams niet elke keer als 1e of laatste zijn.
- 09:10-9:40 Sprint planning Team 1
- 09:45-10;10 Sprint planning Team 2
- 10:15-10:40 Sprint planning Team 3
- 10:40-10:50 Pauze docent
- 10:50-11:15 Sprint planning Team 4
- 11:20-11:45 Sprint planning Team 5
- 11:50-12:15 Sprint planning Team 6
Workshop User Story mapping
Deze workshop leer je eindopdracht kennen, maar leert ook de User Story Mapping (USM) techniek kennen. Je past deze toe voor de opdracht komende twee weken. Deze techniek gebruik je ook in het eindproject om (meer) structuur aan te brengen
Figuur 1: De oorspronkelijke analogie van van Jeff Patton de grondlegger van USM (Patton, 2008)
Voorbereiding
- Lees het verhaal over User Story Mapping en kijk de video van 6 minuten van Atalassian op de website van de Open Practice Library ().
- Kies een van onderstaande mogelijke 'Functionele uitbreidingen van PitStop' op, of verzin of genereer er zelf
- Verzin voor deze casus zes (6) user stories in de standaard vorm
Als <gebruikersrol> wil ik <functionaliteit> zodat ik <businesswaarde>
. Hierbij:
- a. Minstens drie verschillende gebruikers(rollen) of persona's.
- b. Zoek op wat een persona is in Agile (bijvoorbeeld op Wikipedia of interaction-design.org).
- c. Zorg dat je user stories uniek zijn, anders dan die van je klasgenoten.
- d. Post je 6 user stories in Slack (eindopdracht-kanaal).
- e. Na het posten van unieke user stories kun je een casus claimen voor je groep. Overleg met je team; bij discussie beslist de docent.
NB: Het is geen gegeven dat je zelf ingediende/bedachte user stories ook mag implementeren, dit gaat in overleg met team, en hier houdt de docent veto recht.
Lesinhoud
- Maak een aantekeningen/tekening (concept map)
- The 8 Fallacies
- Intro User Story Map
- Lesopdracht: Maak met je team een user Story map van je eigen casus/user stories
Een 'Concept map' van 'User Story Map'
Opdracht studenten: Maak n.a.v. lesinhoud vandaag een concept map van User Story Mapping
Relevante termen voor deze concept map zijn o.a.:
- Value slices, prioritering
- User story map, backbone
- User stories, acceptatiecriteria en backlog/code management tool
Einde les maakt de docent een foto hiervan.
User Story Map
Figuur 2: User Story map, leeg template van miro.com
Doel van de les is een goed beeld te hebben wat een User Story Map is en waar dit voor dient, en hoe je er een kunt maken voor een concrete business case (of functionele uitbreiding). Als Figuur 2 een plaatje van een USM stond hoef je zelf geen beeld meer te maken. Dit is een leeg template van op Miro, een mooie tool.
De richtlijnen op Open Practice Library geven aan minstens 3 sprints te maken. Ook de term 'MVP' in het template is belangrijk. Dit is een soort abstract 'sprintdoel'. Maar in true 'DDD practice' moet je hier in je eigen template een concrete invulling voor maken in de 'Ubiquitous language' die je deelt/gaat delen met business experts. In plaats van hen uit te leggen wat een 'MVP' is. Want dat moeten zij uiteindelijk zelf beoordelen: wat is 'viable' in hun business? Wat levert waarde op? Wel kun je eens nadenken over varianten op MVP als 'Minimally Marketable Product' (MMP) en 'Minimal Loveable Product' (MLP).
Lesvraag: Is er een vaste volgorde in het maken van MVP, MMP en MLP? Minimally Viable Product, Marketable Product en Lovable Product!?
Intro over 'Fallacies' in algemeen
Ter overpeinzing/bespreking:
“The trouble with the world is not that we know so little. It’s that we know so much, that just ain’t so.” - Mark Twain (or is it.. ;)
- Toetsvraag fallacies of distributed computing bespreken/bekijken
- Dit was een tricky vraag. Waarom is het nuttig te denken in termen van 'fallacies'?
- Terzijde: Toetsvraag over Autonomy over authority bekijken
- Wat betekent hierin het (Engelse) woord over?
- Is authority hier op meta niveau, over development team, of basisniveau, de microservice zelf? Snap je het onderscheid?
The 8 Fallacies of User stories
Hier zijn 3 fallacies. Verzin met de klas er nog 5. Bekijk de lijst die de docent toont.
Invest principes
Een beetje het tegenovergestelde van deze zelf bedacht 8 fallacies is het INVEST principe van Bill Wake (Wikipedia, 2024). Deze geldt voor PBI's, maar User stories is daar een vorm van. Deze moet je hanteren in het project bij het maken van sprint planningen, of bij het nadenken van value slices in je User Story Map. Hieronder de korte definitie van Wikipedia, maar het artikel van Philip Rogers op logrocket.com is wat toegankelijker met plaatjes en meer toelichting (2018).
"..the characteristics of a good quality Product Backlog Item (commonly written in user story format, but not required to be) or PBI for short. Such PBIs may be used in a Scrum backlog, Kanban board or XP project."
Letter Meaning Description I Independent The PBI should be self-contained. N Negotiable PBIs are not explicit contracts and should leave space for discussion. V Valuable A PBI must deliver value to the stakeholders. E Estimable You must always be able to estimate the size of a PBI. S Small PBIs should not be so big as to become impossible to plan/task/prioritize within a level of accuracy. T Testable The PBI or its related description must provide the necessary information to make test development possible.
Agile: GEEN WaterScrumFall
Agile wordt wel eens foutief aangegrepen als excuus om 'gewoon aan de slag te gaan' zonder verder te plannen of na te denken. Het is belangrijk om aan de slag te gaan en niet verstrikt te raken in 'analysis paralysis'. Maar met een beetje nadenken vantevoren kun je vaak veel verspilde tijd later voorkomen. En nadenken over een Road map voor je product samen met opdrachtgever en andere stakeholders. Dit kan in de vorm van een User Story Map. Hiermee zet je ook wat 'sprint goals' uit voor de 1e paar Sprints. Dit Requirements Engineering' stukje kun je ook iteratief aanpakken, in plaats van waterfall. Zodat je niet in de val trapt van 'WaterScrumFall' zoals Jez Humble het noemt:
"After witnessing a handful of Agile transformations, oftentimes the system of Waterfall isn’t entirely replaced by Agile, merely paved over. The DevOps group might have embraced it, but the rest of the business is still operating in a “Non-Agile”, project-that-starts-and-ends, style." - Steven Prutzman (2023)
Figuur 2: Simon Brown predikt 'Just enough upfront design' (YouTube/Brown, 2022)
Naast Humble's WaterScrumfall concept benadrukt ook C4 creator ook Simon Brown's praatje 'The lost Art of Software Architecture' hoe enige INVESTering zich kan uitbetalen in tijdsbesparing later. Dit is zeker een kijktip! Je software architectuur uitdenken met het C4 model is hier een vorm van. Maar aan de domein-/functionele kant is User Story Mapping hier een goede vorm voor.'
Quiz
Test je kennis met deze korte multiple choice quiz.
Leerdoelen
Check met onderstaande leerdoelen of je de stof beheerst en User Story mapping en gerelateerde kennis in de vingers hebt.
- Je kunt uitleggen wat User Story Mapping (USM) is en waarom het belangrijk is voor projectplanning.
- Je kunt beschrijven hoe USM helpt bij het prioriteren van user stories in DevOps projecten.
- Je kunt het INVEST-principe uitleggen en toepassen op het maken van sterke user stories.
- Je begrijpt wat fallacies zijn (algemene misvattingen) en kunt misvattingen in user stories herkennen als ze worden gegeven.
- Je kunt het verschil uitleggen tussen user stories en andere Product Backlog Items (PBI’s), zoals taken, bugs en epics.
- Je kunt een backbone en value slices beschrijven in een User Story Map.
Casussen Uitbreiding Pitstop
Kies een van onderstaande casussen of maak er zelf een.
Casus 1. Klant 'in the loop'
Notificatie systeem naar gebruikers dat reparatie gestart is, of reparatie klaar, of evt. input tussentijds nodig is Image(goedkeuren reparatie a.d.h.v. kosten) (huidige notificatie systeem in het systeem is alleen naar klanten dat een onderhoudsbeurt nodig is).
Doel is vooral de response tijd van klanten te verkleinen, wachttijden verkleinen voor efficiënter gebruik van garage werkplaatsen.
Casus 2. Leenauto’s: geluk bij een ongeluk
Klanten kunnen tijdens reparatie ook een leenauto krijgen. Hiertoe moeten zij digitaal kunnen aangeven dát ze dit willen, zo ja met wat soort auto, en iets kunnen vinden over voorwaarden, inleverdatum etc.
Hierbij werkt PitStop samen met een Leasemaatschappij, en richten zich op klanten die wel eens een ‘leuke/andere’ auto willen uitproberen als ‘geluk bij een ongeluk’ als ze een (al dan niet geplande) reparatie hebben.
Casus 3. Doe het zelf avonden
Module voor inplannen en aanmelden voor informatieavonden, waarbij klanten in de garage kunnen mee sleutelen onder leiding van reparateur. Dit doet PitStop vooral voor klantenbinding. De workshops richt zich vooral op wat klanten met wat oudere auto’s, wat een aantal reparateurs leuk vindt, en ook onder klanten animo voor is. En ook vanwege moeilijk te krijgen personeel, en dat de garage in de avonduren nu toch ongebruikt is.
Casus 4. Andere eigen functionaliteit
Figuur 3: Wie is creatiever; mens of machine? Bron: Dean Long (2023)
Studentengroepen kunnen ook zelf een functionaliteit plannen, mits passend bij Pitstop, en niet te groot en niet te klein. Wees zelf creatief. Of gebruik desgewenst ChatGPT als 'assistive technology' of 'creative technology' om een suggestie. Kader deze wel met de nodige informatie. Geef hem de beschrijving huidige functonaliteit zoals Edwin van Wijk die opgeeft in documentatie in zijn github repo. Geef hem daarna de drie voorbeeld casussen/functionaleiten als eh.... voorbeeld. Maar itereer (prompt) ook wel door op wat ChatGPT je geeft krijgt. Onderstaand is een - vrij uitgebreide - start prompt die deze zaken bevat:
"Genereer een context- en opdrachtbeschrijving voor een nieuwe PitStop uitbreiding Zie de opdrachtbeschrijving en 3 voorbeelden op de minordevops.nl site. Concreet:
- Raadpleeg de bestaande functionaliteit van Microservice applicatie PitStop over 'Garage Maintenance' op https://github.com/EdwinVW/pitstop/wiki/Application%20functionality. Vertaal dit naar het Nederlands voor de introductie (onderdeel C hieronder)
- Raadpleeg dan de sectie "Voorbeelden van functionele uitbreidingen" op </week-7-8-beroepsproduct/opdracht-beschrijving.html#voorbeelden-van-functionele-uitbreidingen>
- De 4e optie beschrijft daar al het 'zelf verzinnen' eventueel met hulp van ChatGPT. Voor de gewenste functionele uitbreiding van PitStop genereer je 7 zaken:
- a. een coole project naam a la "Leenauto's" of "Klant in the loop", maar dan voor een nieuwe/andere functionele uitbreiding
- b. En ook een creatieve ondertitel, hierbij zoals "Geluk bij een Ongeluk"
- c. Een Nederlandse vertaling en parafrasering van de standaard functionaliteit van PitsStop via de eerder gegeven URL op github.com/EdwinVW als context beschrijving en introductie in een h2 kopje 'Context'.
- d. Een korte opdrachtbeschrijving waarin je minstens 2 gebruikersgroepen noemt en ook wat details qua 'working objects' als 'lijstjes', 'notificaties', 'overzicht', 'start ticker' of 'go/no beslissing' en functionaliteit en domeintermen uit PitStop zoals 'reparatie', 'doorlooptijd' en nieuwe termen uit de uitbreiding (dit zijn voorbeelden, gebruik deze NIET letterlijk, tenzij ze voor de door jou bedacht uitbreiding ook toevalllig relevant zijn)
- e. Genereer ook direct een afbeelding bij de opdracht, in lijn met de andere 3 (tekening rondom het thema, met liefst hierop een of meer personen in beweging (een beetje 'in actie').
- f. Geef tot slot een disclaimer dat dit een fictieve casus is, en dat genoemde API's en partijen niet per se echt zijn.
- g. Geef de bronnen, de 2 URL's op github.com en minordevops.nl van hierboven
Geef dan aan dat je graag door itereert op wat je hebt gemaakt. "Want één prompt is geen prompt..."
Maak van al bovenstaande een duidelijke zakelijke tekst, dus GEEN marketing tekst. Schrijf actief. Wees spaarzaam met bivoegelijke naamwoorden. Bewaar marketing voor het plaatje ;). Schrijf de hele tekst in b2 niveau Nederlands en in active vorm (dus NIET lijdend e.g. met 'word/worden' of 'is/zijn' + voltooid deelwoord). Laat ook de
a
,b
,c
t/mg
indeling weg uit je gegenereerde input. Dit is hierboven enkel voor het structureren van de prompt zelf. Graag 1 kopjes 1 met de Titel en dan dubbele punt en erachter de subtitel. Dan eronder direct het gegenereerde plaatje (afbeelding), liefst rechts uitgelijnd."
ChatPUG: PitStop Uitbreiding Generator
Er is per oktober 2024 ook een kant en klare 'custom GPT', een zogenaamde 'GPTs' beschikbaar. Deze bevat een uitgebreide variant van bovenstaande prompt. Hier de link naar chatgpt.com:
Dit is een service aan jou, maar geeft geen garantie op dat de output goed is (e.g. 'garantie tot de deur', oftewel de plek waar jij begint met gebruiken is al GEEN ENKELE garantie meer). Dat is ter eigen beoordeling. Je kunt dit ook gebruiken 'zolang de voorraad strekt' (want Open AI kan deze feature ook betaald maken e.d.)).
Figuur 4: ChatPUG: PitStop Uitbreiding Generator
NB Een Generative AI is dus NIET betrouwbaar. En je zou het een 'slappe afspiegeling' van een echte opdrachtgever kunnen noemen. Maar het is wel een opdrachtgever met - waarschijnlijk - meer kennis dan welke 'echte' opdrachtgever ter wereld dan ook. En ook is een Genearative AI gebruiken als 'opdrachtgever' beter dan als developer zelf je eigen opdrachtgever zijn. Omdat je dan opdracht en/of requirements snel bij stelt op basis van wat makkelijk te implementeren is. Of zelf leuk lijkt.. Een bekend gezegde is "You are NOT your user". Dit gaat over UX/UI, maar is ook iets breder toepasselijk.
"User-Centred Design is surprisingly difficult. One of the biggest issues, certainly for those with no HCI or usability experience, is a lack of appreciation of how users think and work.Their assumption is that users will approach and solve problems in the same way as the designers and developers of an interactive solution." - ixDF, 2016
Maar nogmaals wel is AI en zeker LLM's (Large Language Models) structureel unexplainable en onbetrouwbaar. Daarom hieronder een belangrijke disclaimer en waarschuwing bij gebruik.
Disclaimer/waarschuwing
In essentie is het gebruik van ChatPUG niet wezenlijk anders dan bovenstaande 'handmatige' prompt gebruiken. Je hoeft nu alleen maar 'Go' in te typen o.i.d. Maar omdat de Prompt nu netjes verpakt is in een (GPTs) doosje, vergeet je wellicht dat ChatGPT fouten maakt. En dat de maker eran mogelijk ook fouten of onvolkomenheden in de prompt achter de GPTs heeft achtergelaten. Dus we raden aan om verder werken hierop en de GPTs zelf bekijken en aanpassen. En vooral zelf alle output te controleren, door te prompten en handmatig verder te werken met wat je van ChatGPT krijgt. Want als engineer kun je de gebruikte tool niet de schuld geven; je bent zelf verantwoordelijk voor je werk.
Sowieso moet je NOOIT persoonlijke gegevens of IP (Intellectual property) gevoelige gegevens in ChatGPT of andere online tools/AI's invoeren!
Ook moet je GEEN gevoelige gegevens in ChatGPT stoppen. Sowieso geen persoonsgegevens als namen of locatiegegevens. Maar onder gevoelig gegevens hoort bijvoorbeeld ook de opdracht(beschrijving) die je van de echte opdrachtgever in blok 2 van de minor DevOps krijgt.
Voor die opdracht teken je mogelijk ook een NDA (Non Disclosure Agreement). Maar ben je zonder dat ook in algemene zin een 'professionele houding' verplicht en voorzichtigheid met gevoelige gegevens. Dus vraag altijd eerst toestemming voor gebruik van AI van een opdrachtgever. Een leg deze daarbij goed uit wat je wilt doen, wat de meerwaarde kan zijn, maar ook welke alternatieven. En wat de risico's zijn. Het zelf in controle blijven, en Generative AI de (minder gevoelige) details laten verbeteren is ook vaak een betere aanpak:
"You start to rely on AI to generate content that you realistically should be ashamed to be letting a robot generate for you" (Panagis, 2024).
Hoogstens kun je als tegenmaatregel je prompt eerst zwaar anonimiseren. Of een custom AI model gebruiken in plaats van een van de tech giants. Want bij tech giants en ook in het algemeen moet je altijd bedenken dat:
"If you're not paying for the product, you ARE the product." - Andrew Lewis (Shaikh 2018)
Bronnen
- Brown, S. (13 okt 2022) The lost art of software design by Simon Brown. YouTube. Geraadpleegd 14-102-2024 op https://www.youtube.com/watch?v=36OTe7LNd6M
- Interaction Design Foundation - IxDF. (2016, February 28). Empathic Design: Is Empathy the UX Holy Grail?. IxDF. Geraadpleegd 14-10-2024 op https://www.interaction-design.org/literature/article/empathic-design-is-empathy-the-ux-holy-grail
- Prutzman, S. (Nov 10, 2023) Is your business stuck in a Water-Scrum-FALL model? medium.com.Geraadpleegd 13-20-2024 op https://medium.com/@sprutzman/is-your-business-stuck-in-the-water-scrum-fall-model-28e3c99eca6c
- Rogers, P. (Sep 10, 2024) Writing meaningful user stories with the INVEST principle Logrocket.com. Geraadpleegd 11-20-2024 op https://blog.logrocket.com/product-management/writing-meaningful-user-stories-invest-principle/
- Takane M., De Beasi, R. (April 20, 2017) User Story Mapping & Value Slicing - Create lightweight release plans by slicing value out of collections of features Open Practice Library. Geraadpleegd op 11-10-2024 via https://openpracticelibrary.com/practice/user-story-mapping
- Panagis, A. (Aug 8, 2024) Is AI A Good Starting Point? Generative AI – The Easy Way Out scalemath.com. Geraadpleegd op 11-10-2024 via https://scalemath.com/blog/generative-ai/
- Patton, J. (8 okt 2008) The New User Story Backlog is a Map jpattonassociates.com. Geraadpleegd 11-10-2024 op https://jpattonassociates.com/the-new-backlog/
- Shaikh, F. (Nov 23, 2018) If you're not paying for the product, you are the product! LinkedIn. Geraadpleegd op 11-10-2024 via https://www.linkedin.com/pulse/youre-paying-product-you-faiz-shaikh/
- Wikipedia auteurs (17 sept 2024) INVEST (mnemonic) Wikipedia Geraadpleegd op 11-10-2024 via https://en.wikipedia.org/w/index.php?title=INVEST_(mnemonic)&oldid=1246204419
DevOps Beroepsproduct & beoordelingsmodel
Week 7
- Les 1 - Ma ocht: User Storymap maken + Casus uitwerken (teams backlog vullen en Sprint 1 inrichten)
- Les 2 - Di ocht: Sprint planning 1 (naar productie + ontwikkelen/onderzoek)
- Les 3 - Vr ochtend: 'Tech' reviews & retrospective sprint 1(e week) (naar staging)
Week 8
- Les 1 - Ma ocht: Sprint planning week 2
- Les 2 - Di ocht: Sprint retrospective
- Les 3 - Vr ocht: Eindpresentaties/teambeoordeling
Week 9
- Les 1: Ma ochtend: Indivuele verantwoording/beoordeling
- Les 2: Gaat niet door (donderdag herkansing theorie)
- Les 3: Vr ochtend: InfoSupport Workshop MCPS (Azure DevOps e.d.)
Afsluiter van de course fase is een opdracht om in teamverband een DevOps BeroepsProduct (BP) te realiseren, te deployen en in de lucht te houden en monitoren.
Het is goed om je al een keer op deze eindopdracht en beoordelingscriteria te orienteren aan het begin van de course, zodat je hier gericht naar toe kunt werken. Tijdens de course fase refereert de docent waarschijnlijk ook regelmatig aan de eindopdracht, ivm het CDDM beoordelingsmodel. En in de laatste weekopdracht(en) neem je hierop ook al een voorschotje.
In dit gedeelte voor week 7 en 8 vind je de volgende zaken:
- opdrachtomschrijving van het beroepsproduct
- het beoordelingsmodel van het BP dat je als team maakt (een rubric, uit de DevOps beroepspraktijk).
- uitleg van beoordeling van verantwoording van je individuele bijdrage en het benodigde/in te vullen template hierbij (markdown!).
- een FAQ (work in progress)
Figuur: Ontdek het DevOps 'Secret Ingredient' tijdens de course eindopdracht!
NB Tijdens de course eindopdracht leer je — eindelijk — de secret ingredient van DevOps kennen! (zie figuur; spoiler warning: filmpje NIET aanklikken!)
De DevOps minor is voltijd. Jullie worden geacht om 40 uur per week aan beroepsproduct te ontwikkelen. Dus op maandag bespreken we bovenstaand overzicht en eventuele uitwijkingen hierop. Communcatie verloopt ook via het aangemaakt Slack kanaal en/of Teams (Slack in 2024)/.
Informatie project
Vraag student
"Ik ben een beetje verward door het rooster van ISAS i.c.m het rooster op minordevops.nl. Wat zijn nu precies de lestijden voor het DevOps project volgende week? Ik wil ook netjes verlof boeken met m’n werk."
Reminder: KiesOpmaat geeft/gaf ook aan:
Rooster Er wordt vanuit gegaan dat studenten van maandag t/m vrijdag beschikbaar zijn, dus bijbaantjes of andere vakken van maandag t/m vrijdag (9.00-17.45 uur) volgen is geen optie.”
Er is in de laatste twee weken geen centrale stof meer, en ook geen theorietoetsen. We gaan de geleerde theorie toepassen, en waar nodig nog aanvullen of gaten dichten. Je werkt zelfstandig met je team werken aan de eind opdracht. Dit zijn twee sprints van een week. Hiermee oefenen we ook de vorm vam het eindproject in blok 2. Op de lesmomenten is de docent in het geroosterde lokaal, tenzij anders afgestemd. Begin van de week zijn sprint planning en eind van de week reviews. In week 2 kan begin van de week nog een retrospective met je docent zijn, of je doet dit als team zelfstandig (continuous improvement).
In week 9 is (naast theorie toets herkansing) mogelijk ook nog een bedrijfsbezoek en/of een workshop bij InfoSupport workshop. Details volgen in de lessen.
Voorbeeld tijdschema Scrum Sessie
Hieronder een voorbeeld van Sprint planning, maar dit gaat vergelijkbaar voor andere Scrum ceremonies. Dit schema gaat uit van 6 groepen. Als er minder groepen zijn, bijvoorbeeld 4, dan zijn de sessies iets langer, bv. 40 og 45 minuten. In dit voorbeeld zijn de groepsnamen nog ‘abstract’ gelaten. De daadwerkelijke teamnamen en planning moet je afstemmen met de docent (vraag dit na als deze er zelf niet mee komt!). Hierbij variëert de volgorde tussen sessies, zodat dezelfde teams niet elke keer als 1e of laatste zijn.
- 09:10-9:40 Sprint planning Team 1
- 09:45-10;10 Sprint planning Team 2
- 10:15-10:40 Sprint planning Team 3
- 10:40-10:50 Pauze docent
- 10:50-11:15 Sprint planning Team 4
- 11:20-11:45 Sprint planning Team 5
- 11:50-12:15 Sprint planning Team 6
Opdrachtbeschrijving beroepsproduct DevOps
Afsluiter van de course fase is een opdracht om een DevOps beroepsproduct te maken als team met — uiteraard — gelijkwaardige bijdrage van elk teamlid.
A. Het team:
- deployt een applicatie (systeem) die bestaat uit meerdere containers (microservices) naar minstens één live omgeving
- past de onderzochte DevOps technologieën uit de onderzoeksweek toe in de applicatie en/of deployment
- voert hierop een product increment door met toepassing van de in thema weken opgedane kennis en vaardigheden
B. Elk groepslid laat zien dat hij/zij:
- effectief samenwerkt in een team en onderling goed communiceert
- een eigen eigen rol en specialisatie heeft gevonden
- een bijdrage levert en een Agile aanpak hanteert.
Dit betekent een gedeelde verantwoordelijkheid en verantwoordelijkheidsgevoel. Dit beroepsproduct is zo een voorbereiding op de grote opdracht van tijdens de project fase van de minor. Daarom werk je aan een product met een moderne microservices architectuur (complexe architectuur, zie bv. Figuur 1).
Figuur 1: Voorbeeld van een microservice architectuur — waar komt jouw uitbreiding?
De bovenvermelde punten — A1, A2 en A3 en B1, B2 en B3 — zijn knock-outs. De drie punten onder B. beargumenteer je in de individuele verantwoording. De drie punten onder A zijn hieronder verder toegelicht en uitgesplitst. Met name het product increment bevat de nodige verplichte onderdelen.
Al met al moet je best veel dingen voor elkaar krijgen in twee weken. Verdeel het werk over alle teamleden en zoek naar 'twee vliegen in een klap slaan'. Kijk wat je met het toepassen van je technologieen al hebt afgedekt. Hou tot slot de gemaakte functionaliteit en architecturele aanpassing klein zoals in toelichting hieronder ook vermeldt.
Enkele opmerkingen van student na afloop van dit BP project staan onderaan. Wellicht goed om door te nemen voor een meer 'studenten perspectief'. En ook om niet aan dezelfde steen/stenen te stoten...
De knockouts zorgen voor een bepaalde minimale hoeveelheid werk die je als team moet verzetten, oftewel kwantiteit. Wellicht kun je dit i.p.v. kwanteit overigens nog beter varieteit noemen. Want in plaats van je tijd alleen steken in bv. veel functionaliteit, kun je na 1e functionaliteit beter focussen ook security analyse te doen en pipeline in te richten. Deze variateit/kwantiteit is nodig om dus een 6 te halen. Op HBO niveau geldt echter NIET 'het werkt, dus het is goed genoeg'. Eerst maak je een werkende situatie, maar daarna review en refactor je verder tot het ook onderhoudbaar, uitbreidbaar etc is. Kortom, zorg voor kwaliteit.
Voor het bepalen van de kwaliteit van het product en gebruikte proces(en ds voor een cijfer hoger dan een 6) gebruik je de CDMM beoordelingscriteria zoals elders beschreven. Naast het afvinken leg je ook uit waarom je aan de punten voldoet. E.g. toon aan dat je bewust bewkaam bent als team. De verantwoording individuele bijdrage vind je ook elders, hier de links:
A1. Applivatie live zetten (en houden)
Dit betekent dat je
- a. de applicatie werkend krijgt op een productie omgeving (dag 1 sprint 1).
- b. maar ook een (externe) staging omgeving (cq. test, QA, etc.). (dag 2 sprint 1)
Omdat je maar één K8s cluster hebt kun je hiervoor een Kubernetes namespace gebruiken (Lewis 2015). Bonus is als je de staging omgeving tijdelijk maakt, door deze test omgeving weer snel te kunnen stoppen en afbreken. Zodat er bv. minder load balancer kosten zijn.
A2. Toepassen technologieën
- a. Je past alle technologieen toe van alle teamleden in het product.
- b. Documenteert het gebruik in README, ADR's en/of verwijzing/quote uit eigen blogs
- c. En/of automatiseert in shell scripts zodat ook iemand die technologie niet kent met het product kan werken
Als technologieen alternatieven zijn, doe je PoC's en past evt. beide toe, of je kiest o.b.v. bronnen en documenteert keuze met Architecture Decision Records. Evt. clashes, problemen met technologie had je waar mogelijk voorzien tijdens onderzoeksweek, maar documenteer je anders kort met verwijzing naar evt. openstaande issue van gebruikte technologie en/of vind work-around.
Architectuur documentatie
Je software architectuur documenteer je in dit project typisch via C4 diagrammen en ADR's. Maar vergeet bij de C4 diagrammen de begeleidende toelichting niet. En bij de ADR's ook een inleiding.
Kijk voor opties voor ADR's nog eens terug in de les over Continuous Documentation
Tijdens realisatie vind geen puur 'lab' onderzoek meer plaats. Je doet veld- en werkplaatsonderzoek en verdiept je waar nodig verder in de DevOps wereld. Je toont hierbij 'vormbehoud' van niveau van de course opdrachten. Dit wil zeggen dat je de minimale eisen aan opdrachten en kennis uit de theorieweken en -toetsen hier weer laat zien. Er zijn geen uitgebreide verslagen meer nodig. Eventuele uit te zoeken zaken, zoals vragen kun je formuleren en prioriteren als gitlab issue. Uitkomsten documenteer je als ADR's, zoals in de course gedaan.
A3. Product Increment
In het product increment (figuur 2) besteed je als team — naast realisatie van nieuwe functionaliteit — ook aandacht aan het opstellen van non-functionele eisen en het hieraan voldoen via de aangeleerde DevOps aanpak. In het product increment realiseer je de volgende zes eisen:
-
a. Makkelijke uitrol van je product increment, via 'niet standaard'
Deployment
- bijvoorbeeld Canary, Blue Green
Deployment
of gebruik van een externe tool als Helm of Ansible
- bijvoorbeeld Canary, Blue Green
- b. Aanpassing van architectuur van de applicatie, inclusief documentatie!
-
c. Monitoring van hardware gebruik
- om problemen te voorkomen en efficiency en kostenbesparing mogelijk te maken en evt. custom metric en rapportages
-
d. Security aspecten, bv scan op container en/of dependency niveau
- update van dependencies en uitrollen ervan zonder regressiefouten of voor gebruikers merkbare glitches of functionele veranderingen
- e. Automatische schaling, bv. bij meer of minder (gesimuleerde) gebruikers
-
f. Fouttolerantie, design for failure en/of High Availability
- uitvallende hardware of services erop heeft geen merkbare gevolgen (evt. Chaos engineering toepassen)
Figuur 2: Output van een Sprint is een Product increment (Bron: kiwop.com, 2020)
Toelichting/tips bij de opdracht
Het is zaak de functionele uitbreiding relatief simpel te houden. Het kan ook een prototype functionaliteit zijn, die nog verder uitgewerkt moet, mits de roadmap wel duidelijk is en evt. bugs op een 'known issues' lijst staan en workaround hebben. De uitbreiding moet dus wel enigszins realistisch zijn, en ook deels zichtbaar via UI of webservices. Ook heb je uiteraard tests geschreven voor het geautomatiseerd testen van je product increment.
De toepassing van de onderzochte technologie moet efficient zijn en pragmatisch. Ofwel: de technologie moet je helpen bij bovenstaande doelen en niet loshangen en alleen tijd gekost hebben. Denk aan het gebruik van een geautomatiseerd monitoring dashboard, toepassen van een service mesh met built in security features, of gebruik een ops tool/technieken als IaC.
Bewaar al te grote ambitie qua functionaliteit voor het project in blok 2. De kern van de opdracht is het tonen van een DevOps aanpak. Dus het is niet onoverkomelijk ook als in je functionaliteit mogelijk nog wat UI gebreken zitten, of integratiebugs. Hiermee kun je bv. ook demo'en dat dat je een rollback kunt doen...
Denk bij een architecturwijziging aan:
- één of meer nieuwe microservices toevoegen. Deze communiceren onderling of met bestaande microservices.
- Het opsplitsen van bestaande microservice in twee onderdelen met eigen verantwoordelijkheid.
- Het aanpassen van .NET microservice naar (API compatible) Java, NodeJS of microservice met een andere programmeertaal (Polyglot 'X').
- Onder Polyglot X hoort overigens naast een andere programmeertaal ook het gebruik van een andere stack, bv. Java TomEE vs Java Spring, of een aanpassing in een andere laag, bv. persistentie dus switchen van MSSQL naar MySql, PostgreSQL, een NoSQL oplossing zoals ElasticSearch of caching technologie rondom database en/of applicatie zoals Redis of RabbitMQ of Service Bus persistent of een in memory database.
- Het doorvoeren van meer Event Driven architectuur zoals aanpassen naar CQRS patroon.
- Het uitbreiden of uitsplitsen van front-end laag naar aparte microservice, een self hosted CDN aanpak of cookieless subdomain of zelfs micro frontend achtige aanpak.
- Of nog iets anders... :)
Er is bij deze opdracht GEEN externe opdrachtgever en tevens gebruik je hierbij een bestaande applicatie, zodat je zelf weinig functionaliteit/features hoeft te verzinnen. Start met een applicatie die al in containers kan draaien, zodat je deze niet van scratch hoeft op te bouwen.
In dit opzicht lijkt het op een zogenaamd brown field project, in de zin dat je NIET vanaf scratch begint, maar je moet verdiepen in een bestaande software architectuur en een deel van de details van de code en configuratie. Het gekozen project is echter wel een green field qua gebruikte technologieën en aanpak. Dus het bevat unit tests en heeft in principe een microservices architectuur. Aangeraden project is InfoSupport's Pitstop. Een alternatief is Microsoft's 'e-shop on containers' project.
Je uitbreiding moet wel uniek zijn binnen je klas. De technologieen die je hierin toepast zijn ook uniek, maar dat is bij onderzoeksopdracht als het goed is al geregeld.
Voorbeelden van functionele uitbreidingen
Kijk bij de les/workshop User Story mapping voor enkele casussen (casi?) voor een functionele uitbreiding van PitStop (met elk ook weer subonderdelen). Met een plaatje erbij van Dall-e voor een sfeer impressie. Geef wel je eigen draai aan een functionaliteit. Of verzin zelf een functionaliteit (en je eigen plaatje met Dall-e :)).
Studentenfeedback na afloop van de BP opdracht
Hier wat feedback/reflectie van studenten na afloop van het project, om een beeld te krijgen vanuit hun perspectief.
"De opdracht was aardig abstract en vaag in het begin. Na het stellen van vragen aan de docent was er meer duidelijkheid en tijdens de werkdagen kwamen we er zelf ook meer achter wat we moesten doen. Er was weinig tijd om alles goed te doen en hierdoor hebben we concessies moeten maken op bepaalde vlakken. Verder is werken aan een (redelijke) grote applicatie die jezelf niet hebt geschreven lastig en tijdrovend maar wel leerzaam voor later in het bedrijfsleven." - Student X
"Ik ben zeer tevreden met de voortgang van dit project. In het begin was het nog een beetje puzzelen wat precies de verwachtingen & eisen waren. Zodra dit bekend was bij ons waren wij al snel uit over wat we willen doen met dit project. Namelijk het toevoegen van mechanics. Al snel had ieder zijn specialiteit gevonden, in mijn geval was dat de front-end. ..." - Student Y
"In het begin was de opdracht heel onduidelijk. Ik begreep toen ook niet wat er nou precies moest gebeuren. Wat later kwam ik erachter dat wij gewoon heel vrij waren, zolang wij maar bepaalde doelen haalden. Op zich was dit wel een keer een fijne manier van werken, maar vind het persoonlijk prettiger werken wanneer er meer duidelijkheid is. Ook was de Pitstop applicatie aardig groot voor deze twee weken. Wij zijn in het begin heel veel tijd verloren aan het uitzoeken hoe Pitstop in elkaar zit." - Student Z
Bronnen
- Lewis, I. (28 Augustus 2015) Using Kubernetes Namespaces to Manage Environments, geraadpleegd 21-10-2021 op https://kubernetes.io/blog/2015/08/using-kubernetes-namespaces-to-manage/
- Long, D. Hongxin (31 juli 2023) Creating Quality Online Content in the Era of AI Geraadpleegd 5-10-2023 op https://www.deanlong.io/blog/creating-helpful-reliable-people-first-ai-content
- Kiwop (12 April 2020). Agile methodologies in web development kiwop.com. Geraadpleegd 19-12-2024 op https://www.kiwop.com/en/blog/agile-methodologies-in-web-development
Beoordelingsmodel (groepsproduct + -proces)
Als beoordelingsmodel voor de weekopdrachten en het beroepsproduct (BP) dat je maakt — gebruiken we het Continuous Delivery Maturity Model (CDMM) zoals gedefinieerd in een blogpost op de website InfoQ. Deze onderscheid vijf categorieen (rijen) met elk 5 niveaus (kolommen) met een aantal 'checkpunten'.
Hieronder een korte opsomming van de 5 categorieën uit het CDMM, met per categorie een beschrijving van belangrijke aspecten. Maar voor de verplichte self assessment moet je ook zelf de details achterhalen van de 'checkpoints', zoals onderaan de pagina verder beschreven, toegelicht onder 'DevOps concepten' op deze website, maar ook in het originele 'InfoQ' artikel (Böstrom et al., 2013).
- 🧑🤝🧑 Culture & Organization: Multidisciplinair samenwerken, conform Agile manifesto, verminderen silo's en gedeelde verantwoordelijkheid conform 'DevOps is not a role', etc. (Agile).
- ⛪ Design & Architecture: Just in time design, continuous documentation, microservice architectuur, High Availability, autonomy over authority, etc. (C4, IaC, clustering)
- 🏗️ Build & Deploy: Gescripte pipelines, continuous integration, continuous deployment, koppeling aan versiebeheer, 'automate all the things' etc. (GitOps)
- 🧪 Test & Verification: Leesbare en liefst uitvoerbare specificaties, geautomatiseerd testen, testpiramide, opstellen en meten bedrijfsmetrics, etc. (TDD, BDD, test pyramid)
- 📈 Information & Reporting Inzicht in issues/backlog, metrics vanuit productie, beeld hard- en softwaregebruik, log aggregatie, visualisatie, 'strengthen feedback loops', etc. (SlackOps)
Bovenstaand de categorieën nog even in het Engels en als toelichting een indicatie van hogere maturity per punt met wat kernpunten. Het Maturity model geeft meer stapsgewijze opbouw in niveaus met bij elk niveau checkpunten om af te vinken. Deze vind je hieronder opgesplitst over twee tabellen zodat het goed op deze pagina past:
- de beginniveaus (🐣 2, 🐥 4 en 🦆 6-)
- respectievelijk hogere niveaus (🤨 6+, 8 😍, 🤯 10)
Om niet direct te verdwalen in het detail kun je eerst overzicht te krijgen via de toelichtingin in subsecties hier eronder. Sectie A geeft een toelichting van het gebruik CDMM als beoordelingsmodel voor cijferindicatie. Sectie B licht de vijf beoordelingscriteria toe die dit model bevat. Sectie C beschrijft de samenhang met (en mapping naar) de thema's, opdrachten en lessen van de course fase. Sectie D licht de indeling van de teampresentatie momenten toe. Tot slot in sectie E iets over de impliciete aanname dat je geautomatiseerd testen en aan TDD doet. Tot slot de gebruikte Bronnen.
Voor het eind beroepsproduct van de coursefase krijg je ook een individueel cijfer. Deze is veelal gelijk aan het teamcijfer, maar zoals elders is toegelicht hoe elk teamlid hiervoor de verplichte 'verantwoording van de individuele bijdrage' geeft, via een persoonlijk markdown bestand (waarvoor een template format is), en een mondelinge toelichting hierbij tijdens de Review.
CDMM Basis tot gemiddeld
Criterium | 😴 Basis - 2 | 🥱 Beginner - 4 | 😐 Gemiddeld - 6 |
---|---|---|---|
🧑🤝🧑 Cultuur & Organisatie |
|
|
|
⛪ Ontwerp & Architectuur |
|
| |
🏗️ Build & Deploy |
|
|
|
🧪 Test & Verificatie |
|
|
|
📈 Informatie & Rapporteren |
|
|
|
CDMM Gemiddeld tot Expert
Criterium | 😐 Gemiddeld - 6 | 🙂 Gevorderd - 8 | 😎 Expert - 10 |
---|---|---|---|
🧑🤝🧑 Cultuur & Organisatie |
|
| |
⛪ Ontwerp & Architectuur |
|
|
|
🏗️ Build & Deploy |
|
|
|
🧪 Test & Verificatie |
|
|
|
📈 Informatie & Rapporteren |
|
|
|
A. Toelichting gebruik CDMM als beoordelingsmodel
Dit model is opgesteld voor ICT organisaties, om de fase van adoptie van DevOps patterns en het toepassen van Continuous Delivery aan te geven. In deze course gebruiken we dit ook voor bepalen van niveau van jullie als DevOps team. Je DevOps team zien we daarbij dus zien als een kleine DevOps organisatie.
Het model kent vijf beoordelingscategorieën met elk vijf beschreven niveaus: base
, beginner
, intermediate
(=gemiddeld
), advanced
en expert
. Voor de becijfering koppelen we grofweg een cijfer aan elk niveau:
- 😴
base
niveau cijfer**2**
- 🥱
beginner
niveau, een**4**
- 😐
gemiddeld
niveau een**6**
- 🙂
gevanceerd
niveau een**8**
- 😎
expert
niveau een**10**
Het voldoende niveau (dus een 6
) is dus intermediate
oftewel gemiddeld
. Hier ben je voldoende volwassen. Bij lager zit je op onvoldoende, maar dat betekent in dit geval niet dat je aanpak niet adequaat is, vandaar de gebruikte emoticons van het nog slapen en ontwaken: 😴 2 en 🥱 4. Wellicht waren deze iconen ook passend geweest: 🐣 2, 🐥 4 en 🦆 6 (😉).
Deze 'Beginner' punten moet je dus wel inrichten, dit zijn traptreden die je moet nemen naar hoger niveau. Op tenminste een aantal punten moet je ook naar gemiddeld of hoger zitten voor een voldoende. Je hebt immers een DevOps minor gevolgd, dus een bedrijf verwacht dan dat je meer DevOps kennis hebt dan de gemiddelde instappende ICT'er. Het staat de beoordelaar vrij om een tussenliggend cijfer te geven op de deelaspecten, dus bijvoorbeeld een 5
, 7
of 9
is ook mogelijk (een 1
betekent dat je niks hebt gedaan of ingeleverd).
Bij de beoordeling levert de docenten/beoordelaars wel maatwerk, dus rekening houdend met omstandigheden. Bij beoordeling is het niet allen een kwestie van simpelweg afvinken, maar belangrijkste is dat je ook zelf kunt beoordelen waar je staat, de gebruikte termen goed kunt interpreteren, koppelen aan je eigen en je teams werk. Kortom dat je aantoont dat je een 'bewust bekwame' DevOps professional bent.
Verdere opmerkingen:
- De Engelse termen uit het CDMM-artikel, zoals 'base', worden afgewisseld met Nederlandse equivalenten ('basis') voor verduidelijking.
- Termen in
monocase
font (dus met backticks ` in markdown) verwijzen naar specifieke concepten of labels zoals beschreven in het CDMM-model. - De termen 'beoordelingscriteria' en 'categorieën' gebruiken we in de tekst als synoniemen en verwijzen naar dezelfde onderdelen.
B. De 5 beoordelingscriteria
Onderstaand de vijf beoordelingscriteria waar je in je team laten op 'intermediate' niveau moet scoren. Als indicatie een korte beschrijving en wat voorbeelden. Maar voor beoordeling moet je de hele rubric bekijken en bekijk voor uitleg van alle 'etc.' in onderstaande het originele InfoQ artikel als verdere achtergrond. Merk op dat achter elk criterium uit CDDM tussen haakjes ook een ruw equivalent van de criteria uit de OWE.
- 🧑🤝🧑 Cultuur & Organisatie - CO: DevOps is een cultuur (en geen rol). Van basis versiebeheer en ad hoc proces tot projectgebaseerde teams met volledig gedefinieerd DevOps proces. Het team heeft gezamenlijke verantwoordelijkheid en backlog en hanteert een Agile aanpak en ceremonies (bv. Scrum), etc. (DevOps-1 - Continuous Delivery)
- ⛪ Design & Architectuur - OA: Ontwerp van je software architectuur. Van monoliet naar microservices mapping op infrastructuur (evt. IaC), focus op NFR's voor bv. autoscaling, twelve-factor app principles, etc. (DevOps-3 - Containerization/Orchestration)
- 🏗️ Build & Deploy - BD: Van wat handmatige stappenplan naar volautomatische build met kwaliteitschecks en een Canary of bluegreen deploy vanuit zelf ingerichte pipeline, dev/prod parity etc. (DevOps-2 GitOps)
- 🧪 Test & Verificatie - TV: Van wat (goede) unit tests¹ naar volledige testpiramide, load tests en tests van bedrijfswaarde. De mate van TDD, acceptatietests, BDD, security, refactorings, review-proces en -inspanningen etc. (DevOps-4 - DevSecOps)
- 📈 Informatie & Rapportering - IR: Van standaard hardware monitoring naar realtime applicatiespecifieke metrics en cross applicatie en cluster informatie, A/B tests. Hoe goed monitor je de applicatie, static code analyse, loglevels/-aggregatie, productspecifieke rapportages, etc? (DevOps-4 - SlackOps)
Hieronder de beoordelingsrubric overgenomen van het Continuous Delivery Maturity Model (CDMM) van infoq.com. De rubric is feitelijk overgenomen uit een plaatje bij dit artikel wat een samenvatting van het artikel vormt, in de vorm van afvinkbare 'checkbox punten'. Drze zijn verdeeld over vijf categorieen die elk weer vijf niveaus van 'volwassenheid' hebben.
Wijzigingen t.o.v. originele CDMM
De wijzigingen in bovenstaande tabel ten opzicht van het originele CDMM van InfoQ zijn erg beperkt en spreken deels voor zich, maar hier voor de nieuwsgierigen.
- Ten opzichte van het InfoQ artikel is elk item/checkbox vertaald naar het Nederlands.
- Elk checkpunt nu een eigen code (bv. CO-003), die kort de categorie en het niveau aangeeft.
- Om het op één pagina te laten passen is de grote tabel opgesplitst in twee tabellen; één met niveaus 0 t/m 2 voor het gewenste niveau tijdens theorie deel van de course fase (1e 5 weken).
- Het streefniveau 2 'Gemiddeld' komt dus in beide tabellen voor als indicatie/koppeling tussen de twee. Tabel 2 is met niveaus 2 t/m 4 voor verdere verdieping in onderzoek, BP en het grote project. Vanaf base niveau 0 naar 2 doe je in de course fase als het goed is.
Tot slot zijn de volgende checkpoints in het CDMM toegevoegd:
- CO-206 Trunk based development - In lijn met punt 'CO-201 *minimale branching' is het logisch dat developers in versiebeheer zoveel mogelijk op de trunk werken (bv.
main
). Zie verder het artikel hierover uit 2018 op InfoQ hierover, 5 jaar na het CDMM artikel :) (InfoQ, 2019) - Punt DB wijzigingen in VCS is verplaatst vanuit categorie 'Ontwerp & Architectuur' naar 'Build & Deploy' als BD-105 in lijn met de overige hogere checkpoints rondom 'db' zoals 'Automatiseer meeste DB wijzigingen* die ook in deze categorie staan. Deze hangen meer samen met automatiseren van deploys met pipeline en versiebeheer standaarden dan met de applicatie architectuur. Wel kun je argumenteren dat het gebruik van een ORM tool met migrations wel weer deels een (software) design of architectuur keuze is. Wel een ADR waard in ieder geval. Dan zouden BD-303 en BD-402 juist naar de categorie OA moeten, maar i.v.m. consistentie doen we dit niet.
- Verder nog geen punten. Suggesties zijn welkom, mits natuurlijk niet dubbelop met bestaande punten.
Gebruik checkpunten voor self assessments
De checkpunten ga je gebruiken in de weekopdracht en beroepsproduct, maar het is wel de bedoeling naast de code OOK de naam op te nemen in je eigen product documentatie, toelichting bijdrage team en dergelijke. Dus NIET enkel de code, want dan wordt het erg cryptisch (en moet de lezer dit weer opzoeken).
Bijvoorbeeld:
Het gezamenlijk zelf komen tot een besluit tijdens de sprint retrospective — in plaats van naar de PO te kijken voor een besluit — zien wij als voorbeeld van CDMM CO-206 - Decentrale besluitvorming). Dit toont aan dat wij als team al voldoende scoren op criterium Cultuur en Organisatie.
Op een eventuele vraag van de beoordelaar waarom jullie dan nog niet 'handelen op metrics' (C0-203) moeten je dan zelf idealiter een antwoord formuleren (wellicht is "Promotheus doen we pas in week 5" een goede verdediging ;))
Een verdere toelichting op de categorieën en niveaus vind je hieronder. Of vraag ernaar tijdens de lessen!
C. Mapping van de 'CDMM checkboxes' op de weekthema's/-opdrachten
Tijdens de lesweken in de course fase richt je je in opdrachten vooral op stappen Basis en Beginner. Tijdens het onderzoek en DevOps BP ontwikkeling (laatste 3 weken) ga je je als het goed is ontwikkelen naar hoger niveau een of manier criteria (maar tenminste vormbehoud).
Hieronder een klein opzetje van de mapping. Merk op dat het merendeel van de checkboxes nog ingedeeld moet worden. Waarbij je sommige in twee of meer categorieen kunt/moet indelen (zoals BD-207 'standaard proces voor alle omgevingen' in containerization en Continuous Deployment en OA-103 in containerization en devSecOps).
- Wk1 - GitOps: CO-003, BD-001 Code in versiebeheer, BD-103 Handmatige tags en versies, BD-201 Auto triggered builds (commit hooks), TV-001 Automatische unit tests, IR-102 Statische code analyse, TV-201 Automatische component test (geisoleerd), ...
- Wk2 - Containerization: OA-103 (3rd party) library management, BD-203 Build once deploy anywhere, BD-204 Automatiseer meeste DB wijzigingen, BD-206 , BD-401
- Wk3 - Continuous Delivery/BDD: CO-001, CO-101, BD-205, BD-206, IR-101, IR-202, TV-301 ...
- Wk4 - Orchestration/DevSecOps: OA-201 Geen of minimale branching, TV-002, TV-303, TV-304, OA-103, ...,
- Wk5 - SlackOps/DDD: IR-001, IR-002, IR-101, IR-301, OA-502... / IR-201, OA-501
D. Beoordelingsmomenten/toetsen
De beoordeling van dit beroepsproduct gebeurt op basis van 3 onderdelen. Deze komen langs twee beoordelingsmomenten; een Productdemo
en een Code review
. Hier een overzicht met ook beoordelingscriteria per onderdeel.
- Productdemo a. Het tonen van het product en het updaten en live monitoren ervan tijdens een korte teamdemonstratie voor beoordelaar(s)/opdrachtgever
- Code review
a. Product en code/config review: Langer overleg met alleen team en beoordelaar(s):
- toelichting indididuele bijdrage
- vragen van beoordelaars
- bespreking van jullie self assessment b. Kwaliteit van proces, README en de verdere achterliggende documentatie
- verloop sprints en Scrum ceremonies
- doornemen scrumborden, issues, user stories, traceerbaarheid wijzigingen via issues, commit messages, pull requests en review opmerkingen
- doornemen/toetsen README en begrijpelijkheid documentatie (C4 + UML en overige diagrammen en (verpliche) tekstuele toelichting)
Hieronder geven subsectie E1, E2 en E3 verdere toelichting van respectievelijk Productdemo en Code Review en tot slot de wegingsfactoren o beter gezegd dat er juist geen harde/kwantitatieve wegingsfactoren zijn.
D1. Toelichting Productdemo
De productdemo duurt circa een kwartier en daarna max een kwartier vragen. De presentatie gebeurt voor de beoordelaars en in principe met aanwezigheid van de andere teams NIET met aanwezigheid andere teams. Omdat jullie in principe op basis van een redelijk bekende product hoef je aan introductie hiervan niet veel tijd te bestenden en licht je vooral je eigen uitbreiding hiervan toe, en demo't deploy van product increment en monitoring hiervan.
Voordat de demo is doe je met het hele team een self assessment van het gemaakte DevOps product en gevolgde proces en vult in een self-assessment.md
voor alle 5 BC's een cijfer in op basis van niveaubeschrijvingen in de rubric in. Je schrijft hierbij ook een argumentatie voor de invulling, met enkele steekwoorden per BC en ook een of meer paragrafen voor de eindcijfer.
Bij beoordeling geldt dat alle te beoordelen zaken aanwezig zijn in ingeleverde beroepsproduct en ook in je documentatie te vinden zijn. Je werkt dus NIET in Word documenten, maar in tekst en markdownbestanden geintegreerd samen bij de broncode en configuratiebestanden.
Merk op dat de beschrijvingen van de 'lagere niveaus', basis, en beginner niet per se tekortkomingen beschrijven, maar ladders zijn op een trap die je moet nemen richting een voldoende en hopelijk zelfs goed cijfer. Op een aantal criteria zit je gelukkig wel al direct op een 6 door bijvoorbeeld gezamenlijke backlog voor Dev&Ops te gebruiken en een Test en/of Behaviour Driven aanpak te gebruiken.
Als gezegd moet je alle belangrijke zaken, zoals behaalde non functional requirements, of je proces als DevOps team ook zelf kort beschrijven in je documentatie. Je moet ook weten waar je zelf staat. De niveaubeschrijvingen zijn geen kant en klare recepten, dus je moet zelf ook een interpretatie hiervan doen en imvulling. Bij twijfel stem zaken - als het goed is vooraf - af met de beoordelende docent(en). Het expert (=extreem) niveau dat bij een 10 en hierbij ga je above en beyond, dus moet je ook zelf aangeven waarom je op het niveau zit.
D2. Toelichting Code Review
Bij een tweede langer assessment met alleen de docenten en je team gaan we ook in op kwaliteit code, match configuratie met infrastructuur model en gewenste NFR's? Als intro hiervoor bespreken jullie de grove rol- en werkverdeling en elk teamlid geeft toelichting van eigen bijdrage in het product (minstens 1 bijdrage waar je trots op bent, en kwaliteit kunt beargumenteren en een stuk werk waar je concrete verbeterpunten kunt noemen).
De kwaliteit van de README beoordelen docenten bijvoorbeeld door terplekke zelf de code te pullen uit versiebeheer en containers of clusters te runnen o.b.v. jullie README. En daarnaast te bekijken of documentatie voldoende aangrijpingspunten biedt voor nieuwe developer in team om het product snel te begrijpen en aan verder te bouwen.
Voor individuele beoordeling geef je verantwoording van je eigen bijdrage in het groepsproduct en bv. aan de hand van je markdown document ook meer details van het toepassen van de onderzochte technologieen uit de onderzoeksweek. Als gezegd hebben deze tools/technologieen hopelijk een positieve uitwerking op je eindproduct gehad. Denk aan verbeterde/makkelijkere monitoring, hogere productiviteit, betere security, betere code kwaliteit, geautomatiseerde pipeline etc.
D3. Eindcijferbepaling en wegingsfactoren
Tot slot nog evenover de weging; om dit EXPLICIET te maken: er is GEEN hard voorgeschreven weging tussen de 5 beoordelingscriteria om tot een eindcijfer te komen. Normaliter zullen alle vijf de criteria even zwaar wegen, en is er vaak een lijn qua product. En geeft een onvoldoende op een aspect reden tot twijfel. Maar het gaat meer om je eigen beoordeling en - vooral - beargumentering hiervan. Daarom moet je ook een self assessment doen; zie onder.
Het kan zijn dat sommige aspecten minder van belang waren in jullie opdracht en op zichzelf onvoldoende waren. Maar het overall toch voldoende was doordat een ander aspect buitengewoon goed is gedaan, of zaken door externe en niet te voorspellen zaken juist erg tegenvielen.
Merk ook op dat het eindproduct zelf geen eigen cijfer krijgt. Dit is bewust (dit is overigens tijdens projectblok anders, waar de opdrachtgever ook een deelcijfer geeft). Geen cijfer voor eindproduct betekent natuurijk NIET dat je geen product increment moet hebben. Dit is verplicht. Maar we willen niet dat je inzet op heel complexe functionaliteit en daarbij de DevOps basics uit het ogen verliest. Of bv. logging of monitoring aan de kant schuift. Maa zonder product (increment) is er geen proces. En beter product en logische 'bedrijfswaarde' geeft meer gelegenheid DevOps skills te tonen en een betere demo en leidt indirect toch tot een hoger cijfer.
Bijvoorbeeld een groter product increment of uitgebreide refactoring in bestaande code of opsplitsen van microservice in 1 container in 2 aparte, geeft ook een langer commit spoor, meer unit tests, een aanleiding voor extra Q&A omgeving, een demo canary deploy voor subfunctionaliteit I, een A/B test van een andere functionaliteit, data migratie van feature X, en (zelf onderzochte) InfraStructure As Code configuratie voor microservice Z. Een groter product increment geeft natuurlijk ook meer aanleiding voor een complexere architectuur. Ga je voor een simpele CRUD microservice, of kies je juist complexe logica die ook een 'domain driven' ontwerp vraagt, met wellicht caching in miroservice en synchronisatie tussen microservives, een event-driven en/of CQRS aanpak met eventual consistentie, inzet van een message broker etc.
E. Speciale noot over (geautomatiseerd) testen
¹ Merk tot slot op dat het instapniveau (dus 2
) niveau qua Test en Verificatie direct 'code is onder test', dus geautomatiseerde tests. Terwijl dit in het beroepsveld lang nog niet bij alle bedrijven gebeurt. In de course gaan we in op BDD (ook wel ATDD = Acceptance Test Driven Design of 'Specification by Example' genoemd), waar ISM studenten ook nog een rol bij kunnen spelen in het opstellen. Maar er is in de minor binnen contacturen niet de tijd om TDD 'vanaf de grond' aan te leren. Maar TDD en gerelateerde patterns en principe als Arrange, Act, Assert (AAA) en Red, Green Refactor veronderstellen we wel als bekend bij developers. Zorg dat je hier ook mee geoefend hebt, of alsnog oefent!
Continuous Integration is a software development practice where members of a team integrate their work frequently, usually each person integrates at least daily - leading to multiple integrations per day. Each integration is verified by an automated build (including test) to detect integration errors as quickly as possible.
De grondlegger van de term Continuous Integration Martin Fowler hamert in vele van zijn blogs op TDD aanpak en legt in blog met titel 'Is high quality software worth the cost?' aan dat deze vraag op een verkeerde veronderstelling berust, omdat kwaliteitssoftware juist goedkoper is om te onderhouden in plaats van duurder (zie figuur 1).
Figuur 1: High (internal) quality software is goedkoper i.p.v. duurder! Aldus Martin Fowler (2019).
In deze lijn trekken in de DevOps wereld over het algemeen door, bv. Continuous Delivery voorman David Farley (van het gelijknamige 'seminal' boek). Met 'goed' bedoelen we hier:
- behoorlijke test coverage, in ieder geval van complexe code (hoge cyclomatische complexiteit)
- leesbare testcode met cyclomatische complexiteit van 1)
- gericht op gedrag en testen van interface i.p.v. implementatie details
- en zonder 'unit testing anti patterns' (zoals 'Liar', 'Excessive setup', 'The giant' en 'The mockery' zie deze video van David Farley).
Bronnen
- Boström, P & Palmbor., T 6 februari 2013. The Continuous Delivery Maturity Model, geraadpleegd 13-1-2021 op https://www.infoq.com/articles/Continuous-Delivery-Maturity-Model
- Fowler, M. 19 mei 2019, Is high quality software worth the cost. Geraadpleegd 20-10-2021 op https://martinfowler.com/articles/is-quality-worth-cost.html
- InfoQ (2018). Trunk Based Development as a Cornerstone for Continuous Delivery. InfoQ.com. Geraadpleegd 5-9-2024 op https://www.infoq.com/news/2018/04/trunk-based-development/
Beoordeling Individuele bijdrage
- Datum: 11 okt 2021
- Auteur: Bart van der Wal
1. Inleiding: Verantwoording eigen bijdragen
Naast je beoordeling als team voor het samen gemaakte product krijg je ook een individueel cijfer op basis van jou bijdrage aan dit product. Dit gebeurt zowel tijdens beroepsproduct en voor je product uit blok 2.
Je hoeft tijdens het project geen uitgebreid verslag te schrijven, en sowieso geen Word documenten, zoals in sommige andere projecten. Maar wel moet elk groepslid wel een eigen markdown bestand toevoegen en bijhouden (direct) in de docs
folder van het team repository/project. Hieronder het template. Dit template bevat de volgende 9 kopjes. Bij elk kopje kort vermeld de competenties uit de OWE of 'devops maturity' aspecten die hier in ieder geval bij horen:
-
Code/platform bijdrage
- DevOps-1 Continuous Delivery
- CDMM: Design & Architecture
- CDMM: Test & Verification
-
Bijdrage app configuratie/containers/Kubernetes
- DevOps-2 Orchestration
- DevOps-4 Containerization
- CDMM: Design & Architecture
-
Bijdrage versiebeheer, CI/CD pipeline en/of monitoring
- DevOps-3 GitOps
- DevOps-5 SlackOps
- CDMM: Information & Reporting
- CDMM: Test & Verification
- CDMM: Build & Deploy
-
Onderzoek
- DevOps-6 Onderzoek
-
Bijdrage code review/kwaliteit anderen en security
- DevOps-4 DevSecOps
- CDMM: Culture&Organization
- CDMM: Test & Verification
-
Bijdrage documentatie
- CDMM: Design & Architecture
- DevOps-6 Onderzoek
-
Bijdrage Agile werken, groepsproces, communicatie opdrachtgever en soft skills
- DevOps-7 Attitude*
- CDDM: Culture & Organization
-
Leerervaringen
- DevOps-7 Attitude
- CDDM: Culture & Organization
-
Conclusie & feedback
- DevOps-7 Attitude
Dit document dient als bewijslast richting beoordelaars op meer afstand, maar ook voor je eigen overzicht en ter referentie tijdens de groepssessie voor beoordeling van de individuele bijdrages.
Om een basisvulling te vereisen maar ook al te grote omvang van het document te beperken ivm beoordeelbaarheid, vermeldt het template wat minimum- en maximumaantallen. Dit bestand houdt je bij tijdens het hele project.
Hieronder in sectie 2 wat eisen en richtlijnen over het 'invullen' van het template. In sectie 3 volgt het template zelf, om te copy-pasten naar je eigen repo. In sectie 4, 5 en 6 daarna nog wat achtergrondinformatie bij de individuele beoordeling, de individuele delta die dit geeft op het groepscijfer respectievelijk de algemene beoordelingscriteria die hierbij relevant zijn.
2. Eisen en richtlijnen Individuele verantwoording
Hieronder de richtlijnen in 4 subsecties, maar deze lijst is al de TL; DR:
- Zorg dat template teksten zo snel mogelijk weg zijn uit de templates, uiterlijk bij (en enige ;) tussentijdse beoordeling.
- Zorg dat verantwoording ook tussentijds al leesbaar en compleet is (tussentijds eventueel TODO's voor jezelf)
- Gebruik vrije tekst en bullets
- Gebruik (semantische) linkteksten GEEN kale URL's.
2.1 Beoordelaar kijkt niet als er nog template teksten aanwezig zijn
Verwijder voor het inleveren alle template teksten! Zodat alleen de kopjes (en opgesomde competenties) overblijven!
De template teksten staat in de markdown als hulp. Maar aanwezigheid van deze (standaard) template teksten op het moment van beoordelen ziet de beoordelaar als een teken dat je nog niet klaar bent ermee bent. Dit heeft als gevolg dat hij/zij dus niet kan beoordelen. Niet (kunnen) beoordelen betekent een onvoldoende!
Vervang bijvoorbeeld <mijn-naam>
bv. door Eliezer Yudkowsky
. NB: Dus NIET <Eliezer Yudkowsky >
; de angle brackets (<
en >
) zijn om templateteksten aan te geven, dus bij invullen moet je ze WEGhalen.
2.2 Ook leesbaar en compleet bij tussentijdse beoordeling
Bij tussentijdse toetsing heb je al een volledige en leesbare versie, met minstens de minimale aantallen. Richting de eindbeoordeling werk je deze verder bij, en schrapt evt. punten als je anders over het maximum aantal gaat en je inmiddels grotere/belangrijker zaken hebt. Of als je punten kunt samenvoegen onder 1 noemer (N.B. Punten zijn evt. terug te vinden via versie historie).
Dus je vult ook al een voorlopige eindoordeel in. En bijvoorbeeld hebt ook al de helft van de tips en tops.
Mocht je er tussentijds achterkomen dat onder een kopje nog te weinig of zelfs GEEN werk en/of links kunt geven, neem voor je zelf dan wat TODO
's op, met een richting, zodat je in de 2e helft kunt zorgen dat je wel voldoende varieteit en breedte in je werk hebt.
2.3 Gebruik vrije tekst én bullets
TL; DR Dus: gebruik een combinatie van beschrijvende teksten en korte bullet lijsten met links naar werk in het met team gebruikte 'code management systeem' waarmee beoordelaar je werk kan verifieren.
De bedoeling van deze verantwoording is dat het korte tekstuele beschrijving is. Voor structuur gebruik je hierbij ook bullets. Maar je gebruikt NIET alleen maar bullets, of alleen maar paragrafen. Je gebruikt een combinatie. Typisch is een paragraaf dan een inleiding bij een bullet lijst, zoals Qua Kubernetes configuratie deed ik het volgende
. Of een toelichting bij iets interessantes. Schrijf ook een korte inleiding.
2.4 Gebruik linkteksten
- Maak van links shortlinks, dus met goede linktekst en niet de hele originele URL’s (die nemen anders groot deel van je documentatie in beslag, dat is ongewenst)
- Maak deze links ook naar bv. code diffs of pull requests i.p.v. direct naar volledige bestanden/folders in versiebeheer met integrale stukken code die van iedereen in het team kunnen (en horen!) te zijn.
- Plaats ook opmerkingen in pull requests (review opmerkingen) en github issues ().
Het agile principe van face-to-face contact is ook belangrijk, maar stem niet alles alleen maar mondeling af zorg voor de traceerbaarheid en beoordeelbaarheid door externen. Zo heeft groepsgenoot ook iets om op terug te vallen na mondeling afstemmen (of deze notuleert zelf mondling overleg in issue).
Als je dit onverhoopt tijdens het project te weinig gedaan hebt, kun je alsnog dit documenteren. In je markdown zelf maakt deze wellicht te groot, maar dan kan het in een taak/issue waar je in markdown naar linkt, of in de wiki o.i.d. (hier hebben jullie hopelijk ook team standaard voor, en anders kun je die wellicht met terugwerkende kracht opstellen, in kader van overdracht naar anderen, nu jullie dit project gaan verlaten).
Dus vervuil je markdown niet met hele lange URL links, maar kort deze in, of - beter nog - maak een linktekst die echt semantisch is, en ook thuishoort in een lopende tekst. In de tabel hieronder drie voorbeelden.
3. Markdown template individuele bijdrage
# Eigen bijdrage <mijn-naam>
Als deliverable voor de individuele bijdrage in het beroepsproduct maak een eigen markdown bestand `<mijn-voornaam>.md` in je repo aan met tekst inclusief linkjes naar code en documentaties bestanden, pull requests, commit diffs. Maak hierin de volgende kopjes met een invulling.
Je schrapt verder deze tekst en vervangt alle andere template zaken, zodat alleen de kopjes over blijven. **NB: Aanwezigheid van template teksten na inleveren ziet de beoordelaar als een teken dat je documentatie nog niet af is, en hij/zij deze dus niet kan of hoeft te beoordelen**.
Je begin hier onder het hoofdkopje met een samenvatting van je bijdrage zoals je die hieronder uitwerkt. Best aan het einde schrijven. Zorg voor een soft landing van de beoordelaar, maar dat deze ook direct een beeld krijgt. Je hoeft geen heel verslag te schrijven. De kopjes kunnen dan wat korter met wat bullet lijst met links voor 2 tot 4 zaken en 1 of 2 inleidende zinnen erboven. Een iets uitgebreidere eind conclusie schrijf je onder het laatste kopje.
## 1. Code/platform bijdrage
Competenties: *DevOps-1 Continuous Delivery*
Beschrijf hier kort je bijdrage vanuit je rol, developer (Dev) of infrastructure specialist (Ops). Als Developer beschrijf en geef je links van minimaal 2 en maximaal 4 grootste bijdrages qua code functionaliteiten of non-functionele requirements. Idealiter werk je TDD (dus ook commit van tests en bijbehorende code tegelijk), maar je kunt ook linken naar geschreven automatische tests (unit tests, acceptance tests (BDD), integratie tests, end to end tests, performance/load tests, etc.). Als Opser geef je je minimaal 2 maximaal 4 belangrijkste bijdragen aan het opzetten van het Kubernetes platform, achterliggende netwerk infrastructuur of configuration management (MT) buiten Kubernetes (en punt 2).
## 2. Bijdrage app configuratie/containers/kubernetes
Competenties: *DevOps-2 Orchestration, Containerization*
Beschrijf en geef hier links naar je minimaal 2 en maximaal 4 grootste bijdragen qua configuratie, of bijdrage qua 12factor app of container Dockerfiles en/of .yml bestanden of vergelijkbare config (rondom containerization en orchestration).
## 3. Bijdrage versiebeheer, CI/CD pipeline en/of monitoring
Competenties: *DevOps-1 - Continuous Delivery*, *DevOps-3 GitOps*, *DevOps-5 - SlackOps*
Beschrijf hier en geef links naar je bijdragen aan het opzetten en verder automatiseren van delivery pipeline, GitOps toepassing en/of het opzetten van monitoring, toevoegen van metrics en custom metrics en rapportages.
NB Het gebruik van *versiebeheer* ((e.g. git)) hoort bij je standaardtaken en deze hoef je onder dit punt NIET te beschrijven, het gaat hier vooral om documenteren van processtandaarden, zoals toepassen van een pull model.
## 4. Onderzoek
Competenties: *Nieuwsgierige houding*
Beschrijf hier voor het Course BP kort je onderzochte technologie met een link naar je blog post, of het toepassen ervan gelukt is en hoe, of waarom niet. Beschrijf evt. kort extra leerervaringen met andere technologieen of verdieping sinds het blog.
Tijdens het grote project beschrijf je hier onderzoek naar het domein en nieuwe onderzochte/gebruikte DevOps technologieën. Wellicht heb je nogmaals de voor blog onderzochte technologie kunnen toepassen in een andere context. Verder heb je nu een complex domein waar je in moet verdiepen en uitvragen bij de opdrachtgever. Link bijvoorbeeld naar repo's met POC's of, domein modellen of beschrijf andere onderwerpen en link naar gebruikte bronnen.
Als de tijdens course onderzochte technologie wel toepasbaar is kun je dit uiteraard onder dit punt noemen. Of wellicht was door een teamgenoot onderzochte technologie relevant, waar jij je nu verder in verdiept hebt en mee gewerkt hebt, dus hier kunt beschrijven. Tot slot kun je hier ook juist een korte uitleg geef over WAAROM jouw eerder onderzochte technologie dan precies niet relevant of inpasbaar was. Dit is voor een naieve buitenstaander niet altijd meteen duidelijk, maar kan ook heel interessant zijn. Bijvoorbeeld dat [gebruik van Ansible in combi met Kubernetes](https://www.ansible.com/blog/how-useful-is-ansible-in-a-cloud-native-kubernetes-environment) niet handig blijkt. Ook als je geen uitgebreid onderzoek hebt gedaan of ADR hebt waar je naar kunt linken, dan kun je onder dit kopje wel alsnog kort conceptuele kennis duidelijk maken.
## 5. Bijdrage code review/kwaliteit anderen en security
Competenties: *DevOps-7 - Attitude*, *DevOps-4 DevSecOps*
Beschrijf hier en geef links naar de minimaal 2 en maximaal 4 grootste *review acties* die je gedaan hebt, bijvoorbeeld pull requests incl. opmerkingen. Het interessantst zijn natuurlijk gevallen waar code niet optimaal was. Zorg dat je minstens een aantal reviews hebt waar in gitlab voor een externe de kwestie ook duidelijk is, in plaats van dat je dit altijd mondeling binnen het team oplost.
## 6. Bijdrage documentatie
Competenties: *DevOps-6 Onderzoek*
Zet hier een links naar en geef beschrijving van je C4 diagram of diagrammen, README of andere markdown bestanden, ADR's of andere documentatie. Bij andere markdown bestanden of doumentatie kun je denken aan eigen proces documentatie, zoals code standaarden, commit- of branchingconventies. Tot slot ook user stories en acceptatiecriteria (hopelijk verwerkt in gitlab issues en vertaalt naar `.feature` files) en evt. noemen en verwijzen naar handmatige test scripts/documenten.
## 7. Bijdrage Agile werken, groepsproces, communicatie opdrachtgever en soft skills
Competenties: *DevOps-1 - Continuous Delivery*, *Agile*
Beschrijf hier minimaal 2 en maximaal 4 situaties van je inbreng en rol tijdens Scrum ceremonies. Beschrijf ook feedback of interventies tijdens Scrum meetings, zoals sprint planning of retrospective die je aan groespgenoten hebt gegeven.
Beschrijf tijdens het project onder dit kopje ook evt. verdere activiteiten rondom communicatie met de opdrachtgever of domein experts, of andere meer 'professional skills' of 'soft skilss' achtige zaken.
## 8. Leerervaringen
Competenties: *DevOps-7 - Attitude*
Geef tot slot hier voor jezelf minimaal 2 en maximaal **4 tops** en 2 dito (2 tot 4) **tips** á la professional skills die je kunt meenemen in toekomstig project, afstuderen of wellicht zelfs verdere loopbaan (de 'Transfer' uit STARRT). Beschrijf ook de voor jezelf er het meest uitspringende hulp of feedback van groepsgenoten die je (tot dusver) hebt gehad tijdens het project.
## 9. Conclusie & feedback
Competenties: *DevOps-7 - Attitude*
Schrijf een conclusie van al bovenstaande punten. En beschrijf dan ook wat algemener hoe je terugkijkt op het project. Geef wat constructieve feedback, tips aan docenten/beoordelaars e.d. En beschrijf wat je aan devops kennis, vaardigheden of andere zaken meeneemt naar je afstudeeropdracht of verdere loopbaan.
4. Werkwijze beoordeling individuele bijdrage
Voor je individuele bijdrage in het project krijg je ook een beoordeling.
4.1 Input voor beoordeling
Basis hiervoor is de input van je teambegeleider(s), en evt. observaties van de klant/opdrachtgever tijdens Scrum ceremonies of daarbuiten of andere door beoordelaars belangrijk gevonden punten. De inbreng tijdens Productdemo of de Review sessie kan ook doorslag geven als je ervoor nog te weinig zichtbaar was. Uiteraard weegt ook mee het correct en voor externen ook leesbaar en begrijpelijk invullen van bovenstaand template met je verantwoording van je individuele bijdrage.
4.2 Groepssessie individuele beoordeling
De uiteindelijke individuele beoordeling gebeurt n.a.v. een groepssessie. Dit klinkt wellicht tegenstrijdig, want je focust in de verantwoording op eingen werk, maar we gaan er vanuit dat je toelichting bekend is bij teamgenoten en geen verantwoording. Omdat samenwerking met groepsgenoten en bv. het reviewen van elkaars werk, of anderszins samenwerken centraal staat bij DevOps. Tijdens de sessie geef je ingevulde tekst toelicht. Deze meeting duurt een half uur tot een uur afhankelijk van je groepsgrootte. Je hebt hierbij ongeveer 5 minuten voor je eigen werk. Deze sessie plan je in met je begeleiders/beoordelaars. De begeleider vraagt tijdens deze sessie bijvoorbeeld het volgende:
- Waar ben je het meest trots op van je bijdragen aan het teamproduct?
- Waar heb je nog het minst laten zien?
- Vervolgens lopen we samen snel door je factsheet heen
Aan het eind van de sessie geeft de beoordeleer aan wat je delta op het groepscijfer is.
Als teamlid mag je opmerkingen/input geven, maar we proberen discussies te bewaren voor andere contactmomenten.
4.3 Gebruik links
Naast de tekst zelf is natuurlijk de kwaliteit van het daarin gelinkte bronmateriaal (zorg dat de links zelf ook werken, en bv. wijzen naar een diff of review van eigen werk, i.p.v. naar werk van anderen). Zorg ook dat het presentabel is door GEEN kale lange URL's te geven, maar de URL's zelf waar mogelijk in te korten maar ook netjes achter een link te stoppen met korte maar duidelijke linktekst in een duidelijke en actief geschreven zin (of herschrijf).
5. Delta op teamcijfers
Je eindcijfer is het groepscijfer en nog individuele 'delta' hierop. Deze delta is in principe 0, dus dat betekent dat je eindcijfer hetzelfde is als het groepcijfer. Maar als beoordelaars aanleiding hebben kunnen deze een delta geven die varieert van -1
tot +2
op het teamcijfer. Ook geldt dat als je als teamlid geheel niet of duidelijk te weinig hebt bijgedragen, of je bijdrage niet voldoende kunt verantwoorden, dan is je eindcijfer een onvoldoende, ongeacht het teamcijfer. Dit laatste betekent dus dat je het project een volgende editie over moet doen. Hetzelfde geldt uiteraard als na toepassen van een delta je eindcijfer onder de 5,5 zit.
2
Project niet afgerond4.5
Project gedaan maar onvoldoende bijgedragen (geen vormbehoud courses) en/of deze bijdrage niet voldoende verantwoord-1
Op aantal punten tekort geschoten, maar wel significante bijdrage-0,5
Op één of enkele punten tekortgeschoten op verwachte input of toegezegde bijdrage+0
Project goed meegewerkt, gezorgd voor significante bijdrage en kwaliteit en vormbehoud van course+0,5
Erkenning van belangrijke bijdrage op een aspect van het teamproduct of -proces+1
Belangrijke extra invloed qua kwantiteit of kwaliteit van teamproduct binnen het team op één of enkele punten+2
Op een aantal punten een essentiële positieve extra invloed qua kwaliteit, kwantiteit van werk
Om bovenstaande wat concreter te maken hieronder enkele (fictieve) beschrijvingen van projectsituaties en de hieruit voortkomende beoordeling.
5.1 Voorbeeld 1
Een team heeft als teamcijfer een 7
gehaald met een weinig opvallend project met wel een enthousaste en duidelijk einddemo. Eigenlijk al het gevraagde zat erin, zij het minimaal. Teamlid A heeft een belangrijke invloed gehad bij de realisatie van de database, en is 'above and beyond' gegaan en krijgt een 7+1
=8
. Teamlid B heeft steady gecodeerd, maar heeft geen enkele verslaglegging gedaan en kan achteraf ook onvoldoende terugvinden in aangemaakte issues of commit opmerkingen om dit nog te fixen voor de inlever deadline. Een 4
.
5.2 Voorbeeld 2
Een team heeft een 6
gekregen. In dit team is Teamlid X in week 2 helaas uitgevallen (een 1
). Het security aspect missen zij geheel, want heeft verder niemand opgepakt ondanks dat dit teamverantwoordelijkheid is. Wel is er een nieuw microservice en wijzigingen in back-end en front-end met noSQL storage. Teamlid Y heeft een bestaand issue nooit gefixt, hoewel dit wel met hem is afgesproken omdat dit bij zijn expertise hoorde. Achterliggende reden was dat zijn technologie toch niet in bleek te passen in het beroepsproduct en hierdoor was hij gedemotiveerd.
De team beslissing bij sprint 2 om dit te laten vallen en te documenteren als ADR was hij het eigenlijk niet mee eens. Maar dat durfde hij toen niet te zeggen. Omdat hij achter de schermen bleef 'doormodderen' kwam hij een week onvoldoende aan zijn issues toe. Gelukkig kon hij hier wel op reflecteren en heeft op de front-end in de week erna nog goed bijgedragen: (6-0.5
= 5.5
).
Teamlid Z heeft alle issues van X opgelost, en ook de hele front-end opgezet, en hierbij ook een BDD aanpak gerealiseerd waardoor vanuit de front-end de hele applicatie geacceptatest kan worden: 6+2
= 8
.
6. Beoordelingscriteria
Bij de beoordeling is uitgangspunt dus een ingevulde individuele bijdrage en uiteraard ook alles wat erachter zit qua product/configuratue en documentatie in gitlab/versiebeheer. De beoordelaars hebben verder ook indrukken beoordelaars tijdens SCRUM sessies en dergelijke. Tijdens het project hoef je niet alles te doen wat in de course behandeld is, maar je hebt hier wel gebruik van gemaakt en toont vormbehoud op de competenties uit de course fase (zoals ook vermeld in individuele bijdrage):
- DevOps-1 Continuous Delivery
- DevOps-2 GitOps
- DevOps-3 Containerization
- DevOps-4 DevSecOps
- DevOps-5 SlackOps
- DevOps-6 Onderzoek
- DevOps-7 Attitude
Verder kunnen beoordelaars ook algemene teamcompetenties meenemen zoals:
- Focus op kwaliteit en kwantiteit van het werk
- Pragmatisch houding (KISS) en rol pakken
- Teamgenoten helpen
- Kritische houding, focus op testen, security en reliability
- Aanspreekbaar zijn en verantwoordelijkheid nemen
- Nieuwsgierige en onderzoekende houding
FAQ Eindopdracht
Onderzochte technologie toepassen in beroepsproduct
Vraag: Ik kan mijn beoogde onderzochte technologie toch niet toepassen. Kan ik nu alsnog een voldoende halen voor het project?
Antwoord 1
Dit kan gebeuren. Want als je vantevoren al 100% wist dat de gekozen technologie ging werken dan was je gekozen technologie wellicht niet spannend genoeg...
Of je alsnog een voldoende haalt is afhankelijk van je motivering hierbij. Als je moet kort vooronderzoek de problemen al had kunnen voorzien, dan had je de technolgoie niet moeten onderzoeken. Het idee van praktisch onderzoek is wel dat je de resultaten gebruikt om om het toe te passen. Onderzoek alleen voor theorie doen we niet in dit project/vak (elders heeft dit zeker en plaats...)
Idealiter merk je aan het eind van het onderzoek al dat het onderzochte wellicht toch niet past. Soms stuit je op een bug of moeilijk te voorzien integratie probleem. Gebruik alsnog je geschreven blog post als referentie, mogelijk voor een in de toekomst. Of als genoemd/overwogen alternatief voor een wel gebruikte technologie of aanpak (denk aan decision forces diagram). Als er een bug is, geef dan een referentie naar documentatie waar dit staat. Of een issue in open source repo. Mocht deze er niet zijn, dan maak je deze natuurlijk zelf even aan, om de community al wat verder te helpen.
Als de enige reden dat je het niet toegepast is dat je hier geen tijd voor had is dit in principe niet geldig. Je moet dan althans in je documentatie nog een beschrijving geven hoe het wel toegepast kan worden. Bij wel voldoende tijd. Geef een oplossingsrichting.
Unieke technologie
Vraag: Ik wil dezelfde technologie onderzoeken als mijn teamgenoot
Antwoord 2
Dat mag niet :|. Het is de bedoeling je eigen specialisatie te hebben en niet het geehl met zijn tween te doen. Uiteraard mag je elkaar wel helpen en verder samenwerken. Als het een grote tool of framework is waar je beiden één aspect of feature van wilt onderzoekn mag dit wel. Stem dan onderling gezamenlijke zaken af en zorg dat je ook een eigen aspect. Licht deze situatie ook kort toe in de inleiding van je blogpost en verwijs naar elkaars blog posts, met een quote of parafrase waaruit de lezer een idee heeft wat het is en wat de verschillen zijn.
Week 9 - Presentaties, herkansingen, transfer naar project blok 2
- Les 1 - Eindpresentaties
- Vrijdag: Minor DevOps Workshop Maarten van Golen MCPS
De volledige formele eisen, competenties en beoordeling staan in de de OWE.
De beoordeling van het beroepsproduct is in de vorm van een teampresentatie van het gebouwde product, en live deployment. Tot slot geef je hier ook de als team eerder vastgestelde self assessment op basis van het Continuous Delivery Maturity Model (CDMM). Met ook verbeterpunten en/of richtingen van evt. known issues.
Op een andere dag een meer inhoudelijke review meeting ook met het hele team, maar dan met van alle teamleden toelichting van eigen bijdrage in product en kwaliteit hiervan. Hierbij laat je ook documentatie zien zoals C4 diagrammen, Architecture Decision Records en een goeie README. Maar de mondelinge toelichting vinden we minstens zo belangrijk als 'comprehensive documentation'. Dit is vergelijkbaar met de beoordelingvorm in het grote project in blok 2. Je code moet zoveel mogelijk voor zichzelf spreken (the code IS the design). Maar gekozen technologieen moet argumentatie voor zijn (DRY vs YAGNI e.d.).
Na de presentaties is deze week ook de herkansingsmogelijkheid van theorietoetsen. En eind van de week kennismaking met de opdrachtgever.
Week 9 - Herkansings(totaal)toetsen
Als je voor één of meer deeltoetsen een onvoldoende had en je cijfer wilt ophalen, of zelfs als je al voldende had, maar je cijfer gewoon wilt ophalen, heb je op deze dag een totaaltoets voor zowel de course Dev
als de course DevOps
. Je moet je wel vantevoren aanmelden via iSASOsiris. Het lokaal navragen bij de docent (of evt. in iSAS).
NB November 2023: De grote set Kubernetes oefenvragen uit Kahoots zijn ook in deze oefentoets gezet, i.v.m. lagere toegankelijkheid van Kahoots.
Vrijdag 3 november 2023 11:30-13:00 (lokaal: C1.06)
- 11:30 Lokaal open, intro en regels
- 11:35 TheorieToets Dev: Linux, C4, RabbitMQ
- 12:05 Einde/Pauze
- 12:15 Theorietoets DevOps: GitOps t/m SlackOps en DDD t/m EDA...
- 12:45 Einde/Evt. kort nabespreken desgewenst
- 13:00 Einde
Toetsregels
Cesuur 70%: max 12 fout voor voldoende (5,5).
-
Eén punt voor iedere 'multiple choice' vraag (tenzij anders aangegeven).
- Bij multiple choice is slechts 1 antwoord goed (of 1 antwoord is 'het beste').
- Voor open vragen is het aantal punten aangegeven.
-
Er zijn geen hulpmiddelen teogestaan zoals boeken, spiekbriefjes, websites of communicatiemiddelen toegestaan.
- Je mag alleen 1 browser open hebben met 1 tabblad (namelijk die met daarin deze online toets)!
- Voor de start van de toets graag je rugzak of tas met je telefoon, smartwatch en/of andere devices voorin de klas leggen.
- Evt. gebruikt kladpapier moet je bij het verlaten van de klas ook inleveren.
-
Je mag het lokaal verlaten pas na de helft van de toetstijd, en dan laptop en rugzak achter laten in de klas.
-
Mensen met 'extra tijd' regeling kunnen max 50% extra tijd krijgen. I.v.m. bepertke lestijd en nabespreking gaat dit wel ten koste van eventuele pauzetijd tussen 2 toetsen door.
-
Bij Digitale toetsen in Ans gaan via de Schoolyear safe browser
- Sluit de toets na het starten NIET meer af, dit ziet Schoolyear als fraude, en dan sluit deze je buiten
-
De digitale toets is 'Bring your own device', je moet Windows of macOS draaien (dus geen Linux, regel dan 'dual boot' of vraag anders tijdig een leenlaptop aan bij de HAN (dit kan via Osiris))
DevOps (voltijd)
"Let's do some major DevOps!"
In deze multidisciplinaire minor staat de moderne techniek DevOps centraal. In een DevOps-team werken developers en beheerders samen om nieuwe features van een applicatie te ontwikkelen, en tegelijkertijd de bestaande features draaiende te houden.
Hierbij is er veel aandacht voor het garanderen van een hoge beschikbaarheid van een applicatie. We gaan kijken naar loosely coupled micro services, event-carried state transfer, Docker, Kubernetes, RabbitMQ, unit testen, acceptatie testen, build- en release-pipelines, logging, monitoring, site reliability engineering, kort-cyclisch development en natuurlijk de samenwerking tussen Dev en Ops.
De minor bestaat uit twee gedeelten: een gedeelte met theorie en een kleinschalig project waarin zowel je theoretische als praktische kennis wordt voorbereid op het tweede deel: het uitvoeren van een grootschalige project voor een echte klant waarbij je je expertise optimaal kunt benutten. Beide delen worden verzorgd door de HAN en Info Support samen, waarbij de HAN vooral in het eerste en Info Support vooral in het tweede deal de lead zal nemen in de begeleiding.
Afhankelijk van het profiel dat je volgt, wordt aandacht besteed aan de volgende onderwerpen:
- Devops
- Test driven development
- Deployment-tooling (CD/CI-tools, containers, container orchestration)
- Management en beheer (configuration management, monitoring, logging, cloud providers)
- (Domain driven) design en design patterns
- OO-programmeren
- REST
- ORM
- Web- en applicatieservers
- Versiebeheersystemen (zoals Git)
- Operating systems
- Netwerken, security en protocollen
- Proxies, load balancers, firewalls
Leerdoelen
Na het volgen van deze minor beschik je over de theoretische en de praktische kennis om een continuous delivery-project in te richten en uit te voeren in een professionele organisatie.
Aanvullende informatie
Voor meer informatie:
info@han.nl | T (024) 35 30 500 van 09.00 tot 16.30 bereikbaar | www.han.nl
Contactpersoon minor
Ralph Niels E-mail: Ralph.Niels@han.nl
Inschrijven? Goed om te weten!
Bij populaire minoren vindt 3 tot 4 weken na het open gaan van de inschrijvingen een loting plaats áls er op dat moment meer inschrijvingen zijn dan beschikbare plaatsen. Bij de minoren waar nog plaats is, geldt daarna tot aan de sluiting van de inschrijfperiode: zodra een minor vol is, wordt deze gesloten, vol = vol.
Daarnaast geldt dat als het aantal aanmeldingen na drie weken ruim onder de norm ligt; deze minor mogelijk wordt teruggetrokken. Dus heb je interesse, meld je direct aan.
Schrijf je op tijd in!
Let op: Voor HAN studenten geldt dat zij zich, in geval van uitloten of geen doorgang van de eerste keuze NA de periode van besluitvorming (deze duurt ca. 3 weken), kunnen herinschrijven. Dit kan alleen op de dan nog beschikbare minoren die plaatsen vrij hebben.
Ook dan geldt: zodra een minor vol is, wordt deze gesloten, vol = vol.
Een goed overzicht van de HAN minoren kun je vinden in de minoren app! De app is bereikbaar via: http://www.minoren-han.nl/
Ingangseisen
Studenten HBO-ICT van de HAN die een development-profiel volgen of het profiel ISM volgen.
Toetsing
Er zijn voor beide courses 2 deeltoetsen (totaal 4 theorie toetsen). Verder zijn er wekelijkse verplichte oefeningen voor DevOps course ook oefeningen voor sommige Dev workshops. Verder is er een individueel onderzoek voor de Dev course waarvoor je een verslag moet schrijven (blogpost).
Tot slot is er een DevOps beroepsproduct waar je met een team 2 weken aan werkt en tot slot presenteert voor beoordelaars en ook individuele bijdrage aan toelicht tijdens een review sessie.
De toetsing is de standaard projecttoetsing met een tussentijds groepsbeoordeling en individuele beoordeling en hetzelfde op het eind. De beoordelingscriterie en eisen tijdens het project volgen begin van het project.
Zie details overweging en beoordeling in de OWE.
Rooster
Er wordt vanuit gegaan dat studenten van maandag t/m vrijdag beschikbaar zijn, dus bijbaantjes of andere vakken van maandag t/m vrijdag (9.00-17.45 uur) volgen is geen optie.
De roostering zal plaatsvinden zoals bij AIM gebruikelijk: in de coursefase 4 tot 6 maal per week een dagdeel les (verder zelfstudie) en in de projectfase 40 uur per week projectwerk.
Werkvormen
- Werkcolleges
- Projectopdracht
Deze tekst staat ook op kiesopmaat.nl (dd, 1 feb 2021)
DevOps tools (tech in deze minor (logo attributie)
Presented by:
Courses - Blok 1 bij AIM
- git
- Markdown
- Docker
- OpenNebula
- Kubernetes
- GitLab
- GiHub
- Java
- Cucumber
- RabbitMQ
- ELK
- npm
- Ansible
- DevOps schema
- DotNet core
Project - Blok 2 bij InfoSupport
- Argo
- Azure
- Azure DevOps
- React
- Java 11
- Docker
- Kubernetes
- Argo
- Micronaut (todo logo)
Logo's
DevOps lijst van concepten
Onderstaande tabel bevat een lijst van woorden, of — beter — concepten (want een concept bestaat soms uit meerdere woorden). De tabel bestaat nu vooral uit een toelichting op de checkpunten uit het CDDM beoordelingsmodel. Voor het beantwoorden van vaker terugkomende vragen zoals:
Wat wordt er bedoelt met het punt BD-203 - Build Once deploy anywhere?
Hoe dan ook, van deze termen moet je de betekenis kennen als je de minor hebt gevolgd. Alleen de uitleg in de tabel lezen is niet altijd voldoende voor goed begrip. Je moet ook de context uit de les erover kennen. Maar het kan wel een begin zijn, of manier om snel iets terug te zoeken.
Toelichting
In de DevOps minor leer je DevOps tools en DevOps concepten. Nu zijn tools meestal tijdelijk, zeker in een snel ontwikkelend vakgebied als DevOps. Maar (basis) concepten hebben een veel langere houdbaarheid, goede concepten zelfs oneindig...
Figuur 1 toont ludiek wat termen uit het wild, waar je ook veel buzzwords tegenkomt. Als DevOps professional moet je onderscheid kunnen maken tussen waardevolle concepten, en buzzwords.
In ieder geval is het doel wel dat deze termen ook aansluiten bij de beroepspraktijk en bestaande DevOps terminologie. De meeste woorden zijn dan ook Engels.
Hoewel de meeste feitelijk ook Nederlands zijn, of feitelijk deel uit maken van de internationale DevOps taal of jargon. Idealiter, als een concept een goede 'semantische' naam heeft, is ook voor ICT'ers de Van Dale soms een aardig begin. En zou je de originele betekenis/oorspring niet altijd terug moeten zoeken ('Death of the author' principe). Maar in de praktijk is vaak enkel de termn maar is dit niet toereikend heb je meer bronnen nodig om deze` goed te begrijpen (zie het voorbeeld uit figuur 3).
Figuur 2: Discussie thread op Twitter X over 'deployment' vs. 'release' (bron: Steve "ardalis" Smith 9-11-2023 op X)
Het plaatje in Figuur 2 toont een (vrij) recente discussie rondom checkpoints CO-302 uit het CDMM.
Concept/begrip | Uitleg |
---|---|
DevOps | Cultuur van samenwerken |
Green field vs. brown field | Nieuwbouw project vs bestaand project en/of nieuwe/nieuwste technologie vs legacy technologie. |
TODO | ... |
OA-001 Geconsolideerd platform & en technologie | Dit betekent dat je als organisatie een keuze hebt gemaakt qua technologie, meestal met erbij horende training, ervaring van huidige medewerkers. Bijvoorbeeld Java, of dotNet. Of Wordpress voor simpele corporate sites maar SiteCore voor complexere sites, en of multi-tenant opdrachten. Dit hoort bij lagere niveaus, omdat je bij microservices aanpak juist 'Polyglot X' kunt doen, zoals InfoSupport dat noemt, om programmeertaal of stack te laten varieren per microservice. Maar aanname is hierbij wel vaak weer een basis technologie als Kubernetes of Docker Swarm o.i.d die deze polyglot X mogelijk maken. Kortom: deze krijg je eigenlijk gratis bij gebruik PitStop, mits je gebruikte technologie maar documenteert. |
BD-006 Enkele deployment scripts bestaan | Dit zijn wat handmatige deploy scripts die als basis kunnen dienen voor automatisering op de hogere levels (e.g. 'automate all the things'). |
BD-101 Polling builds | Ik ga uit dat dit polling model is waarbij in plaats van dat je 'git distribution' (bv. GitHub met GitHub Actions) recht geeft te pushen naar de (runtime) omgeving via opslaan credentials o.i.d., er een tool is op een andere plek die periodiek checkt (bv. elke minuut) of er in je Git repo of ander versiebeheer een nieuwere versie staat en zo ja dan die code pakt, build en containerized en evt. test. Merk op dat het testen van de build onlosmakelijk verbonden is met Continuous Integration in de definitie van Martin Fowler’s hiervan: "Each of these integrations is verified by an automated build (including test) to detect integration errors as quickly as possible." |
BD-203 Build Once Deploy Anywhere | Dit 'BODE' principe houdt in dat je één keer een artefact bouwt, zoals een .jar , .war , of een Docker-image, en ditzelfde artefact gebruikt voor alle omgevingen: van test en staging tot productie.Je koppelt een specifieke commit aan het artefact en automatiseert tagging en versiebeheer, zodat je elke build uniek kunt traceren.Je beheert configuraties buiten het artefact via omgevingsvariabelen, in lijn met het 12 Factor App-principe. Door configuraties niet hard mee te bouwen, voorkom je de noodzaak om omgevingsspecifieke artefacten te maken, zoals spotitube-prod.war of spotitube-staging.war. Met één geteste en goedgekeurde build kun je direct deployen naar productie, zonder opnieuw te bouwen. Je standaardiseert het deploymentproces over alle omgevingen. Dit proces omvat ook geautomatiseerde database-migraties en gescripte runtimeconfiguratie-aanpassingen. Door deze aanpak creëer je een uniforme delivery pipeline die alle stappen omvat: van source control tot productie. Dit minimaliseert fouten, verhoogt de betrouwbaarheid en versnelt het deploymentproces. Met tools zoals ArgoCD en andere CI/CD-oplossingen automatiseer je het combineren van configuraties met de artefacten en rol je deze efficiënt uit naar meerdere omgevingen. |
BD-204 Automatiseer meeste DB wijzigingen | Dit punt kun je bv. afvinken met het gebruik van de in de course fase (kort) behandelde Entity Framework (EF) Code first aanpak. Deze ondersteunt (automatische) data migraties (o.b.v. een 'single source of truth', namelijk de code). Maar alleen het gebruik van EF is voor dit punt echter niet voldoende. Je moet dan ook minstens één voorbeeld hebben van een daadwerkelijke en 'niet triviale' data migratie. Vaak hebben teams een standaard migratie voor het opzetten van de initiële database. E.g. een migratie van 'niets' naar iets. Of deze is evt. opgesplitst in een 'create' stuk en een 'insert' migratie, maar ook dat is nog triviaal (e.g. simpel). 'Niet triviaal' wil zeggen dat je de databasestructuur verandert door bijvoorbeeld een tekstveld om te zetten naar een foreign key naar een stamtabel (vaak hoort hier wijziging in de UI bij van een vrij tekstveld naar een dropdown, en/of back-end veld omzetten naar Enum i.p.v. String o.i.d.). Bij deze structuur wijziging moet je ook bestaande data migreren in je Up() én Down() methode. Of alles goed gaat moet je dan vervolgens testen, en typisch is handmatig schrijven van wat migratie code nodig. Voor afvinken moet je zo'n (voorbeeld van) een migratie ook kort toelichten in je CDMM of elders. Helemaal interessant maak je het als je een serie van wijzigingen hebt die je apart lokaal test, maar vervolgens op een test omgeving gecombineerde doorvoert (migreert) en test, liefst ook tegen kopie van productie, of gelijkwaardige set om te voorkomen dat je dit als eerste op productie doet en hierbij pas eventuele integratie problemen optreden. Let wel, dat dit is in een kleine project wel lastig te verwezenlijken. Dit vraagt ook een goede toepassing binnen het domein en afstemmen met de opdrachtgever. Als er voor de opdrachtgever geen winst in de nieuwe datastructuur zit, is de effort moeilijke te verkopen. Voor dit punt helpt het wel om heel vroegtijdig live gaan (in week 1 of 2) met een simpele datastructuur en ook bijbehorende test dataset. En hierop ook de opdrachtgever of andere testers laten werken om productie achtige gegevens in te voeren. Op deze test data kun je daarna je (niet triviale) migratie kunt doorvoeren. |
BD-206 Gescripte config wijzigingen | Als je config wijzigigingen gescript hebt, kun je dit script testen op een test omgeving, en checken dat config wijzigingen doen wat je wilt, voordat je het op productie ook doet. Voorkomt fouten en zorgt voor herhaalbaarheud. Versnelt ook het proces, omdat je niet handmatig stap voor stap de config wijzigingen uit moet voeren, of op productie foutgevoelig met een editor config aanpast. |
IR-402 Cross Silo analysis | Dit punt uit Information & Reporting is geavanceerd en vereist de nodige domeinkennis en overzicht van de organisatie. Dit punt is gelieerd aan Conway’s Law over de link tussen de structuur van de applicaties/microservices en de structuur van de organisatie die de applicaties gebruiken/laten bouwen. Basis eis is dat je meerdere microservices draait die Kan je systeem ook metrieken rapporteren waardoor je verbanden tussen verschillende organisatie onderdelen (silo's) kunt zien? Dat je organisatieonderdelen onderling kunt vergelijken op bepaalde aspecten? Zulke informatie geeft voor een bedrijf vaak optimalisatie mogelijkheden. Zoals InfoQ aangeeft: "Moving to expert level in this category typically includes improving the real time information service to provide dynamic self-service useful information and customized dashboards. As a result of this you can also start cross referencing and correlating reports and metrics across different organizational boundaries,. This information lets you broaden the perspective for continuous improvement and more easy verify expected business results from changes." |
CO-201 Multidiscl. team (betrekken DBA, CM) | In plaats van een aparte developer team en operations team (die CM=Configuration Management) doen. En wellicht ook aparte DB admin of admins, plaats je iedereen in het team, zodat mensen vroegtijdig(er) overleggen (shift left), en wijzigingen niet tijdens deploy aan het eind vastlopen, omdat een probleem bovenkomt die iemand van andere discipline had kunnen zien aankomen. Denk bijvoorbeeld ook aan security mensen (e.g. van DevOps naar een DevSecOps team). |
CO-202 Component eigenaarschap | Hoewel het hele team verantwoordelijk is voor alles, is het wel goed om een of enkele mensen eigenaar te maken van een component. Denk bij een component bijvoorbeeld aan een microservice. Dit sluit ook aan bij de 'Pizza rule' uit DevOps (NetFlix): het team verantwoordelijk voor 1 microservice moet (bij onderhoud) aan 1 pizza genoeg hebben. Dus 2 of 3 mensen? |
CO-203 Handelen op metrics | Studenten vraag: > "[...] Hoe zouden wij dit moeten uitvoeren in dit project? We hebben niet echt gebruikers waarop we kunnen reageren." Antwoord: Als er geen echte gebruikers zijn, moet je deze faken. Sowieso is het een best practice om een test dataset aan te leggen in een database of andere data storage. Ook om je requirements duidelijk te krijgen, en gekozen abstracties te testen. Dit onder de noemer “Sometimes three good examples are more helpful to understand the requirements than a bad abstraction.”' - Peter Hruschka (domainstorytelling.com, 2023). |
CO-206 Decentrale besluitvorming | Agile is naast cross-functional en collaberatief ook niet hiërarchisch (Wrike, z.d.). Er is dus NIET één baas, voorzitter of product owner die alles beslist. De product owner is weliswaar verantwoordelijk voor houden van overzicht van het product en WAT erin komt. Maar HOE je dit realiseert besluiten de teamleden samen, en voor decentrale besluitvorming betekent dit dat een beslissing idealiter bij de persoon die de meeste relevante kennis heeft, qua domein en/of technisch (zie ook <a href="CO-202>CO-202 Component eigenaarschap). Een probleem kan ook om 3:00 's nachts optreden, en idealiter kan er op dat moment ook een beslissing genomen worden om het op te lossen, zonder 'de baas' uit bed te bellen om een beslissing te nemen over wel/niet release van een fix en evt. release. Wel houdt CO-206 in dat je ook samen een proces opzet, waarbij je met hele team later bv. een post mortem over zo'n issue houdt, en meer structurele fix inplant, na een nachtelijke work-around/bugfix, en bv. ook je (DevOps) proces optimaliseert om kans op een soortgelijke fout later te verkleinen. Terzijde: er is ook een interessante link tussen 'decentral decision making' en het concept 'epicrocacy' zoals beschreven door Jason Brannon in zijn 'scherpe' boek 'Against democracy' (2017, voor de duidelijkheid: geen ICT boek :P). |
CO-301 Dedicated Tools team | Er is een apart team in het bedrijf dedicated gericht op DevOps tools inrichten, beheren en onderzoeken. Sinds circa 2022 kwam dit principe ook onder de noemer Platform Engineering naar voren (State of DevOps, 2023). Dit houdt in dat er één apart team verantwoordelijk is voor het 'platform' waarop de IT draait. Dit lijkt op een soort interne 'Platform as a Service (PAAS)', maar sommigen spreken liever van 'Platform as a Product' (taloflow.ai, 2024, teamtopologies.com, 2021). Of pessimistisch (of realistisch?) gezegd: Het team van 'DevOps tools experts' is zo druk met hun werkzaamheden, dat ze geen tijd meer hebben voor ontwikkelwerkzaamheden in regulier teams. NB: Merk op dat het woord 'apart' een beetje indruist tegen de 'DevOps cultuur' van 'break down silo's. En een 'specialistisch' team gaat ook tegen het multi-disciplinaire karakter van DevOps teams, waarbij ook juist een Polyglot X aanpak mogelijk is. Dus dat elke deelapplicatie/microservice een andere techniek heeft (the right tool for the right job). Ook bij polyglot X is echter het (container) platform meestel wel geconsolideeerd (dat wil zeggen er zijn regels over, zodat alle teams in het bedrijf dezelfde taal en frameworks gebruiken). Dit is bijvoorbeeld Kubernetes en de de DevOps aanpak geeft veel nieuwe andere tools en technologie die aansluiten bij DevOps zoals Git, Kubernetes, Ansible, Argo. Iedereen kent de basis, maar een expertise team op dit gebied levert voor grotere bedrijven wel winst op. |
CO-302 - Deployment loskoppelen van release | Hoewel ICT'ers de termen 'release' en 'deployment' vaak als synoniemen gebruiken, geeft dit CDMM checkpoint aan dat een volwassen DevOps deze 2 van elkaar los kan koppelen. Een release is een set samenhangende wijzigingen, een product increment in Scrum termen. Het 'increment' samen met het product samen leidt tot een potentially shippable product. Een nieuwe versie van je applicatie. Het 'potentially' stelt eisen aan dat de nieuwe features (voldoende) bugvrij zijn, en samenhangend. Maar het laat dus vrij of je de nieuwe versie ('release') daadwerkelijk beschikbaar stelt voor naar eindgebruikers ('productie'). Dit is dan een 'business beslissing'. Het loskoppelen heeft twee varianten. Je kan er de nieuwe release alleen deployen op een (accceptatie test omgeving, en dan beslissen er op door te itereren door nieuwe inzichten die je krijgt. Je kunt ook via bv. een 'dark release' of 'feature toggle' de onderliggende code van de functionaliteit wel degelijk opleveren, maar deze nog niet activeren (feature toggle) of bereikbaar maken (dark release). Het 'loskoppelen' gaat erom dat je dit makkelijk in kunt stellen, zodat de twee concepten 'release' en 'deployment' duidelijk van elkaar gescheiden zijn. Zie figuur 1. |
OA-001 Geconsolideerd platform & technologie | Een bedrijf kiest voor een enkele technologie, of combi van bij elkaar passende technologieen (e.g. stack) voor alle applicaties. Bv. Windows (platform) en GEEN macOS. Of programmeertaal/ontwikkelomgeving .NET. Dus een medewerker kan dan niet bij een nieuwe opdracht opeens Java kiezen, ook al is er wellicht een library in Java die al 50% van de requirements vervult, die er (nog) niet voor .NET is. En een developer kan ook niet een Elixir project kiezen voor opdracht waar dit past (maar hoge concurrency eisen bv. proberen te voldoen via gebruik RabbitMQ). Of "Geen MySQL, want "we hebben een SQL Server licentie, en 3 DB admins met MS DP-300 certificaat. Dit is erg pragmatisch en komt dus veel voor, want geeft standaardisatie, maar is tegelijkertijd wel de tegenhangen van de Polyglot X aanpak die DevOps in principe mogelijk maakt (merk op dat Polyglot X zeker niet verplicht is bij DevOps). |
CO-402 No rollbacks (always roll forward) | Dit checkpunt vereist wat zelfstudie, want dit punt vraagt wat verdieping en kun je over discussieren. Lees bijvoorbeeld kritische beschouwing van Jim Bird over roll forward en andere DevOps best practices of misconcepties (Bird, 2011). Dit punt moet je discussieren en toelichten als je dit punt wilt afvinken in je CDMM, met liefst beschrijving van eigen concrete situatie in je software ontwikkeltraject waar je een roll forward deed, of juist automatische rollback kon doen, en hoe dan. |
OA-102 API-gestuurde aanpak | De microservices praten met elkaar met (geconsolideerde) interface, bv, RESTful API's of service bus (of RabbitM!). Dit maakt PolyGlot X aanpak mogelijk, niet alle applicaties hoeven bv., meer in Java (voorloper aanpak voor innovatie is andere taal op zelfde Virtual Machine zoals JVM (met Java, Kotlin, Scala)) of .NET met C#, F# of VB.NET voor CLR. |
OA-203 Configuration as Code (CaC) | De (software) configuratie van een applicatie staat OOK in versiebeheer, zodat je het verloop hiervan over de tijd kunt zien en terugvinden (ivm auditing ook: wie heeft op 28 oktober deze setting aangepast?). Evt. kan configuratie hierbij in aparte repository staan dan code in verband met security, waar andere mensen (dan developer) verantwoordelijk voor zijn (denk aan connection strings die anders toegang tot productie db zouden geven (niet confogm AVG/GDPR)). Denk bij configuratie aan welk OS, welke software/middleware, maar ook zaken als welke software instellingen zoals IP adressen van machines). Verder kun je naast configuratie van applicatie zelf, ook denken aan configuratie van bijvoorbeeld een deployment pipeline die je applicatie build uit de code en oplevert naar een (runtime) omgeving. CaC vraagt dus de 'scripted pipelines' van Jenkins 2.0, de oude 'via UI' manier in Jenkins 1.0 geldt niet als CaC (maar wellicht kun je via UI ingestelde settings wel exporteren en dan inchecken in VCS en daarna hiermee verder werken). Hier is verder veel online over te vinden. |
OA-205 Modules omzetten naar componenten | De monoliet is al wel modulair opgezet, de bestaande modules hang je in eigen microservice, bv. met eigen Docker container, zodat je ze los van elkaar kunt gaan opleveren. Heeft als potentieel probleem wel 'testing pyramid of hell' |
OA-301 Volledige component gebaseerde architectuur | Next level van OA-205, met het 'strangle pattern' is een evt. oude monoliet (volgens 'monolithFirst' aanpak van Fowler) volledig omgezet in microserves |
OA-302 Graph business metrics uit applicatie | Naast de standaard metrieken die bv. Grafana kan geven van cpu, geheugen en bandbreedte gebruik heb je ook custom metrics gemaakt, die ook voor de business waarde hebben. En die frequent geupdate zijn, zodat business hierop ook kan sturen, en experimenten kan doen qua business logica in de markt en zien hoe deze uitpakken (bv. A/B testen). |
BD-104 1e stap naar standaardisatie deploys | Meerdere teams gebruiken zelfde stappenplan voor deploy (bv. geconsolideerde keuze is SQL Server, en men switcht van .bak bestanden naar nieuwe BacPac) en/of gebruikt Azure Cloud voor alle producten. |
BD-206 Gescripte config wijzigingen | De bij BD-203 genoemde config (bv. systeemvariablen) test je ook op een test omgeving VOORdat je op productie test door een script te maken die je kunt uitvoeren. Sluit aan bij 12factor principe van one off Admin processes. Onder config wijzigingen kun je overigens naast omgevingsvariabelen ook andere config denken, zoals update van dependency bij security issue, maar bv, zelfs aanpassingen aan het database schema zien (SQL DDL scripts). In een ORM gebruik je hiervoor bv 'db migration scripts/code. |
BD-401 Build bakery | Dit is een heel breed onderwerp, wat teruggaat naar de begintijd van Virtualisatie, met Amazon Machine images, maar wat feitelijk volwaasen is gemaakt door container registries en runtimes a la, waarbij je bv. een door veel applicatie hergebruikte base image hebt, met aparte config voor de specialisatie ervan (e.g. Dockerfile met CMD apk install tool-x ). Vink dit punt NIET zomaar af als je Docker gebruikt, maar verdiep je in bron en argumenteer zelf waarom je hieraan voldoet. |
BD-402 Zero touch continuous deployment | Geen handmatige inmenging meer nodig voor een deploy, een commit leidt automatisch tot nieuwe versie op productie, idealiter met gradual release maar dat valt hier niet bij, via de pipeline (mits linting, unit tests, automatische integratie tests etc. ). Merk op dat in projecten waar nog handmatige tests zijn dit niet altijd gewenst is, maar idealiter gebeurde dit plaats op test omgeving, en kun je via BODE principe (BD-203) risicoloos ermee naar productie via commit op main . |
TV-201 Automatische component test (geisoleerd) | Geautomatiseerde integratie en/of UI test van een microservice, waarbij gebruikte dependent microservice gemockt zijn |
IR-101 Meet het proces | InfoQ heeft bij het 'measure the process' stuk het voorbeeld van een aantal metrieken rondom het software ontwikkelproces zoals cycle-time of delivery time. Het proces meetbaar maken betekent dat je weet hoe lang een release duurt, dus het runnen van de pipeline. Of dat je weet hoeveel bugs er open staan op een component. En wat de gemiddelde fix tijd van een bug is. Of hoeveel bugfixes er in een release zitten. Het uberhaupt in kaart brengen is het begin van ook weten waar bottlenecks of probleemgebieden zijn in je software landschap. Waar zitten de moeilijke onderhoudbare 'big ball of mud' monolieten. Of welke modules leveren vaak bugs op. En voor de release van welke service moet je altijd een paar developers klaar hebben. Meet het proces gaat echter alleen over het inzichtelijk hebben van zulke informatie, en nog niet over het verbeteren op basis hiervan. |
IR-201 Gedeeld informatie model | Dit punt is op twee manieren op te vatten. De eerste, zoals binnen InfoQ's artikel vooral bedoelt gaat het over het informatie model van het software ontwikkelingsproces zelf. Zoals je ook metrieken voor bepaakt onder IR-101. Dit informatiemodel gaat over releases, indienen van bepaalde requirements, deze formuleren als requirements en hier bijvoorbeeld unit tests of acceptatie tests voor opstellen. Ook het indelen van de software in modules of componenten (=typisch microservices), en dan de namen van deze microservices of modules. Dit is dus op meta niveau ten opzichte van het 'domeinproces' waarover de ontwikkelde applicatie gaat, en waarop ook een informatiemodel van toepassingen is. Dit gaat dan om entiteiten en hun eigenschappen zoals zichtbaar in het domeinmodel. Om aan te kunnen geven hoe het release proces verloopt, welke feature net is gereleased, of voor een komende release gepland is, of hier nog issues voor open staan, of om terug te zoeken op welke omgeving het staat, of wie dit daar gedeployed heeft, moet iedereen (of in ieder geval de juist mensen) dit terug kunnen halen uit bijvoorbeeld een code mangement systeem, een log van gedraaide pipelines, of overzicht van containers en hun versies in een container registry. Voor dit punt kun je ook denken aan het informatiemodel van de applicatie en van het domein en diens subdomeinen zelf. Denk hierbij aan DDD's ubiquitous language. Dit is een door iedereen gedeelde lijst van woorden, e.g. een 'alomvertegenwoordige taal' in een organisatie. Deze gebruiken dus zowel business mensen tijdens het werk, als developers in hun broncode (class names, foldernamen, variabele namen, methodenamen etc.). Dit houdt in dat de hele organisatie bedoelt hetzelfde met een bepaalde term. Of als één term meerdere dingen betekent in verschillende contexten, zoals bijvoorbeeld verschillende afdelingen van het bedrijf, dan zijn deze (bounded) contexts duidelijk en bekend, en is voor elke context een definitie van de term. In een microservice architectuur heeft idealiter elke microservice eigen opslag (autonomy over authority) en synchroniseer je geen informatie direct via de database (maar heb je validation layer (DDD)) |
IR-202 Traceerbaarheid ingebouwd in pipeline | Traceren of 'tracing' gaat over het achterhalen van fouten/bugs in software. In een DevOps omgeving denk je dan eerder aan fouten in productie (of staging), i.p.v. nog lokaal (development) waar je deze fouten kunt debuggen in je IDE. Het gaat hierbij ook vaker om integratie bugs. |
IR-301 Graphing-as-a-service | Er is een aparte service die op aanvraag en redelijk gestandaardiseerd grafieken kan aanleveren. In plaats van dat elke applicatie dit intern zelf doet, en elk op eigen wijze. |
IR-303 Report trend analysis | Gelieerde aan IR-402, maar in plaats van Cross Silo kan in ieder geval binnen een Silo/service/organisatie onderdeel grafieken of gegevens worden opgevraagd, maar dan wel over een bepaalde tijd, om verloop te kunnen analyseren (trend). |
IR-401 Dynamische grafieken en dashboards | Spreekt hopelijk voor zich? Realtime of i.i.g. 'near realtime' data uit productie op dashboard scherm ook bereikbaar voor business mensen. Bv. het aantal openstaande issues op schermen in team work garden, maar wellicht ook direct inzichtelijk maken als/dat server geheugen volloopt, of tonen van aantal mensen momenteel in check-out scherm van webwinkel (of vergelijkbare 'custom metric' in ander/eigen domein). |
OA-401 Infrastructure as Code (IaC) | Deze term is te vergelijken met Configuration as Code (CaC OA-203), alleen in plaats van de software configuratie beschrijf je nu de hardware configuratie als code. Oftewel: op welke infrastructuur gaat je software precies draaien. Dus welke CPU, hoeveel geheugen, hoeveel harde schijfruimte, maar bv. ook of bandbreedte. Voor echt hardcore IAC hoort hier ook het type hardware nog bij, zoals heb je Intel processor nodig, of AMD of een Apple M1 o.id., is je harddisk een (snelle) SSD (solid state disk) of ouderwetse magenetische schijf. Typisch gezien doe je dit bij Cloud providers, die dit soort hardware ook kunnen leveren. De precieze opties die je hebt hangen dan ook af van de Cloud provider die je gebruikt. Verschillende cloud providers hebben ook verschillende naampjes voor de machines. Er zijn ook wel speciale IaC tools/talen om meer generiek een config in te schrijven, zoals Cloudformation voor AWS (Amazon Web Services) of Azure Resource Manager (ARM, niet te verwarren met de (RISC) processor met hetzelfde acronym). Deze geven dus een soort abstractielaag om niet alle details te hoeven kennen, en minder afhankelijk te zijn van wijzigingen in hardware die er zijn. En er is zelfs cloud agnostische Terraform (hoewel de machine namen in deze config taal vaak alsnog cloud specifiek zijn). Vergeet ook niet dat je voor IaC ook tools moet hebben die deze config moeten kunnen uitvoeren (anders is het slechts een 'spec', geen code). Dit punt zit dus erg aan de OPS kant, en kun je NIET zomaar afvinken, maar moet je je echt verdiepen in IAC. Als developer wil je je vaak je software juist enigszins onafhankelijk maken van onderliggende hardware details, maar uit handen laten nemen door in te stappen op een 'X As a Service model'. Als er speciale eisen zijn, zoals gebruik GPU's i.p.v. CPU's voor bv, grafische toepassingen, of machine learning kan dit echter niet altijd meer, of als je heel grootschalig gaat werken kun je je kosten besparen als je dit zelf doet. Een goede aanzet voor dit punt, om het 'half af te vinken' kan wel zijn dat je in Kubernetes horizontal podscaling instelt ën je containers draait met zogenaamde Quality of Service instellingen hebben, dus echt vermelden van hardware karakteristieken zoals minimale CPU snelheid en harddisk ruimte. |
CDMM Q&A
Q: Kunnen wij het punt CO-305 - Continuous improvement al behalen door retrospectives uit te voeren over ons individuele handelen en onze processen? A: Niet helemaal, je moet naast probleem analyse (retro), ook verbeterpunten concreet formuleren (denk Transfer uit STARRT methode) en ook doorvoeren in opvolgende sprints (of kunnen uitleggen waarom een voorgenomen improvement in de praktijk er toch niet van kwam) Q: Wat bedoelen jullie met het punt BD-207 - Standaard proces voor alle omgevingen? A: Dit gaat vooral over het deploy proces. Als antwoord een schets van een situatie waarin een team een verschillend proces per omgeving hanteert. Zonder standaardisatie verloopt het deploymentproces verschillend per omgeving:
- Op de developmentomgeving gebruiken teamleden handmatig commando’s om de app te deployen.
- Voor staging upload je bestanden via FTP.
- Production vereist speciale scripts die uniek zijn voor de live-omgeving.
Deze verschillen leiden tot fouten, zoals configuratiemissers, vergeten updates, of inconsistente versies tussen omgevingen.
Q: Voor BD-302 - Meerdere build machines: mag mijn teamgenoot die runnen op zijn VPS? A: Ja
Q: TV-302 - Performance test? Wat moeten wij performance testen? En hoe uitgebreid? A: Performance kritieke onderdelen. Early optimisation is the root of all evil. Zei eens iemand. Maar er kwam nog wat achteraan. En performance is ook een feature, die veel geld of andere waarde (minder verspilde tijd) kan opleveren in sommige domeinen. Dus zo uitgebreid als nodig is om probleem in kaart te krijgen, maar mits het past in jullie tijdsbesteding. Stem af met opdrachtgever. Je moet echter ook wat onderzoek doen in het project, je bent met een heel team. Dus je kunt best goede tools en/of aanpakken onderzoeken. Bv. een profiler in je IDE. Of een load test tool als K6 voor webapps.
Nog over faken data: fake it till you make it
In kader van het 'shift right' is het goed om al tijdens ontwikkelen vooruit te kijken naar relevante metrics die je kunt verzamelen en waarop de business kan handelen. Dit is wel eens beschreven als een soort 13e factor als uitbreiding op de 12factor app principles. Namelijk als 'Telemetry' (namelijk in het boek van Kevin Hoffman (2016))
I like to think of pushing applications to the cloud as launching a scientific instrument into space. [...] If your creation is thousands of miles away, and you can’t physically touch it or bang it with a hammer to coerce it into behaving, what kind of telemetry would you want?
Bronnen
- Hoffman, K. 1st edition, april 2016. Beyond the twelve factor app - Exploring the DNA of Highly Scalable, Resilient Cloud Applications. Oreilly, Pivotal. Geraadpleegd op 23-10-2023 op https://www.cdta.org/sites/default/files/awards/beyond_the_12-factor_app_pivotal.pdf
- Hofer S. & Schwentner H. domainstorytelling.com (2023) Domain Storytelling: Quick-Start Guide - Feeling lost? Workplace Solutions Geraadpleegd 23 oktober 2023 op https://domainstorytelling.org/quick-start-guide#feeling-lost
- Bird, J (2011) Rolling forward and other deployment myths. DZone. Geraadpleegd laatst op https://dzone.com/articles/rolling-forward-and-other
- Smith, Steve "ardalis" (9-11-2023). Deployment vs Release. X Geraadpleegd 13 nov 2023 op https://x.com/ardalis/status/1722728350437757320
- Brannon, J. Against democracy Boekbeschrijving geraadpleegd 23 oktober 2023 op https://www.bol.com/nl/nl/p/against-democracy/9200000075205551/
Werkwijze bij DevOps weekopdrachten
Denk aan onderstaande punten bij het maken van de weekopdrachten
- Gezamenlijk backlog/issues in GitLab, samen opstellen/verdelen
- Kleine frequente commits (en commit op de gemaakte issues)
- Schrijf op het eind als team samen een self assessment van jullie werk a.d.h.v. het CDMM
- Lever in via assignen issue aan docent (+een git tag)
- Vorm telkens duo's of grotere teams en wissel, afhankelijk van de weekopdracht
Hieronder verdere uitleg per punt.
1. Gezamenlijke backlog
Binnen Agile en DevOps is een gezamenlijke backlog ook een best practice (= "CO-101 Eén backlog per team"). Maak voor je opdracht in GitLab een planning bord aan met ook achterliggende issues aan in de reposiotory en verdeel de taken onderling (assign) op een logische manier (ieder ongeveer de helft).
Neem hiervoor samen kort opdracht door en kies korte maar logische issue titels. Gebruik issue nummer(s) ook in je commit messages, zodat je vanuit issues daarna ook door/terug kunt klikken naar gedane commits. Vergeet daarbij niet het gebruik van hekje #
, bv. Fixt issue #23 domeinterm nu 'pink' ipv 'piglet'.
2. Aanhouden Git versiebeheer (best practice)
Tijdens deze course doen we versiebeheer met git. Je commit je uitwerkingen. Hanteer hierbij git (en devops) best practices, zoals:
- use small commits
- commit often
- write clear and short commit messages
- werk samen (beiden committen!)
- werk op zelfde branch of merge regelmatig
3. Self assessment
- Schrijf SAMEN een korte reflectie en voeg toe in je README of je je aan de best practices hebt gehouden (hierboven genoemd)
- Bekijk een aantal relevante punten uit DevOps maturity model (CDMM), Code én naam/korte beschrijving checkpunt, en geef aan of je hier aan voldoet en beoordel op welk niveau je staat in. Waarom niet, en noem verbeterpunten (bv. CO-101, CO-105, CO-205, CO-003, OA-201, OA-202, BD-103, TV-001)
- Zijn er nog meer punten relevant? Geef waar nodig toelichting waarom jullie wel voldoen of niet, en welke punten verbetering behoeven en welke nog niet relevant waren
- Tag de versie met git als het af is met een 'major versie'
1.0.0
en push alles. Maak een issue getiteld 'Nakijken' aan in GitLab en wijs deze toe aan de docent.
*Tijdens het self assessment heb je wellicht de neiging nog zaken te fixen. Het netjes opdelen van commits schiet er in de praktijk vaak bij in vanwege pragmatische overwegingen. Zoals je als het goed is weet kun je in git achteraf de geschiedenis nog aanpassen. Zeker alleen lokaal; namelijk met interactive rebasing. Zie bv. 'rewriting history op de git site' de sectie 'Splitting a commit' geeft een voorbeeld.
Als je tijd hebt mag dit. Maar belangrijker dan alles goed doen, is kennis hebben hoe het voortaan goed/beter te doen (niveau 'bewust onbekwaam' ip.v. 'onbewust bekwaam'). En dit ook te kunnen formuleren voor jezelf. Dus steek je tijd liever in korte toelichting hoe je dit zou aanpakken, of precies waarom het niet lukt (wat is de reden, wat is de foutmelding die je kreeg? welke stappen heb je gezet?).
Let op: een self assessment betekent NIET een individuele assessment. Het is wel okee (zelfs goed) eerst onafhankelijk van elkaar een assessment te bedenken, maar overleg je mening en voeg daarna de punten uit beiden samen en overleg om tot een teamoordeel te komen.
Schrap daarbij ook onnodig lange, dubbele of achteraf onjuiste of onduidelijke zaken (samenvoegen is namelijk iets anders dan achter elkaar plakken). Dit is ook een vorm van integratie (e.g. bij 'Continuous Integration denk je waarschijnlijk primair aan integreren van code e.g. pull requests, maar ook documentatie hoort hierbij, en een self assessment is ook een vorm van documentatie).
4. Inleveren
Als je klaar bent maak dan een issue aan in/bij je GitLab repo met titel Nakijken
en assign deze aan je docent.
De docent beoordeelt je werk in gitlab en of het voldoende is. Zo niet dan maakt de docent een issue aan om te fixen met korte beschrijving. Volgens de Joel test geldt in principe 'fix bugs before you write new code'. Je moet in principe een voldoende hebben voordat je naar volgende opdracht.
NB Aan het eind van van de course upload je een .zip
met al je opdrachten naar iSAS voor het archief (namelijk voor evt. accreditatie checks bij AIM). Dit inleveren is een eis om totaalbeoordeling/-cijfer te krijgen (want na cijfer toekenning door docent gaat je inlevermogelijkheid automatisch dicht).
Wat moet ik waar uploaden in iSAS?
Hier het totaal overzicht van wat waar in te leveren in iSAS (2024):
- MINDEC03
- TOETS-02 - Beroepsproduct Dev <-- Onderzoeksblog repo + presentatie slides?
- TOETS-03 - Huiswerkopdrachten Dev <-- Linux Bash script & RabbitMQ groepsrepo
- MINDEC04
- TOETS-02 - Beroepsproduct DevOps <-- PitStop uitbreiding BP groepsrepo
- TOETS-03 - Wekelijkse Huiswerkopdrachten DevOps <-- Verzamelzip weekopdracht 1, 2, 3 en 5
5. Groepsvorming voor wekelijkse Opdrachten
Om het samenwerken te oefenen, heb je voor elke opdracht wisselende teamgrootte en -partners. Als developer heb je wellicht de neiging om alles in je eentje te doen, want dat scheelt een boel overhead. En een klasgenoot vragen/vinden kan best spannend zijn. DevOps gaat echter over samenwerken. Voor het managen hiervan heb je ook de tools maar geldt uiteindelijk:
'Individuals and interactions over processes and tools' - Agile manifesto
Week 1
- Vorming van Paren:
- Studenten vormen zelfgekozen paren.
- Taalvereiste:
- 50% van de paren moet werken in Java.
- De andere 50% werkt in C#.
Week 2
- Wisselen van Partner:
- Studenten moeten van partner wisselen.
- Taalkeuze:
- Elk paar kan kiezen tussen Java of C# op basis van de behoeften van hun project.
Week 3, 4 en 5
- Flexibele Paren:
- Paren kunnen opnieuw wisselen.
- Terugkeren naar het oorspronkelijke paar is toegestaan.
Beschrijving Onderwijseenheid (OWE)
- 1. Inleiding
- 2. DevOps competenties
- 3. Dev competenties (DevOps4Dev)
- 4. Ops competenties (DevOps4Ops)
- 5. DevOps - Project competenties
- 6. Beoordelingscriteria per competentie
- 7. Mapping tussen toetsen en course- en projectcompetenties
- 8. Onderwijsmaterialen
- 8. Ingangseisen
- Bronnen
1. Inleiding
Deze OWE beschrijving (onderwijskundige eenheid) geeft voor de 'Minor DevOps' (MDO) de competenties, beoordelingscriteria en wijze van toetsing van alle courses en het project. Dit is een AIM norm; de OWE komt ook in het Onderwijs Statuut (OS/OER document). Een meer algemene introductie op deze minor staat op de home pagina van deze website.
De OWE is opgedeeld in secties. Deze hebben naast titel ook een nummer voor het overzicht. De eerste secties hebben geen subsecties omdat ze vrij kort zijn, maar verderop zijn er subsecties met subnummer.
Na deze inleiding volgen in sectie 2, 3 en 4 eerst de competenties van elk van de 3 courses in blok 2. In sectie 5 staan de competenties van het eropvolgende project in blok 2. In sectie 6 komen in subsecties de beoordelingscriteria bij elk van de competenties horen. Deze geven meer details. In sectie 7 volgt tot slot een overzicht van verschillende toetsen voor elk van de courses en toetsvormen en wegingsfactoren en dergelijke. Deze sectie geeft ook de mapping van de competenties en beoordelingscriteria naar de toetsen die deze.... toetsen en beoordelen :).
Tot slot in sectie 8 nog high level de onderwijsmaterialen en in sectie 9 een lijst van vereiste voorkennis voor toegang tot de minor (momenteel alleen ISM en developer profielen van HAN - AIM, in de toekomst wellicht breder toegankelijk voor HBO ICT studenten).
Links naar iSAS
De publiek zichtbare variant van de OWE beschrijvingen is iSAS, hier de links:
2. DevOps competenties
In de 'DevOps' middencourse ontwikkelen alle studenten van de minor als het goed onderstaande competenties. Merk op dat achter elke competentie een kort woord of woord combinatie tussen haakjes staat. Hoewel hiermee niet de gehele zin (e.g. competentie beschrijving) gevat wordt in enkel dit woord, geeft dit wel kernachtig een kernbegrip weer van de competentie. Dit dient als ezelsbrug, ook wel 'mnemonic' genoemd (een concept uit assembly talen). Bij een aantal competenties is dit het DevOps 'buzzword'/thema van de verschillende geplande onderwijsweken (zoals 'Continous Delivery' of 'gitops'). Let wel deze mapping op de ezelsbruggetjes is wel enigszins grof. Zo komt de pipeline die centraal staat bij Continuous Delivery bijvoorbeeld in meerdere weken terug, met aspecten als toepassen van unit tests, automatische deploy etc. verdeeld/verspreid over meerdere lessen/weken.
- DevOps-1 Je kunt goed samenwerken in een DevOps team en draagt bij aan het iteratief opleveren van nieuwe 'Cloud producten' (Continuous Delivery)
- DevOps-2 Je kunt werken met versiebeheer centraal in de DevOps aanpak en kent en gebruikt bijbehorende workflows en CI/CD systemen (GitOps)
- DevOps-3 Je kunt werken met containers, gangbare software architecuren vertalen naar een container architectuur en de principes van container orchestration toepassen (Containerization)
- DevOps-4 Je kent de rol van testen, TDD en andere testaanpakken, kent DevOps security best practices, kan deze opvolgen en package managers gebruiken (DevSecOps)
- DevOps-5 Je kunt goede logging en monitoring realiseren in verschillende omgevingen en zorgen voor applicatiespecifieke rapportages (SlackOps)
- DevOps-6 Je kunt onderzoeksmethoden gebruiken en resultaten uit zelf verricht onderzoek, en dat van anderen toepassen in een beroepsproduct (Onderzoek)
- DevOps-7 Je laat een nieuwsgierige instelling zien gecombineerde met een pragmatische aanpak en een positief kritische houding (Attitude)
3. Dev competenties (DevOps4Dev)
In de 'DevOps4Dev' schakelcourse leren de instromende 'developer' studenten onderstaande kennis en vaardigheden (e.g. competenties). Merk op dat voor het gemak de competenties codes de vorm 'Dev-x' hebben in plaats van het meer verbose 'DevOps4Dev-x'. Maar dit laatste zou wel correcter zijn.
- Dev-1 Je kent de rol en functie van besturingssystemen en kent de basis van Linux server beheer en administratie (Linux)
- Dev-2 Je kent voor DevOps relevante protocollen, netwerkstandaarden en security principes (Protocollen)
- Dev-3 Je kunt kwalitatieve unit tests en automated acceptance tests schrijven en reviewen en ontwikkelen volgens Behaviour Driven Development (BDD)
- Dev-4 Je kent een aantal basisprincipes van software design in het algemeen en Domain Driven Design in het bijzonder ((DD) Design)
- Dev-5 Je kunt zelfstandig verdiepend onderzoek verrichten en de uitkomsten op een voor vakgenoten heldere manier verwoorden (Onderzoek)
4. Ops competenties (DevOps4Ops)
In de 'DevOps4Ops' schakelcourse doen de instromende 'operations' studenten onderstaande kennis en kunde op (e.g. competenties). Merk op dat analoog aan DevOps4Dev de competenties codes weer simpele vorm 'Ops-x' hebben in plaats van 'DevOps4Ops-x', hoewel dit laatste wellicht correcter zou zijn.
- Ops-1 Je ontwerpt en ontwikkelt een DevOps-pipeline, zodat je beveiligingsrisico’s zo vroeg en effectief mogelijk kan signaleren en beheersen (DevSecOps)
- Ops-2 Je valideert een DevOps-pipeline ten aanzien van prestatie-efficiëntie en betrouwbaarheid met methoden zoals performance testing, chaos engineering en monitoring. (Chaos engineering)
- Ops-3 Je ontwerpt DevOps-structuren (zoals multi-project pipelines) ook op het hoogste abstractieniveau (architectuur), om zo de kwaliteit van softwarediensten in productie te optimaliseren. (quality)
- Ops-4 Je ontwerpt en ontwikkelt volgens het ‘infrastructure as code’-paradigma. Je analyseert voor- en nadelen voor de opdrachtgever van het ‘infrastructure as code’-paradigma vergeleken met alternatieve paradigma’s zoals interactieve configuratie en geautomatiseerde configuration management.
- Ops-5 Je kunt zelfstandig verdiepend onderzoek verrichten en van de uitkomsten op een heldere verslag doen zodat vakgenoten dit snel kunnen begrijpen (Onderzoek)
5. DevOps - Project competenties
N.B.: Richting 2023/2024 'multidisciplinair project' aangepast naar 'DevOps groepsproject met een authentieke opdrachtgever'
- Project-1 Kan in de courses opgedane kennis en vaardigheden toepassen in een DevOps groepsproject met een authentieke opdrachtgever. #Vormbehoud
- Project-2 Kan onderscheid maken tussen groepsbelangen en belangen inzake de eigen discipline. #Tshaped
- Project-3 Gebruikt analyse- en onderzoeksmethodieken, -technieken en -gereedschappen en trekt gedegen conclusies uit bevindingen. #onderzoek
- Project-4 Kan, gegeven een probleem, een beargumenteerde keuze maken over ontwerpbeslissingen. #Ontwerpdocumentatie
- Project-5 Werkt methodisch en Agile bij het realiseren en/of inrichten van een gekozen oplossing. #Agile
- Project-6 Communiceert helder over de resultaten van zijn/haar werk, toont aan onverwachte situaties te kunnen oplossen en kan reflecteren op en lering te trekken uit het multidisciplinaire project. #CommunicerenReflecteren
Bovenstaande wordt per minor per september 2024 gewijzigd naar:
- MDO-Project-1 Kan de 'DevOps volwassenheid' van een gemaakt product en DevOps team aangeven aan de hand van een aangereikt DevOps maturity model #SelfAssessment
- MDO-Project-2 Kan een door opdrachtgever aangereikte ontwikkelstack gebruiken en gebruik van extra technologieën goed afstemmen, beargumenteren en documenteren #DevOpsTechnology
- MDO-Project-3 Kan Agile werken, een rol in een team invullen en ceremonies gebruiken om tot een steeds beter product en proces te komen #WayOfWorking
- MDO-Project-4 Kan een staging én productie omgeving inrichten met bijbehorende pipelines, toenemende productkwaliteit en frequentie van opleveringen #BuildAndDeployment
- MDO-Project-5 Kan een DevOps product documenteren met README's, software architectuur diagrammen met toelichting en een verzameling van gemaakte architectuur beslissingen #Documentatie
- MDO-Project-6 Toont een professionele werkhouding door proactieve communicatie met opdrachtgever en begeleiders, een goede en onderling kritische werksfeer in het team en het maken van en zich houden aan afspraken #SoftSkills
- MDO-Project-7 Heeft een nieuwsgierige houding, zet in courses opgedane kennis en vaardigheden pragmatisch in en bekwaamt zichzelf verder via onderzoek en kritische zelfreflectie #attitude
6.5.1 Project-1-1 Vormbehoud
- Self assessment (CDMM checkpoints met toelichtingen + cijfer indicatie 5 hoofdcategorieën)
- c. Build en Deployment (ontwikkelstraat, Azure DevOps, etc.)
- Verantwoording eigen bijdrage: CI/CD pipelines, ontwikkelstraat, app configuratie, containerization, versiebeheer, monitoring, security, documentatie
6.5.2 Project-1-1 T-shaped
- a. Technologie (techstack, devops tools, monitoring/metrics)
- Verantwoording eigen bijdrage: broncode
6.5.3 Project-1-1 Onderzoek
- Verantwoording eigen bijdrage: Onderzoek
6.5.4 Project-1-1 Ontwerpdocumentatie
- d. Documentatie (C4, continuous documentation, ADR's, etc.)
- Verantwoording eigen bijdrage: documentatie
6.5.4 Project-1-1 Agile
- b. Way of Working (Scrum, Storymap, etc.)
- Verantwoording eigen bijdrage: review, Agile werkproces
6.5.5 Communiceren en reflecteren
- e. Soft Skills (effectief Agile werken, communiceren en presenteren aan technische+niet technische stakeholders)
- Verantwoording eigen bijdrage: groepsproces, communicatie opdrachtgever en soft skills, leerervaringen en conclusies
6. Beoordelingscriteria per competentie
De subsecties 6.2 tot en met 6.5 geven voor elk van de competenties van elk van de 3 courses en het project de beoordelingscriteria die de competentie verduidelijken en beoordeeling concreter maken. Vanwege het DRY principe (Don't Repeat Yourself) zijn de competenties hierbij NIET herhaald. In 6.1 eerst een korte toelichting over nummering.
6.1 Toelichting sectienummers en nummering competenties en beoordelingscriteria
De nummering van subsubsecties met beoordelingscriteria hieronder komt overeen met de nummering van hoofdsecties met de bijbehorende competentie. Dus beoordelingscriteria in sectie 6.x.y
horen bij de competentie in sectie x
(bv. 6.3.x
horen bij sectie 3
). Dit is — mede — dankzij het invoegen van deze inleidende sectie 6.1 met een structuurbeschrijving. Dit is een soort interne 'leeswijzer'. Zonder dat het als een kopje 'leeswijzer' heeft, maar een meer inhoudelijke naam. Tip: Volg dit voorbeeld in het blog van je onderzoek (een toets)! Gebruik ook sectienummers en subsectienummers zoals hier om kortere interne verwijzing te (kunnen) doen. Gebruik NIET meer niveaus dan 3 (subsubsecties is diepste niveau, in analogie met Linus (Torvalds, z.d.) richtlijn in de Linux kernel coding style: "...if you need more than 3 levels of indentation, you're screwed anyway, and should fix your program."
Om de koppeling met de competentie duidelijk te maken hebben de beoordelingscriteria een subcijfer. Voor competentie DevOps-7 zijn bijvoorbeeld 3 beoordelingscriteria met code DevOps-7-1, DevOps-7-2 en DevOps-7-3.
NB Net als bij de competenties zegt de gebruikte volgorde van beoordelingscriteria niet per se iets over de volgorde van onderwerpen in de lessen.
6.2 DevOps beoordelingscriteria per competentie
De 5 competenties van de algemene 'middencourse' DevOps beschreven in sectie 2 mappen naar respectievelijke beoordelingscriteria opgesomd in de nu volgende sectie 6.2.1 tot en met 6.2.7.
6.2.1 DevOps-1 Continuous Delivery (Cultuur & Organisatie)
- DevOps-1-1 Kent de Agile principes en kan uitleggen hoe DevOps in het verlengde hiervan ligt
- DevOps-1-2 Vindt een eigen rol in een team, neemt hierbinnen verantwoordelijkheid en communiceert proactief binnen het team en naar buiten
- DevOps-1-3 Kan helder, ondubbelzinnig en doelgroepgericht communiceren over Devops concepten, practices en producten zowel mondeling als schriftelijk
- DevOps-1-4 Levert een DevOps product op iteratieve wijze op, en kan je bijdrage hieraan zelf onderbouwen
- DevOps-1-5 Kent en gebruikt correct voor DevOps relevante concepten zoals MVP, product-increment, greenfield, brownfield en microservices
- DevOps-1-6 Kent de grote cloud providers/platforms, de verschillende '... as a service' categorieen en het onderscheid tussen public en private cloud
6.2.2 DevOps-2 GitOps (Build & Deploy)
- DevOps-2-1 Kan een CI/CD pipeline opzetten en configureren voor handmatige en automatische deployment naar meerdere omgevingen (OTAP)
- DevOps-2-2 Kent de centrale rol van een versiebeheersysteem in DevOps en belangrijke GitOps concepten zoals push- vs pull model, reconcilliation en desired state
- DevOps-2-3 Kan goed omgaan met een versiebeheersysteem (Git) en kent de principes hierachter en enkele advanced features ervan
- DevOps-2-4 Kent enkele workflows voor teams in een VCS platform, methodes van 'trunk based development' en realiseert hiermee Continous Integration
- DevOps-2-5 Kent Continuous Deployment strategieen zoals green-blue deployment, feature toggles en canary deploys en past één of meer toe
6.2.3 DevOps-3 Containerization (Design & Architectuur)
- DevOps-3-1 Kent basisprincipes van testen, de testpiramide en kan geautomatiseerde tests uitvoeren en code coverage bepalen met een tool
- DevOps-3-2 Kent best practices en principes voor Cloud applicaties en kan deze verifieren (12factor principes)
- DevOps-3-3 Kan applicatie onderdelen 'containerizen' en onderling laten communiceren
- DevOps 3-4 Kent de rol van netwerken bij containers, en principes van een load balancer, firewall en proxy en relevante protocollen/standaarden
- DevOps 3-5 Kent de principes van een message broker en past er een toe in een multi-container applicatie
- DevOps 3-6 Kent de basisprincipes van InfraStructure as Code en hoe dit past binnen de DevOps aanpak
- DevOps 3-7 Kent de basisprincipes van Domain Driven Design en kan deze toepassen en toetsen in DevOps code, configuratie en documentatie
6.2.4 DevOps-4 DevSecOps (Test & Verificatie)
- DevOps-4-1 Is security aware tijdens het realiseren van een DevOps product en houdt overzicht van zwakke plekken
- DevOps-4-2 Kan containers scannen en vulnerabilities en security alerts opvolgen via updates m.b.v. een package manager
- DevOps-4-3 Kent een aantal DevOps security best practices en past deze toe
- DevOps-4-4 Weet wat CVE's zijn en de relatie leggen naar eigen code/product en gebruikte depdencies
- DevOps-4-5 Kan evt. regressiefouten als gevolg van security update opsporen en uitsluiten in productie
6.2.5 DevOps-5 SlackOps (Information & Reporting)
- DevOps-5-1 Kent best practices voor logging in een containerized omgeving en kent de integratiepunten van tools als Docker en Kubernetes
- DevOps-5-2 Kan hardware gebruik in een container cluster monitoren en rapporteren en ook applicatiespecifieke monitoring toevoegen
- DevOps-5-3 Kan directe rapportage in- en integratie met collaboratietools als bijvoorbeeld MS Teams, Slack of Discord realiseren
6.2.6 DevOps-6 Onderzoek
- DevOps-6-1 Kan zich snel verdiepen in nieuwe DevOps technologieen in het verlengde van bestaande kennis en kunde en kan inschatten of verder onderzoek een goede tijdsinvestering is
- DevOps-6-2 Kent onderzoeksmethoden voor praktijkgericht onderzoek en past deze toe in de realisatie van het beroesproduct
- DevOps-6-3 Maakt gebruik van onderzoeksresultaten van anderen en jezelf, verantwoordt de kwaliteit van het onderzoek en geeft een correcte bronvermelding
6.2.7 DevOps-7 Attitude
- DevOps-7-1 Bent pragmatisch, stelt zelf vantevoren een voldoende duidelijk einddoel en werkt hier naartoe, maar kunt je werk ook timeboxen en inschatten wanneer 'You ain't gonna need it'
- DevOps-7-2 Bent positief kritisch op gebruikte bronnen, gemaakte specificaties, ontwerpen, producten en rapportages van jezelf en anderen
- DevOps-7-3 Toont een kritische blik in verslaglegging, documenteert known issues en 'speelt op de bal; niet op de persoon'
- TODO: DevOps-7-4 Werkt goed samen en fungeert als T-shaped professional zoekend naar verdieping in een of enkele onderwerpen, maar ook breed georienteerd op andere onderwerpen en overdracht van en naar teamgenoten
6.3 Dev beoordelingscriteria per competentie
Hieronder alle beoordelingscriteria voor de competenties van developers specifieke course beschreven in sectie 3.
6.3.1 Dev-1 Linux
- Dev-1-1 Kan met behulp van command line/terminal navigeren op eigen systeem en externe Linux servers en systeeminformatie opvragen
- Dev-1-2 Je kan containers debuggen via gebruik van standaard linux tools gebruiken en nieuwe tools installeren
- Dev-1-3 Je kent de rol van Linux voor containers, en hoe containers op andere operating systemen draaien
6.3.2 Dev-2 Protocollen
- Dev-2-1 Kan een load balancer instellen en configureren voor een container of container cluster
- Dev-2-2 Kent het gebruik van het DNS protocol in containers en past deze toe voor container communicatie
- Dev-2-3 Kan netwerk instellen en communicatie tussen verschillende netwerken mogelijk maken
- Dev-2-4 Kent verdere voor DevOps relevante protocollen, implementaties hiervan en architecturele stijlen zoals RabbitMQ, etcd en REST
6.3.3 Dev-3 Behaviour Driven Development
- Dev-3-1 Kent de BDD principes en tools en kan samen met eindgebruikers en/of niet ontwikkelaars requirements opstellen en uitwerken
- Dev-3-2 Kent de relatie tussen TDD en BDD en kan de toegevoegde waarde van elk uitleggen
- Dev-3-3 Kan hoge test coverage realiseren en aantonen en kent de waarde en beperkingen hiervan
- Dev-3-4 Kent de principes van de test pyramide en past deze effectief toe in een DevOps omgeving
TODO: Evt. aanpassen, omdat we Dev-3 in 2021 in de DevOps course behandelden.
6.3.4 Dev-4 Design en Domain Driven Design
- Dev-4-1 Kent de belangrijkste strategic patterns uit Domain Driven Design namelijk Ubiquitous Language, Bounded Context en Context mapping en past deze toe
- Dev-4-2 Kent enkele tactical patterns uit DDD, namelijk Services, Entities, Value Object en het Aggregate pattern, en past deze toe indien mogelijk
- Dev-4-3 Kan een software architectuur ontwerp documenteren met diagrammen en een duidelijke toelichting hierop geven met extra informatie en aandachtspunten
TODO: Evt. aanpassen, omdat we Dev-4-1 en Dev-4-2 in 2021 in de DevOps course behandelden, namelijk de InfoSupport workshops. Hier was ook aandacht voor Event Driven Architectures zoals CQRS.
6.3.5 Dev-5 Onderzoek
- Dev-5-1 Verdiept zich zelfstandig in Devops concepten en nieuwe DevOps technologieen (tools, talen, frameworks of practices, principles, patterns)
- Dev-5-2 Beschrijft onderzoeksresultaten helder, ondubbelzinnig, gestructureerd en doelgroepgericht
- Dev-5-3 Selecteert bruikbare bronnen van derden en doet correcte bronvermelding
Merk op dat de de competentie en beoordelingscriteria voor Dev-5 en Ops-5 'onderzoek' identiek zijn.
6.4 Ops beoordelingscriteria per competentie
De competenties specifiek voor operations en infrastructuur en security studenten mappen elk ook naar een aantal beoordelingscritera in de volgende 5 subsecties.
6.4.1 Ops-1 DevSecOps
- Ops-1-1 Je kunt security problemen oplossen via een update zonder een voor eindgebruikers merkbare verstoring
- Ops-1-2 Je kan relevante security issues uit OS of middleware vinden met een tool of via handmatig doornemen van security rapporten
- Ops-1-3 Je kan een update doorvoeren in een test omgeving en daar via (bestaande) tests bepalen of er regressie issues zijn
- Ops-1-4 Je kent een techniek voor incremental rollout van de nieuwe applicatie versie en kan problemen hierbij monitoren
- Ops-1-5 Je bent je bewust van mogelijkheden en onmogelijkheden bij oplossen van security issues en hoe hierover te communiceren met stakeholders en developers
6.4.2 Ops-2 Chaos monkey
- Ops-2-1 Je kent de principes van chaos engineering en toegevoegde waarde hiervan
- Ops-2-2 Je kunt een tool gebruiken om chaos engineering toe te passen in een containerized omgeving
- Ops-2-3 Je weet hoe productie en QA/test omgeving zo te configureren dat chaos engineering effectief is
TODO '22: Competentie(s) rondom chaos engineering verplaatsen naar DevOps course, in ieder geval de conceptuele (e.g. Ops-2-1)
6.4.3 Ops-3 Quality Attributes
- Ops-3-1 Je kunt de rol van System Quality Attributes in een software ontwerp beschrijven en voldoen aan deze requirements inzichtelijk maken met een DevOps aanpak
- Ops-3-2 Je kunt met een orchestration tool als Kubernetes configuratie opzetten voor bijvoorbeeld autoscaling, Quality of Service en health checks
- Ops-3-3 Je neemt verantwoordelijkheid voor non-functionele eisen van een applicatie en weet hoe deze te monitoren en verbeteren ook rekening houdend met kosten aspecten
6.4.4 Ops-4 Infrastructure As Code
- Ops-4-1 Je kent de principes van IAC en kunt deze toepassen met behulp van een tool in een private of public cloud
- Ops-4-2 Je kunt een nieuwe test of productie omgeving inrichten, uitrollen en documenteren voor gebruik door teamleden die weinig van IAC afweten
- Ops-4-3 Je kunt in een bestaande applicatie InfraStructure As Code introduceren of stapsgewijs toewerken naar een meer 'cattle not pets' aanpak
6.4.5 Ops-5 Onderzoek
- Ops-5-1 Je verdiept je zelfstandig in Devops concepten en nieuwe DevOps technologieen (tools, talen, frameworks of practices, principles, patterns)
- Ops-5-2 Je beschrijft onderzoeksresultaten helder, ondubbelzinnig, gestructureerd en doelgroepgericht
- Ops-5-3 Je selecteert bruikbare bronnen van derden en doet correcte bronvermelding
Merk op dat de de competentie en beoordelingscriteria voor Dev-5 en Ops-5 'onderzoek' hetzelfde zijn.
7. Mapping tussen toetsen en course- en projectcompetenties
Hieronder voor elk van de 3 courses en het project de beoordelingscriteria die deze specifiek toetsen. Ook andere gegevens als toetsvorm en deelcijfers.
Het verschil tussen beoordelingscriteria en deelcijfers is dat criteria vakinhoudelijk zijn, terwijl deelcijfers meer over de vorm of fasering gaan. Zo kennen de courses wekelijkse deeltoetsen die docenten of student assistenen afzonderlijk beoordelen, maar wiens gemiddelde cijfer een enkele toets vormt.
De deelopdrachten die je per week opbouwt commit je naar de je persoonlijke remote git repository (voor de week deadline!) zodat deze voor beoordelaar inzichtelijk zijn. Maar i.v.m. AIM standaarden en externe accreditatie moet je een verzamel .zip uit git van alle opdrachten op het eind van de course (en voor de deadline die in iSAS staat) ook uploaden in iSAS voordat je een cijfer kunt krijgen. Geen upload is geen beoordeling.
7.1 Toetsing Course DevOps (10 ECTS)
- BP_Team Teamcijfer beroepsproduct
- Toetsvorm: Beroepsproduct
- Toetsvorm extra: DevOps product, inclusief team demo documentatie en individuele verantwoording schriftelijke en mondeling
- Gewicht, grens: 60%, >= 5,5
- Deelcijfers:
- Kwaliteit en kwantiteit 'DevOps beroepsproduct' inclusief documentatie (aka 'product')
- Duidelijkheid van Team demo van product en WIJ`E beantwoorden vragen
- README + Documentatie
- Team product review + self assessment
- Kwaliteit en kwantiteit individuele werk
- Duidelijkheid en aantrekkelijkheid toelichting/verantwoording individuele bijdrage
- Toepassen onderzoek in BP met bronvermelding
- Reflectie eigen functioneren mondelinge toelichting
- Leeruitkomsten (percentage toetsmatrijs tussen haakjes):
-
DevOps-1 Continuous Delivery (15%)
-
DevOps-2 Containerization (14%)
-
DevOps-3 GitOps (14%)
-
DevOps-4 DevSecOps (14%)
-
DevOps-5 SlackOps (14%)
-
DevOps-6 Onderzoek (14%)
-
DevOps-7 Attitude (15%)
-
T_DevOps 2-wekelijkse theorietoetsen
- Gewicht, grens: 40%, >= 5.5
- Deelcijfers:
- week 3, >= 4.0
- week 6, >= 4.0
- Leeruitkomsten (percentage toetsmatrijs tussen haakjes):
- DevOps-1 Kent Continuous Delivery principes, concepten en tools (20%)
- DevOps-2 Kent Containerization principes, concepten en tools (20%)
- DevOps-3 Kent GitOps principes, concepten en tools (20%)
- DevOps-4 Kent Orchestration en DevSecOps principes, concepten en tools (20%)
- DevOps-5 Kent SlackOps principes, concepten en tools (20%)
-
Opdr_DevOps Wekelijkse huiswerkopdrachten DevOps
- Toetsvorm Extra: Github commits + iSAS .zip
- Gewicht, grens: Vink
- Deelcijfers:
- 5 weekopdrachten, allen vink, of gemiddeld voldoende
- Leeruitkomsten (percentage toetsmatrijs tussen haakjes):
- DevOps-1: Kan Continuous Delivery toepassen (20%)
- DevOps-2: Kan Containerization toepassen (20%)
- DevOps-3: Kan GitOps toepassen (20%)
- DevOps-4: Kan Orchestration en DevSecOps toepassen (20%)
- DevOps-5: Kan SlackOps toepassen (20%)
-
7.2 Toetsing Course Ops (5 ECTS)
-
T_Ops Gemiddelde van theorie(deel)toetsen Ops
- Toetsvorm: 2 theorietoetsen digitaal
- Gewicht, grens: 50%, >= 5.5
- Beoordelingscriteria:
- Ops-1 'DevSecOps: Alle beoordelingscriteria
- Ops-2 'Chaos Engineering': Alle beoordelingscriteria)
- Ops-3 'Quality Attributes': Alle beoordelingscriteria
- Ops-4 'Infrastructure as Code': Alle beoordelingscriteria
-
Blog_Ops Blog n.a.v. onderzoek
- Ops-5 (onderzoek)
-
Opdr_Ops Wekelijkse huiswerkopdracht Ops
- Toetsvorm Extra: Github commits + iSAS .zip
- Gewicht, grens: 50%, >= 5.5
- Deelcijfers:
- Week 2: Vink
- Week 4: Vink
- Leeruitkomsten (percentage toets matrijs tussen haakjes):
- Ops-1: Kan DevSecOps toepassen (todo)
- Ops-2: Kan Quality Attributes opstellen, realiseren en toetsen (todo)
- Ops-3: Kan Chaos Engineering toepassen (todo)
- Ops-4: Kan kan Infrastructure as Code toepassen (todo)
7.3 Toetsing Course Dev (5 ECTS)
- T_Dev Gemiddelde van theorie(deel)toetsen Dev
- Toetsvorm: Wekelijkse deeltoetsen
- Gewicht, grens: 50%, >= 5.5
- Leeruitkomsten (percentage toetsmatrijs tussen haakjes):
- Dev-1 Linux: Alle beoordelingscriteria (50%)
- Dev-2 Protocollen: Alle beoordelingscriteria (25%)
- Dev-3 BDD: Alle beoordelingscriteria (0%)
- Dev-4 (DD) Design/C4/Continuous Documentation: Alle beoordelingscriteria (25%)
TODO okt '21: Stof Dev-2+Dev-3 en Dev-4 behandelt tijdens DevOps les respectievelijk InfoSupport workshops en getoetst in DevOps deeltoets 2 (m.u.v. Dev-4-3 arch/doc. met C4 en Continuous Documentation en In Dev-2 moet RabbitMQ beter verwerkt in volgende editie) TODO sept '23: Stof micro front-ends moet nog een leeruitkomst bij, of verwerken in/herformuleren van Dev-4
-
Blog_Dev Blog n.a.v. onderzoek
- Toetsvorm: Markdown commits + pdf iSAS
- Gewicht, grens: 50%, >= 5.5
- Beoordelingscriteria:
- Dev-5 'Onderzoek': Alle beoordelingscriteria (100%)
-
Opdr_Dev
- Toetsnaam: Wekelijkse huiswerkopdracht Dev
- Gewicht, grens: Vink
- Toetsvorm Extra: Github commits + iSAS .zip
- Deelcijfers:
- Week 2: Vink
- Week 4: Vink
- Leeruitkomsten (percentage toetsmatrijs tussen haakjes):
- Dev-1: Kan Linux gebruiken (50%)
- Dev-2: Kan relevante communicatie protocollen voor DevOps zoals DNS en RabbitMQ gebruiken (50%)
- Dev-3: Kan Behaviour Driven Development toepassen (0%)
- Dev-4: Kan software design lezen en Domain Driven Design toepassen (0%)
NB: Bij editie '21 zijn Dev-3 - BDD en Dev-4 - DDD getoetst en gedoceerd in DevOps toets en lessen, en was het 'protocol' RabbitMQ Exchanges (DNS, etcd. e.d. ook in DevOps). TODO voor '23/'24: Onderwerp Micro front-ends expliciet toevoegen. Missende inlevergelegenheid voor Wekelijkse huiswerkopdracht toevoegen in iSAS.
7.4 Toetsing DevOps Project (15 ECTS)
Beoordeling via beoordelingsmodel Projecten met 4 toetsmomenten:
- 10% Tussentijdse beoordeling Beoordeling. Geen minimumscore. Bestaande uit:
- groepscijfer, op basis van kwantiteit en kwaliteit Beroepsproduct en DevOps groepsproces, zie team beoordeling
- Verrekenen van individuele 'delta' op basis van individuele verantwoording schriftelijk en presentatie en observaties begeleiders (knock-out bij duidelijk te weinig inbreng), zie individuele beoordeling
- 90% Eindbeoordeling Beroepsproduct. Score minimaal een 5,5. Ook bestaande uit:
- groepscijfer
- en individuele delta of knock-out, zelfde als tussentijds
7.4.2 Toelichting afwijken reguliere AIM projectbeoordeling
De structuur met 4 toetsen tussentijds en eindcijfer en voor beide een groepscijfer en individuele beoordeling is hetzelfde als de reguliere AIM projectbeoordeling. Als minor vallen we hier niet onder, maar voor eenduidigheid is dit wel prettig.
De weging van cijfers gebeurt echter net anders, het eindcijfer is een optelling van groepscijfer en een individuele delta, eventueel negatief, of positief, maar doorgaans 0 (e.g. hele groep zelfde cijfer). De reguliere projectmethode gebruikt weegfactoren voor groepscijfer en individuele cijfer. Maar een vermenigvuldiging in plaats van simpele optelling van cijfers leidt tot minder intuitieve betekenis van delta. Want dit halveert voor het daadwerkelijke eindcijfer effectief de gegeven delta van de gekozen -1 tot +2 range naar de -0.5 naar +1 range.
Ook gelden groepscijfer en individueel niet beiden als knock-out voor eindcijfer, maar alleen de individuele cijfer. Dit kan door een negatieve delta waardoor je cijfer onder de 5,5 komt of het toekennen van de 1
of 4
absolute cijfers op basis van onvoldoende individuele bijdrage of verantwoording (e.g. knock-out). Dat een onvoldoende groepscijfer geen directe knock-out is, laat onverlet dat alle individuele teamleden verantwoordelijk zijn dit wel als signaal moeten zijn tijdig te communiceren met begeleiders en via samen bepaalde weg als team toch nog een groeps voldoende te behalen. Een eventuele neiging in zo'n situatie alleen voor de eigen individuele voldoende te gaan, zal leiden tot individueel alsnog onvoldoende beoordeling vanwege onvoldoende samenwerking en verantwoordelijkheidsgevoel. Als ondanks steken van voldoende aandacht hierin dit toch niet lukt, kan een evt. toegekende positieve delta evt. alsnog bepaalde groepsleden over de streep trekken.
8. Onderwijsmaterialen
- Online lesoverzicht
- Opdrachten via GitHub Classroom
- Committen en samenwerken via AIM interne Gitlab: https://gitlab.devops.aimsites.nl.
- Uploaden resultaten in iSAS
- Reader DevOps - Ian Sommerville (alleen beschikbaar voor AIM/minor studenten)
- Diverse Online documentatie tools (o.a. docker.com, kubernetes.io)
- TODO:
PluralSight (via XTend kortingsdeal AIM)
Aangeraden naslagmateriaal (e.g. leestips van de docent)
- Boek Continuous Delivery, Jez Humble, David Farley
- The Phoenix project, Gene Kim
8. Ingangseisen
De minor is alleen toegankelijk voor HBO ICT studenten met een development profiel.
Vanwege het verdiepende karakter van de minor moet je ook een 4-e jaars student zijn. We gaan er van uit dat je bij aanvang van de minor je (meeloop) stage en verdiepende semester hebt afgerond. Op het moment van inschrijven voor de minor is dit idealiter ook zo, of ben je je verdiepende semester of (meeloop)stage aan het afronden.
Inhoudelijk gelden verder de onderstaand eisen over je voorkennis en vaardigheden. Deze heb je nodig om tijdens de minor verder uit te bouwen of om mee te kunnen werken in het beroepsproduct aan het eind van de course fase en het DevOps project in blok 2.
Om ze te onderscheiden van de TIJDENS de minor opgedane competentie zijn de competenties codes hieronder voorzien van een V-
prefix.
Edit juni 2023: Op dit moment staat deelname in deze minor niet open voor ISM (infratructuur) studenten. Mogelijk verandert dit voor editie in 2024 of later en er zijn naast V-Dev
competenties ook V-Ops
competenties opgesteld. Om verwarring te voorkomen hebben we deze verwijderd (en in versiebeheer gestald). Deze kennis en vaardigheden zijn nodig tijdens de courses, maar ook tijdens het project, om een voldoende product op te kunnen leveren.
9.2 Vereiste voorkennis Developers
- V-Dev-1 Je kunt object geörienteerd programmeren in een getypeerde taal en kent enkele OO design patterns en kan deze herkennen en toepassen
- V-Dev-2 Je kunt geautomatiseerde unit en integratie tests schrijven met gebruikmaking van een test framework en -tool
- V-Dev-3 Je kunt ontwikkelen volgens Test Driven Development (TDD) en kent TDD patterns als Red-Green-Refactor, Arrange, Act, Assert en concepten als sut, mocks, stubs, etc.
- V-Dev-4 Je kent de werking van web protocollen als HTTP en DNS en dataformaten als XML en JSON
- V-Dev-5 Je kent de standaard 3-tier architectuur en principes van andere gelaagde architecturen
- V-Dev-6 Je kent basis UML technieken en kan requirements en technische documentatie samenstellen
Bronnen
- Linus Torvalds. z.d. Linux kernel coding style. geraadpleegd 9-2-2021 op https://www.kernel.org/doc/Documentation/process/coding-style.rst *
*Merk op dat we hier afwijken van standaard APA conventie van `Achternaam, voorletters'en gewoon 'Linus Torvalds' schrijven. Dit is vanwege het vaak informelere 'je' en 'jij' binnen de ICT en ook het fenomeen van rockstar developers e.d. wel verantwoord. Je mag hieruit opmaken dat afwijken van standaarden best mag, mits expliciet gemaakt en met een goede argumentatie en afstemming vantevoren. Belangrijkste punt is dat je laat blijken de standaard WEL kent en hebt overwogen. Stem dit dus af met evt. beoordelaars.
Minor chartering
Door: Bart van der Wal, zomer 2021
Het toepassen van The Agile Inception Deck (AID) op de Minor DevOps zelf.
NB Een workshop van InfoSupport behandelt AID ook en in het project in blok 2 ga je dit ook gebruiken.
1. Describe why we are here
To do some major DevOps!
De DevOps beweging bestaat nu zo'n 10 jaar, en je ziet adoptie in groot deel van ICT bedrijfsleven, maar bij AIM (en voor zover mij bekend andere HBO ICT's) was er nog geen dedicated vak hierover, maar sijpelde het slechts hier en daar het onderwijs binnen via gebruik tools en om sneller aan de slag te kunnen.
2. Create an Elevator Pitch
"Let's do some major DevOps!" :)
In deze minor leer je moderne DevOps technieken en concepten om te kunnen innoveren en waarde toe te voegen in bedrijven. DevOps ligt in het verlengde van de Agile beweging, en geeft zeer veel tools, en best practices om als klein bedrijf een applicatie op schaal te draaien en om als groot bedrijf je complexe bedrijfsprocessen te modelleren, en te voorkomen dat tijd verloren gaat aan ICT complexiteit (accidental complexity) zodat je de gewonnen tijd kunt steken in het (via ICT) verbeteren van je bedrijfsvoering (inherente complexiteit).
3. Design a Product Box
Met het voltooien van een minor DevOps tijdens je studie ben je meer waard voor bedrijven en kun je sneller aan de slag in het ICT werkgebied. Interessante werkgevers hebben een hele categorie vacatures zals 'DevOps Engineer' en 'Site Reliability Engineer' (SRE), waarvoor je in aanmerking komt.
4. Create a NOT List
In scope | Out of scope |
---|---|
Git | Cloud provider specific services/tools |
Docker | Programming basics (voorkennis) |
Kubernetes | Infrastructure as Code (Terraform e.d.) |
Prometheus/Grafana | Service mesh (eigen onderzoek) |
Linux | Basic computer skills (voorkennis) |
DevOps principles | Business part/LEAN etc. |
CNCF & DevSecOps basics | Ansible, Puppet, Chef, eBPF |
Extra: Ideeen Ops workshops 2022
- Package manager
- Running unit tests (writing Cucumber specs?)
- Managing DevOps
- CM: Ansible/CM
5. Meet Your Neighbors
Core team is jij, mede studenten, docenten AIM, docenten InfoSupport.
Buren/dependencies:
- aimsites.nl
- StackOverflow
- InfoSupport medewerkers
- Stackoverflow
- Academic license cloud services/trials
6. Show the Solution
Zie DevOps Tech.
7. Ask What Keeps Us Up at Night
- Is het te makkelijk?
- Is het te moeilijk?
- Operationele problemen
8. Size It Up
- 9 weken courses
- 9 weken project
9. Be Clear on What’s Going to Give
What's going to give? Nou in deze volgorde (tussen haakjes korte toelichting)
-
- scope (minimale diepgang per onderwerp)
-
- quality (6 niveau ligt vast)
-
- time (vast, 9 weken)
-
- money (n.v.t. behalve 'tijd is geld')
10. Show What It’s Going to Take
- Minimaal 20 studenten (max. 30)
- Een PluralSight account voor elke student
- Een voldoende krachtige laptop om lokaal
- VS Code, IntelliJ
- Nieuwsgierigheid, pragmatische insteek en een kritische blik
- Flexibiliteit en uren (40 uur per week, geen bijbanen)
- Goede en tijdige onderlinge communicatie
- Tijdige feedback en input
DevOps Minor voorlichting 20 apr 2023
AIM + InfoSupport
Start september 2023 (ma 28 augustus) Inschrijving sluit 30 april; zie verder kiesopmaat.nl.
$web-only$
DevOps overzicht in een paar plaatjes
Druk op alt+p (mac: Option+p) voor de slides. $web-only-end$
$slides-only$
$slides-only-end$
Bronnen/Attributie
Alle bronnen/plaatjes gevonden of geraadpleegd op do 20 april 2023 :)
- Shift left https://www.testim.io/wp-content/uploads/2019/11/Shift-Left-Testing.png
- Wait... DevOps is Agile https://imgflip.com/i/7iu3it
- Agile Manifesto https://agilemanifesto.org/
- DevOps infinity https://opensenselabs.com/sites/default/files/inline-images/IC-DevOps-Loop-Illustrations.jpg
- DevOps is a culture, not a role https://twitter.com/OneUptimeHQ/status/1529463567673589763
- Basic DevOps Geraadpleegd op https://medium.com/@knoldus/opsinit-basic-understanding-of-devops-part-1-49dea74433fd
Blog
Hier vind je de blog posts van studenten van de minor DevOps over hun onderzoek naar technologien uit de Cloud Native Computing Foundation (CNCF) en andere DevOps tools, frameworks, talen etc.
Waar vind je verder nog zo'n verzameling Nederlandstalig DevOps blogs!? Die je helpen om de pareltjes te vinden, de disruptive technologies, tussen alle one day flies en de 'only buzz' tech.
Per 2022 zijn blog posts ook wel geschreven met hulp van ChatGPT. Maar moeten studenten wel door prompten en handmatig aanpassen totdat het ook echt zinnig is. Daarnaast presenteren studenten ook kort hun onderzoeksbevindingen in korte pitches die zij in teamverband geven. Mocht je hierbij aanwezig kunnen/willen zijn, dan zijn verzoeken welkom.
Met dank aan alle studenten!
Bart van der Wal, docent minor DevOps
Unit testen in Java met Maven Surefire en JUnit
Bart van der Wal, augustus 2024.
Dit is de Java/Spring Boot variant van de tutorial 'Unit testing C# in .NET using dotnet test and xUnit' op Microsoft Learn (2024). Deze tutorial toont een project opzet met een:
- unit test-project
- en een broncode-project
Om de tutorial te volgen met een vooraf opgebouwd project, kun je de voorbeeldcode op GitHub (van der Wal, 2024) bekijken of downloaden. We gaan er van uit dat je weet hoe dit werkt.
Hieronder eerst een toelichting over de wijzigingen t.o.v. de originele C# variant/tutorial en de context. Dit is ook interessant voor studenten die deze opdracht doen. Daarna 5 instructiestappen om te volgen meer specifiek voor Java Spring Boot variant. Hiervan is de laatste optioneel.
1. Toelichting
Deze tutorial is naast starter van de week opdracht ook een beetje een voorbeeld blog post, zoals je zelf in week 6 moet schrijven. Met in ieder geval een hands-on karakter via voorbeeld code om over te nemen en terminal commands om uit te voeren voor jou als lezer. Ook bevat deze APA referenties, zoals je zelf in de blog moet gebruiken. is in het Nederlands Alleen het 'onderzoekskarakter' is wellicht ondermaats als voorbeeld. Alhoewel ik hieronder wel wat beschouwingen doe en aansluit bij DevOps concepten zoals de DevOps roadmap en het Continuous Delivery Maturity Model (CDMM) die je ook een beetje, respectievelijk zelfs heel goed moet leren kennen in de minor.
Deze tutorial schreef ik naar aanleiding van minor DevOps 2024 waarin we licht varieren/diverisificeren t.o.v. eerdere edities. Dit in het kader van concept van 'Polyglot X' uit DevOps: dat microservices verschillende talen/frameworks kunnen gebruiken. Hiermee stijg je uit boven het basis niveau (Base level) uit het CDMM (een soort DevOps Maturity Model, InfoQ, 2013):
"Many organizations at the base maturity level will have a diversified technology stack but have started to consolidate the choice of technology and platform, this is important to get best value from the effort spent on automation."
Merk op dat er hierbij het checkpunt uit CDMM 'consolidate' (MinorDevOps, z.d.)) er wel een gemene deler Docker of Kubernetes is. Qua communicatie tussen de microservices is (gewoon via een) http API een standaard, maar in een latere week van de minor leren studenten ook een voorbeeld van een 'message bus' of (eigenlijk) 'message broker' namelijk RabbitMQ. ZO ga je naar meer advanced level van CDMM:
"...split the entire system into self contained components and adopt[ed] a strict api-based approach to inter-communication so that each component can be deployed and released individually." (InfoQ, 2013)
Figuur 1: Deel van DevOps roadmap wat aangepast naar context van minor DevOps (roadmap.sh, 2024)
De helft van de studenten (-teams/-duo's) doet de opdracht met .NET. De andere helft met Java, Spring Boot. In opdracht van week 2 ga je verder door de deze basis applicatie 'containerizen'.
2. Installeren scoop of SDKMan en dan Spring Boot CLI
We start een Java project met Spring Boot. Hierbij gebruiken we Maven als package manager zoals gebruikelijk bij Software Engineering op de HAN. Je bent misschien geneigd om IntelliJ te gebruiken. En voor het editen van code is dit prima, maar voor de herhaalbaarheid/scriptability ga je nu als DevOps-er, de initiele opzet via de commandline doen.
Installeer daarvoor de Spring Boot CLI (Command line interface) conform de instructies op de website (Spring Boot, z.d.): Maar het lijkt wel 'turtles all the way down', want voordat je Spring CLI kunt installeren (Spring Boot, z.d.) moet je eerst een package manager installeren, maar gebruik (en installeer) bv. scoop
op Windows (scoop, z.d.), brew
op macOS of sdkman
als je Linux gebruikt.
Dit is een korte samenvatting voor Windows gebruikers (macOS en Linux komen er sowieso wel uit, toch?)
"Open een PowerShell terminal (version 5.1 or later) en vanaf de PS C:> prompt, run:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression
En daarna op de command line:
scoop bucket add extras
scoop install springboot
Bij onverhoopte errors, backtrace check de gegeven/originele bronnen/website voor installatie instructies, dit verandert vaak snel over de tijd.
3. Start Java Spring Boot project
Deze sectie beschrijft het maken van een Spring Boot Java project met de applicatie code en ook meteen een eigen test package. De project moet de volgende directory structuur en bestanden krijgen, conform standaard Maven structuur:
/priemtester
pom.xml
src/main/java/nl/han/devops/
PriemTesterApplication.java
PriemTester.java
src/main/java/nl/han/devops
PriemTesterTests.java
Figuur 2: Je zou de Spring Initializer in IntelliJ CLI kunnen gebruiken, maar...
Figuur 3: Beter: gebruik de Spring boot CLI, don't be afraid of the command line!
Voer onderstaand commando uit. Superkort is het ook niet meer, maar je customized meteen de package naam en naam van java klasse met je main(..)
functie (dit wordt PriemTesterApplication
).
spring init --build=maven --package-name=nl.han.devops priemtester
Je mag nu de applicatie is aangemaakt deze wel openen in IntelliJ IDEA. Installeer deze als je deze nog niet hebt staan (best meteen Ultimate editie via je HAN student e-mail). Of navigeer naar je project directory en open deze in de VS Code editor:
cd priemtester
code .
4. Make it your own!
Hernoem DemoApplication.java
naar PriemTesterApplication.java
.
Maak een nieuwe klasse PriemTester.java
met de volgende code:
package nl.han.devops;
public class PriemTester {
public boolean isPriemgetal(int candidate) {
throw new UnsupportedOperationException("Nog niet geïmplementeerd.");
}
}
Aangezien we een unit test gaan schrijven van de 'domein' logica, en NIET de gehele Applicatie (dat zou een integratietest zijn) hernoem ook de DemoApplicationTests.java
naar PriemTesterTests.java
om deze te 'repurposen'. Verwijder dan ook de gegenereerde contextLoads()
methode, die hier dan niet meer thuishoort.
Deze code gooit nu een UnsupportedOperationException
met een bericht dat deze methode nog geimplementeerd is. Op deze manier compileert de code wel, en kun je het runnen, maar is duidelijk wat er aan de hand is, ook als je dit stuk code een paar dagen laat liggen, en dan pas weer terug komt. Maar nu gaan we dit gaan we al veel sneller aanpassen ;).
De NIET TDD manier om de code te runnen/testen zou zijn om in je main
de nieuwe methode aan te roepen. Je kunt even tijdelijk de code in je main
methode in PriemTesterApplication.java
als volgt maken, aangezien deze nu nog niet echt iets doet, en om wel te checken of je nog Java programma's kunt runnen ;). Maar verwijder deze code daarna weer.
public static void main(String[] args) {
SpringApplication.run(PriemTesterApplication.class, args);
// Tijdelijke test code.
var priemTester = new PriemTester();
for(int i = 0; i<10; i++) {
System.out.println("Getal " + i + " is een priemgetal?" + priemTester.isPriemgetal(i));
// Einde tijdelijke test code, beter via TDD
}
}
We gaan nu unit tests gebruiken als entry points in plaats van de main methode. Zo kom je ook netjes tot TDD: Test Driven Development, zoals verplicht in deze minor! En 'vervuil' je je main methode niet met test code.
5. Maak een test, TDD all the way!
Een populaire aanpak in testgestuurde ontwikkeling (TDD) is om eerst een (mislukkende) test te schrijven voordat de doelcode wordt geïmplementeerd. Deze tutorial gebruikt de TDD-aanpak. De methode IsPrime kan worden aangeroepen, maar is niet geïmplementeerd. Een testaanroep naar IsPrime faalt. Bij TDD wordt een test geschreven waarvan bekend is dat deze zal falen. De doelcode wordt vervolgens bijgewerkt om de test te laten slagen. Je herhaalt deze aanpak steeds opnieuw: je schrijft een falende test en werkt daarna de doelcode bij om te slagen.
Vul de code in PriemTesterApplicationTests
met test methodes voor input 1
en 2
. Later komen er meer methodes in de verzameling tests. Zo'n verzameling tests noemt men ook wel een test suite.
NB: Dit woorde 'suite' in 'test suite' spreek je ANDERS uit dan het woord 'suit' (=pak), wat veel mensen foutief zeggen. Je zegt 'suite' meer als 'zwiete' (of 'sweet' in het Engels). Luister anders eens op Google Translate naar het Nederlands en evt. ook de Engelse variant, via de volgende link:
https://translate.google.com/?sl=nl&tl=en&text=test%20suite&op=translate (als developer/devopser moet je ook kunnen praten over je vak, dus probeer hier zelf eens zinnen of woorden uit als je twijfelt hoe je ze uitspreekt)
@SpringBootTest
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class PriemTesterApplicationTests {
PriemTester sut;
@BeforeAll
void beforeAll() {
sut = new PriemTester();
}
@Test
void PriemTester_1_is_geen_priemgetal() {
// Arrange.
// TODO Refactoren dit soort herhalende code.
// DAMP: DRY voor unit tests: Descriptive And Meaningfull Phrases.
sut = new PriemTester();
var input = 1;
var expected = false;
// Act.
var actual = sut.isPriemgetal(input);
// Assert.
Assertions.assertEquals(expected, actual);
}
@Test
void PriemTester_2_is_een_priemgetal() {
// Arrange.
// TODO Refactoren dit soort herhalende code.
// DAMP: DRY voor unit tests: Descriptive And Meaningfull Phrases.
sut = new PriemTester();
var input = 2;
var expected = true;
// Act.
var actual = sut.isPriemgetal(input);
// Assert.
Assertions.assertEquals(expected, actual);
}
De @Test
annotatie maakt een methode als een test methode die gerund wordt door de 'test runner'.
De naam van een test methode maakt technisch niet uit, maar het is belangrijk deze een beschrijvende naam te geven.
Verder biedt JUnit ook de @BeforeEach
en @BeforeAll
annotatie die telkens voor elke test (in de testsuite) respectievelijk eenmaal voor start van op de (gelijknamige) methode)
Run mvn test
. En/of gebruik de 'play' toets op toetsmethodes in je editor/IDE.
Los de TODO's op door herhalende code te refactoren naar de BeforeAll. En run de tests opnieuw om te checken dat alles nog werkt.
Breidt nu de applicatie code isPriemgetal
uit met de volgende code:
public boolean isPriemgetal(int kandidaat) {
if (kandidaat == 1) {
return false;
}
throw new UnsupportedOperationException("Niet geheel geïmplementeerd.");
}
Run weer de tests.
6. Meer testgevallen via parametriseren testmethode
Voeg tests toe voor input 0
en -1
. Je kan verder gaan copy-pasten en wat aanpassen. Maar dat is niet DRY (Don't Repeat Yourself), maar WET (Write Everything Twice). Er is een betere manier!
bool result = sut.IsPrime(1);
Assert.False(result, "1 zou geen priemgetal moeten zijn");
Er bestaan nog extra JUnit annotaties die het mogelijk maken een suite van vergelijkbare tests op te stellen.
Je kunt gebruik maken van @ParameterizedTest
om een reeks tests uit te voeren met verschillende invoerargumenten. De annotatie @ValueSource
specificeert de waarden voor die invoer. In plaats van afzonderlijke test methodes te schrijven, gebruik je deze JUnit annotaties om één enkele testtheorie te creëren. Als volgt:
package nl.han.devops;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class PriemTesterTest {
private final PriemTester priemTester = new PriemTester();
@ParameterizedTest
@ValueSource(ints = {-1, 0, 1, 2})
public void isPriemgetal_WaardenKleinerDan2_ReturnFalse(int value) {
boolean result = priemTester.isPriemgetal(value);
Assertions.assertFalse(result, value + " zou geen priemgetal moeten zijn");
}
}
NB Conform lessen uit het 1e Semester van Software Engineering, is het goed de priemTester
variabele in bovenstaande code te hernoemen naar sut
om evident te maken dat de PriemTester klasse de system under test
is in deze unit test.
Run mvn test
en twee van de testen zullen falen. Om alle tests te laten slagen, update de IsPriem
methode met de volgende code:
public bool IsPriemgetal(int kandidaat) {
if (kandidaat < 2) {
return false;
}
throw new NotImplementedException("Not fully implemented.");
}
Volg de TDD aanpak, en voeg meer falende testen toe, en update de applicatie code. Zie evt. de uiteindelijke versie van de implementatie op GitHub.
Let op: Deze IsPriem
methode is GEEN efficient algoritme om te testen of een getal een priemgetal is (hiervoor kun je best een bestaande oplossing/package uit NuGet of MavenCentral repository halen).
7. Optionele extra opdracht: Make it fast.
Binnen Software Engineering, en ook in deze minor, richten we ons vooral op de 'make it work' fase en dan de 'make it nice' fase uit het bekende adagium van Beck's bekende gezegde over code:
Figuur 4: "Make it work, make it nice, make it fast." - Kent Beck, z.d. (TODO: APA), Bron plaatje: the tombomb
Maar voor de liefhebbers, die eens willen kijken naar 'make it fast'. Best manier is toch dit van andere te jatten, en je eigen originaliteit te bewaren voor onopgeloste problemen (of oplossing van bestaande problemen toepassen in nieuwe domeinen, waar niemand dit probleem al echt heeft gezien ... 😉 💶).
Voor een WEL efficiente methode, of in ieder geval efficientere aanpak zoek zelf een package in NuGet of Maven central, bestudeer de README/documentatie of community feedback of deze goed is, en voeg hiervan de URL als bron toe. En voeg een variant toe van deze implementatie. Liefst via eerst extracten van een interface uit je huidige PriemTester
(met refactor optie van IntelliJ bv; of anders handmatig. Deze interface noem je PriemTester
en je huidige implementatie hernoem je naar CustomPriemTester
. Dan maak je een nieuwe implementatie EfficientPriemTester
, en hierin roep je de Maven package aan. Feitelijk is dit nu een.... Adapter patroon). Later zou je een load test kunnen bouwen, om de twee implementaties op performance/snelheidsverschillen te kunnen testen.
Bronnen
- InfoQ (2013). The Continuous Delivery Maturity Model. Geraadpleegd 27 augustus 2024 op https://www.infoq.com/articles/Continuous-Delivery-Maturity-Model/
- Minor DevOps (z.d.) Beoordelingsmodel Groep. Geraadpleegd op 27-8-2024 op https://minordevops.nl/beoordelingsmodel-groep.html
- Microsoft Learn (3-7-2024) Unit testing with dotnet test and xUnit. Geraadpleegd op 27 augustus op https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-with-dotnet-test
- Scoop.sh (z.d.) Scoop geraadpleegd op 2 september 2024 op https://scoop.sh/
- Spring Docs (z.d.) Installing the CLI :: Spring Boot, Geraadspleegd op 27-8-2024 op https://docs.spring.io/spring-boot/cli/installation.html
- Spring.io (z.d.) Installing Spring Boot CLI geraadpleegd op 2 september 2024 op https://docs.spring.io/spring-boot/installing.html#getting-started.installing.cli
- Wal, B. van der. (2 september 2024) Priemtester code. geraadpleegd op 2 september 2024 op https://github.com/hanaim-devops/priemtester
Microservices: The complete saga (compensating transactions)
In deze blog beschrijf ik een manier om gedistribueerde transacties toe te passen in een microservice-architectuur met behulp van het [saga pattern](https://docs.microsoft.com/en-us/azure/architecture/reference-architectures/saga/saga) en het [compensating transactions pattern](https://docs.microsoft.com/en-us/azure/architecture/patterns/compensating-transaction).
Allereerst leg ik de aanleiding voor deze blog uit door te bespreken waarom transacties en microservices niet vanzelfsprekend hand-in-hand gaan. Daarna licht ik toe wat compensating transactions en het saga pattern precies inhouden, waarna ik een voorbeeldimplementatie van het saga pattern laat zien.
Deze blog is geschreven in opdracht van de Hogeschool van Arnhem en Nijmegen tijdens de Minor DevOps.
Transacties en microservices
Het gebruik van transacties in een database is een welbekende en veelgebruikte techniek om een aantal samenhangende operaties uit te voeren die óf allemaal slagen óf allemaal falen. Een belangrijk aspect van een transactie is dat deze atomair is. Dit houdt in dat de data die een transactie aanpast pas in de database gecommit wordt op het moment dat de transactie succesvol is afgerond. Een "half-afgeronde" transactie bestaat dus niet (Microsoft, 2018).
Het gebruik van een microservice-architectuur biedt op veel vlakken voordelen. Helaas bemoeilijkt het gedistribueerde karakter van microservices het gebruik van transacties enorm. Sterker nog, het is meestal onmogelijk om een ACID-compliant transactie over verschillende microservice-databases uit te voeren (Microsoft, z.d.).
Er zijn verschillende strategieën om transacties toe te passen in een microservice-architectuur. In dit artikel richt ik me op het saga pattern met compensating transactions. Het is belangrijk om te noemen dat deze transacties nog steeds niet ACID-compliant zijn. "Atomicity" en "Isolation" kunnen meestal niet gegarandeerd worden. In plaats daarvan zijn de transacties BASE-compliant:
- Basically Available
- Soft state
- Eventually consistent
Hierbij is vooral het concept eventual consistency belangrijk. Dit concept houdt in dat een wijziging niet direct zichtbaar is, maar na verloop van tijd wel gegarandeerd overal doorgevoerd wordt (ScyllaDB, 2021).
Compensating transactions
Als je gedistribueerde transacties gaat implementeren wordt het concept van compensating transactions erg belangrijk. Een compensating transaction is een idempotente actie die precies het tegenovergestelde doet van een bepaalde stap in de transactie. Elke actie binnen een transactie heeft dan ook een eigen compensating action (Microsoft, 2017). Dit is een voorbeeld van een gedistribueerde transactie:
Als voorbeeld gebruik ik een fictieve reisorganisatie. Een klant kan hier een (volledig willekeurige) reis boeken. Om dit te bereiken moet er met drie services gecommuniceerd worden. Als er een stap mislukt wordt de compensating action van die stap aangeroepen. Als er bijvoorbeeld iets misgaat bij het reserveren van de huurauto wordt de reservering geannuleerd en de vlucht geannuleerd. Het systeem bevindt zich dan weer in de staat waarin het zich voor het begin van de transactie bevond.
Uit dit diagram blijkt ook het belang van idempotentie. Het is namelijk ook mogelijk dat een compensating action faalt. Het is dus erg belangrijk dat de actie net zo lang herhaald kan worden tot deze slaagt.
Saga pattern
Een manier waarop je gedistribueerde transacties met compensating transactions kan implementeren is met behulp van het saga pattern (IBM, z.d.). Je kan het saga pattern op twee manieren implementeren, namelijk choreography-based en orchestration-based (Richardson, z.d.). Beide strategieën hebben voor- en nadelen. Dit is een interessante talk van Caitie McCaffrey over het toepassen van het saga pattern voor het verwerken van statistieken van de game Halo. Caitie heeft het hier specifiek over een orchestration-based saga.
Choreography-based
De choreography-based saga is de meest eenvoudige manier om het saga pattern te implementeren. In deze situatie "weet" elke service wat de volgende stap in de transactie is. Nadat een service zijn stap succesvol heeft uitgevoerd is hij zelf verantwoordelijk voor het aanroepen van de volgende service. Hetzelfde geldt voor een niet-succesvol afgeronde stap. De service voert zijn eigen compensating action uit en roept de volgende compensating action aan. De architectuur van een choreography-based saga ziet er dus precies uit zoals het plaatje hierboven (Microsoft, z.d.).
Het voordeel van een choreography-based saga is dat het eenvoudig te implementeren is in een kleine architectuur. Er is geen single point of failure, elke service heeft namelijk evenveel verantwoordelijkheid bij het uitvoeren van de transactie. Een nadeel is echter dat het lastig te traceren is waar de transactie zich op dit moment bevindt. Ook het uitbreiden of wijzigen van een transactie wordt al snel complex (Richardson, z.d.).
Orchestration-based
Een orchestration-based saga introduceert een nieuw concept: de orchestrator of saga execution coordinator (SEC). De SEC houdt alle transacties bij, weet welke stappen er volgen en in welke staat een transactie zich bevindt. De orchestrator is verwantwoordelijk voor het aanroepen van services, maar dus ook het uitvoeren van de compensating transaction wanneer een actie faalt. Het voordeel van deze gecentraliseerde aanpak is dat het een stuk makkelijker is om uit te vinden in welke staat een transactie zich bevindt. De SEC houdt dit namelijk precies bij. Daarnaast is het uitbreiden of wijzigen van een transactie eenvoudiger, aangezien dit alleen in de saga execution coordinator aangepast hoeft te worden. Het nadeel is dat er een single point of failure geïntroduceerd wordt (Richardson, z.d.).
De SEC kan je als losse service deployen. Een andere optie is om deze in een andere service te embedden. Dit kan bijvoorbeeld de eerste service in een transactie zijn.
Voorbeeldimplementatie
Om een voorbeeld te demonstreren van een saga gebruik ik mijn eerdere voorbeeld van een fictief reisbureau. De voorbeeldcode kan je hier vinden. Instructies voor het uitvoeren staan in de README. De architectuur ziet er als volgt uit:
NB: Ik gebruik RabbitMQ om tussen services te communiceren. Het gebruik van een message queue is geen vereiste bij het gebruik van het saga pattern. Ik gebruik het hier wel omdat dat gebruikelijk is bij een microservice-architectuur.
Vanwege de grootte van deze architectuur kies ik ervoor om gebruik te maken van een choreography-based saga. Dit is de flow van de transactie:
- De controller van
ReisAPI
start een transactie op het moment dat iemand POST naar/reizen
- De
TicketService
boekt een vliegticket - De
HuurautoService
reserveert een huurauto - De
HotelService
boekt een hotel
Wanneer er iets fout gaat in een service zal de service eerst zijn eigen actie compenseren, waarna hij de compenserende actie van de vorige service aanroept. Zo ziet het begin van de transactie in ReisAPI
(ReizenController.cs
) er uit:
using (connection)
{
using var channel = connection.CreateModel();
channel.ExchangeDeclare("saga", ExchangeType.Topic, true);
Message message = new()
{
Id = Guid.NewGuid().ToString()
};
channel.BasicPublish("saga", "saga.ticketservice.execute", null,
Encoding.UTF8.GetBytes(JsonSerializer.Serialize(message)));
}
De ReisAPI
publiceert een nieuw bericht op het saga topic met routing key saga.ticketservice.execute. Op het moment dat het uitvoeren van de actie foutgaat zal de service zijn actie ongedaan maken. Indien er een vorige stap in de transactie was zal de service een bericht publiceren met routing key saga.[servicenaam].compensate. Op die manier hoeft een service dus alleen aan de topic saga.[servicenaam].* te binden. Deze strategie zorgt er ook voor dat een eventuele uitbreiding naar een gecentraliseerde aanpak een stuk makkelijker wordt. Deze service hoeft dan alleen aan de topic saga.*.* te binden.
Elke service heeft een Execute()
methode, in dit geval om duidelijk te maken dat dat de stap in de transactie is die uitgevoerd wordt:
async Task Execute(Message message)
{
Console.WriteLine($"Started executing HotelService for {message.Id}");
await collection.InsertOneAsync(message);
var rand = new Random();
if (rand.Next(10) < 7) throw new Exception();
Console.WriteLine($"Executed HotelService for {message.Id}");
Next(message);
}
De Execute()
methode van HotelService
(HotelService/Program.cs
) simuleert (in 70% van de gevallen) een fout in het uitvoeren, waarna door een bovenliggende try/catch
de compenserende actie wordt aangeroepen. Dat is in dit geval het ongedaan maken van de Insert
in de database.
Daarnaast krijgt elke service een Next()
methode, deze wordt aangeroepen zodra de stap in de transactie van die service voltooid is. Elke service weet dus wat de volgende stap in de transactie is, en publiceert in dit geval een nieuw bericht op de message queue.
void Next(Message message)
{
channel.BasicPublish("saga", "saga.hotelservice.execute", null,
Encoding.UTF8.GetBytes(JsonSerializer.Serialize(message)));
}
Uiteraard heeft elke service ook een manier om zijn actie te compenseren en terug te gaan naar de vorige stap in de transactie. De methode Compensate()
maakt de actie ongedaan en Previous()
roept de vorige service aan:
async Task Compensate(Message message)
{
Console.WriteLine($"Started compensating HuurautoService for {message.Id}");
var rand = new Random();
if (rand.Next(10) < 7)
{
Console.WriteLine($"Compensation of HuurautoService failed for {message.Id}! Retrying...");
throw new Exception();
}
await collection.DeleteOneAsync(document => document.Id == message.Id);
Console.WriteLine($"Compensated HuurautoService for {message.Id}");
Previous(message);
}
void Previous(Message message)
{
channel.BasicPublish("saga", "saga.ticketservice.compensate", null,
Encoding.UTF8.GetBytes(JsonSerializer.Serialize(message)));
}
In dit geval simuleert HuurautoService
(HuurautoService/Program.cs
) het falen van een compensating action. De aanroep van de Compensate()
actie ziet er zo uit:
await Policy
.Handle<Exception>()
.WaitAndRetryForeverAsync(i => TimeSpan.FromSeconds(1))
.ExecuteAsync(async () => await Compensate(parsed!));
Wanneer de compensating action faalt zal deze net zolang herhaald worden tot 'ie slaagt. Ik heb Polly gebruikt voor deze foutafhandeling. Als een transactie succesvol wordt afgerond zien de logs er zo uit:
reisapi_1 | Started transaction 1670771a-29ca-4d53-a5e9-e46f913529a5
ticketservice_1 | Started executing TicketService for 1670771a-29ca-4d53-a5e9-e46f913529a5
ticketservice_1 | Executed TicketService for 1670771a-29ca-4d53-a5e9-e46f913529a5
huurautoservice_1 | Started executing HuurautoService for 1670771a-29ca-4d53-a5e9-e46f913529a5
huurautoservice_1 | Executed HuurautoService for 1670771a-29ca-4d53-a5e9-e46f913529a5
hotelservice_1 | Started executing HotelService for 1670771a-29ca-4d53-a5e9-e46f913529a5
hotelservice_1 | Executed HotelService for 1670771a-29ca-4d53-a5e9-e46f913529a5
hotelservice_1 | Completed transaction 1670771a-29ca-4d53-a5e9-e46f913529a5
Elke service voert dus zijn eigen stap uit en "geeft het stokje door" naar de volgende service in de transactie. Wanneer er iets fout gaat ziet het er zo uit:
reisapi_1 | Started transaction 0674aa00-5aec-4c5e-b265-b7db47d9f1ae
ticketservice_1 | Started executing TicketService for 0674aa00-5aec-4c5e-b265-b7db47d9f1ae
ticketservice_1 | Executed TicketService for 0674aa00-5aec-4c5e-b265-b7db47d9f1ae
huurautoservice_1 | Started executing HuurautoService for 0674aa00-5aec-4c5e-b265-b7db47d9f1ae
huurautoservice_1 | Executed HuurautoService for 0674aa00-5aec-4c5e-b265-b7db47d9f1ae
hotelservice_1 | Started executing HotelService for 0674aa00-5aec-4c5e-b265-b7db47d9f1ae
hotelservice_1 | Started compensating HotelService for 0674aa00-5aec-4c5e-b265-b7db47d9f1ae
hotelservice_1 | Compensated HotelService for 0674aa00-5aec-4c5e-b265-b7db47d9f1ae
huurautoservice_1 | Started compensating HuurautoService for 0674aa00-5aec-4c5e-b265-b7db47d9f1ae
huurautoservice_1 | Compensation of HuurautoService failed for 0674aa00-5aec-4c5e-b265-b7db47d9f1ae! Retrying...
huurautoservice_1 | Started compensating HuurautoService for 0674aa00-5aec-4c5e-b265-b7db47d9f1ae
huurautoservice_1 | Compensation of HuurautoService failed for 0674aa00-5aec-4c5e-b265-b7db47d9f1ae! Retrying...
huurautoservice_1 | Started compensating HuurautoService for 0674aa00-5aec-4c5e-b265-b7db47d9f1ae
huurautoservice_1 | Compensated HuurautoService for 0674aa00-5aec-4c5e-b265-b7db47d9f1ae
ticketservice_1 | Started compensating TicketService for 0674aa00-5aec-4c5e-b265-b7db47d9f1ae
ticketservice_1 | Compensated TicketService for 0674aa00-5aec-4c5e-b265-b7db47d9f1ae
ticketservice_1 | Compensated transaction for 0674aa00-5aec-4c5e-b265-b7db47d9f1ae successfully.
In dit geval gaat er iets fout in HotelService
. De service maakt eerst zijn eigen actie ongedaan en roept vervolgens de compensating action van HuurautoService
aan. Deze gaat vervolgens fout en wordt net zo lang herhaald totdat hij slaagt. Uiteindelijk is de compensating transaction afgerond en is alle data die in de database was opgeslagen nu weer verwijderd. Dit kan je verifiëren door naar localhost:8081
te gaan en de TicketService
database te bekijken. Hier staan alleen documenten waarvan de gehele transactie is geslaagd.
Conclusie
Het is relatief eenvoudig om het saga pattern toe te passen in een bestaande microservice-architectuur. In veel gevallen zal het echter niet zo eenvoudig zijn als mijn voorbeeldimplementatie. In een complexere architectuur met veel verschillende transacties is het waarschijnlijk beter om voor een gecentraliseerde aanpak — het orchestrated saga pattern — te kiezen. Deze blog biedt echter een goede basis voor het begrip en implementeren van compensating transactions en het saga pattern.
Bronnen
-
Microsoft (2018, 31 mei). What is a Transaction? - Win32 apps. Microsoft Docs. Geraadpleegd oktober 2021 van https://docs.microsoft.com/en-us/windows/win32/ktm/what-is-a-transaction
-
Microsoft. (z.d.). Saga distributed transactions - Azure Design Patterns. Microsoft Docs. Geraadpleegd oktober 2021 van https://docs.microsoft.com/en-us/azure/architecture/reference-architectures/saga/saga
-
ScyllaDB. (2021, 23 juni). What is Eventual Consistency? Definition & FAQs. Geraadpleegd oktober 2021 van https://www.scylladb.com/glossary/eventual-consistency/
-
Microsoft. (2017, 23 juni). Compensating Transaction pattern - Cloud Design Patterns. Microsoft Docs. Geraadpleegd oktober 2021 van https://docs.microsoft.com/en-us/azure/architecture/patterns/compensating-transaction
-
IBM. (z.d.). Solving distributed transaction management problem in microservices architecture using Saga. IBM Developer. Geraadpleegd op 7 oktober 2021 van https://developer.ibm.com/articles/use-saga-to-solve-distributed-transaction-management-problems-in-a-microservices-architecture/
-
Richardson, C. (z.d.). Sagas. microservices.io. Geraadpleegd op 7 oktober 2021 van https://microservices.io/patterns/data/saga.html
Ansible: Configureren zonder nieuwe dingen te leren
In het kader van de HAN-minor DevOps onderzoek ik de automatiseringstool Ansible. Dit is geen onderwerp tijdens de lessen van de coursefase niet, maar past wel binnen de onderwerpen *Orchestration* en *Continuous Delivery*. Het doel van dit onderzoek is om kennis op te doen over de technologie en om deze technologie toe te kunnen passen binnen een kleinschalig DevOps project. Binnen de Pitstop applicatie kan Ansible worden toegepast om verschillende nodes te deployen en hier de juiste packages voor te installeren.
Dit blog legt eerst uit wat Ansible is en welke problemen het voor je kan oplossen, hierna volgt een hands-on onderdeel met opzet van een Nginx webserver vanuit een Docker container gedeployed naar localhost. Tenslotte een vergelijking van Ansible met andere tools en verschillende redenen gegeven om voor Ansible te kiezen.
Wat is Ansible?
Ansible (RedHat, z.d.) is een automatiseringsplatform dat is opgericht in 2012. Het is oorspronkelijk ontwikkeld door Michael deHaan maar inmiddels is het een gratis open-source tool die beheerd wordt door de Ansible community en wordt het gesponsord door RedHat. Het is hoofdzakelijk geschreven in Python en draait op alle Unix gebaseerde systemen (Linux, MacOs, enz.) en Windows (Wikipedia, 2021).
Ansible is in tegenstelling tot andere configuratiemanagement tools agentless. In plaats hiervan maak je verbinding met de verschillende nodes door middel van een SSH key. Verder maakt Ansible gebruik van YAML bestanden met een taal dat sterk lijkt op Engels (Hummel, 2019) (Higbee, 2020).
Waar kan Ansible bij helpen?
Ansible kan helpen bij het opzetten en beheren van meerdere services door middel van één configuratie. Hierdoor hoeft bij het schalen van services niemand handmatig de server in te richten, maar doet Ansible dit voor je (Orchestration). Door deze aanpak kan een service binnen enkele seconden gebouwd worden.
Verder kan het helpen bij het configureren van de verschillende services. Dit gebeurd op basis van het ‘push’ principe. De main server, vaak een lokale computer, pusht updates van de configuratie naar de follower servers (Configuration management).
Hiernaast kan Ansible je helpen bij het automatiseren van deployments op verschillende omgevingen (Automatic deployment). Hierdoor ontstaat een kortere ‘time to market’ (Hummel, 2019) (simplilearn, 2019) (Higbee, 2020).
Waarom is Ansible een echte DevOps tool?
Ansible is een automatiseringstool die het mogelijk maakt om aan het principe Infrastructure as Code (IaC) te voldoen. IaC is het proces van het beheren en inrichten van computerdatacenters via machineleesbare definitiebestanden, in plaats van fysieke hardware configuratie of interactieve configuratietools. IaC is een best practices in DevOps, het betrekt ontwikkelaars meer bij het definiëren van configuratie en Ops-medewerkers eerder tijdens het ontwikkelingsproces. Automatisering in het algemeen heeft tot doel het verwarrings- en foutgevoelige aspect van handmatige processen weg te nemen en efficiënter en productiever te maken. Dit is ook wat Ansible doet door configuratiefiles te maken. Hierdoor kunnen betere software en applicaties worden gemaakt met flexibiliteit en minder downtime (Ahmed, 2020).
De Ansible configuratiemanager structuur
De configuratiemanager van Ansible heeft een duidelijke en eenvoudige structuur zoals is weergegeven in Afbeelding 1.
Afbeelding 1: Ansible configuratiestructuur
In Afbeelding 1 is te zien dat er één management node is, dit kan gewoon een lokale laptop zijn. Op deze node wordt Ansible geïnstalleerd. Daarnaast worden op deze node een host file en één of meerdere playbooks aangemaakt. Een playbook is de configuratie file voor de services. Binnen deze file worden de taken omschreven die uitgevoerd moeten worden. De Main node maakt vervolgens een connectie naar het IP adres van de follower nodes via een SSH verbinding, de IP adressen van de follower nodes staat beschreven in de host file. De follower nodes hebben hierdoor geen enkele kennis van Ansible en het playbook nodig (Dittrich, z.d.).
Het configureren van twee nodes door middel van Ansible
Zoals eerder besproken, is het mogelijk om de configuratie van alle aangesloten nodes te regelen. In dit hoofdstuk wordt een demo uitgevoerd om een Nginx webserver op te zetten en te deployen op localhost:8080 vanuit een docker container. In deze demo wordt gebruik gemaakt van twee ubuntu:20.04.3 LTS versie nodes (VM). Een van deze virtual machines is als management node (Main) aangewezen en de andere VM is de Follower node.
Het installeren van Ansible
Door middel van een aantal commando's kan Ansible worden geinstalleerd op de Main node. Eerst update je de packagemanager door middel van het commando sudo apt-get update
. Nu kun je Ansible installeren sudo apt install ansible -y
. Om te controleren of Ansible juist geïnstalleerd is kan je het commando ansible –version
uitvoere. Wanneer de response vergelijkbaar is met Afbeelding 2, is Ansible correct geïnstalleerd (Higbee, 2020).
Afbeelding 2: Ansible installed response
Het configureren van Ansible en SSH
Om Ansible te configureren en naar het juiste IP adres van de Follower te laten verwijzen, dien je eerst het IP adres van de Follower op te vragen. Dit kun je doen door het commando ifconfig
uit te voeren op de Follower node. In de onderstaande afbeelding is het IP adres van de service zichtbaar die je later gebruikt in de host file van de Main node.
Afbeelding 3: ifconfig response
Hiernaast dien je een SSH key aan te maken, dit werkt op iedere distributie van Linux anders, voor ubuntu kun je de volgende commando’s uitvoeren op de Follower node
sudo apt-get update
sudo apt-get install openssh-server
sudo systemctl status ssh
sudo ufw allow ssh
ssh username@ip_address
voer ‘yes’ in
voer een wachtwoord in
Hierna dien je te wisselen naar de Main node. Wanneer de wens is dat de configuratie ook op de Main node wordt uitgevoerd, kunn je de bovenstaande stappen ook hierop uitvoeren. Hierna kun je de Ansible host file aanpassen om een connectie te maken met de Follower nodes. Dit kan door sudo nano /etc/ansible/hosts
uit te voeren. In deze file moeten de volgende regels toegevoegd worden. (Linuxize, 2019)
Afbeelding 4: Ansible host file
Het aanmaken van een playbook in Ansible
Het aanmaken van een Ansible playbook kan met elke tekst editor, de structuur van het bestand is makkelijk te begrijpen en de taal lijkt op Engels. Het aanmaken van een playbook.yml gaat door middel van het commando sudo nano playbook.yml
hierna kun je het playbook.yml bestand vullen met een aantal taken die chronologisch worden uitgevoerd. Voor het pullen en deployen van de nginx docker container ziet het playbook.yml er zo uit:
---
- name: docker_install_nginx
hosts: ansible_clients
become: true
tasks:
- name: Install aptitude using apt
apt: name=aptitude state=latest update_cache=yes force_apt_get=yes
- name: Install required system packages
apt: name=docker state=latest update_cache=yes
loop: [ 'apt-transport-https', 'ca-certificates', 'curl', 'software-properties-common', 'python3-pip', 'virtualenv', 'python3-setuptools']
- name: Add Docker GPG apt Key
apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
state: present
- name: Add Docker Repository
apt_repository:
repo: deb https://download.docker.com/linux/ubuntu bionic stable
state: present
- name: Update apt and install docker-ce
apt: update_cache=yes name=docker-ce state=latest
- name: Install Python pip
apt: name=pip update_cache=true state=present force_apt_get=yes
with_items:
- python-pip
- python3-pip
become: true
- name: Install Docker Module for Python
pip:
name: docker
- name: Pull nginx Docker image
docker_image:
name: "nginx"
source: pull
- name: Create default containers
docker_container:
name: "nginx_container"
image: "nginx"
state: started
recreate: yes
published_ports:
- "8080:80"
Elke playbook file moet beginnen met ---
hierna volgt de host informatie (deze is gelijk aan de groep name uit de host file). Hierna volgt het keyword tasks met daaronder alle taken die beginnen met een -
. Eerst worden een aantal packages geïnstalleerd die nodig zijn om Docker te installeren. Vervolgens wordt Docker zelf geïnstalleerd en wordt de Nginx image opgehaald. Tenslotte wordt een container gestart op poort 8080. Let op dat voor iedere OS of distributie de commando’s om te installeren anders kunnen zijn. Verder dien je tekst te laten inspringen in de playbook file. (Kataria, z.d.) (simplilearn, 2019)
Het uitvoeren van een playbook in Ansible
Het uitvoeren van een playbook in Ansible gaat door middel van het commando ansible-playbook playbook.yml -kK
. Na het uitvoeren van het commando is een soort gelijk scherm te zien als in Afbeelding 5. (simplilearn, 2019)
Afbeelding 5: Ansible run playbook response
Vervolgens kan je een browser openen op de Follower node en http://localhost:8080
bezoeken. Daar zie je dan de startpagina van nginx:
Afbeelding 6: Nginx running op localhost:8080
Waarom kiezen voor Ansible?
Een van de grootste voordelen aan Ansible vergeleken met andere configuratiemanagement tools is dat Ansible agentless is. Dat wil zeggen dat je op de follower nodes geen agent hoeft te installeren. Hier zitten twee voordelen aan:
- Er blijft meer ruimte en kracht over op de follower node, hier draait immers geen agent die deze ruimte opvult
- De follower nodes hebben geen enkele kennis van Ansible en kun je direct vervangen zonder ze verder in te stellen
Een ander voordeel is dat playbooks gemakkelijk te lezen en schrijven zijn. Dit komt omdat ze geschreven worden in bijna natuurlijk Engels. Andere tools gebruiken hiervoor vaak programmeertalen wat het ingewikkelder maakt.
Ook is Ansible open-source, heeft het een grote community en het wordt gesponsord door RedHat. Hierdoor is er veel onderhoud en zijn er veel nieuwe features.
In vergelijking met andere tools is Ansible declaratief en niet procedureel. Dit betekent dat de beschrijving de eindtoestand van de machine bevat en dat Ansible alle nodige stappen onderneemt om aan die beschrijving te voldoen. Door op deze manier te werken, kunnen playbooks meerdere keren worden toegepast zonder dat dit bijwerkingen oplevert (Delgehier, 2020).
Een laatste voordeel is dat Ansible ook beschikt over een user interface, namelijk Ansible Tower. Ansible Tower is de extra ‘laag’ bovenop Ansible die complexe IT-infrastructuren inzichtelijk en beheersbaar maakt. De voordelen van Ansible Tower zijn:
- Ultieme controle over uw IT infra met een helder, visueel dashboard
- Role-based access control
- Taakverdeling
- Gecentraliseerde logging
- Ingebouwde notificaties
- Mogelijkheid om Tower overal te integreren met behulp van de API
Een groot nadeel aan Ansible Tower is dat het niet gratis is en dat het flink in de kosten kan lopen (Proxy, 2020).
Is Ansible de onmisbare DevOps tool?
Kortom, Ansible is de onmisbare configuratiemanagement tool. Een configuratiemanagement tool is binnen de wereld van DevOps van ultiem belang en Ansible biedt flink wat voordelen tegenover traditionele configuratiemanagement tools. Een aantal van die voordelen zijn:
- Agentless.
- Playbooks in natuurlijk Engels.
- Playbooks zijn declaratief en kunnen meerdere keren worden toegepast zonder bijwerkingen.
- Open-source en gesponsord door RedHat.
Zoals in de demo zichtbaar, is het super eenvoudig om meerdere servers te configureren en hier op te bouwen, installeren of deployen, zonder kennis te hebben van al deze commando’s. Verder maakt Ansible gebruik van het ‘push’ principe met een connectie via SSH waardoor de follower nodes geen kennis hoeven te hebben van Ansible.
Bronnen
- RedHat. (z.d.). Ansible is Simple IT Automation. Ansible. Geraadpleegd op 6 oktober 2021 van https://www.ansible.com/
- Wikipedia. (2021, 3 oktober). Ansible. Geraadpleegd op 6 oktober 2021 van https://en.wikipedia.org/wiki/Ansible_(software)
- Hummel, G. (2019, 18 september). What is Ansible? Cloud Academy. Geraadpleegd op 6 oktober 2021 van https://cloudacademy.com/blog/what-is-ansible/
- simplilearn. (2019, 27 november). Ansible Full Course | Ansible Tutorial For Beginners | Learn Ansible Step By Step | Simplilearn [Video]. YouTube. Geraadpleegd op 6 oktober 2021 van https://www.youtube.com/watch?v=EcnqJbxBcM0
- Ahmed, R. (2020, 16 september). What Is Ansible? – Configuration Management And Automation With Ansible. Edureka. Geraadpleegd op 6 oktober 2021 van https://www.edureka.co/blog/what-is-ansible/#ansible_in_devops
- Kataria, J. A. A. (z.d.). Managing Docker containers using Ansible. Axelerant. Geraadpleegd op 7 oktober 2021 van https://www.axelerant.com/blog/managing-docker-containers-using-ansible
- Linuxize. (2019, 2 augustus). How to Enable SSH on Ubuntu 18.04. Geraadpleegd op 7 oktober 2021 van https://linuxize.com/post/how-to-enable-ssh-on-ubuntu-18-04/
- Higbee, W. (2020, 13 januari). Getting Started with Ansible [Video]. Pluralsight. Geraadpleegd op 6 oktober 2021 van https://www.pluralsight.com/courses/getting-started-ansible
- Dittrich, D. (z.d.). 2. Ansible and Configuration Management — D2 Ansible playbooks. Davedittrich. Geraadpleegd op 7 oktober 2021 van https://davedittrich.readthedocs.io/projects/ansible-dims-playbooks/en/latest/ansible.html
- Delgehier, C. (2020, 24 april). Why and How We Use Ansible. OpenIO Object Storage. Geraadpleegd op 7 oktober 2021 van https://www.openio.io/blog/why-and-how-we-use-ansible
- Proxy. (2020, 30 juni). Ansible Tower - Geavanceerde IT Automation Proxy Services. Geraadpleegd op 7 oktober 2021 van https://www.proxy.nl/ansible-tower/
Is Linkerd iets voor jou?
In deze blogpost doe ik verdiepend onderzoek naar een technologie die DevOps gerelateerd is. Ik kijk hoe je [Linkerd](https://linkerd.io/) kunt inzetten in een DevOps project. Aan het eind van deze blogpost is hopelijk helder hoe je Linkerd kunt toepassen in een eigen project.
Voor het onderzoek maken we gebruik van de workshop en library onderzoeksruimtes van de ict research methods. Het gebruik van meerdere onderzoeksruimtes zorgt ervoor dat je triangulatie toepast, data verzamelen gebeurt dus op meerdere manieren. We passen de volgende onderzoeksmethoden toe:
We gaan als eerste kijken naar wat Linkerd is en waar het uit bestaat, vervolgens hoe je Linkerd opzet, daarna hoe je Linkerd toevoegt in een bestaande applicatie en tot slot kijken we wat Linkerd toe kan voegen aan een applicatie.
Introductie Linkerd
Linkerd is een service mesh voor Kubernetes. Linkerd maakt het uitvoeren van services veiliger en eenvoudiger door het bieden van runtime debugging, observeerbaarheid, betrouwbaarheid en beveiliging. Linkerd doet dit allemaal zonder aanpassingen te maken aan de al bestaande code.
Een service mesh is een speciale infrastructuurlaag om communicatie tussen services veilig, betrouwbaar en snel te maken (Kunze, 2018a). Waar je normaal de communicatie logica in de services stopt, abstraheert een service mesh die logica met behulp van een proxy. Zo'n proxy draait naast elke service en zo voorkom je aanpassingen aan de code.
Een service mesh omvat meerdere management processen en een set van schaalbare netwerkproxy's die naast de applicatie draaien (Morgan, z.d.). De proxy's vormen de data plane van een service mesh. De management processen vormen de control plane van een service mesh. De architectuur van Linkerd is goed te zien in onderstaande afbeelding.
Opmerking. Overgenomen uit Linkerd vs Istio: Service Mesh Comparison door A. Sahu, 2021 (https://www.infracloud.io/blogs/service-mesh-comparison-istio-vs-linkerd). 2021, Anjul Sahu.
Data plane
In bovenstaande afbeelding is te zien dat de data plane, oftewel de proxy's het verkeer van en naar de services afvangt. Dit gebeurt onder andere om het verkeer van TLS encryptie te voorzien (Fainchtein Buenavida, 2019). Dit gebeurt ook om het gedrag door te geven aan de control plane, deze kan daarmee relevante data tonen in grafieken aan de gebruiker.
Control plane
In bovenstaande afbeelding is te zien waar een deel van de control plane van Linkerd uit bestaat. De control plane heeft echter nog andere componenten die hier niet tussen staan, zoals Prometheus en Grafana.
De control plane heeft controle over de data plane en zorgt ervoor dat de data plane op een gecoördineerde manier kan handelen. Ook zorgt de control plane ervoor dat er een API is waar een gebruiker het gedrag van de data plane kan inspecteren en wijzigen.
Opzetten Linkerd
Om Linkerd te kunnen gebruiken moet je het eerst installeren. Onderstaande instructies geven aan hoe dit moet.
Installatie
Bij deze installatie gaan we er vanuit dat je een werkend kubectl
commando hebt, is dit niet zo? Kijk dan hier hoe je dit moet installeren.
De Linkerd CLI installeren kan op met één van de volgende twee opties.
-
Homebrew
Als je gebruikt maakt van Homebrew dan kan je de CLI met het
brew install linkerd
commando installeren. -
Curl
Als je geen gebruik maakt van Homebrew dan kan je de CLI installeren met behulp van het
curl
commando. Het installatie commando is:curl -sL run.linkerd.io/install | sh
.Voeg de CLI toe aan de PATH variabele om verder te kunnen gaan. Het commando hiervoor ziet er als volgt uit:
export PATH=$PATH:/c/Users/<USER>/.linkerd2/bin
, vervang hierbij<USER>
voor de naam van jouw user.Dit commando staat ook in de output van het
curl
commando.
Om te controleren of de installatie succesvol was voer je het linkerd version
commando uit, de output toont de versies voor de client en server.
De server version is nu nog unavailable
, de volgende stappen lossen dit op.
Voer het volgende commando uit om te controleren of de cluster gereed is om Linkerd te installeren: linkerd check --pre
. De output laat zien of de cluster gereed is.
Vervolgens kun je met linkerd install | kubectl apply -f -
de control plane installeren. De -f
optie geeft aan dat er een naam van een bestand of folder volgt, de -
erna laat weten dat het de bestanden pakt die voortkomen uit het linkerd install
commando. Dit kan even duren, dus voordat je verder gaat is het aan te raden om te verifiëren dat alles goed ging met het linkerd check
commando. De output laat zien of de installatie klaar is.
In Linkerd is het linkerd dashboard
commando deprecated. Linkerd raadt daarom aan dat je linkerd viz dashboard
gebruikt, zoals te zien in onderstaande afbeelding. Hiervoor is de viz
extensie vereist, deze moet je dus installeren.
Met het linkerd viz install | kubectl apply -f -
commando voegen we de viz extensie toe. Met het linkerd viz check
commando kun je kijken of de installatie van de viz
extensie succesvol is verlopen.
Het dashboard openen kan vervolgens met het al eerder genoemde linkerd viz dashboard
commando. Het dashboard opent dan automatisch in een nieuw tabblad in de browser.
Toevoegen van Linkerd aan een applicatie
Benodigdheden
De volgende stappen vereisen twee dingen:
-
Een Kubernetes cluster.
Een makkelijke manier om er één aan te maken is het runnen van een cluster op je lokale machine. Dit kan gemakkelijk met bijvoorbeeld Docker Desktop of k3d.
-
Een valide YAML/JSON bestand.
Gebruik het
curl -sL run.linkerd.io/emojivoto.yml
commando om hetemojivoto.yml
bestand te downloaden, deze kun je gebruiken in de volgende stappen.
Stappen
Om Linkerd ook echt te kunnen gebruiken voeg je het toe aan de applicatie. Onderstaande stappen geven aan hoe dit moet.
- Pak eerst het YAML/JSON bestand van de applicatie en run het
kubectl apply -f <YAML/JSON file>
commando. - Open een lokale port om de applicatie op te draaien met het
kubectl -n <NAMESPACE> port-forward <SERVICE> 8080:80
commando. - Voeg Linkerd toe aan de applicatie met het volgende commando:
kubectl get -n <NAMESPACE> deploy -o yaml \
| linkerd inject - \
| kubectl apply -f -
Dit commando haalt alle deployments in de meegegeven namespace op, voegt annotaties toe in de Kubernetes deployment bestanden en daarna voert Kubernetes een rolling deploy uit om elke pod zonder downtime bij te werken met de proxies van de data plane.
Linkerd is nu aan de bestaande services toegevoegd!
Toevoegingen van Linkerd
Linkerd voegt een grote reeks aan functionaliteit toe, waaronder (Sahu, 2021):
- Monitoring met Prometheus en Grafana
- Automatic proxy injection
- Load balancing
- High availability mode
- TLS encryptie
De grootste kracht van Linkerd is echter geen van deze functionaliteiten, maar juist dat deze functionaliteiten werken zonder dat Linkerd aanpassingen maakt aan de applicatie. Dit zorgt ervoor dat Linkerd makkelijk in gebruik te nemen is, zelfs voor grootte applicaties.
Het gebruik van Linkerd
Linkerd kan waarde toevoegen aan een applicatie, zeker als de applicatie veel services heeft. Linkerd komt dan ook veel voor in een microservice architectuur. Het is niet noodzakelijk om een microservice architectuur te hebben, het zou bij een monoliet bijvoorbeeld ook waarde kunnen toevoegen (INNOQ, 2021). Het hangt dus echt af van de functionaliteit die de applicatie nodig heeft en wat grootte van de applicatie is.
Applicaties die bijvoorbeeld nog niet in Kubernetes draaien moeten eerst in Kubernetes komen, hier kan veel tijd in gaan zitten. In zo'n geval kan je Linkerd dus beter niet gebruiken (Kunze, 2018b). Ook als je bijvoorbeeld alleen maar monitoring gebruikt dan is het niet verstandig om Linkerd met allemaal 'extra' functionaliteiten toe te voegen die je niet gebruikt, maar kun je beter zelf de monitoring inbouwen.
Conclusie
Is Linkerd iets voor jou? Deze blogpost heeft uitgelegd dat het erg afhangt van de applicatie. Linkerd kan veel functionaliteiten toevoegen, bestaande code hoeft niet aangepast en het is makkelijk te installeren en op te zetten. Het gebruik van Linkerd is daarom vaak handig in grotere applicaties met een microservice architectuur.
Is Linkerd iets voor jou? Naar mijn mening is het altijd verstandig om het gebruik van Linkerd te overwegen als je met een microservice architectuur werkt, zelf zou ik er voor kiezen om het wel te gebruiken tenzij er een goede rede is om het niet te doen.
Toepassen linkerd in Pitstop
Met deze blogpost sluit ik de onderzoeksweek in de minor af en ga door naar de eindopdracht van de coursefase. Dit is een kort DevOps project op basis van Pitstop, een demo applicatie van InfoSupport medewerker Edwin van Wijk. Hierin mag ik de onderzochte technologie ook toepassen. Linkerd toepassen in de pitstop applicatie kan eenvoudig door de installatie en opzet stappen te volgen die ik deze blogpost beschreef. Bij het toevoegen van Linkerd aan de pitstop applicatie gebruik je de .yml
bestanden die al in pitstop zitten. In het geval van pitstop gaat het om meerdere .yml
bestanden in plaats van één. Het vervangen van kubectl apply -f <YAML/JSON file>
voor kubectl apply -f <folder name>
is de enige nodige aanpassing, waarbij de <folder name>
in dit geval k8s
is.
Bronnen
- Bonestroo, W.J., Meesters, M., Niels, R., Schagen, J.D., Henneke, L., Turnhout, K. van (2018). ICT Research Methods. HBO-i Amsterdam. ISBN/EAN: 9990002067426. Geraadpleegd op 7 oktober 2021 van http://www.ictresearchmethods.nl/
- Fainchtein Buenavida, L. (2019, 10 december). Introduction to Service Meshes on Kubernetes. DZone. Geraadpleegd op 7 oktober 2021 van https://dzone.com/articles/introduction-to-service-meshes-on-kubernetes
- INNOQ. (2021, 28 september). Service Mesh Comparison. Geraadpleegd op 7 oktober 2021 van https://servicemesh.es/
- Kunze, T. (2018a, december 11). What is a Service Mesh?. Glasnostic. Geraadpleegd op 8 oktober 2021 van https://glasnostic.com/blog/what-is-a-service-mesh-istio-linkerd-envoy-consul
- Kunze, T. (2018b, 18 december). Should I Use a Service Mesh?. Glasnostic. Geraadpleegd op 7 oktober 2021 van https://glasnostic.com/blog/should-i-use-a-service-mesh
- Morgan, W. (z.d.). The Service Mesh: What Every Engineer Needs to Know about the World’s Most Over-Hyped Technology. Buoyant. Geraadpleegd op 6 oktober 2021 van https://buoyant.io/service-mesh-manifesto/
- Sahu, A. (2021, 9 maart). Linkerd vs Istio: Service Mesh Comparison. InfraCloud. Geraadpleegd op 6 oktober 2021 van https://www.infracloud.io/blogs/service-mesh-comparison-istio-vs-linkerd/
Infrastructure as Code in Microsoft Azure met Terraform
*Infrastructure as Code* is een manier om wijzigingen in je infrastrctuur te automatiseren, gebruikmakend van configuratie bestanden in je repository.
Deze blogpost introduceert de beginselen van Infrastructure as Code (IaC) in Microsoft Azure Services en ook de tool Terraform.
De post geeft een korte indruk van enkele zaken, allereerst een korte theoretische introductie van IaC. Daarna duiken we in de voordelen van IaC vergeleken met de "gebruikelijke" manier om infrastructure te beheren in Azure. Tot slot do ik een stap voor stap implementatie van IaC in de Microsoft Azure stack met de tool Terraform, via lab onderzoek (Bonestroo et al., 2018).
Kennis maken met IaC
Om te beginnen: Infrastructure as Code is het proces van het vervangen van handmatige stappen voor het maken en beheren van infrastructure met regels code (Workfall, 2021). Deze noemt met vaak configuratiebestanden of resources. Deze resources kunnen elk stuk infrastructure in a bepaalde omgeving maken, bijvoorbeeld een virtuele machine, een database, of — in de context van Azure — een logic app of service bus.
Infrastructure as code workflow (DigitalOcean, 2021)
Gebruik en voordelen van IaC
Er zijn een aantal voordelen van het gebruik van IaC, waarvan de voornaamste is dat het een efficiente en consistente manier is om infrastructuur te definieren en beheren.
Versiebeheer
Het definieren van infrastructuur resources maakt het mogelijk om wijzigingen te en toevoegingen aan de infrastructuur bij te houden in versiebeheer. Het gevolg is een historie van wijzigingen in je infrastructuur, waarnaar je makkelijk een rollback kunt doen in geval van een fout of niet werkend systeem.
Ook is het mogelijk om de wijzigingen in je infrastructuur te inspecteren en controleren voordat je daadwerkelijke oplevert.
Documentatie
Deze bestanden kunnen ook dienen als documentatie, aangezien de bestanden een specificatie zijn van de state (toestand) en opmaak van de services op een leesbare manier.
Snelheid
Ook is het op deze manier specificeren van je infrastructuur een stuk sneller. Vooral als je te maken hebt met een zeer uitgebreide infrastructuur, is het simpelweg niet mogelijk om alles te behren via een grafische user interface. Niet DevOps teams hebben het nog zwaarder te verduren, aangezien developers moeten wachten op een apart ops team om de benodigde infrastructure in de lucht te brengen (SDxCentral, 2021).
Je kunt makkelijk delen van IaC bestanden hergebruiken om specifieke services op te schalen.
Automatisering
Bovendien kunnen tools zoals Terraformje in staat stellen jr process te automatiseren. Je kan een IaC configuratie wijzigen of toevoegen. Daarna kun je de deployment van de wijzingen integreren in je CI/CD pipeline om deze naar een cloud provider naar keuze op te leveren.
Best practices with IaC
Voordat je IaC toepast is het goed om te een paar best practices te kennen om je aan te houden. Ik heb enkele van deze practices hieronder opgesoms, welke ik het meest waardevol vindt.
Documenting
When using infrastructure as code your configuration files will essentially be your documentation (Chan, 2021). This doesn't mean you shouldn't write any documentation at all!
In complexe landschappen kunnen diagrammen heel waardevol zijn. In sommige gevallen is een snelle blik op een overzicht / diagram meer waard dan de gehele structuur van de configuratie file te bestuderen.
Keep it simple, keep it modular
Het is een best practice om de configuratiebestanden simpel te houden en makkelijk te lezen. Op die manier kunnen andere developers makkelijk up to speed komen met de infrastructuur configuratie.
Dit kun je bijvoorbeeld doen door te modulatiseren. Als je de configuratie modulair houdt, dan kun je elementen hergebruiken, wat voor een consistente file structure zorgt (Xenonstack, 2021).
Mutable of immutable
Een mutable infrastructure betekent dat je wijzigingen kunt toepassen op je infrastructure terwijl deze al up and running is. Het hanteren van mutable infrastructure zorgt ervoor dat individuele wijzigingen aan je cluster kunnen zorgen voor configuration drift, waarbij een cluster stapsgewijs steeds meer afwijkt over de tijd, als gevolg vn de handmatige wijzigingen (Pelletier, 2020).
Sommigen argumenteren dat een betere manier om met wijzigingen om te gaan is met Immutable Infrastructure. Dit betekent de infrastructure die runt weggooien en deze volledig vervangen als je een wijziging deployed. Zo sta je toe om vorige configurations op te slaan als versies, en makkelijk opnieuw te deployen op basis van een versie van de infrastructuur (Vasiljevic, 2021).
Mutable vs immutable (Vasiljevic, 2021)
Implementing IaC
Er is een heel scale van tools die je kunt gebruiken voor IaC. In dit geval focussen we op Terraform. Aangezien je Terraform kunt integreren met een veelheid aan cloud service providers.
Overzicht van de workflow van Terraform (Hashicorp, 2021)
Implementing IaC with Terraform
Terraform gebruikt .tf
bestanden om je infrastructure configuraties in op te slaan. De syntax lijkt op Yaml and JSON. Als gewenst kun je ook een .tf.json
file extensie gebruiken, die je toestaat om JSON te schrijven.
Om te beginnen met het implementern van IaC, zal ik eerst een configuratie voor een lokale Docker container maken om bekent te raken met de syntax en verschillende onderdelen van Terraform.
Ik heb een .tf
configuratie bestand gemaakt met instructies om Nginx te runnen op een lokale Docker container:
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = ">= 2.13.0"
}
}
}
provider "docker" {
host = "npipe:////.//pipe//docker_engine"
}
resource "docker_image" "nginx" {
name = "nginx:latest"
keep_locally = false
}
resource "docker_container" "nginx" {
image = docker_image.nginx.latest
name = "NginxUsingTerraform"
ports {
internal = 80
external = 8000
}
}
Dit bestand bestaat uit het volgende:
- Terraform blok met Terraform settings.
- Een lijst van vereiste providers binnen het Terraform blok. Dit lijkt op een dependency die is vereist om de infrastructuur te creeren.
- Een provider, die in dit geval ons doorverwijst naar onze Docker Engine die de infrastructure aanmaakt.
- Een lijst van resources. Dit zijn de resources om aan te maken. In dit geval is er een Nginx image, en een Nginx container waarop de image gedeployed zal worden.
Terraform commando's
Terraform ondersteunt de volgende basic commando's:
- Om Terraform te initialiseren en de vereiste dependencies te downloaden gebruik
terraform init
. - Om de configuratie te valideren gebruik je
terraform validate
. - To see a list of changes to be deployed use
terraform plan
. - To apply changes to your infrastructure use
terraform apply
. - To stop your running infrastructure use
terraform destroy
.
TODO: Rest vertalen Using the init and apply commands the infrastructure is deployed to a local Docker instance. A list of changes is shown and Terraform asks for confirmation before deploying.
After a short while you will see the specified Nginx container running in your local Docker instance.
Scaling up
Say you want to add another Nginx container to your infrastructure. Since the image and Docker provider are listed above for the first resource. Adding a second container is as easy as adding a second resource to the configuration file.
Adding the following resource to the file creates a second Docker container running Nginx in Docker.
resource "docker_container" "nginx_clone" {
image = docker_image.nginx.latest
name = "NginxUsingTerraformClone"
ports {
internal = 81
external = 8001
}
}
Both resources running in a Docker container
Implementing Terraform on Microsoft Azure
Terraform can communicate with a multitude of cloud services. I will use Azure for this example.
A prerequisite to working with Terraform in Azure is being logged in to your Azure account using the Azure cli.
To get started you can want to create a resource group and storage account. This resource group will contain all our resources.
I created the resource group and storage account using the following configuration:
resource "azurerm_resource_group" "rg" {
name = var.resource_group_name
location = var.location
}
resource "azurerm_storage_account" "storageaccount" {
name = "tbterraformstorageac"
resource_group_name = var.resource_group_name
location = var.location
account_tier = "Standard"
account_replication_type = "LRS"
}
You might notice var.[name]
items in this example, these are variables.
Variables
Terraform configuration files support variables as well. For example the name of the resource group I created will be re-used in future configuration files. To add variables you can create a new configuration file which can contain the following:
variable "resource_group" {
default = "TerraformResourceGroup"
}
variable "location" {
default = "westeurope"
}
Adding a resource to Azure
Next I will create a feature branch, on this branch I will make some changes to our infrastructure. I will be adding a MSSQL Database to azure.
To add cloud specific resources there are a multitude of templates available in the Terraform registry to get started. As there are way too many configuration options for each resource to remember!
I added the following file to create a database server and the MSSQL instance:
resource "azurerm_mssql_server" "tbdatabaseserver" {
name = "tbdatabaseserver"
resource_group_name = var.resource_group_name
location = var.location
version = "12.0"
administrator_login = "tb4dm1n!"
administrator_login_password = "SuperSecurePass123!"
}
resource "azurerm_mssql_database" "tbsqldatabase" {
name = "tbsqldatabase"
server_id = azurerm_mssql_server.tbdatabaseserver.id
collation = "SQL_Latin1_General_CP1_CI_AS"
license_type = "LicenseIncluded"
max_size_gb = 4
read_scale = true
sku_name = "BC_Gen5_2"
zone_redundant = true
extended_auditing_policy {
storage_endpoint = azurerm_storage_account.storageaccount.primary_blob_endpoint
storage_account_access_key = azurerm_storage_account.storageaccount.primary_access_key
storage_account_access_key_is_secondary = true
retention_in_days = 6
}
}
You can apply these changes directly from the command line using the apply command. But in most cases, you won't be working on your own. Terraform changes can be tracked by your version control system, and thus your changes can be monitored when making a pull request. There will be more info about this below.
Integrating Terraform into your pipeline
When your Terraform infrastructure is added to your version control system you are able to integrate it into your build pipeline. This allows you to see the changes Terraform is about to make to your infrastructure when creating pull requests.
Adding Terraform support is as easy as adding a Terraform extension to Azure DevOps.
You can then add the terraform init
, ... validate
, ... plan
, ... apply
commands to your pipeline stages. Allowing you to validate the changes you are going to make to your infrastructure. Show the changes using the output of plan, to eventually merge the changes kicking off an apply pipeline.
Unfortunately I am not able to demonstrate this due to missing privileges in Azure. If you do want to try this for yourself I would highly recommend reading the following blogposts:
-
Terraforming from zero to pipelines as code with Azure DevOps. Thomas Thornton, 2021, about creating an Azure pipeline with Terraform integration.
-
Azure DevOps #1 - Terraform Plan as a PR Comment – Kamil Wiecek, 2021 About a custom way to add Terraform comments to your PR's.
In summary
When starting a new project, or when currently working on a project. I would highly recommend to implement IaC as it simplifies creating and managing infrastructure for your project. It allows anyone to create infrastructure without having to navigate a user interface. They can easily get up to date on the infrastructure landscape since the configuration files are readable and serve as documentation.
Versioning of infrastructure is easily done because the infrastructure configuration is checked in to your version control system. Which also allows the ability to review changes before deploying.
Using a tool like Terraform you are able to easily apply your changes to a multitude of cloud services.
Sources
- Workfall. (2021, February 26). How to manage infrastructure as code (IaC) with Terraform on AWS? Medium. Opgehaald, october 2021 van https://medium.com/workfall/how-to-manage-infrastructure-as-code-iac-with-terraform-on-aws-1fa6cd6bccfe
- Hashicorp. (2021). Terraform overview. Retrieved October 2021, from https://www.terraform.io
- Bonestroo, W.J., Meesters, M., Niels, R., Schagen, J.D., Henneke, L., Turnhout, K. van (2018). ICT Research Methods. HBO-i, Amsterdam. ISBN/EAN: 9990002067426. Retrieved October 2021, from http://www.ictresearchmethods.nl
- Chan, M. (2021, January 26). Infrastructure as Code: 6 best practices to get the most out of IaC. Thorn Technologies. Retrieved October 2021, from https://www.thorntech.com/infrastructure-as-code-best-practices
- Pelletier, J. (2021, May 20). Configuration Drift in Kubernetes - What is it and Why it Matters. Fairwinds. Retrieved October 2021, from https://www.fairwinds.com/blog/configuration-drift-kubernetes
- Vasiljevic, R. (2021, June 4). IaC Benefits, Challenges & Best Practices. SuperAdmins. https://superadmins.com/infrastructure-as-code-demystified-iac-benefits-challenges-best-practices/#IaC_Best_Practices_According_to_SuperAdmins
- Terraform. (n.d.). Azurerm_mssql_database. Terraform.Io. Retrieved 6 October 2021, from https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/mssql_database
- Thornton, T. (2020, October 27). Validating Terraform Code During A Pull Request In Azure DevOps. Thomas Thornton. Retrieved October 2021, from https://thomasthornton.cloud/2020/07/29/validating-terraform-code-during-a-pull-request-in-azure-devops
- Kamil Wiecek (2021). Terraform plan as a PR comment. Azure DevOps #1. Retrieved October 2021, from https://www.kamilwiecek.com/blog/azure-dev-sec-platform-ops
- Thornton, T. (2020b, December 4). Terraforming from zero to pipelines as code with Azure DevOps. Thomas Thornton. Retrieved October 2021, from https://thomasthornton.cloud/2020/11/28/terraforming-from-zero-to-pipelines-as-code-with-azure-devops
- Xenonstack. (2021). Infrastructure as Code Tools and Best Practices. Retrieved October 2021, from https://www.xenonstack.com/blog/what-is-infrastructure-as-code
- SDxCentral. (2021, 19 maart). Server Resolution Error 1001. Retrieved October 2021, from https://www.sdxcentral.com/articles/sponsored/implementing-infrastructure-as-code-for-cloud-speed-and-agility/2021/06/
SpecFlow in een DevOps project
Deze blogpost heeft als hoofdvraag: "Hoe kan je SpecFlow inzetten in een kortlopend DevOps project?"
Het doel van dit onderzoek is uitsluitsel geven of SpecFlow gebruikt zal worden in het beroepsproduct van de minor DevOps. De deelvragen beantwoorden de hoofdvraag van dit onderzoek. De deelvragen zijn:
-
- Wat is SpecFlow?
-
- Hoe past SpecFlow binnen BDD?
-
- Hoe werkt SpecFlow in de praktijk?
Ik onderzoek n.a.v. de eerste twee deelvragen middels literature study uit de ICT Research Methods van Bonestroo et al. (2018), de gekozen technologie respectievelijk hoe deze binnen BDD past. In de laatste deelvraag toets ik de technologie in de praktijk, middels de onderzoeksmethode prototype. De drie hierop volgende hoofdstukken beantwoorden de deelvragen in de volgorde zoals hierboven staat. Tot slot beantwoordt de conclusie de hoofdvraag van dit blog.
1. SpecFlow
SpecFlow is een opensource framework dat een testautomatiseringsoplossing biedt voor .NET, gebaseerd op het BDD-paradigma. SpecFlow definieert, beheert en voert voor mensen leesbare acceptatietests uit in .NET-projecten (SpecFlow, z.d.-a). Eenvoudig gezegd is SpecFlow Cucumber voor .NET (CODEDEC, z.d.).
SpecFlow biedt een mechanisme om specificatie om te zetten in uitvoerbare code. Dit kan je vervolgens gebruiken om geautomatiseerde tests te maken, die je kan uitvoeren met applicatie code om te controleren of deze het gedrag vertoont zoals beschreven in de specificaties (Dijkstra, 2020).
SpecFlow tests schrijf je met behulp van Gherkin, waarmee je test cases kunt schrijven in natuurlijke talen. SpecFlow gebruikt de officiële Gherkin parser, die meer dan 70 talen ondersteunt. Met SpecFlow koppel je deze tests met zogenaamde bindings aan de applicatiecode, waarna je deze tests kunt uitvoeren met behulp van een test framework naar keuze (SpecFlow, z.d.-a). SpecFlow zet de specificaties die zijn geschreven in de Gherkin Given / When / Then syntax, als scenario's in feature files om in uitvoerbare code, ook wel 'step definitions' genoemd (Dijkstra, 2020).
Nadat deze stappen zijn omgezet in uitvoerbare code, houdt de verantwoordelijkheid van SpecFlow op. Om de testautomatisering verder te implementeren, zodat deze daadwerkelijk communiceert met de te testen applicatie, moet je een andere tool toevoegen aan de testautomatseringsoplossing. Enkele tools die vaak in combinatie met SpecFlow worden gebruikt om een testautomatiserings framework te vormen zijn NUnit, MSTest en xUnit (Dijkstra, 2020).
Het SpecFlow ecosysteem
Dijkstra (2020) schrijft dat naast het kernproject ook enkele tools beschikbaar zijn van SpecFlow, die gezamenlijk bekend staan als SpecFlow+. Onderdeel van deze collectie zijn:
- SpecFlow+ Runner, een test runner specifiek geschreven voor SpecFlow
- SpecFlow+ Excel, hiermee kan de kracht van Microsoft Excel gebruikt worden om functies en scenario's te maken.
- SpecFlow+ LivingDoc, voor het maken van documentatie van feature files
2. SpecFlow in BDD
De YouTube video 'Getting Started with SpecFlow' (2020) legt uit dat behavior-driven development (BDD) bestaat uit vier fasen:
- Illustration/discovery fase
- Formulation fase
- Automation fase
- Validation fase
Dijkstra (2020) schrijft dat een van de belangrijkste doelen van BDD is om een gedeeld begrip te creëren van hoe een applicatie zich zou moeten gedragen, door discussie te vergemakkelijken en met concrete voorbeelden te komen. Dit wordt uitgedrukt in een Domain Specific Language (DSL), met behulp van de Given / When / Then syntax, dat bekend staat als Gherkin. Het andere onderdeel van BDD houdt zich bezig met het omzetten van deze specificaties in geautomatiseerde acceptatietests, en dat is waar SpecFlow in het spel komt.
SpecFlow kan je (normaliter) alleen gebruiken in de automation fase, zoals onderstaand figuur toont. SpecFlow is een tool die BDD ondersteunt, dus door alleen SpecFlow te gebruiken ben je niet automatisch BDD aan het toepassen. Het is mogelijk BDD te doen zonder SpecFlow en het is ook mogelijk SpecFlow te gebruiken zonder BDD (SpecFlow, 2020).
Bron: SpecFlow (2020)
3. SpecFlow in de praktijk
Stap nul, alvorens we beginnen met de realisatie van het prototype, is het installeren van een SpecFlow plugin voor de IDE. SpecFlow biedt een extensie voor Visual Studio en een plugin voor JetBrains Rider. Deze zijn eenvoudig te installeren binnen de gekozen IDE.
Dit prototype gebruikt JetBrains Rider, in voorbeelden zal deze IDE ook zichtbaar zijn. De stappen voor Visual Studio zullen vrij hetzelfde zijn, het is dus mogelijk om de stappen binnen Visual Studio te volgen.
De eerste stap is het aanmaken van een solution met een "Class library", beide genaamd SpecFlowCalculator
. Dit prototype gebruikt SDK: 5.0
, taal: C#
en framework: net5.0
, zoals in het onderstaand figuur zichtbaar is.
Na het aanmaken van de solution en het project hernoemen we Class1.cs
naar Calculator.cs
en vervangen zijn content met de volgende code:
using System;
namespace SpecFlowCalculator
{
public class Calculator
{
public int FirstNumber { get; set; }
public int SecondNumber { get; set; }
public int Add()
{
throw new NotImplementedException();
}
}
}
Vervolgens maken we een nieuw project aan binnen de solution. Dit project is van het type SpecFlow Project
, heet SpecFlowCalculator.Specs
, maakt gebruik van het net5.0
framework en gebruikt xUnit
als test framework, zie de onderstaande afbeelding voor de uitwerking.
Na het aanmaken van het SpecFlow Project voegen we de class library toe als dependency, binnen JetBrains Rider kan het op de onderstaande manier.
Na het toevoegen van de dependency maken we een feature file aan in de map Features
, dit bestand noemen we Calculator.feature
.
Deze feature file vullen we met een scenario in Gherkin, dit scenario neemt twee getallen, geeft aan dat ze bij elkaar opgeteld moet worden en geeft een verwacht resultaat.
Feature: Calculator
Simple calculator for adding **two** numbers
@mytag
Scenario: Add two numbers
Given the first number is 50
And the second number is 70
When the two numbers are added
Then the result should be 120
Na het aanmaken van de feature file en het schrijven van het eerste scenario is het tijd om de step definitions aan te maken. We plaatsen dit bestand in de Steps
folder, noemen het CalculatorStepDefinitions.cs
en vullen het met de step definitions, gebaseerd op de bovenstaande Gherkin code.
Binnen deze klasse maken we een instantie van Calculator
en een variabele _result
aan. Tot slot implementeren we de step definitions, het resultaat is:
using TechTalk.SpecFlow;
using Xunit;
namespace SpecFlowCalculator.Specs.Steps
{
[Binding]
public sealed class CalculatorStepDefinitions
{
private readonly ScenarioContext _scenarioContext;
private readonly Calculator _calculator = new();
private int _result;
public CalculatorStepDefinitions(ScenarioContext scenarioContext)
{
_scenarioContext = scenarioContext;
}
[Given("the first number is (.*)")]
public void GivenTheFirstNumberIs(int number)
{
_calculator.FirstNumber = number;
}
[Given("the second number is (.*)")]
public void GivenTheSecondNumberIs(int number)
{
_calculator.SecondNumber = number;
}
[When("the two numbers are added")]
public void WhenTheTwoNumbersAreAdded()
{
_result = _calculator.Add();
}
[Then("the result should be (.*)")]
public void ThenTheResultShouldBe(int result)
{
Assert.Equal(result, _result);
}
}
}
Na het implementeren van de step definitions kunnen we de tests draaien. Het resultaat is falende tests, met als melding dat er een NotImplementedException
optreedt, dit komt omdat de Add
methode van Calculator
nog niet geïmplementeerd is.
Nu is het tijd om de Add
methode van Calculator
te implementeren op de volgende manier:
public int Add()
{
return FirstNumber + SecondNumber;
}
Na deze implementatie runnen we de tests opnieuw, met als resultaat dat alle steps slagen.
Bij de realisatie is gebruik gemaakt van: SpecFlow (z.d.-b).
Living Documentation
Door gebruik te maken van de SpecFlow+ LivingDoc tool kan er living documentation gegenereerd van alle test resultaten, zodat deze gemakkelijk gedeeld kunnen worden met het team.
De LivingDoc CLI tool kan je installeren met het volgende commando:
dotnet tool install --global SpecFlow.Plus.LivingDoc.CLI
Na de installatie moet je naar de output directory van het SpecFlow project navigeren. Hier kan je komen door het volgende commando uit te voeren, vanuit de root van deze repository.:
cd SpecFlowCalculator/SpecFlowCalculator.Specs/bin/Debug/net5.0/
Binnen deze map kan je living documentation genereren met het onderstaande commando:
livingdoc test-assembly SpecFlowCalculator.Specs.dll -t TestExecution.json
Dit genereert een HTML bestand met alle scenario's en resultaten op de volgende locatie:
SpecFlowCalculator/SpecFlowCalculator.Specs/bin/Debug/net5.0/LivingDoc.html
Conclusie
SpecFlow is een opensource framework dat je kan gebruiken om voor mensen leesbare acceptatietests te definiëren, beheren en automatisch uit te voeren in .NET-projecten. SpecFlow zet specificaties, scenario's in feature files, die zijn geschreven in Gherkin om in uitvoerbare code, ook wel step definitions genoemd.
SpecFlow is een tool die BDD ondersteunt, op zichzelf is het geen BDD. Wanneer je SpecFlow binnen BDD gebruikt komt het aanbodt in de automation fase, de derde van de vier fasen binnen BDD.
Het gebruik van SpecFlow is in de praktijk prettig, dit komt doordat de documentatie voor het framework duidelijk en uitgebreid is. Ook zijn er verschillende guides en voorbeeldprojecten te vinden. De extensie die SpecFlow biedt draagt eraan bij dat dat SpecFlow prettig in gebruik is. SpecFlow zelf biedt ook nog aanvullende SpecFlow+ tools die het werken met SpecFlow bevorderen.
De eindconclusie is dat SpecFlow een ideale tool is voor een DevOps project dat gebruik maakt van services die je realiseert in .NET en volgens behavior-driven development.
Bronnen
- Bonestroo, W. J., Meesters, M., Niels, R., Schagen, J. D., Henneke, L., & Turnhout, K. (2018). ICT Research Methods. HBO-i, Amsterdam. Geraadpleegd oktober 2021 van http://www.ictresearchmethods.nl/
- CODEDEC. (z.d.). What is SpecFlow. Geraadpleegd op 6 oktober 2021 van https://codedec.com/tutorials/what-is-specflow/
- Dijkstra, B. (2020, 6 april). BDD, SpecFlow and The SpecFlow Ecosystem. Geraadpleegd op 6 oktober 2021 van https://blog.testproject.io/2019/10/08/bdd-and-the-specflow-ecosystem/
- SpecFlow. (2020, 11 september). Getting Started with SpecFlow [Videobestand]. Geraadpleegd van https://www.youtube.com/watch?v=HpRzI0C-x-8
- SpecFlow. (z.d.-a). Welcome to SpecFlow’s documentation! Geraadpleegd op 6 oktober 2021 van https://docs.specflow.org/projects/specflow/en/latest/
- SpecFlow. (z.d.-b). *Welcome to the Step-By-Step Getting Started Guide!() Geraadpleegd op 6 oktober 2021 van https://docs.specflow.org/projects/getting-started/en/latest/index.html
Een zwerm van Docker nodes
In het kader van de HAN-minor DevOps onderzoek ik de orchestration tool *Docker Swarm*, een onderwerp dat de courses niet standaard behandelen, maar wel te maken heeft met het thema van de vierde week: *orchestration*.
Dit onderzoek heeft als doel kennis van deze technologie op te doen zodat het eventueel gebruikt kan worden in een klein DevOps project. In deze context zou Docker Swarm toegepast kunnen worden om een microservice architectuur te deployen.
Eerst een uitleg wat Docker Swarm nou precies is en waar een cluster uit bestaat. Daarna volgt een hands-on onderdeel met twee verschillende configuraties van een Swarm cluster. Ten slotte een vergelijking van Docker Swarm op een aantal onderwerpen en beschrijving in welke situaties je het beste Docker Swarm kunt toepassen.
Wat is Docker Swarm?
Docker Swarm (Docker, z.d.) is een container orchestration tool waarmee een gebruiker meerdere containers over een aantal verschillende host machines kan deployen (sumo logic, z.d.). Deze fysieke of virtuele nodes vormen samen een cluster vormen. Binnen dit cluster kun je nog steeds je Docker commando’s uitvoeren. Het enige verschil is nu dat deze commando’s worden uitgevoerd door de verschillende nodes in je cluster.
Docker Swarm, of Swarm Mode, draait op de swarming toolkit ‘Swarmkit’. In vroegere versies van Docker was het optioneel om deze software toe te voegen aan je Docker installatie, maar vanaf Docker 1.12 zit Swarmkit standaard bij een Docker installatie ingebakken (Poulton, 2018).
Nodes
Een swarm bestaat uit een groep van machines die samen gebundeld zijn tot een cluster. Als een nieuwe machine aan dit cluster wordt toegevoegd, wordt het een node in de swarm. Het is in principe niets anders dan een Docker node, het enige verschil is dat je vaak bij development te maken hebt met je eigen lokale node. Dit is de machine waar je op werkt. Echter zie je al gauw bij productie swarm deployments dat je te maken hebt met meerdere Docker nodes die zijn verdeeld over meerdere fysieke en virtuele (cloud) machines (Docker, z.d.).
Zoals in Afbeelding 1 staat afgebeeld, bestaat een Swarm uit verschillende soorten groepen en wordt er onderscheid gemaakt tussen verschillende soorten nodes. Hoewel het diagram maar twee soorten nodes laat zien, bestaan er drie typen nodes die ieder een eigen rol spelen in het swarm ecosysteem.
Afbeelding 1. Globaal overzicht van een Docker Swarm.
Manager nodes zijn nodes die voor het cluster management zorgen. Ze zorgen ervoor dat taken worden toegewezen aan worker nodes en dat de swarm zich in de gewenste staat bevindt. Nigel Poulton (2018) stelt dat Docker een minimaal aantal van drie en een maximaal aantal van zeven manager nodes aanbeveelt. Minder dan dit aantal kan nadelig werken op de availability van je cluster en meer dan dit aantal kan voor onnodige complexiteit zorgen. Een van de manager nodes wordt geclassificeerd als de leader node. De leader node maakt alle beslissingen die betrekking hebben tot swarm management en taakverdeling. Als de leader uitvalt, wordt er door middel van het Raft consensus algoritme een nieuwe leader gekozen.
Worker nodes zijn nodes die de de toegewezen taken van de manager nodes uitvoeren. Docker (z.d.) stelt dat de manager nodes standaard ook worker nodes zijn, maar het is eventueel zo te configureren dat deze twee takenpakketten van elkaar worden gescheiden en dat manager nodes exclusief management taken uitvoeren. Gedurende het uitvoeren van de taken wordt de status van de worker node bijgehouden door een agent die bij de worker node draait. Deze agent rapporteert de status van de node en de uit te voeren taken aan de manager nodes zodat deze de gewenste staat van iedere worker node kan bijhouden.
Services
Een Service is de definitie van een taak die wordt uitgevoerd op een manager of een worker node. Docker Swarm hanteert twee soorten services:
- Replicated services: Swarm mode replicated services functioneert op een manier waarop jij als gebruiker aangeeft hoeveel replica’s van een taak uitgevoerd worden. De manager distribueert de replica’s over de beschikbare nodes op basis van de schaal die je hebt aangegeven. Je wilt bijvoorbeeld vier replica’s van een front-end applicatie runnen.
- Global services: Global services funtioneert op een manier waarop de swarm manager de taak op elk van de beschikbare nodes dat aan opgegeven service constraints en resource requirements voldoet.
Hoe werkt Docker Swarm?
Om de werking van docker swarm op een simpele manier toe te lichten, heb ik drie virtuele machines opgezet: manager, worker1 en worker2. Alle drie machines draaien versie 20.10.9. van de Docker engine.
Een swarm configureren
Om een swarm te configureren, voert de eerste node het commando docker swarm init
uit. Afbeelding 2 toont dat het commando een nieuwe swarm aanmaakt en dat de node een manager wordt.
Afbeelding 2. Aanmaken van een docker swarm.
Bovenstaand docker swarm join
commando voer je nu uit op de twee worker machines. Zoals in Afbeelding 3 is te zien, worden deze machines nu nodes in de swarm.
Afbeelding 3. De twee worker nodes joinen de swarm.
Je kunt dit controleren door bij de manager docker node ls
uit te voeren. In Afbeelding 4 zie je dat het een lijst van nodes geeft, waarbij het zichzelf als manager ziet en de twee toegevoegde nodes in het lijstje weergeeft.
Afbeelding 4. De huidige nodes in het cluster.
Een service deployen in Docker Swarm
Om een replicated service te deployen in de swarm, voer je het commando docker service create
uit. Zie onderstaand commando om drie replica’s van een nginx service te maken en deze te publishen op poort 8080.
docker service create --name webapp \
--replicas 3 \
--publish published=8080,target=80 \
nginx
Afbeelding 5 toont drie replica’s van de nginx service gedeployed op het cluster.
Afbeelding 5. Het aanmaken van drie replica’s van een nginx service.
Meerdere services deployen met Docker stack
Poulton (2018) stelt dat het mogelijk is om op een meer declaratieve manier je services in één keer te deployen op de docker swarm. Hiervoor gebruik je stackfiles. Dit zijn niet meer dan docker-compose bestanden met meer informatie om een deployment uit te voeren op een cluster. Voor deze blog heb ik een simplistische NodeJS Express applicatie gebouwd die een aantal resultaten van een MongoDB database teruggeeft. De applicatie vind je hier te vinden, en heeft de volgende structuur:
Als eerst schrijf je een docker-compose.yml
die geschikt is om een docker stack deploy actie uit te voeren. Dit betekent dat de compose file versie 3+ moet zijn (Poulton, 2018).
Ook moet je voor iedere service een deploy onderdeel definiëren. In dit onderdeel geef je aan of je de service global of replicated wilt deployen en hoeveel replica’s je op de nodes moeten komen. Je kunt eigen update- en/of restart configuratie aangeven om in te spelen op wijzigingen in het cluster en hoe je om wilt gaan met crashes. Binnen het deploy blok kun je dus in feite je gewenste state aangeven.
Voor de sample app is het onderstaande stackfile opgesteld. De webapi service deployed de service nu in replicated mode met drie verschillende replica's en de mongo service deployed Docker enkel op een manager node.
version: '3'
services:
webapi:
image: 127.0.0.1:5000/swarm-demo
build: .
ports:
- "3000:3000"
networks:
- swarm-app
deploy:
mode: replicated
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
depends_on:
- db
db:
image: mongo
ports:
- "27017"
volumes:
- mongodata:/data/db
restart: "always"
deploy:
placement:
constraints: [node.role == manager]
networks:
- swarm-app
volumes:
mongodata: {}
networks:
swarm-app:
Om deze applicatie in de docker swarm te deployen, voer je het commando docker stack deploy --with-registry-auth --compose-file docker-compose.yml swarm-demo
uit. Afbeelding 6 toont de gedefinieerde services met bijbehorende aantal replica’s.
Afbeelding 6. Het deployen van een stackfile in de docker swarm.
Het resultaat van de Express applicatie te zien (zie Afbeelding 7) door naar poort 3000 te navigeren.
Afbeelding 7. Resultaat van de Express web applicatie.
Docker Swarm vs. Kubernetes
Docker Swarm en Kubernetes zijn beiden container orchestration software. Waarin verschilt Docker Swarm van Kubernetes en waarin komt het overeen? Hieronder staan de belangrijkste punten op een rijtje.
- Installatie en gebruik — Docker Swarm maakt standaard deel uit van de Docker Engine, waardoor het bij een Docker installatie inbegrepen is. Kubernetes moet apart worden geïnstalleerd en geconfigureerd, dit wordt door sommigen als complex ervaren (Drewel, 2021).
- Leercurve — Met kennis van het gebruik van Docker is de leercurve vrij vlak voor het gebruik van Docker Swarm. Kubernetes daarentegen is een stuk uitgebreider dan Docker Swarm, hierdoor is de leercurve ook stijler. De gebruiker moet bijvoorbeeld leren om de kubectl CLI te gebruiken. Docker swarm kan makkelijk worden gebruikt door gebruikers die kennis hebben van de Docker CLI.
- Scalability — Zowel Kubernetes en Docker Swarm maken gebruik van automatisch opschalen van services (IBM, 2021). De manier waarop ze dit doen verschilt wel. Omdat Kubernetes uitgebreider is, duurt het opschalen langer dan bij Docker Swarm (Sengupta, 2020). Hierdoor is Docker Swarm geschikter voor on-demand scaling.
- High Availability — Het grootste verschil in HA is te vinden in de manier waarop het cluster wordt beheerd. Docker Swarm garandeert HA door op manager node niveau service replication uit te voeren. Kubernetes bevat een geavanceerder controle (control plane) systeem waarbij de Control Plane ‘unhealthy’ nodes direct aanpakt (Rosen, 2020).
- Monitoring — Kubernetes biedt veel meer mogelijkheden voor third-party monitoring software integration zoals Prometheus, Grafana en InfluxDB. Docker Swarm kan op een aantal manieren gemonitored worden, maar over het algemeen ervaart men dit als complex door de vele cross-node objecten en services.
Is Docker Swarm de orchestration tool voor jou?
Zoals in deze blog is aangetoond, kan je op een gemakkelijke manier een Docker Swarm cluster configuren en gebruiken. Een cluster bevat een simpele begrijpbare structuur met manager en worker nodes. Het kent veel overeenkomsten, maar ook verschillen met grotere orchestration tools zoals Kubernetes, met name in onderliggende technologiëen, maar ook in de mogelijkheden van bijvoorbeeld monitoring en het gebruik hiervan.
Bij het kiezen voor een orchestration tool, moet je bepaalde factoren afwegen. Het moet aansluiten op je behoeften. Is je microservice architectuur van kleinere schaal, wil je binnen het domein van Docker blijven werken, heb je geen extra lagen van indirectie nodig en wil je snel on-demand kunnen schalen? Dan is Docker Swarm de tool voor jou.
Bronnen
- Docker. (z.d.). Empowering App Development for Developers. Geraadpleegd op 6 oktober 2021 van https://www.docker.com
- Docker. (z.d.). Deploy a stack to a swarm. Docker Documentation. Geraadpleegd op 6 oktober 2021 van https://docs.docker.com/engine/swarm/stack-deploy
- Docker. (z.d.). Swarm mode key concepts. Docker Documentation. Geraadpleegd op 7 oktober 2021 van https://docs.docker.com/engine/swarm/key-concepts
- Drewel, K. (2021, 26 februari). Kubernetes vs. Docker (Swarm): wat zijn de verschillen? True. Geraadpleegd op 7 oktober 2021 van https://www.true.nl/blog/kubernetes-vs-docker-swarm-verschillen
- Poulton, N. (2018, 4 januari). Docker Deep Dive [Video]. Pluralsight. Geraadpleegd op 6 oktober 2021 van https://www.pluralsight.com/courses/docker-deep-dive-update
- Sengupta, S. (2020, 24 november). Kubernetes vs Docker Swarm: Comparing Container Orchestration Tools. BMC Blogs. Geraadpleegd op 7 oktober 2021 van https://www.bmc.com/blogs/kubernetes-vs-docker-swarm
- Rosen, C. (2021, 3 april). Docker Swarm vs. Kubernetes: A Comparison. IBM. Geraadpleegd op 7 oktober 2021 van https://www.ibm.com/cloud/blog/docker-swarm-vs-kubernetes-a-comparison
- Sumo Logic, Inc. (2021, 1 juni). What is Docker Swarm? Sumo Logic. Geraadpleegd op 6 oktober 2021 van https://www.sumologic.com/glossary/docker-swarm
K3s… Weer een buzzword of best in class Kubernetes distributie voor lokale development?
In deze blogpost onderzoek ik een nieuwe technologie die mijn samenwerkingsgroep kan gebruiken tijdens een tweeweeks DevOps project. Dit doe ik door een blog te schrijven met een 'hands on' karakter.
Deze blog bevat daarom configuratie en code en zorgt ervoor dat medestudenten hiermee aan de slag kunnen. Op basis van de AIM-methodekaarten beantwoord ik een hoofdvraag uit. Voor het beantwoorden van de deelvragen maak ik gebruik van drie onderzoeksgebieden: bibliotheek, veld en werkplaats.
De hoofdvraag van mijn onderzoek is:
Hoe kunnen de Ingress en LoadBalancer resources in K3s effectief worden ingezet binnen een tweeweeks DevOps project op een lokaal development cluster?
Per deelvraag geef ik aan welke onderzoeksmethode ik ga gebruiken. Ook motiveer ik waarom ik voor die onderzoeksmethode heb gekozen.
-
Deelvraag 1: Wat is K3s, en waarin verschilt dit met de standaard Kubernetes distributie? Voor het beantwoorden van deze vraag voor ik een Literature Study (HBO-i, 2021) uit. Op internet is veel informatie over K3s te vinden in de vorm van blogs en documentatie. Deze informatie kan ik goed gebruiken om een antwoord te geven op deze deelvraag.
-
Deelvraag 2: Welk besturingssysteem gebruikt mijn samenwerkingsgroep en hoe installeer je daar K3s op? Om deze vraag te beantwoorden voer ik eerst een kleine Survey (HBO-i, 2021) uit. Ik wil namelijk dat deze vraag zo beantwoord wordt dat hij relevant is voor mijn samenwerkingsgroep. Praktische voorbeelden voor Linux terwijl de samenwerkingsgroep Windows gebruikt is onwenselijk.
-
Deelvraag 3: Op welke wijze kan een applicatie, draaiend in een K3s cluster, opengesteld worden zodat verbinding van buitenaf mogelijk is? Voor deze deelvraag voer ik een werkplaats onderzoek uit. Ik heb gekozen voor de Prototyping methode (HBO-i, 2021). Dit zal een zeer praktisch hoofdstuk worden waarin ik aan de hand van een prototype aantoon hoe verbinding van buitenaf mogelijk is. Op dit prototype kan verder gebouwd worden in het twee weken durend DevOps project.
Ik heb voor K3s gekozen omdat deze technologie in het verlengde ligt van Kubernetes gebruikt in lesweek 4 – Orchestration. Ik merkte van studenten om mij heen dat ze het gebruiken van een LoadBalancer en Ingress lastig vonden. Uit vorige ervaring wist ik dat K3s het gebruik van een LoadBalancer en Ingress makkelijk maakt. Door het schrijven van deze blog hoop ik mijn medestudenten te overtuigen K3s toe te passen als lokaal development cluster binnen een klein DevOps project.
Ik heb variëteit in de onderzoeksmethodes gezocht om zo de kwaliteit van het onderzoek te verhogen. Door eerst online materiaal te bestuderen, daarna een enquête af te nemen en dan pas een prototype te bouwen kan ik het onderzoek zo relevant mogelijk opstellen. Mijn mix van onderzoeksmethodes past het meest bij het “Choose fitting technology” pattern (HBO-i, 2021).
Aan het eind van deze blog weet je wat K3s is en heb je een K3s cluster draaiend op Windows of MacOs. Binnen dit cluster maak je gebruik van een LoadBalancer en Ingress om naar containers te verbinden.
Relatie tussen K3s en Kubernetes
K3s is een lichtgewicht en door de CNCF gecertificeerde Kubernetes distributie. Deze is productieklaar, gemakkelijk om te installeren en komt in een binary van minder dan 100 MB. De ontwikkelaars van K3S geven aan dat het geweldig werkt voor Internet of Things, Continuous Integration, Development en op ARM gebaseerde devices (k3s-io, 2021). Om dit te bereiken hebben de ontwikkelaars een aantal wijzingen aangebracht, hieronder een opsomming van de belangrijkste.
- Het is verpakt in één binary.
- Het voegt ondersteuning toe voor sqlite3, MySQL en Postgres als default storage backend.
- Het heeft minimale tot geen OS-afhankelijkheden.
- Storage drivers zijn verwijderd.
- Cloud provider drivers zijn verwijderd.
Doordat het een lichtgewichte Kubernetes distributie is kun je deze gebruiken op minder krachtige hardware zoals een Raspberry Pi (Roy, 2021). Met de standaard Kubernetes zou dit niet mogelijk zijn vanwege zijn grote voetafdruk voor zowel geheugen als CPU (Boyd, 2021). Om het geheugengebruik in K3s te verminderen worden alle componenten, voor een Kubernetes cluster, in één proces uitgevoerd. K3s is daarom ook geschikt als development cluster omdat het snel en eenvoudig op te zetten is en weinig resources op je laptop gebruikt. K3s levert daarbij add-ons met standaardinstellingen die ervoor zorgen dat het cluster “out of the box” gebruikt kan worden (Boyd, 2021). Als je dit vergelijkt met Kubernetes ben je zelf verantwoordelijk om dependencies te installeren. Om gebruik te maken van een LoadBalancer ben je met de standaard Kubernetes afhankelijk van een Cloud Provider. K3s bundelt Klipper-lb als ingebouwde LoadBalancer provider. Ook wordt Traefik meegeleverd als Ingress provider. Iets wat in de standaard Kubernetes niet aanwezig is (k3s-io, 2021).
Installeren van K3s en het opzetten van een cluster
Ik heb eerst onderzocht welke besturingssystemen de studenten in mijn samenwerkingsgroep gebruiken. Ik heb de opties Windows, MacOs en Linux in een enquête verstuurd. De enquête heb ik zelf ook ingevuld zodat er compleet beeld ontstaat. In de tabel onder deze tekst staan de resultaten. Drie studenten gebruiken Windows en één student MacOs. Aan de hand van deze resultaten heb ik besloten om te zoeken naar een manier om K3s te installeren voor zowel Windows als MacOs gebruikers.
Besturingssysteem | Aantal gebruikers |
---|---|
Windows | 3 |
MacOs | 1 |
Linux | 0 |
De installatiestappen op de officiële K3s website geven aan dat K3s op elke moderne Linux distributie geïnstalleerd kan worden (Rancher, 2021). Echter is Windows geen Linux distributie dus heb ik gezocht naar een vervangende oplossing. Via de blogpost van Jason Yee (Yee, 2020) en de officiële K3s documentatie ben ik bij k3d uitgekomen (Rancher, 2021). K3d is een wrapper om K3s heen zodat het in Docker containers gedraaid kan worden. De enige requirements zijn Docker en kubectl (“K3d”, 2021). Deze dependencies kunnen op zowel Windows als MacOs geïnstalleerd worden. Om k3d op MacOs te installeren moet je het commando brew install k3d
uitvoeren. Op Windows maak je gebruik van chocolatey. Door het commando choco install k3d
uit te voeren wordt k3d op Windows geïnstalleerd. Alle commando’s die volgen in deze blog kunnen op zowel Windows als MacOs uitgevoerd worden in de terminal.
Je eerste K3s cluster
Nu we K3d geïnstalleerd hebben kunnen we ons eerste cluster aanmaken. Dit doen we door gebruik te maken van het commando k3d cluster create <clusternaam>
. Ik kies ervoor om “mijncluster” als naam te gebruiken. Door het volgende commando uit te voeren wordt een K3s cluster met één node aangemaakt: k3d cluster create mijncluster
.
Als we daarna kubectl get nodes
uitvoeren krijgen we te zien dat ons cluster uit één node bestaat.
Om te demonstreren dat K3s ook met meerdere nodes werkt gaan we een cluster aanmaken met drie nodes. We gebruiken hetzelfde create commando als eerst maar geven nu één extra optie mee. Verwijder eerst de zojuist aangemaakt cluster door het volgende commando uit te voeren: k3d cluster delete mijncluster
. Om een cluster aan te maken met 1 server node en 2 agent nodes voer je het volgende commando uit: k3d cluster create mijncluster --agents 2
. Als we nu kubectl get nodes
uitvoeren zien we 2 extra nodes.
Nu we op hoofdlijnen weten wat K3s is en hoe we een cluster aan kunnen maken is het tijd om het cluster daadwerkelijk te gaan gebruiken.
Verbinding maken met een applicatie in K3s.
Om aan te tonen hoe we verbinding kunnen maken met een applicatie draaiend in K3s ga ik een klein prototype bouwen. Stap voor stap beschrijf ik mijn handelingen zodat je zelf ook mee kunt doen. Aan het einde van deze sectie heb je een whoami
(https://hub.docker.com/r/containous/whoami) applicatie geïnstalleerd op je K3s cluster. Deze applicatie kun je bereiken door te navigeren naar whoami.localhost. Hiermee demonstreren we dat de LoadBalancer en Ingress naar behoren werkt. In de afbeeldingen hieronder is de eindsituatie te zien waar we naartoe gaan werken.
We beginnen met het aanmaken van een nieuw cluster. Omdat we nu applicaties in het cluster willen benaderen moeten we het create commando iets aanpassen. Voer het volgende commando uit: k3d cluster create -p "80:80@loadbalancer" mijncluster
. Met de p optie geven we aan dat poort 80 lokaal doorverwijst naar poort 80 op de ingebouwde Klipper-lb (LoadBalancer) van K3s.
Als eerste maken we een nieuwe deployment voor de whoami applicatie. Laten we het aantal replicas op 3 zetten zodat we kunnen verifiëren of de Ingress wisselt tussen de verschillende pods die aangemaakt worden met deze deployment. De deployment krijgt een label whomai zodat we ernaar kunnen verwijzen in de service die we zo dadelijk aanmaken.
apiVersion: apps/v1
kind: Deployment
metadata:
name: whoami
spec:
replicas: 3
selector:
matchLabels:
app: whoami
template:
metadata:
labels:
app: whoami
spec:
containers:
- name: whoami-container
image: containous/whoami
De volgende stap is het aanmaken van een service. We specifiëren hier dat we een service van het type ClusterIP willen. De pods die we targeten hebben het label app: whoami. Dat hebben we zojuist in de deployment ook gespecificeerd. Als laatst geven aan dat poort 80 doorverwijst naar poort 80 in de pod.
apiVersion: v1
kind: Service
metadata:
name: whoami
spec:
type: ClusterIP
ports:
- targetPort: 80
port: 80
selector:
app: whoami
De laatste stap is het configureren van de Ingress. In de spec geven we aan dat we als host whoami.localhost
willen gebruiken. Aan het einde van de spec specificeren we op welke service en poort we aan willen sluiten.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: whoami
annotations:
kubernetes.io/ingress.class: traefik
spec:
rules:
- host: whoami.localhost
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: whoami
port:
number: 80
Door al deze yaml bestanden uit te voeren zou in theorie de whoami applicatie op whoami.localhost benaderbaar moeten zijn. Laten we dat testen. Als ik in mijn browser navigeer naar whoami.localhost krijg ik een pagina te zien met daarop de hostname van de pod. Wanneer ik de pagina ververs krijg ik een andere hostname te zien. We kunnen dus concluderen dat het prototype werkt en we nu gebruik maken van een LoadBalancer en Ingress om onze whoami applicatie te benaderen.
Hostname bij eerste bezoek. | Hostname na het verversen van de pagina. |
Afsluiting
In deze blog heb ik geschreven dat K3s een lichtgewicht Kubernetes distributie is die “out of the box” direct gebruikt kan worden. Om dit te bewijzen heb ik laten zien hoe je K3s gemakkelijk op MacOs en Windows kan installeren en hoe je effectief gebruik kunt maken van de meegeleverde LoadBalancer en Ingress. Ik ben ervan overtuigd dat we deze technologie in kunnen zetten tijdens het beroepsproduct als lokaal development cluster.
Bronnen
- Yee, J. (2020, 6 december). Kubernetes & Rancher 2.5 on a Win 10 laptop with k3d & k3s to deploy nginx locally. Geraadpleegd op 6 oktober 2021 van https://itnext.io/kubernetes-rancher-2-5-on-your-windows-10-laptop-with-k3d-and-k3s-7404f288342f
- k3s-io. (2021, 12 juli). GitHub - k3s-io/k3s: Lightweight Kubernetes. Geraadpleegd op 6 oktober 2021 van https://github.com/k3s-io/k3s
- HBO-i. (2021, 2 juli). ICT research methods. Geraadpleegd op 6 oktober 2021 van https://ictresearchmethods.nl
- Roy, H. (2021, 23 september). K8s vs k3s: The Comprehensive Difference. Geraadpleegd op 6 oktober 2021 van https://www.p3r.one/k8s-vs-k3s
- Boyd, W. (2021, 17 juni). 5 Reasons to Use K3s. Geraadpleegd op 6 oktober 2021 van https://acloudguru.com/blog/engineering/5-reasons-to-use-k3s
- Rancher. (2021, 9 augustus). K3s - Lightweight Kubernetes. Geraadpleegd op 6 oktober 2021 van https://rancher.com/docs/k3s/latest/en/
- K3d. (2021, 17 september). Geraadpleegd op 6 oktober 2021 van https://k3d.io/v5.0.0
Nanoservices: microservices, maar dan kleiner
Als je een *big ball of mud* refactort krijg je een *monoliet*. Splits die monoliet vervolgens op in modules en je krijgt een *SOA* (Service Oriented Architecture). Geef elke service één verantwoordelijkheid en je hebt *microservices*. Maar het kan nóg kleiner (Ruby Garage, 2021).
In het kader van de minor DevOps heb ik het in dit blog over hoe je met nanoservices een systeem opdeelt in hele kleine services met elk één taak. Ik leg uit wat precies het verschil is tussen microservices en nanoservices en waarom je voor nanoservices moet kiezen (of juist niet). Met behulp van het Serverless framework schrijf ik zelf een nanoservice, natuurlijk op een DevOps manier.
There's always a smaller fish
We kennen microservices als modulaire, onafhankelijke applicaties die op zichzelf deploybaar en schaalbaar zijn. Microservices kunnen een oplossing zijn voor bedrijven die tegen problemen aan lopen zodra hun applicatie begint te schalen. Nieuwe features ontwikkelen blijkt een stuk complexer te zijn zodra je met 1000 developers aan dezelfde codebase moet werken (Kim et al., 2016, pp. 182–183).
Een nanoservice is een stuk code met één publieke methode die net zoals een microservice autonoom is. Microservices hebben één verantwoordelijkheid, en nanoservices hebben één taak. Een microservice zou dus verantwoordelijk kunnen zijn voor het afrekenen van een bestelling, maar een nanoservice kan zo klein zijn dat het alleen de taak heeft om een bevestigingsmail naar de klant te sturen (Ebi, 2020).
Serverless
Een belangrijke eigenschap van nanoservices is dat ze vaak serverless zijn. Dit betekent niet dat het niet op een server draait, maar dat een cloud provider verantwoordelijk is voor het beheren en bereikbaar houden van de infrastructuur. Als developer hoef je je dan alleen nog zorgen te maken over in welke runtime je nanoservice draait (RedHat, 2017). Dit gaat dus nog een stapje verder dan microservices. Microservices deploy je meestal in een container met een besturingssysteem. Bij nanoservices is zelfs het besturingssysteem niet meer relevant.
Replicas: ∞
Bij een serverless architectuur draait je applicatie on-demand. Zodra je een request stuurt naar de nanoservice (of er treedt een event op), zorgt de cloud provider (bijvoorbeeld AWS) dat er een nieuwe instantie van je nanoservice opgestart wordt. Zodra de request of event afgehandeld is, wordt de nanoservice weer uitgezet (RedHat, 2017).
Pitstop uitbreiden met een nanoservice
Nu we weten wat het verschil is tussen een microservice en een nanoservice, gaan we een nanoservice schrijven. Ik gebruik voor dit voorbeeld de Pitstop applicatie van Edwin van Wijk (2017). Dit is een werkplaats management systeem voor een fictieve auto-garage. Deze applicatie wordt als voorbeed gebruikt voor verschillende software-architectuur concepten zoals microservices, Domain Driven Design en CQRS.
Wat je nodig hebt
- NodeJS
- Optioneel: een AWS account (Free Tier)
Wat we gaan maken
Om in Pitstop een reparatie te plannen moet je eerst je voertuig registeren. Hiervoor vul je het kentekennummer, merk en type van je auto in. Het merk en type van een auto kun je in Nederland eigenlijk afleiden uit het kentekennummer. Hiervoor kunnen we een API van de RDW gebruiken, maar in het kader van Ubiquitous Language willen we onze Engelse codebase niet mengen met Nederlandse termen. Ook heb je voor deze API een secret key nodig, en deze willen we natuurlijk niet openbaar maken in onze front-end. Laten we hier een nanoservice voor gaan schrijven met behulp van de Serverless documentatie.
Yet Another YAML file
Om te voorkomen dat je voor elke wijziging in je serverless function door 100 AWS menu's moet klikken, maken we gebruik van een serverless application framework. Dit maakt het mogelijk om je nanoservice ook lokaal te testen en voorkomt dat je vast komt te zitten aan één cloud provider. Er zijn meerdere serverless application frameworks, maar hier gebruiken we Serverless Framework omdat deze open-source is en het makkelijker maakt om voor meerdere cloudplatformen te ontwikkelen (Microsoft, z.d.).
Serverless project opzetten
# Serverless draait zelf op NodeJS, maar je kunt je nanoservices in andere talen programmeren
$ npm install -g serverless
# Serverless heeft standaard templates voor veelgebruikte talen, zoals NodeJS op AWS
$ sls create --template aws-nodejs --path get-car-brand
De aws-nodejs
template maakt twee bestanden aan. In serverless.yml
staat de configuratie van je nanoservice, zoals de runtime, hoeveelheid geheugen en het platform waarop je wil deployen. In handler.js
staat de entrypoint van je nanoservice. Deze methode wordt uitgevoerd zodra je de nanoservice aanroept. Deze heeft een event parameter. In het geval van een REST API zou dit dus de request kunnen zijn.
Serverless functie schrijven
Onze nanoservice zal niet veel meer doen dan een request sturen naar de RDW API en het resultaat vertalen naar het Engels.
# Om HTTP requests te sturen kunnen we in NodeJS de axios library gebruiken
$ npm i axios
'use strict';
const axios = require('axios');
const SECRET_KEY = process.env.RDW_API_KEY;
module.exports.getCarBrandAndType = async (event) => {
const voertuigGegevens = await axios
.get(`https://opendata.rdw.nl/resource/m9d7-ebf2.json?kenteken=${event.licensePlate}`,
{ headers: { 'X-App-Token': SECRET_KEY }});
// Onze nanoservice werkt als een HTTP API en geeft dus een response terug.
// Je zou hier eventueel ook een event kunnen publishen naar een event queue.
return {
statusCode: 200,
body: JSON.stringify(
{
brand: voertuigGegevens.data[0].merk,
type: voertuigGegevens.data[0].handelsbenaming
}
),
};
};
Omdat we de nanoservice niet lokaal aanroepen, maar via HTTP, moeten we een event definïeren. Ook heb ik de handler methode een andere naam gegeven, dus pas ik dit aan in de serverless.yml
.
functions:
getCarBrandAndType:
handler: handler.getCarBrandAndType
events:
- http: GET getCarBrandAndType
We kunnen onze nanoservice nu met één command deployen naar onze gewenste cloud provider. Ook dit definieer je in je serverless.yml
.
provider:
name: aws
runtime: nodejs16.x
lambdaHashingVersion: 20201221
The DevOps way
Laten we nu kijken hoe we nanoservices volgens een DevOps methode kunnen ontwikkelen volgens de DevOps best practices van Atlassian (z.d.).
Shift Left
Het is onhandig om onze nanoservice telkens naar de cloud te moeten deployen om het te kunnen testen. Unit tests kun je natuurlijk gewoon in je project zetten zoals je dat normaal doet, maar voor integratietests gebruiken we Serverless local (Skierkowski, 2019). Onze integration tests schrijven we in een serverless.test.yml
bestandje.
- name: gets the brand and type by license plate
endpoint:
method: GET
path: /carBrandAndType/58GGG8
response:
body:
brand: RENAULT
type: CLIO
$ sls test
passed - GET /carBrandAndType/58GGG8 - gets the brand and type by license plate
Silver Bullet
Ik hoor je nu al denken: "Al deze moeite voor één functie?". Zoals bijna elke architecturale stijl zijn nanoservices natuurlijk geen silver bullet.
Voor- en nadelen van nanoservices
Fowler (2015) beschrijft op zijn blog een aantal voor- en nadelen van microservices die min of meer ook gelden voor nanoservices.
Ten eerste kun je met microservices en nanoservices verschillende programmeertalen mixen. Ik vind dit persoonlijk een goede use case voor nanoservices. Stel dat je een library hebt gevonden die heel veel werk voor je wegneemt, maar deze is niet in jouw programmeertaal geschreven. Deze zou je dan in een nanoservice kunnen gebruiken en aanroepen vanuit je bestaande applicatie.
Daar tegenover staat dat het aanroepen van een nanoservice kosten met zich meebrengt. Het aanroepen van een nanoservice verhoogt de latency. Daarnaast is de foutafhandeling voor een remote call ingewikkelder dan voor een lokale functie-aanroep.
Om met al deze complexiteit om te gaan heb je ook weer nieuwe vaardigheden en tooling nodig die niet iedereen heeft. Fowler (2015) denkt dat het invoeren van een DevOps cultuur ook helpt bij deze complexiteit.
Autonomie
Een reden voor veel DevOps organisaties om over te stappen op microservices is zodat development teams de vrijheid hebben om onafhankelijk van elkaar te ontwikkelen (InfoQ, 2015). Een nanoservice is zo klein dat je er met één persoon al aan kan werken. Zo creëer je dus eigenlijk een cultuur waarin samenwerking moeilijker wordt.
Conclusie
Het opsplitsen van je applicatie kan een oplossing zijn wanneer je erachter komt dat de onderdelen van je applicatie te sterk aan elkaar gekoppeld zijn. Maar zoals het KISS-principe voorschrijft is het ook belangrijk om je applicatie zo simpel mogelijk te houden. De overhead die nanoservices met zich meebrengen is niet iets wat elke organisatie kan gebruiken.
Misschien zorgt de verdere ontwikkeling van tooling (zoals Serverless) er wel voor dat het makkelijk wordt om meerdere nanoservices te beheren zonder de onnodige overhead.
Bronnen
- Atlassian. (z.d.). DevOps Best Practices. Geraadpleegd op 7 oktober 2021 van https://www.atlassian.com/devops/what-is-devops/devops-best-practices
- D., A. (2021, 27 juli). Best Architecture for an MVP: Monolith, SOA, Microservices, or Serverless? RubyGarage. https://rubygarage.org/blog/monolith-soa-microservices-serverless
- Ebi, C. (2020, 25 februari). The rise of nanoservices. Increment. https://increment.com/software-architecture/the-rise-of-nanoservices
- Fowler, M. (2015, 1 juli). Microservice Trade-Offs. martinfowler.com. https://martinfowler.com/articles/microservice-trade-offs.html
- Kim, G., Debois, P., Willis, J., Humble, J., & Allspaw, J. (2016). The DevOps Handbook. Amsterdam University Press.
- Microsoft. (z.d.). Oplossingen met meerdere cloudomgevingen met Serverless Framework - Azure Example Scenarios. Microsoft Docs. Geraadpleegd op 6 oktober 2021 van https://docs.microsoft.com/nl-nl/azure/architecture/example-scenario/serverless/serverless-multicloud
- RedHat. (2017, 31 oktober). What is serverless? https://www.redhat.com/en/topics/cloud-native-apps/what-is-serverless
- Retter, M. (2021, 24 februari). Netflix AWS: The Netflix Serverless Case Study. Dashbird. https://dashbird.io/blog/serverless-case-study-netflix/
- Skierkowski, M. (2019, 10 juli). Basic Integration Testing with Serverless Framework. Serverless. https://www.serverless.com/blog/serverless-test-framework
- Van Wijk, E. (2017, 26 september). GitHub - EdwinVW/pitstop. GitHub. https://github.com/EdwinVW/pitstop
Continuous monitoring in DevOps met Grafana
Stel je eens voor, na een paar sprints heb je met je een team een product af wat naar productie gedeployed wordt. Vanaf dat moment wordt de applicatie eigenlijk een zwart gat. Hoe houd je als team nu in de gaten wat er allemaal gebeurt in je software?
Voor de minor DevOps heb ik onderzoek gedaan naar een nieuwe technologie die bij DevOps wordt toegepast, zodat deze toegepast kan worden in het eindproduct.
In dit onderzoek heb ik gekozen voor een tool die een oplossing biedt voor het eerder geschetste probleem, Grafana. Deze tool past ook bij één van de weekthema's die besproken is in deze minor, SlackOps. Grafana wordt gebruikt in continous monitoring. In dit blog leg ik uit wat Grafana doet, wat continous monitoring is en aan het einde is er ook een demonstratie voor het toepassen van Grafana bij het monitoren van een applicatie. Daar maken we een dashboard over netwerk gebruik en memory, wat alerts verzend bij te hoge waardes.
Wat is Grafana?
Skedler beschrijft Grafana als volgt:
Grafana is an open source visualization and analytics software. It allows you to query, visualize, alert on, and explore your metrics no matter where they are stored. (Skedler Team, 2021)
Kort gezegd is Grafana dus een tool waarmee data, specifiek time-series data, gevisualiseerd kan worden. Grafana is geen tool die zelf data genereert of opslaat, het moet data uit externe bronnen halen. Denk hierbij aan een database of een monitoring tool zoals Prometheus. Grafana kan wel data uit verschillende bronnen combineren tot één dashboard. Een groot voordeel van Grafana is dat de tool zelf al veel ingebouwde data source plugins heeft, waardoor het makkelijk is om data uit veel voorkomende tools op te halen. Ook is Grafana open-source, waardoor er veel extra te downloaden is (zoals plugins, type visualisaties maar ook hele dashboards).
Door Grafana is er ook een voorbeeld gemaakt van een aantal dashboards, wat hier te vinden is.
Grafana binnen devOps
Hieronder staat een afbeelding met de acht DevOps onderdelen. Grafana is onderdeel van de stap 'monitor.'
delta-n (2021)
In deze stap is het product al gedeployed en ga je als team met diagnostische gegevens de gezondheid van je applicatie monitoren. In het artikel van Bose (2020) zijn er drie categorieën van monitoring beschreven die je tijdens deze fase kan toepassen:
- Infrastructure Monitoring: Het monitoren van de infrastructuur (CPU usage, beschikbaarheid etc.)
- Application Monitoring: Het monitoren van een applicatie. (response time, availability etc.)
- Network Monitoring: Het monitoren van netwerk activiteit.
Grafana's rol in het monitoren is het visualiseren van deze gegevens. Zoals in de inleiding al benoemt moeten de gegevens wel ergens anders vandaan worden gehaald.
Een praktisch voorbeeld is te vinden op Stack Overflow. Stack Overflow gebruikt Grafana om data uit Elasticsearch, OpenTSDB en hun alerting tools (Bosun) te visualiseren. Stack Overflow geeft aan dat Grafana helpt om snel een unieke dashboard te maken waarin ze bronnen combineren. En omdat Grafana open-source is geeft het ze de mogelijkheid om plugins te schrijven voor hun eigen alerting tools. (How Stack Overflow Uses Grafana to Optimize Its Systems, z.d.)
Een applicatie monitoren met Grafana
Nu het duidelijk is wat Grafana is en waarvoor het toegepast wordt binnen DevOps kunnen we Grafa toepassen op een applicatie. Deze applicatie is te vinden in deze GIT repository. Hiervoor moet je docker geïnstalleerd hebben. Om de applicatie te runnen voer je docker-compose up
uit.
Nu draait er een simpele Gradle applicatie met één REST endpoint op localhost:8081. De endpoint kan getest worden met het volgende GET request.
http://localhost:8081/greeting?name=test
Je ontvangt dan Hello, test!
terug.
Verder draait nu ook Prometheus(http://localhost:9090) en cAdvisor (http://localhost:8080).cAdvisot cAdvisor doet het volgende:
cAdvisor (Container Advisor) provides container users an understanding of the resource usage and performance characteristics of their running containers. It is a running daemon that collects, aggregates, processes, and exports information about running containers. Specifically, for each container it keeps resource isolation parameters, historical resource usage, histograms of complete historical resource usage and network statistics. This data is exported by container and machine-wide. (Google, z.d.)
Prometheus verzamelt de data uit cAdvisor en stelt deze beschikbaar voor Grafana.
Ook draait Grafana nu op http://localhost:3000/. Hier navigeren we nu heen om ons eerste dashboard te maken.
Stap 1: verbinden van Grafana met Prometheus
Navigeer naar Grafana, log in met de username en wachtwoord admin
.
Maak vervolgens eerst verbinding met een datasource, in ons geval Prometheus. Via het tandwiel in het menu links, navigeer je naar datasources. Voeg een Prometheus source toe. Selecteer dan het Prometheus data type. Vul hier onderstaande gegevens in:
Sla deze configuratie op en selecteer dan links de create optie om een nieuw dashboard te creëren.
Nu beginnen we met het visualiseren van wat basisstatistieken.
Stap 2: visualiseren van data
Voor onze back-end maken we een dashboard met de volgende visualisaties:
- Memory usage
- Memory cached
- Received and sent network traffic.
Voordat we beginnen met het toevoegen van visualisaties voegen we eerst een variabele op het dashboard toe. We moeten namelijk bij sommige grafieken kiezen voor welke container we de visualisaties willen tonen. Door hier een variabele voor toe te voegen, kan dit dashboard gebruikt worden voor verschillende containers.
Rechtboven selecteer je instellingen en ga je naar variables. Hier maak je een variabele met de volgende instellingen:
De waarde van de variabele moeten we nog wel instellen. Het is mogelijk om deze op te halen met een query, maar voor dit voorbeeld vullen we het zelf in. Hiervoor haal je met het volgende commando in de terminal de code van de container op.
docker ps
Noteer de code achter gradle-democopy_resource en navigeer naar localhost:8080. Hier staan alle containers die gemonitord worden. Navigeer naar /docker en hier zie je de containers.
Kopieer de naam van de container die begint met dezelfde code als we eerder genoteerd hebben. Vul deze waarde in en sla dan je variabele op.
Memory met simpele queries.
Vervolgens terug op het dashboard zie je een panel met drie opties:
- Add an empty panel
- Add a new row
- Add panel from the panel library
We beginnen met een new row waarin we informatie over de memory gaan opslaan. Voeg een nieuw paneel toe. Je bent nu op het volgende scherm:
Onderaan bij de query gaan we er een toevoegen om informatie uit Prometheus te halen. Je kan zelf een query schrijven, maar je kan ook de query builder gebruiken. Eerst maken we een query met de builder. De metric die we willen weergeven in deze tabel container_memory_usage_bytes
. Dit willen we niet van iedere container, dus we selecteren het label id
. Hiervoor kiezen we dan vervolgens de naam van de juiste container. Dit levert bij mij de volgende query op:
container_memory_usage_bytes{id="/docker/ac86b01f14c893b0816b7981206230d77526add737303b721bff0e3b17069d10"}
Met use query kunnen we de query toepassen. Dan krijg je ongeveer de volgende grafiek te zien.
Deze is nog te verbeteren. Ten eerste wil ik mijn variabele in de query gebruiken. Dit doe ik door de query aan te passen mt de volgende code.
container_memory_usage_bytes{id="$container"}
In de query tab verander ik ook de legenda. Hier zet ik 'Back-end' neer. Deze kan je ook dynamisch maken door bijvoorbeeld {{id}} neer te zetten. Ook verander bij 'Panel options' in de rechterkant van het scherm de titel naar 'Memory usage'. In dit paneel heb je nog veel meer opties, zoals thresholds, kleurenschemas en andere display opties. Na deze veranderingen ziet de grafiek er dan als volgt uit.
Deze zelfde stappen gebruik ik voor de cached memory, hiervoor gebruik ik 'container_memory_cache'. Hierna zijn je eerste grafieken klaar.
Network traffic met complexere queries.
Nu voegen we nog een grafiek over network traffic toe. Hiervoor gebruik ik wat complexere queries en ga ik meerdere queries in één grafiek stoppen. Maak op je dashboard een nieuw paneel aan. Hierin komen de ontvangen (container_network_receive_bytes_total
) en verzonden bytes (container_network_transmit_bytes_total
).
Eerst maken we een query voor de ontvangen bytes. Hier zetten we een query functie function omheen, rate(). Deze berekent de gemiddelde verhoging.
rate(container_network_receive_bytes_total{}[5m])
Met deze query krijg je meerdere resultaten en dus ook meerdere lijnen in je diagram. Deze lijnen voegen we samen door nog sum() om de query heen te zetten. Hierna kan je ook de legenda aanpassen.
sum(rate(container_network_receive_bytes_total{}[5m]))
De verzonden bytes kan je ook toevoegen in dezelfde grafiek, door een tweede query toe te voegen. Gebruik hier container_network_transmit_bytes_total
. Als je dit correct hebt gedaan, dan heb je het volgende resultaat.
Stap 3: alerts
We gaan nu een aantal statistieken van de applicatie bekijken. Op het moment dat er iets fout gaat, wil je daar snel van op de hoogte zijn. Hier zijn alerts voor. Ter voorbeeld gaan we voor de ontvangen bytes een alert instellen.
Om alerts te ontvangen hebben we eerst een alert channel nodig. In het linker menu kan je bij het belletje een alerting channel toevoegen. Ik heb ervoor gekozen om slack te gebruiken. Met deze tutorial heb ik een webhook url aangemaakt die ik in Grafana instel.
Navigeer terug naar het dashboard en je network grafiek en ga dan naar de tab 'alerts'. Ter voorbeeld vullen we het volgende in:
Vervolgens als je terug navigeert naar het dashboard, kan je naast de refresh knop instellen dat het dashboard automatisch refreshed. Na een tijdje krijg je in je grafiek te zien dat het alert geactiveerd wordt en krijg je een alert op je ingestelde channel:
Als we nu de Is Above in de alert verhogen naar een hoog getal krijg je een bevestiging dat je alert verholpen is.
Stap 4: exporteren van het dashboard
Nu het dashboard klaar is gaan we deze exporteren, zodat we het dashboard later opnieuw kunnen inladen. Via de share knop (naast de naam van je dashboard) kan je een JSON bestand exporteren. Met dit bestand kan je het dashboard importeren. Het is dan ook mogelijk om templates van dashboards online te downloaden en te delen.
Conclusie
Met Grafana kan data uit verschillende bronnen snel omgezet worden naar een dashboard. Deze dashboards, in combinatie met alerts helpen je om je applicaties in de gaten te houden. In de demo heb ik gezien hoe je simpele grafieken kan aanmaken en queries kan schrijven. Met deze kennis van Grafana kan ik in het project continous monitoring toepassen op de pitstop applicatie.
Bronnen
- Bose, S. (2020, 8 december). What is Continuous Monitoring in DevOps? BrowserStack. https://www.browserstack.com/guide/continuous-monitoring-in-devops
- delta-n. (2021, 18 augustus). Wat is DevOps? https://www.delta-n.nl/devops/wat-is-devops
- Google. (z.d.). GitHub - google/cadvisor: Analyzes resource usage and performance characteristics of running containers. GitHub. Geraadpleegd op 6 oktober 2021 van https://github.com/google/cadvisor
- How Stack Overflow uses Grafana to optimize its systems. (z.d.). Grafana Labs. Geraadpleegd op 5 oktober 2021 van https://grafana.com/success/stackoverflow
- Skedler Team. (2021, 28 augustus). Everything You Need to Know about Grafana. Skedler. https://www.skedler.com/blog/everything-you-need-to-know-about-grafana
API gateways with Kong, will it make your project strong?
De DevOps cultuur maakt veel gebruik van microservices. Dit zorgt ervoor dat een client applicatie met veel verschillende API's moet praten om alle benodigde informatie te ontvangen. Maar wat als er meer services bijkomen of bestaande services veranderen? Dit kan erg snel complex en veel werk worden voor de client. Hierbij kunnen *API gateways* een rol spelen. Dit onderzoek beantwoordt de vraag: "Hoe kan een API gateway met KONG geïmplementeerd worden in een microservice systeem?"
Deze vraag wordt beantwoord met behulp van de volgende deelvragen.
- Wat is een API gateway?
- Wat zijn de voor- en nadelen van een API gateway?
- Waarvoor kan je Kong gebruiken?
- Hoe kan met behulp van Kong een API gateway gemaakt worden in Docker?
Bij het beantwoorden van deze vragen gebruik ik de onderzoeksmethodes uit het ICT Research Methods Pack. (Han, z.d.) onder andere de methodes Literature study (Library) en Prototyping (Workshop).
Wat is een API gateway?
Client applicaties moeten met veel verschillende API's praten. Dit kan erg snel complex worden. Om dit eenvoudiger te maken wil je dat de client maar met een API praat. Dit is precies wat een API gateway doet.
Een API gateway zit tussen de client en de services in en handelt als een reverse-proxy. Een API gateway is een single point of entry naar je services. Dit zorgt ervoor dat API design, management en implementatie makkelijker en consistenter is. (Gadge & Kotwani, 2017)
Daarbij kan een API gateway ook gemeenschappelijke taken afhandelen. Denk hierbij aan authenticatie of rate limiting. Daarnaast zorgt een API gateway ook voor decoupling tussen clients en services. De client hoeft niks te weten over welke individuele services er zijn. (Microsoft, 2018)
Voor- en nadelen
Het gebruiken van een API gateway heeft verschillende voor- en nadelen.
Doordat een API gateway tussen de front en back end in zit zorgt dit voor een extra laag of barrière voor de services. Hierdoor kan een API gateway services beschermen tegen verschillende soorten aanvallen zoals DoS en SQL injection (“Why Use API Gateway? Pros & Cons | Knowledge Base”, 2021).
Zoals eerder genoemd kan een API gateway gemeenschappelijke taken uitvoeren zoals: rate limiting, user access control en token authentication. Dit heeft als voordeel dat je dit maar een keer hoeft te implementeren. Daarnaast kunnen services dan focussen op hun taak en verspillen deze geen tijd aan randzaken waardoor de services ook minder complex worden (Microsoft, 2018).
Naast deze voordelen heeft het ook nadelen. Een API gateway zorgt voor een single point of entry. (Gadge & Kotwani, 2017) Dit betekent gelijk ook dat er een single point of failure ontstaat.
Het configureren van het systeem om gebruik te maken van de API gateway zorgt voor extra complexiteit voor developers (“Why Use API Gateway? Pros & Cons | Knowledge Base”, 2021).
De snelheid van het systeem wort beperkt door de snelheid van de API gateway (“Why Use API Gateway? Pros & Cons | Knowledge Base”, 2021).
Wat is KONG?
“Kong provides a flexible abstraction layer that securely manages communication between clients and microservices via API. Also known as an API Gateway.” (Faren, 2019)
Met Kong zet je dus een API gateway op. Kong biedt verschillende mogelijkheden om een API gateway te gebruiken. Onder andere voor Docker en Kubernetes (Kong Inc, 2021).
Een voordeel van een API gateway is het uitvoeren van gemeenschappelijke taken. Dit maakt Kong zeer eenvoudig. Doormiddel van plugins kun je extra functionaliteiten toevoegen aan Kong. (Faren, 2019) Zie: https://docs.konghq.com/hub voor een overzicht van de mogelijke plugins.
Kong in Docker
Een voor de hand liggende optie om Kong lokaal te gebruiken is Docker. Kong maakt dit ook erg eenvoudig aangezien Kong een Docker image beschikbaar stelt (https://hub.docker.com/_/kong/). Om in dit onderzoek Kong te testen gebruik ik twee simpele test API's. Deze zijn terug te vinden in deze repository.
Docker compose
Om Kong in combinatie met deze API's te laten werken gebruik ik een docker-compose.yml
bestand. Allereerst moet je een network opgeven.
version: '3'
networks:
default:
name: kong-network
Vervolgens voeg je Kong als service. Hierbij vallen een paar aspecten op bij environment
. Zo staat hier KONG_DATABASE
. Kong kan de configuratie wel of niet opslaan in een database. In dit onderzoek kies ik ervoor geen gebruik te maken van de database om het simpel te houden. Dit betekent dat je een kong.yml
bestand gebruikt voor de configuratie. De locatie hiervoor geef je aan met KONG_DECLARATIVE_CONFIG:
. Hierbij gebruik je een volume zodat Kong de kong.yml
kan vinden. De log variabelen zijn er alleen zodat Kong weet waar de log heen moet, dit is handig voor debuggen.
services:
kong:
image: kong:2.5.0-alpine
hostname: kong
container_name: kong
environment:
KONG_DATABASE: 'off'
KONG_PROXY_ACCESS_LOG: '/dev/stdout'
KONG_ADMIN_ACCESS_LOG: '/dev/stdout'
KONG_PROXY_ERROR_LOG: '/dev/stderr'
KONG_ADMIN_ERROR_LOG: '/dev/stderr'
KONG_ADMIN_LISTEN: "0.0.0.0:8001"
KONG_DECLARATIVE_CONFIG: "/opt/kong/kong.yml"
command: "kong start"
ports:
- "8000:8000"
- "8001:8001"
volumes:
- ./config:/opt/kong
KONG_ADMIN_LISTEN: "0.0.0.0:8001"
geeft aan welke poort Kong gebruikt. Hierbij valt op dat er twee poorten staan bij ports
. Port 8001 is de admin port, deze gebruik je voor informatie over Kong. Port 8000 is de port de je gebruikt voor de API's.
test-api-een:
image: kong-docker/test-api-een:1.0
build: ./test-api-een
hostname: api-een
container_name: api-een
test-api-twee:
image: kong-docker/test-api-twee:1.0
build: ./test-api-twee
hostname: api-twee
container_name: api-twee
Vervolgens voeg je de API's toe. Hiervoor configureer je geen ports aangezien Kong dit regelt binnen het Docker netwerk.
kong.yml
Nadat je de docker-compose hebt gemaakt kan je Kong configureren. Dit is zeer eenvoudig. In het kong.yml
bestand geef je de services aan. Hierbij geef je de de naam van de services aan, de url en routes.
De url is de hostname uit de docker-compose gevolgd door de port.
Bij de routes geef je aan welk path je gebruikt. In het voorbeeld heeft api-een het path /een
. Dit betekent dat je deze api benadert via {hostname}:8000/een
(bijv. localhost:8000/een
).
_format_version: "2.1"
_transform: true
services:
- name: api-een
url: http://api-een:5000
routes:
- name: test-api-een
paths:
- /een
strip_path: true
- name: api-twee
url: http://api-twee:5001
routes:
- name: test-api-twee
paths:
- /twee
strip_path: true
Plugins
Kong maakt het erg eenvoudig om plugins toe te voegen. Deze configureer je ook in de kong.yml
. Om dit te testen heb ik een rate-limiter plugin (https://docs.konghq.com/hub/kong-inc/rate-limiting) toegevoegd aan de configuratie.
plugins:
- name: rate-limiting
config:
minute: 5
policy: local
Dit is erg eenvoudig omdat je alleen de name opgeeft en dan de configuratie van de plugin. De limit per minuut staat op 5 om dit makkelijk te kunnen testen.
Uitvoeren in Docker
Vervolgens start je de API met de bekende commando's:
docker-compose build
docker-compose up -d
Na het uitvoeren van deze commando's is in de onderstaande afbeeldingen te zien dat kong werkt zoals verwacht.
API een | API twee |
---|---|
Conclusie
Uit het onderzoek blijkt dat een API gateway tussen de client en de services in staat. Zo zorgt de gateway voor een single point of entry. Hierdoor praat de client maar met een API i.p.v. voor elke service een andere API. Dit maakt het voor de client veel minder complex.
Dit heeft een aantal voordelen. Zo geeft een API gateway extra beveiliging en kan de gateway gemeenschappelijke taken uitvoeren. Dit maakt de services gelijk minder complex en deze kunnen focussen op hun taak.
Echter, door de single point of entry is er ook een single point of failure. Dit is een van de belangrijkste nadelen van een API gateway.
Om een API gateway toe te voegen aan een systeem kan je Kong gebruiken. Kong biedt veel functionaliteit waardoor het erg makkelijk te gebruiken is. Zo kan je ook makkelijk extra functionaliteit toevoegen met plugins.
De uitgevoerde demo applicatie ondersteunt dit. Uit de demo app blijkt dat je met Kong inderdaad eenvoudig een API gateway op kan zetten in Docker. Hiervoor moet je de Kong image toevoegen in de docker-compose.yml
. Daarnaast voeg je de services en plugins toe aan de configuratie van Kong in een kong.yml
. Kong maakt dit zeer overzichtelijk en dit was daarom makkelijk toe te passen.
Concluderend kan je met Kong een API gateway eenvoudig implementeren in een microservice systeem.
Bronnen
- Faren, F. (2019, 22 januari). KONG — The Microservice API Gateway - faren. Geraadpleegd op 7 oktober 2021 van https://medium.com/@far3ns/kong-the-microservice-api-gateway-526c4ca0cfa6
- Gadge, S., & Kotwani, V. (2017). Microservice Architecture: API Gateway Considerations. 2017. Published. Geraadpleegd van http://mainlab.cs.ccu.edu.tw/presentation/pdf/(2017)Microservice-Architecture-API-Gateway-Considerations.pdf
- Han. (z.d.). ICT research methods. Geraadpleegd op 7 oktober 2021 van https://ictresearchmethods.nl/Methods
- Kong Inc. (2021, 30 september). Kong Open-Source API Management Gateway for Microservices. Geraadpleegd op 7 oktober 2021 van https://konghq.com/kong
- Microsoft. (2018, 23 oktober). API gateways - Azure Architecture Center. Geraadpleegd op 7 oktober 2021 van https://docs.microsoft.com/en-us/azure/architecture/microservices/design/gateway
- Dashbird Why Use API Gateway? Pros & Cons | Knowledge Base. (2021, 13 januari). Geraadpleegd op 7 oktober 2021 van https://dashbird.io/knowledge-base/api-gateway/pros-and-cons-of-using-an-api-gateway
Laravel webapplicatie met Varnish in een Docker omgeving
In deze blogpost onderzoek ik of en hoe het mogelijk is een Laravel webapplicatie binnen een Docker omgeving te draaien. De reden om voor *Laravel* te kiezen is omdat ik in mijn eigen projecten als ZZP'er veelal gebruik maak van dit PHP-framework. De reden om voor *Varnish caching* te kiezen is omdat dit binnen de hostingbranche een bekende tool is om een website sneller te maken, door middel van caching.
Al langere tijd ben ik aan het kijken naar op welke wijze ik Docker in mijn eigen projecten kan toepassen. Gezien de voordelen die Docker biedt wat betreft het opzetten van een applicatieomgeving inclusief eventueel te installeren dependencies.
De vraag die ik in deze blogpost beantwoord is: Hoe kan een Laravel webapplicatie in combinatie met een Varnish caching service geautomatiseerd in een Docker omgeving worden geplaatst?
Mogelijkheden van Laravel in een Microservice architectuur
Op dit moment gebruik ik binnen mijn eigen projecten Laravel veelal als monoliet.
"A monolithic app has all or most of its functionality within a single process or container and it's componentized in internal layers or libraries. The downside to this approach comes if or when the application grows, requiring it to scale. If the entire application scaled, it's not really a problem. However, in most cases, a few parts of the application are the choke points that require scaling, whereas other components are used less." (Microsoft, 2021)
Een aantal applicaties waar ik aan werk worden steeds groter in omvang, terwijl de hoeveelheid gebruikers toeneemt. Omdat microservices individueel kunnen schalen, verbetert dit in veel gevallen de performance van de software aanzienlijk. Uitbreiden van RAM en CPU is ook een optie, maar dit brengt meer kosten met zich mee.
"Laravel is an open-source PHP framework designed to make developing web apps easier and faster through built-in features. These features are part of what makes Laravel so widely used by web developers." (Tim, 2019)
De features die hier bedoeld worden zijn onder andere:
- Een volledig authenticatie systeem.
- Een ORM-systeem om data uit een database om te zetten naar PHP-objecten en vice versa.
- Een command-line interface om unit tests uit te voeren, handmatig een stuk PHP-code aan te roepen en database migraties uit te voeren.
- Een virtuele development omgeving. Om tijdens het ontwikkelen de Laravel-applicatie doormiddel van een commando de applicatie te starten.
Doordat Laravel voorziet in een groot aantal features is het framework te zwaar om in meerdere microservices op te nemen. Om die reden hebben de ontwikkelaars van het Laravel framework een apart microframework ontwikkeld genaamd Lumen.
"Lumen microframework is a lightweight version of Laravel full-stack framework. Lumen use the Laravel syntax and components, and can be 'upgrade' easily to Laravel.
Lumen is a more specialized (and stripped-down) framework designed for Microservices and API development. So, some of the features in Laravel such as HTTP sessions, cookies, and templating are not needed and Lumen takes them away, keeping what's essential - routing, logging, caching, queues, validation, error handling and a couple of others." (Garbar, 2021)
Als voorbeeld voor hoe je het Lumen-framework kan integreren in microservices, heb ik het Microservices with Lumen project onderzocht. In dit project werken meerdere Lumen-microservices met elkaar samen.
De architectuur van dit bestaande project is als volgt (afbeelding overgenomen uit genoemde repository):
Dit project bestaat uit drie Lumen-microservices:
- LumenApiGateway
- Verantwoordelijk voor authenticatie en het doorsturen van requests naar onderliggende microservices.
- Dit is de microservice waar de (externe) gebruiker mee communiceert.
- LumenAuthorApi
- Een microservice waarin CRUD-operaties (cread, read, update, delete) toegepast worden op een Auteur-object.
- LumenBookApi
- Een microservice waarin CRUD-operaties toegepast worden op een Boek-object.
Communicatie tussen de microservices gebeurt in dit voorbeeld via HTTP. In plaats daarvan kan ook AMQP (via bijvoorbeeld RabbitMQ) gebruikt kunnen worden. Het voordeel aan AMQP is dat het betrouwbaar en asynchroon is, en je je dus geen zorgen hoeft te maken over of je bericht wel aankomt (Sörenson, 2017).
Om die reden heb ik verder gekeken naar de mogelijkheden van RabbitMQ in combinatie met het Lumen-framework. Hierop vond ik een tutorial met een combinatie van het Lumen-framework en RabbitMQ.
Het project, besproken in deze tutorial, bestaat uit twee microservices:
- Microservice 1
- Stuurt een message 'OrderCreated' naar Microservice 2.
- Code zichtbaar op GitHub
- Microservice 2
- Luistert naar messages van het type 'OrderCreated'.
- Code zichtbaar op GitHub
Dit project laat zien dat het mogelijk is om Lumen microservices met elkaar te laten communiceren via een message queue. Dit heeft onder andere het voordeel van 'gegarandeerde levering' tussen de microservices. Nadeel is echter dat bij gebruik van RabbitMQ als communicatiesysteem een groot deel van het Lumen-framework niet niet nodig is. Communicatie binnen zowel Laravel en Lumen verloopt via HTTP. Vandaar dat er een HTTP-routing systeem zit ingebouwd in dit framework. Door RabbitMQ toe te passen worden de onderdelen van Laravel die dit verzorgen echter overbodig.
Voor dit onderzoek houd ik de onderlinge communicatie tussen de microservices daarom bij HTTP. Bij (verplicht) gebruik van RabbitMQ zou ik niet kiezen omdat veel code uit het Lumen-framework hierdoor overbodig is.
Extra services (containers) om Laravel in een Docker container te draaien
Over het algemeen zijn er binnen Laravel een aantal services nodig. Waaronder:
- PHP-FPM, om live PHP te compileren tot HTML
- Relationele database, vanzelfsprekend om data in op te slaan
- RabbitMQ, indien communicatie tussen microservices via AMQP verloopt
PHP-FPM beschikt over een ingebouwde webserver. Deze server verzorgt het compileren van PHP-code tot bijvoorbeeld tekst of HTML en het versturen daarvan naar de (in het geval van dit onderzoek) de Varnish cache.
Mogelijkheden van Varnish in een Microservice architectuur
Varnish Cache is een reverse proxy die op basis van request headers zoals URL en Request Method een kopie van de pagina in het geheugen houdt om deze bij een vervolgbezoek direct uit het geheugen uit te kunnen serveren, ook wel Full Page Cache genoemd (Hipex, 2019).
Voor Varnish is er op Docker Hub een image beschikbaar. Om deze image te gebruiken is het enkel benodigd een zogenaamd .VCL configuratiebestand mee sturen, waarin de instellingen voor de Varnish service worden gedefinieerd.
VCL is de 'configuratietaal' van Varnish en staat voor Varnish Configuration Language.
"Varnish has a great configuration system. Most other systems use configuration directives, where you basically turn on and off lots of switches. We have instead chosen to use a domain specific language called VCL for this.
Every inbound request flows through Varnish and you can influence how the request is being handled by altering the VCL code. You can direct certain requests to particular backends, you can alter the requests and the responses or have Varnish take various actions depending on arbitrary properties of the request or the response. This makes Varnish an extremely powerful HTTP processor, not just for caching.
VCL has inherited a lot from C and it reads much like simple C or Perl. Blocks are delimited by curly brackets, statements end with semicolons, and comments may be written as in C, C++ or Perl according to your own preferences." (Varnish Software AS, z.d.)
De VCL-syntax kent een aantal onderdelen:
- Strings
- Access control lists (ACLs)
- Operators
- Built in subroutines
- Custom subroutines
Via een custom subroutine is het bijvoorbeeld mogelijk om bepaalde webpagina's uit te sluiten van de Varnish cache. Dit kan handig zijn wanneer je een API hebt die altijd de meest recente data terug moet geven. Met behulp van een custom subroutine kan worden ingesteld dat deze API niet gecached moet worden.
In dit geval kan zo'n subroutine er als volgt uit zien:
sub vcl_recv {
if (req.url == "/api") {
return (pass);
}
}
Varnish combineren met Laravel in Docker
Om Laravel in combinatie met Varnish te gebruiken heb ik allereerst een docker-compose.yaml
aangemaakt met daarin een aantal services (containers):
- Database (MariaDB)
- Microservice 1, die data wegschrijft naar de database
- Microservice 2, die data doorstuurt naar de eerste microservice
- Varnish cache
Uiteindelijk ziet deze configuratie er als volgt uit:
version: '3'
services:
# Service 1 - Slaat inkomend bericht op in Database
service1:
build: service1/
restart: unless-stopped
command: bash -c "php artisan migrate && php -S service1:80 -t public"
working_dir: /var/www
volumes:
- ./.env:/var/www/.env
depends_on:
- mariadb
# Service - Verstuurt willekeurig bericht naar service 1 en haalt alle berichten op uit service 1
service2:
build: service2/
restart: unless-stopped
command: bash -c "php -S service2:80 -t public"
working_dir: /var/www
volumes:
- ./.env:/var/www/.env
depends_on:
- service1
# Varnish Service
varnish:
image: varnish:6.0.8
restart: unless-stopped
ports:
- "80:80"
volumes:
- ./varnish/default.vcl:/etc/varnish/default.vcl:ro
# MySQL Service
mariadb:
image: mariadb:latest
restart: unless-stopped
environment:
MARIADB_DATABASE: ${DB_DATABASE}
MARIADB_USER: ${DB_USERNAME}
MARIADB_PASSWORD: ${DB_PASSWORD}
MARIADB_RANDOM_ROOT_PASSWORD: "yes"
Hierbij heb ik poort 80 van de Varnish service publiek toegankelijk gemaakt. De Varnish service stuurt vervolgens (gecached) door middel van een reverse proxy microservice 2 door aan de browser van de gebruiker. Microservice 2 roept om zijn beurt microservice 1 aan om een bericht op te slaan.
Binnen het prototype is het mogelijk berichten te plaatsen en een overzicht van alle berichten op te halen. Er was echter een probleem dat na het toevoegen van een bericht deze niet in het overzicht van berichten kwam te staan. Dit kwam simpelweg doordat het overzicht van berichten in de Varnish cache stond. Om dit probleem op te lossen heb ik een regel toegevoegd, die bij het plaatsen van bericht, de Varnish cache leegt.
Dit maakt dat de Varnish VCL-configuratie er als volgt uit ziet:
vcl 4.0;
backend default {
.host = "service2";
.port = "80";
.connect_timeout = 500s;
.first_byte_timeout = 500s;
}
sub vcl_recv {
if (req.url == "/create") {
ban("req.http.host ~ .*");
return (pass);
}
}
Je kunt hier nog een Docker-volume toevoegen om de database gegevens in op te slaan. Aangezien dit een prototype is heb ik dit voor nu weggelaten.
Het volledige prototype heb ik geplaatst op GitHub: https://github.com/stein155/laravel-varnish-docker.
Laravel webapplicatie in combinatie met een Varnish cache geautomatiseerd uitbrengen
Het proces om een Laravel webapplicatie op een externe server te deployen is mogelijk door middel van continous integration (CI). Onder andere via GitHub is er de mogelijkheid om CI op te zetten. Dit kan gedaan worden met GitHub Actions. In dit geval heb ik de keuze gemaakt om enkel naar GitHub Actions te kijken, aangezien ik daar in een eerder project mee heb gewerkt en daardoor al enige ervaring met dit systeem heb.
Voordat er een configuratie opgesteld kan worden voor GitHub Actions moet er eerst gekeken worden welke stappen er doorlopen moeten worden om de webapplicatie in combinatie met Varnish op een externe server te plaatsen. Deze stappen zijn als volgt, vanuitgaand dat er een bestaande server is waarop ingelogd kan worden door middel van SSH, en Docker (Compose) is geïnstalleerd:
- Inloggen via SSH op de server
- Content van repository kopiëren naar server
- Lumen microservices
- Varnish configuratie
docker-compose.yaml
enDockerfile
- Uitvoeren commando
docker compose up
, waarna de Docker-images opgebouwd worden en de applicatie start.
Binnen GitHub Actions is het mogelijk op bestaande Actions opgesteld door andere GitHub-gebruikers te gebruiken. Uiteindelijk is mijn keuze gevallen op de GitHub check github-action-ssh-docker-compose. Aangezien deze precies de stappen doorliep welke bovenstaand worden genoemd, namelijk om de applicatie op een server te plaatsen en met docker-compose op te starten.
Uiteindelijk heeft dit tot de volgende GitHub Actions configuratie geleid:
name: Deploy
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: alex-ac/github-action-ssh-docker-compose@master
name: Docker-Compose Remote Deployment
with:
ssh_host: ${{ secrets.SSH_HOST }}
ssh_private_key: ${{ secrets.SSH_PRIVATE_KEY }}
ssh_user: ${{ secrets.SSH_USER }}
docker_compose_prefix: prototype
Te zien is dat in bovenstaande configuratie de term secrets voorbijkomt. Dit zijn geheime waarden die per GitHub repository ingesteld kunnen worden. Dit is dus de plek om in dit geval een private key op te slaan. Secrets zijn niet in te zien nadat ze bij de opgegeven repository zijn opgeslagen.
Conclusie
Op basis van dit onderzoek kan ik zeggen dat het mogelijk is het Laravel-framework te gebruiken in een Docker-omgeving, samen met een Varnish caching laag. Net als het automatisch deployen daarvan door middel van een CI-omgeving als GitHub Actions.
Wat wel een punt is bij het gebruik van Varnish, is dat er rekening gehouden moet met dat er situaties zijn waarin caching niet gewenst is. Dit bijvoorbeeld wanneer er een endpoint is om een wijziging te maken, die vervolgens niet zichtbaar is omdat de oude waarde in de cache staat. Binnen Varnish is hier een oplossing voor. Door middel van regels is het mogelijk op bepaalde momenten de cache te legen. Bijvoorbeeld bij het plaatsen van een nieuw bericht (prototype).
Kennis opgedaan uit dit onderzoek heb ik gebruikt in een prototype. Deze is zichtbaar op GitHub: https://github.com/stein155/laravel-varnish-docker.
Bronnen
- Garbar, D. (2021, 14 april). Laravel Microservices or Lumen vs Laravel. Belitsoft. https://belitsoft.com/laravel-development-services/microservices-architecture-development
- Sörenson, F. (2017, 14 juli). AMQP vs HTTP. DEV Community. https://dev.to/fedejsoren/amqp-vs-http
- Microsoft. (2021, 6 januari). Monolithic applications. Microsoft Docs. https://docs.microsoft.com/en-us/dotnet/architecture/containerized-lifecycle/design-develop-containerized-apps/monolithic-applications
- Hipex. (2019, 31 juli). Varnish Cache - Wat is het en wat maakt het zo krachtig? Hipex.io. https://www.hipex.io/varnish-cache/
- Tim, C. (2019, 11 december). What is Laravel? Explain it like I’m five. DEV Community. https://dev.to/creativetim_official/what-is-laravel-explain-it-like-i-m-five-19eb
- Varnish Software AS. (z.d.). VCL - Varnish Configuration Language — Varnish version trunk documentation. varnish-cache.org. Geraadpleegd op 7 oktober 2021 van https://varnish-cache.org/docs/trunk/users-guide/vcl.html
CapRover: Wat is het en wat kan je ermee?
CapRover is een eenvoudige tool om te gebruiken om apps/databases en web servers te beheren. Dit onderzoek gaat over hoe je CapRover kan inzetten in een kortlopend DevOps project. Dit onderzoek maakt gebruik van de "ictresearchmethods" (HBO-i, 2021)=). De methoden die ik gebruikt heb, zijn "**prototyping**" en " **Literature study**". Het gebruik van onderzoeksmethoden uit verschillende onderzoeksruimtes zorgt voor triangulatie: een completer beeld en een onderzoek van hogere kwaliteit.
Hoofdvraag: "Hoe kan je CapRover inzetten in een kortlopend DevOps project?"
Deelvragen:
- Wat is CapRover?
- Hoe kan je CapRover opzetten?
- Hoe kan je CapRover gebruiken?
- Hoe kan CapRover van waarde zijn binnen een DevOps cultuur?
In de beroepsproduct weken werkt een team aan een bestaande applicatie, deze applicatie gaat een ontwikkelteam uitbreiden. Het ontwikkelteam gaat proberen de uitbreidingen te deployen met CapRover. Deze uitbreidingen moet dan wel loosely coupled zijn met de andere microservices.
Dit onderzoek gaat over, wat CapRover nu eigenlijk is en wat de mogelijkheden ervan zijn. Hierna kijken we naar hoe je CapRover opzet en hoe je het kan gebruiken, aan de hand van prototyping. Als het duidelijk is wat CapRover is en hoe CapRover werkt, gaan we kijken naar hoe je CapRover inzet binnen een DevOps cultuur en wat de meerwaarde ervan is.
CapRover introductie
CapRover is een eenvoudige tool om te gebruiken om apps/databases en web servers te beheren. CapRover ondersteunt onder andere NodeJS, Python, StrapiCMS, NextJS en nog veel meer. CapRover is een free en Open Source PaaS (zie PaaS). CapRover is razendsnel en robuust, omdat het Docker, Nginx, LetsEncrypt en NetData gebruikt onder de motorkap. Hier ziet de gebruiker niet veel van, omdat de gebruiker een gebruikersvriendelijk interface gebruikt. Onderstaand een aantal sterke punten van CapRover (CapRover, Free and Open Source PaaS!, 2021, 11 september):
- CLI, voor Automatisering en scripting.
- Web GUI, voor gemakkelijke- toegang en gebruik.
- No lock-in, ook zonder CapRover blijven applicaties werken.
- Docker Swarm, CapRover maakt gebruik van Docker Swarm voor containerization en clustering.
- Nginx, volledige aanpasbaar Nginx template voor load-balancing.
PaaS
PaaS, ook wel "Platform as a Service" genoemd, is het leveren van besturingssystemen en bijbehorende diensten zonder deze te hoeven downloaden of installeren. Met PaaS kun je functies van besturingssystemen aanpassen en bijwerken. Hierdoor kunnen ontwikkelteams op maat software projecten opleveren. Het grote voordeel van PaaS is dat er aanzienlijk meer mensen kunnen werken aan het ontwikkelen, onderhouden en implementeren van web applicaties. (Marqit, 2018, 12 december)
CapRover installatie
Om CapRover te installeren en te configureren, moet je aan een aantal eisen voldoen. Aan onderstaande eisen moet je voldoen om CapRover op te kunnen zetten.
- Je moet een domeinnaam hebben.
- Server specificaties met minimaal 1GB RAM.
- Server moet Docker en npm geïnstalleerd hebben.
CapRover runnen
Om CapRover te runnen in een server moet je onderstaand commando uitvoeren. Het is van belang dat je de port mappings niet aanpast. CapRover werkt alleen op een aantal specifieke ports.
docker run -p 80:80 -p 443:443 -p 3000:3000 -v /var/run/docker.sock:/var/run/docker.sock -v /captain:/captain caprover/caprover
Verbind root domein
CapRover moet verbinden met een domeinnaam, dit doe je door in bijvoorbeeld TransIP een A-record toe te voegen. Dit A-record moet verwijzen naar de server waar CapRover op is geïnstalleerd. Je moet de naam van het A-record instellen als "*"
, dit moet om sub domeinen aan te kunnen maken bijvoorbeeld: [applicatie-naam].[domeinnaam].nl.
CapRover CLI installeren
De NPM package CapRover gebruik je om de CapRover CLI te installeren. Deze package installeer je door onderstaand commando uit te voeren:
npm install -g caprover
Na het installeren van de CapRover package kan je onderstaand commando uitvoeren:
Caprover serversetup
Hier moet je nu je domeinnaam in vullen, waar je zojuist het A-record bij hebt ingevuld die kijkt naar de VPS. Wanneer je ingelogd ben via de cli, kan je inloggen in je CapRover omgeving op de URL: captain.[domeinnaam].nl.
(caprover, caprover - getting started, 2021)
CapRover gebruiken en deployen met CapRover
Om te kijken hoe je applicaties via CapRover kan deployen, gaan we twee applicaties deployen. De eerste applicatie is een Strapi-applicatie. Deze applicatie moet je configureren, zodat deze gebruikt maakt van de tweede applicatie, MongoDB. MongoDB kan je deployen als een one-click database
.
Strapi deploy met CapRover
Om Strapi te deployen met CapRover moet je Strapi eerst lokaal draaiend krijgen. Hoe je dit kunt doen is te vinden op Strapi Getting Started. Om Strapi te deployen moet je een Dockerfile toevoegen.
Dockerfile
FROM strapi/base
# Create app directory
RUN mkdir -p /srv/app
WORKDIR /srv/app
COPY ./package.json ./
RUN yarn install
COPY . .
RUN yarn build
EXPOSE 1337
CMD ["yarn", "start"]
Om Strapi nu te deployen met CapRover moeten er een aantal zaken gebeuren. Eerst moet je in CapRover een nieuwe app maken. In onderstaande afbeelding staat hoe je deze moet configureren. Hier is er de mogelijkheid om HTTPS te gebruiken.
CapRover heeft een verplicht captain-definition
bestand nodig om een Dockerfile te gebruiken:
{
"schemaVersion" :2 ,
"dockerfilePath": "./Dockerfile"
}
De volgende stap is om de environmental Variables
op te stellen. Dit heb je nodig om met MongoDB te verbinden. De handige functionaliteit One Click Apps
van CapRover, kun je gebruiken om een MongoDB op te zetten. Deze functionaliteit biedt meer dan 100 verschillende apps/databases aan, die je met 1 klik op de knop kunt deployen naar een server. MongoDB kun je deployen via One Click Apps
, het enige wat je hoeft is MongoDB opzoeken, de juiste versies in te vullen en een naam te geven. De gegevens van de MongoDB kun je vinden onder het kopje App Configs
, deze gegevens vul je in bij de environmental variables
in je app configs
van je strapi-project.
De volgende stap is om Strapi te gaan deployen. Hier zie je verschillende mogelijkheden:
- CLI deployen
- Tarball
- Github/BitBucket/GitLab,
- Dockerfile,
- Captain-definition file
- Docker image.
Dit prototype maakt gebruikt van een deployment via GitHub. Hier gebruik je een gegenereerde SSH key. Zie hier om een SSH key te genereren op GitHub.
Een URL om een webhook in GitHub in te stellen is beschikbaar, wanneer je de GitHub repo en SSH key ingevuld hebt. De webhook zorgt ervoor dat na het updaten van de master branch er automatisch een nieuwe build en deployment plaatsvinden (zie onderstaande afbeeldingen).
Het project is te benaderen op [app-name].[domeinnaam].nl nadat de deployment succesvol is.
De waarde van CapRover binnen een DevOps cultuur
Tegenwoordig is er binnen veel ontwikkelteams een DevOps cultuur, maar hoe kan CapRover hier een waarde aan toevoegen. Binnen DevOps zijn er een aantal zaken waar veel focus op ligt samenwerken, kortere releasecycli, continu leren en automatisering (What is devops? z.d.). CapRover heeft voor al deze punten mogelijkheden tot verbetering.
CapRover zorgt er voor dat Ops minder werk is, er is geen operations expertise meer nodig. Dit komt simpelweg doordat je niet meer uren en dagen tijd hoeft te besteden aan het opzetten van een server, instellen build tools, SSL certificaten en updates. Ontwikkelaars die gebruik maken van dure services zoals Heroku en Microsoft Azure zullen zien dat je voor CapRover alleen voor de server hoeft te betalen (Lafferty, B. 2021, 5 juli).
Samenwerken
CapRover deployed alles direct naar een server, zodat iedereen bij de bestanden kan voor een optimale samenwerking.
Kortere releasecycli
Deployments naar ontwikkel-, test- en productieomgevingen kun je (automatisch) uitvoeren met webhooks. Hierdoor raak je geen tijd kwijt aan handmatige deploys of het instellen van lastige configuratie.
Continu leren
CapRover heeft een uitgebreid monitoring overzicht en toont constant alle logs van de applicaties die draaien. Hierdoor kan een ontwikkelteam kijken waar fouten zijn en waar verbetering mogelijk is.
Automatisering
In CapRover kun je op verschillende manieren automatisch deployen. CapRover biedt een mogelijkheid om zelf te bepalen wanneer je wilt deployen. Hierbij moet je denken aan bijvoorbeeld een merge met master en een feature-branch. Er zal dan automatisch een deploy plaatsvinden.
Je hebt nog een aantal verschillende alternatieven op CapRover, maar hier lopen de kosten al snel op. (cap_rover. z.d.)
Conclusie
Dit onderzoek heeft laten zien dat je met CapRover snel, gemakkelijk en geautomatiseerd kan deployen naar een server. En snel applicaties, databases en services op kan zetten met één klik en minimale configuratie. Deze waarnemingen heb ik onderbouwd met de onderzoeksmethode “prototyping” en aangetoond dat het ook daadwerkelijk snel en gemakkelijk gaat.
Na het onderzoeken hoe CapRover in elkaar zit, heb ik gekeken naar welke waarde CapRover toevoegt in een DevOps cultuur: Welke processen kan je verbeteren. Verschillende bronnen hebben aangetoond dat CapRover het samenwerken, kortere releasecycli, continu leren en automatisering processen sterk verbeterd. Maar ook dat er geen operations expertise meer nodig is, omdat alles gemakkelijk op te zetten is.
Dit onderzoek heeft laten zien dat CapRover geschikt is voor een kortlopend DevOps project, omdat het snel en gemakkelijk op te zetten is, je snel applicaties kan deployen en DevOps processen optimaliseert.
Bronnen
- Microsoft (z.d.). What is devops? Geraadpleegd op 8 oktober 2021 van https://azure.microsoft.com/nl-nl/overview/what-is-devops/#devops-overview
- CapRover (2021, 11 september). CapRover, Free and Open Source PaaS! Geraadpleegd op 8 oktober 2021 van https://caprover.com
- CapRover (z.d.). Getting Started. Geraadpleegd op 6 oktober 2021 van https://caprover.com/docs/get-started.html
- Bonestroo, W.J., Meesters, M., Niels, R., Schagen, J.D., Henneke, L., Turnhout, K. van (2018): ICT Research Methods. HBO-i, Amsterdam. ISBN/EAN: 9990002067426. Geraadpleegd op 5 oktober 2021 van http://www.ictresearchmethods.nl
- Lafferty, B. (2021, 5 juli). CapRover The Definitive guide. Geraadpleegd op 8 oktober 2021 van https://medium.com/swlh/caprover-the-definitive-guide-90076405aae4
- Marqit. (2018, 12 december). Platform as a Service. Geraadpleegd op 6 oktober 2021 van https://www.marqit.nl/wat-is-platform-as-a-service
- cap_rover. (z.d.). CapRover alternatives. Stackshare Geraadpleegd op 6 oktober 2021 van https://stackshare.io/caprover#alternatives
gRPC binnen een Microservice Architectuur
Daniel van de Ruit, oktober 2021.
Een kwestie waar je vaak tegenaan loopt is de communicatie tussen microservices. Gaan we applicaties met elkaar laten praten door middel van REST? Een softwarebroker als RabbitMQ of Apache Kafka? Of misschien zelfs FTP?
In deze post bespreek ik een relatief nieuwe speler op het gebied van communicatie: gRPC. Centraal staat de vraag "Hoe kan gRPC toegepast worden in een microservice architectuur?". Om deze vraag te beantwoorden heb ik deze opgesplitst in een aantal verschillende deelvragen, die ik in de komende paragrafen toelicht.
Na een stuk theorie besproken te hebben, geef ik een praktisch voorbeeld, die je zelf kunt volgen. De code die in dit voorbeeld wordt gebruikt is beschikbaar in de bijbehorende repository op GitHub, onder de map casus.
Wat is gRPC?
gRPC maakt het mogelijk om functies uit te voeren buiten de applicatie waar je je in bevindt, zelfs als de functie zich op een andere server in een ander continent bevindt.
gRPC is naar eigen zeggen een "High performance, open source universeel RPC framework". Dat is op zich nog niet veel zeggend, tenzij je de term "RPC" al kent.
RPC, of Remote Procedure Call, is een protocol waarmee een programma een service aan kan roepen in een ander programma. Dat programma, kan echter ook een andere taal zijn, op een andere schijf staan, in een ander datacenter staan, of zelfs aan de andere kant van de wereld draaien.
gRPC is een implementatie van dit protocol van origine ontwikkeld door Google. Het protocol bouwt voort op het reeds bestaande, maar nog steeds relatief nieuwe, HTTP/2. De software biedt naast support voor vele verschillende programmeertalen ook load balancing, tracing, health checking en authentication aan. Tot slot kan dit protocol ook gebruikt worden om verschillende apparaten met elkaar in verbinding te stellen, zoals telefoons en webservers.
Het mooiste zal zijn, om vanuit applicatie A simpelweg een functie in applicatie B uit te kunnen voeren. Dat is precies wat gRPC mogelijk maakt. Later in deze post meer over de specifieke technische details hiervan, nu eerst een vergelijk met andere protocollen die je wellicht wil gebruiken in je microservice architectuur.
Wat is het verschil tussen gRPC, REST en RabbitMQ?
gRPC heeft gelijkenissen en verschillen met REST en RabbitMQ. Het grootste voordeel van gRPC is type-safety en het feit dat bi-directionele streams ondersteund worden.
Zoals eerder al gezegd; geen van de technieken is een veel 'betere' oplossing dan de ander. Toch hebben bepaalde technieken wel een voordeel op een bepaald gebied. Stel bijvoorbeeld, dat applicatie A een open verbinding moet hebben met applicatie B, om bijvoorbeeld een live-chat te realiseren. REST (of HTTP) valt dan al enigszins af.
Om goed te kunnen kijken naar de verschillen tussen de tools, is het verstandig om eerst helder te hebben wat welke tool nou precies is. Om te beginnen REST. Dit is (denk ik) een van de eerste protocollen waar je als software / web developer mee te maken krijgt.
Rest
REST, of 'representational state transfer', is een architectuurstijl die de interactie tussen RESTful services mogelijk maakt. Een typisch REST endpoint bestaat uit de volgende onderdelen: http://api.airline.com/airplanes/1
. In dit voorbeeld hebben we het protocol en het domein (http://api.airline.com
), de 'resource' (airplanes
) en een identifier (1
).
Naar een dergelijk endpoint worden (doorgaans) JSON-berichten gestuurd in de body van een HTTP-request. Dit tezamen met de toepasselijke HTTP Method zorgt voor een gestructureerde API, met veel opties voor authenticatie.
Een nadeel van REST is dat er geen type-safety is. Het zou dus goed kunnen, dat er een wijziging in de API gemaakt wordt, waardoor niet het veld "Model": ""
maar het veld "AirplaneModel": ""
verwacht wordt. Voor het request verstuurd wordt zijn er geen checks die valideren het request van het goede formaat is. Dat kan ervoor zorgen dat het request kaatst.
Ook is het de vraag of er geen typefouten in de URL waar mee gecommuniceerd wordt zitten. Een kleine typefout zorgt er al voor dat het bericht niet aankomt en het beoogde resultaat dus niet wordt behaald.
RabbitMQ
RabbitMQ is een zogenaamde "Message Broker". De meest bekende implementatie van RabbitMQ is het gebruik van queues. Queues zijn in theorie een lijst waarop berichten worden gezet. Andere applicaties die op deze queue "luisteren", pakken de berichten die de "sender" op de queue heeft gezet op basis van het First-In-First-Out principe van de queue.
RabbitMQ is een bekende manier van communiceren tussen microservices. Omdat de service veel verschillende soorten oplossingen heeft om communicatie in te regelen en zaken faciliteert als delivery acknowledgement, routing en reply-queues, is het een mooie oplossing waar veel uit gehaald kan worden.
Onder water kan RabbitMQ op dezelfde techniek als gRPC draaien, namelijk RPC.
Echter heeft RabbitMQ vergelijkbare nadelen met REST. Er is geen gedeelde type-safety, wat ervoor zorgt dat het kan zijn dat de ontvanger een bericht niet accepteert. Ook is het zo dat het kan zijn dat er een typefout in de naam van de queue zit en het bericht dus niet bij de beoogde ontvanger aankomt.
Voor dat laatste heeft een broker als RabbitMQ (maar andere brokers ook) een mooie oplossing; Dead Letter queues. Hierop komen berichten terecht die naar een niet bestaande queue gestuurd worden, of waarvan de message TTL (Time To Live) verstreken is. Deze speciale queue kan later worden uitgelezen, om aan de ontwikkelaar door te geven.
gRPC
En dan de speler waarin wij geïnteresseerd zijn: gRPC.
Als we deze tool vergelijken met REST en RabbitMQ, vallen er gelijkenissen te zien. Net als REST, communiceert gRPC ook via het HTTP-protocol. Een subtiel verschil is hierbij, dat gRPC gebruik maakt van het HTTP/2 protocol. Dit protocol is grotendeels ontwikkeld door Google zelf, welke ook de maker van gRPC is. Een groot verschil tussen HTTP/1.1 (het protocol dat een 'gewone' REST API gebruikt) en HTTP/2 is het gebruik van binaire communicatie in plaats van plain-text data-overdracht. Een andere grote ontwikkeling van HTTP/2 is dat streams ondersteund worden, wat in de basis neerkomt op een open verbinding waarin berichten heen en weer gaan van de client naar de server en weer terug.
Een groot voordeel van gRPC zijn Google en haar "Protocol Buffers" (Protobufs). Over dit onderwerp alleen valt een heel onderzoek te schrijven, daarom houd ik het hier kort. Protobufs zijn "taal-neutrale, platform-neutrale, uitbreidbare mechanismen om gestructureerde data te serializeren" (Google, s.d.). Kort door de bocht, kunnen we eigenlijk zeggen dat een Protobuf een soort generiek object is, wat later met behulp van de Protobuf Compiler vertaald kan worden naar een programmeertaal (of meerdere) naar keuze. Onderstaand voorbeeld komt direct van de Google Developers website:
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
}
In de demo komen Protocol Buffers meer aan de orde, maar in het kort maken Protobufs het mogelijk om op een type-safe manier met behulp van gRPC te communiceren. Doordat de methods typesafe zijn, is het probleem van RabbitMQ en REST waar berichten niet aankomen door een typefout, of het probleem dat de body niet voldoet aan de eisen, verleden tijd.
Hoe kunnen twee microservices in verbinding worden gesteld met behulp van gRPC?
Nu de theorie achterwegen is, tijd voor een demo. In deze (vrij eenvoudige) applicatie maken we een Front-End die informatie over vertrekkende vluchten van een luchthaven toont. Deze (React) front-end staat in verbinding met een ASP.NET Core API, de FlightService, die alles weet over vluchten en waar deze vandaan vertrekken. De vliegtuigen zelf en de status daarvan, echter, zijn gesplitst naar een andere applicatie, de AircraftService (Zie het figuur hieronder voor een kort overzicht).
De communicatie tussen de FlightService en de AircraftService zijn de services die we in verbinding gaan stellen met gRPC.
Voor het uitvoeren van deze demo, is een gemiddeld programmeer-niveau vereist, om de wat complexere concepten te begrijpen.
De code is te vinden in de casus
map van deze repository. Op de branch 'uitwerking' is de uitwerking van de casus te vinden.
Vereisten:
- NPM geïnstalleerd
- Zowel Typescript als Nodemon globaal geïnstalleerd (
npm i --save-dev ts-node nodemon
) - Dotnet 5 geïnstalleerd
- Docker geïnstalleerd
- Docker Compose geïnstalleerd
Start de docker-compose door docker-compose up -d
uit te voeren in de 'casus'-map. Dit start de databases. Hier gaan wij verder niets aan veranderen.
Ook de front-end is een gegeven waar we niets aan gaan veranderen (tenzij je de API op een andere port draait dan gebruikelijk). Installeer de NPM-packages door npm install
uit te voeren in de 'flight-info-front-end'-map en start de applicatie met het npm start
commando.
Je ziet dat er nog geen data in de applicatie getoond wordt. Dit komt omdat de API nog niet draait.
Start de API volgens de instructies in de /flight-info-flight-service/README.md
(het liefste met een IDE). Als de port van de API niet anders is dan 5001, zal de pagina nu data laten zien als je deze refresht (let op; dit kan eventjes duren. De database seed zichzelf met voorbeeld-data voor ieder request, om te zorgen dat er altijd data beschikbaar is voor de demo).
Zoals je ziet hebben we nu de data uit de FlightService, maar staan er een aantal 'error' meldingen op het bord. Dit komt omdat de AircraftService nog niet in verbinding staat met de back-end.
gRPC Server (AircraftService)
Open de 'flight-info-aircraft-service' in een IDE. Maak in de hoofdmap een nieuw bestand aan genaamd 'aircraft-service.proto' en plak daar het volgende in:
syntax = "proto3";
import "google/protobuf/empty.proto";
service AircraftService {
rpc GetAircraft(google.protobuf.Empty) returns (AircraftResponse);
}
message Aircraft {
int32 Id = 1;
string Model = 2;
int32 Capacity = 3;
string Status = 4;
string FlightNumber = 5;
}
message AircraftResponse {
repeated Aircraft AllAircraft = 1;
}
Allereerst geven we aan wat de syntax is waar we mee werken, "proto3". Daarna importeren we een package van Google, om een lege parameter te ondersteunen.
In de "Service", wat vergelijkbaar is met een klasse geven we aan, dat we een "Remote Procedure Call" (RPC) hebben. In essentie is dit gewoon een functie die we later aan kunnen roepen.
Tot slot geven we in deze RPC aan, dat we een lege parameter verwachten. We willen immers geen extra data meegeven, we willen simpelweg alle data hebben van de applicatie. Protobuf ondersteunt geen lege parameters, vandaar de import van 'Empty'. De return value van deze functie moet ook gedefinieerd worden.
AircraftResponse
is het object wat teruggestuurd wordt naar degene die de functie aanroept. Arrays zijn in Protobufs vertaald naar het 'repeated' keyword. We geven dus aan, dat we een herhaalde lijst van het type Aircraft
terug willen sturen, die ook in onze .proto
gedefinieerd staat.
Een laatste opvallende zaak aan dit bestand is de cijfers achter de variabelen. gRPC werkt met binaire streams. Om deze reden moet het bestand weten wat de volgorde is waarin wij onze variabelen definiëren, wat gedaan wordt met de cijfers achter de variabelen.
Het lijkt nu nog ietwat onnodig, die Protobufs, maar op een later moment zal je begrijpen waarom deze techniek zo mooi is.
Nu gaan we daadwerkelijk iets programmeren. Voeg aan de AircraftService de packages @grpc/grpc-js
en @grpc/proto-loader
toe, door het volgende commando uit te voeren: npm install @grpc/grpc-js @grpc/proto-loader
.
Open index.ts
in de 'src'-map. Wat we als eerste gaan doen, is ons Proto-bestand importeren.
Voeg de volgende imports toe:
import * as grpc from "@grpc/grpc-js";
import * as protoLoader from "@grpc/proto-loader";
Voeg nu const PROTO_PATH = "./aircraft-service.proto";
toe aan het bestand, net onder de import-regels. Om vervolgens te zorgen dat onze Proto-loader snapt wat wij willen, moet er wat generieke configuratie worden gedefinieerd die we later gaan gebruiken. Voeg onder de let dbClient = null;
de volgende variabele toe:
const options: protoLoader.Options = {
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true,
};
In de functie 'startApplication' zullen we het bestand nu daadwerkelijk in gaan laden. Voeg (na de database-try-catch) de volgende regels toe:
const packageDefinition = await protoLoader.load(PROTO_PATH, options);
const aircraftServiceProto = grpc.loadPackageDefinition(packageDefinition);
Deze twee regels zorgen ervoor, dat TypeScript ons proto-bestand compileert en bekijkt. Onder deze regel definiëren we onze gRPC server:
const server = new grpc.Server();
Zoals eerder beschreven, heeft het Proto-bestand een definitie van een RPC, vergelijkbaar met een functie. Deze functie gaan we nu implementeren.
server.addService((aircraftServiceProto.AircraftService as any).service, {
GetAircraft: async (_, callback) => {
const aircraft = await getAllAircraft();
callback(null, { AllAircraft: aircraft });
},
});
De invulling die we hier geven aan de 'GetAircraft' functie, is de functie die een gRPC client aanroept. In dit geval halen we alle vliegtuigen op met de getAllAircraft()
functie, en geven we die terug aan degene die het request maakt.
Het enige wat nu nog gebeuren moet, is het 'binden' van gRPC aan een port. Dit start onze server. Voeg de volgende code toe, onder de ip en port definition:
server.bindAsync(
`${ip}:${port}`,
grpc.ServerCredentials.createInsecure(),
(error, port) => {
console.log(`Server running at http://${ip}:${port}`);
server.start();
}
);
En dan het moment van de waarheid (of in ieder geval een deel van het uiteindelijk beoogde resultaat): Het starten van de server.
Navigeer in je terminal naar de map waarin (onder andere) de package.json
van de AircraftService staat. Voer het volgende commando uit: nodemon src/index.ts
. Als alles goed is, zie je nu het volgende:
De gRPC server draait. Nu de client nog.
gRPC client (flightService)
Open in je IDE de FlightService (de API). Allereerst gaan we de benodigde dependencies installeren. Open het bestand 'FlightService.csproj' en voeg in de ItemGroup waar ook EntityFrameworkCore in staat de volgende packages toe:
<PackageReference Include="Google.Protobuf" Version="3.18.1" />
<PackageReference Include="Grpc.Net.Client" Version="2.40.0" />
<PackageReference Include="Grpc.Tools" Version="2.41.0" />
Om vervolgens gebruik te kunnen maken van dezelfde Protobuf waar onze server gebruik van maakt (tada: hier is dan het moment waar we zien dat het handig is. Type safety over verschillende microservices :D), moeten we dit .proto
-bestand ook aan de gRPC client toevoegen. Maak een nieuwe map in de root van de FlightService, genaamd "Proto". Kopieer het proto bestand die je eerder gemaakt hebt, en plak deze in de map, zodat je ook in deze map het aircraft-service.proto
bestand hebt staan (maak je wijzigingen aan het proto bestand? Dan moet je dat dus in zowel de Server als de Client aanpassen!).
Terug naar de 'FlightService.csproj': Om te zorgen dat de C# compiler de Protobuf herkent, moeten we deze toevoegen aan het project. Voeg de volgende configuratie toe onder de bestaande ItemGroup:
<ItemGroup>
<Folder Include="Protos" />
</ItemGroup>
<ItemGroup>
<Protobuf Include="Protos\aircraft-service.proto" GrpcServices="Client" />
</ItemGroup>
Om te zorgen dat we netjes werken en niet te veel aan onze code hoeven te zitten als er bijvoorbeeld een server-naam of een port verandert, voegen onze gRPC server URL toe aan de appsettings.json
(of appsettings.development.json
, afhankelijk van hoe je de applicatie start), onder onze "ConnectionStrings" (vergeet de komma na de '}' niet):
"GrpcServer": "http://localhost:50051"
Dan nu nog de implementatie van de server. Vergeet niet om je project te builden (of 'restoren') voor je verder gaat, zodat de toegevoegde packages geïnstalleerd zijn.
Ga naar de 'Get' methode in 'FlightsController.cs'. Je ziet hier, dat we de Flights ophalen uit de database. Voeg de volgende code toe, onder de await DatabaseSeeder.SeedDatabase(_context);
:
using var channel = GrpcChannel.ForAddress(_configuration.GetValue<String>("GrpcServer"));
var client = new AircraftService.AircraftServiceClient(channel);
Dit zet de verbinding op met de gRPC server. Om vervolgens de methode op de server aan te roepen, voegen we twee simpele regels code aan het bestand toe:
var reply = await client.GetAircraftAsync(new Empty());
var allAircraft = reply.AllAircraft;
En dat is het. gRPC, geïmplementeerd als ASP.NET client. Het enige wat nog moet gebeuren om de Front-End op de hoogte te stellen van onze nieuwe data, is het mappen van de data. Update de 'flightData' variabele, zodat het er als volgt uit ziet:
var flightData = flights.Select(flight =>
{
var associatedAircraft =
allAircraft.FirstOrDefault(aircraft => aircraft.FlightNumber == flight.FlightNumber);
return new FlightData
{
Terminal = flight.Terminal,
FlightNumber = flight.FlightNumber,
Destination = flight.Destination,
DepartureTime = flight.DepartureTime,
Gate = flight.Gate,
Status = associatedAircraft?.Status,
AircraftModel = associatedAircraft?.Model
};
});
(Her)start de API, zorg dat de databases (docker-compose) en de gRPC server draaien en navigeer weer naar de Front-End. Als alles goed is, zie je het volgende als je je pagina herlaadt:
Conclusie
gRPC is een tool die communicatie over het HTTP/2 protocol mogelijk maakt, door RPC te implementeren. Voornamelijk het feit dat gRPC type-safe is en cross-language implementaties ondersteunt, is een reden om de techniek te gebruiken. Ook ondersteunt de techniek bi-directional-streaming tussen client en server, wat bijvoorbeeld een chatapplicatie mogelijk kan maken.
Op de vraag of gRPC binnen jouw microservice-architectuur past, kan ik geen antwoord geven. RabbitMQ of zelfs het 'gewone' REST kunnen ook een hele goede optie zijn voor de architectuur van het project waar je aan werkt.
gRPC is relatief simpel te implementeren, in ieder geval in TypeScript en C#. Door de client(s) en de server met elkaar in verbinding te stellen via de beschikbaar gestelde gRPC dependencies, kan eenvoudig een stabiele connectie opgesteld worden.
Bronnen
- DigitalOcean & Abcom. (2021, 23 juni). HTTP/1.1 vs HTTP/2: What’s the Difference?. DigitalOcean. geraadpleegd op 07-10-2021 van https://www.digitalocean.com/community/tutorials/http-1-1-vs-http-2-what-s-the-difference
- Google. (s.d.). Protocol Buffers. Google Developers. Geraadpleegd op 07-10-2021 van https://developers.google.com/protocol-buffers
- Google, & Mugur, M. (2015, 26 februari). Introducing gRPC, a new open source HTTP/2 RPC Framework. Google Developers Blog. Geraadpleegd op 06-10-2021 van https://developers.googleblog.com/2015/02/introducing-grpc-new-open-source-http2.html
- Grigorik, I., & Surma. (2019, 3 september). Introduction to HTTP/2. Google Developers. Geraadpleegd op 07-10-2021 van https://developers.google.com/web/fundamentals/performance/http2#streams_messages_and_frames
- gRPC Authors. (2021). gRPC. gRPC. Geraadpleegd op 06-10-2021 van https://grpc.io
- gRPC (s.d.). gRPC. gRPC.io. Geraadpleegd op 06-10-2021 van https://grpc.io/img/logos/grpc-logo.png (Logo in header-image).
- RabbitMQ. (s.d.). Dead Letter Exchanges — RabbitMQ. RabbitMQ. Geraadpleegd op 07-10-2021 van https://www.rabbitmq.com/dlx.html
- Redhat. (2020, 8 mei). What is a REST API?. Redhat. Geraadpleegd op 07-10-2021 van https://www.redhat.com/en/topics/api/what-is-a-rest-api
- What is REST. (2021, 4 oktober). REST API Tutorial. Rest API Tutorial. Geraadpleegd op 07-10-2021 van https://restfulapi.net
Jenkins X: Een onvolwassen GitOps gigant
De DevOps-wereld werkt steeds vaker aan tools en frameworks die repetitieve taken eenvoudiger moeten maken. De komst van K8S, Helm, Slack integraties en andere software heeft als effect dat het steeds lastiger is om een goede CI/CD-omgeving op te zetten aangezien je meer tools moet bestuderen. Jenkins X biedt software die het volledige GitOps proces automatiseert waardoor developers hun desired state kunnen bereiken zodat ze minder tijd hoeven te besteden aan het fixen van configuratie-bestanden en het instellen van hun CI/CD-omgeving.
Jenkins X in het kort
Jenkins X is gebaseerd rondom GitOps. Er is een centrale Git repository die de desired state van de K8S cluster bevat. Een K8S operator houdt wijzigingen bij in de repository een voert aan de hand daarvan updates door. Jenkins X biedt de JX-CLI aan waarmee het eenvoudig wordt voor developers om het GitOps-proces te beïnvloeden. De JX-CLI is opgesplitst in verschillende microservices waaronder lighthouse en jenkins-x-builders. (Projects, 2021) De onderstaande afbeelding beschrijft een high-level overview van het GitOps proces van Jenkins X. (What Is Jenkins X?, 2021)
(Version Stream, 2020)
Jenkins X automatiseert CI/CD voor developers die werken in de cloud. Daardoor wordt werk uit handen genomen en kunnen ze zich focussen op het maken van software. Om pipelines op te zetten, maakt Jenkins X gebruik van Tekton. Daarnaast is het ook mogelijk om te kiezen voor klassiek Jenkins om pipelines mee te maken. Om een chat te koppelen aan de pipeline is er gekozen voor Lighthouse. Lighthouse integreert onder andere met Tekton en klassiek Jenkins.
Jenkins X gebruikt Terraform om de infrastructuur op te zetten. Terraform is een open source tool die het mogelijk maakt via code of een CLI de infrastructuur te configureren. Het voordeel hiervan is dat developers via eenvoudige commando’s een volledige CI/CD infrastructuur om kunnen zetten (What Is Jenkins X?, 2021).
De GitOps-methode van Jenkins X brengt een aantal uitdagingen met zich mee omtrent beveiliging. Bij het ontwikkelen van Jenkins X is gekozen om gebruik te maken van secret solution providers zoals Vault, Google en Azure. Er is ook overwogen om te kiezen voor het opslaan van secrets in Git, maar dat brengt te veel usability issues met zich mee.
Om de K8S omgeving op te zetten wordt Helm gebruikt. Helm is een package manager voor K8S waarmee Helm charts gedeployed kunnen worden. In een Helm chart wordt per applicatie gedefinieerd welke resources nodig zijn. Hierdoor wordt het mogelijk om met een aantal kleine bestanden een complexe en volledig geconfigureerde K8S cluster op te zetten (Merron & Idowu, z.d.).
Jenkins X bevat veel functionaliteiten ten opzichte van vergelijkbare open source projecten. De onderstaande afbeelding bevat een overzicht van punten waarin Jenkins X uitblinkt ten opzichte van de concurrentie.
(Portela, z.d.)
Jenkins X Architectuur
De onderstaande afbeelding bevat de architectuur van Jenkins X. In dit artikel worden alle onderdelen die te zien zijn in de afbeelding kort behandeld.
(Jenkins X, z.d.)
De architectuur van Jenkins X bestaat uit vier onderdelen: developer experience, CI/CD service, decoupling en platform. Aangezien Jenkins X geen cloud diensten aanbiedt, is er gekozen om integraties met AWS, GCP en Azure te ondersteunen. De conclusie die daaruit kan worden getrokken is dat het doel van Jenkins X met name draait om het aanbieden van een geconfigureerde GitOps-omgeving die integreert met de meest populaire cloud providers. (Jenkins X, z.d.)
Zoals benoemd in het voorgaande hoofdstuk is er een JX-CLI. Hiermee kunnen commando’s worden uitgevoerd op de CI/CD-omgeving zodat de desired state bereikt kan worden. Daarnaast zijn er meerdere dashboards beschikbaar zodat beheerders en developers niet verplicht zijn gebruik te maken van een CLI. De UI bevat echter minder functionaliteiten dan de CLI. (?? z.d.)
Tekton is een open source framework waarmee CI/CD pipelines kunnen worden opgezet. (Tekton, z.d.) Lighthouse kan worden gebruikt voor chat integraties zoals Slack. (z.d.-b) Kuberhealty wordt gebruikt om ervoor te zorgen dat de cluster beschikbaar blijft.
Het onderdeel ‘decoupling’ slaat een brug tussen Jenkins X en de cloud providers. Jenkins X heeft besloten geen hosting service aan te bieden. In plaats daarvan maken ze het mogelijk om de desired state direct in de productie-omgeving te krijgen bij externe cloud providers. Om dit doel te bereiken wordt Terraform gebruikt. Terraform is een open source tool waarmee infrastructuur declaratief via code kan worden opgezet. Daarnaast bieden ze een api aan waarmee de infrastructuur kan worden beheerd (Terraform, z.d.).
K8S external secrets wordt gebruikt om secrets toe te voegen aan Azure Vault of bijvoorbeeld AWS Secret Manager. (z.d.-a)
Hands on in Azure
In dit artikel wordt stap voor stap beschreven hoe een Jenkins X omgeving kan worden opgezet in Azure. Daarnaast worden er korte voorbeelden gegeven over de manier waarop Jenkins X kan worden gebruikt om een desired state te bereiken. Deze instructies zijn specifiek gericht op Windows-gebruikers. Voor MacOS en Linux -gebruikers zullen de meeste stappen overeenkomen met een aantal uitzonderingen zoals het installeren van een CLI.
Om de vereiste tools te installeren, wordt in deze handleiding gebruik gemaakt van 'chocolatey'. Mocht dit nog niet geinstalleerd zijn, open dan powershell met administratieve rechten en voer het onderstaande commando uit.
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
Zodra chocolatey geinstalleerd is, herstart powershell met administratieve rechten. Voer vervolgens stuk voor stuk de onderstaande commando's uit. Deze commando's installeren de CLI's die gebruikt gaan worden in deze handleiding.
choco install azure-cli
choco install terraform
choco install jenkins-x
Vanwege chatops-gerelateerde redenen is het handig om een GitHub organisatie te maken. Daarnaast geeft dit structuur aan de projecten die bij de Jenkins X omgeving horen. Alle projecten die worden aangemaakt binnen Jenkins X, worden toegevoegd aan de GitHub organisatie. Als voorbeeld is er gekozen voor de naam 'The Amazing Lantern'. Geef de organisatie een passende naam, voer de rest van het formulier in en maak de organisatie aan. De organisatie kan worden aangemaakt via deze url: https://github.com/account/organizations/new?coupon=&plan=team_free
Nu er een GitHub organisatie is aangemaakt, is er een token nodig waarmee handelingen verricht kunnen worden op de repositories om op deze manier een desired state te bereiken. Om dit token aan te maken, gebruik deze voorafingestelde URL: https://github.com/settings/tokens/new?scopes=repo,read:user,read:org,user:email,write:repo_hook,delete_repo,admin:repo_hook
Er zijn twee repositories die toegevoegd moeten worden aan de organisatie. Een repository bevat de configuratie voor de infrastructuur en een repository voor de cluster. Zorg er tijdens het aanmaken voor dat de organisatie als 'eigenaar' wordt opgegeven.
- Infrastructuur: https://github.com/jx3-gitops-repositories/jx3-terraform-azure/generate
- Cluster: https://github.com/jx3-gitops-repositories/jx3-azure-akv/generate
Alle applicaties moeten in Azure onder een bepaalde 'resource group' vallen. Daarom wordt een resource group handmatig aangemaakt in Azure voordat de applicaties die daaronder vallen kunnen worden gegenereerd. In dit voorbeeld wordt de naam 'jx-resource' gebruikt. Kies voor een passende naam en raak deze naam niet kwijt, hij is in de volgende stap nodig om de infrastructuur te configureren. Het aanmaken van de resource group kan gedaan worden via deze URL: https://portal.azure.com/#create/Microsoft.ResourceGroup
Open de repository die de infrastructuur bevat in een code editor. Voeg het bestand values.auto.tfvars
toe in root level. Dit bestand bevat instellingen die nodig zijn om handelingen te verrichten op de cluster. Voeg de onderstaande instellingen toe aan dit bestand. Zorg ervoor dat de waardes kloppen.
jx_git_url = "https://github.com/myowner/myname-cluster"
jx_bot_username = "bot_user"
Open nu het bestand variables.tf
. Zoek naar 'apex_resource_group_name' en pas de waarde van 'default' aan naar de resource die zojuist is aangemaakt in Azure.
variable "apex_resource_group_name" {
type = string
description = "The resource group in which the Azure DNS apex domain resides. Required if apex_domain_integration_enabled is true"
default = "NAAM_VAN_DE_RESOURCE"
}
Push de wijzigingen naar de repository.
git add . && git commit -a -m "fix: configure cluster repository and project" && git push
Voer de onderstaande commando's achter elkaar uit om de omgeving op te zetten. Hierbij wordt een aantal keer om het token gevraagd dat aangemaakt is in een van de voorgaande stappen. De omgeving wordt gehost op Azure wat betekent dat alle benodigde onderdelen zoals een K8S cluster, deployments, pods, secrets, etc automatisch worden aangemaakt. Deze zijn later in te zien via het dashboard van Azure. Het kost even tijd voordat alle resource zijn opgestart.
terraform init
terraform plan
terraform apply
Zodra alles is opgestart, voer terraform output connect
om verbinding te maken met de infrastructuur. Vervolgens kan terraform output follow_install_logs
worden gebruikt om te controleren of het opzetten van de infrastructuur goed verloopt. De JX-CLI kan worden gekoppeld aan de omgeving met het command jx ns jx
. Projecten kunnen nu worden aangemaakt met jx project
. Mocht de omgeving niet meer nodig zijn, dan kan deze worden verwijderd met terraform destroy
. Daarnaast kan jx dashboard
worden gebruikt om de pipelines in te zien en jx ui
kan worden gebruikt om de K8S cluster te monitoren.
De volledige Jenkins X omgeving is opgezet en kan worden gebruikt om een desired state te bereiken. Een voorbeeld van het gebruik van Jenkins X is terug te vinden in de organisatie genaamd 'The Amazing Lantern'. Deze organisatie is publiek toegankelijk en kan worden gebruikt als referentie om aan de slag te gaan met Jenkins X.
Conclusie
Met het doel om een volledig GitOps proces op te zetten aan de hand van configuratiebestanden heeft Jenkins X de lat voor zichzelf hoog gelegd. Jenkins X maakt gebruik van ontelbare tools en onderhoud een gigantisch aantal applicaties binnen het zelf opgezette ecosysteem. Een beroemd citaat zegt "if you are trying to do everything all at the same time, you are setting yourself up for failure". Dit is exact wat er op dit moment aan de hand is met Jenkins X. Er is veel tijd nodig geweest om de handleiding in dit onderzoek op te stellen omdat essentiele punten genegeerd worden in de documentatie van Jenkins X. Zo wordt er bijvoorbeeld niets gezegd over het aanmaken van een resource in de 'Azure Terraform Quickstart template'. Daarnaast worden Windows gebruikers genegeerd door de meeste documentatie te richten op MacOS en Linux gebruikers en software zoals 'kpt' te gebruiken terwijl deze 'niet beschikbaar is in Windows'.
Om effectief gebruik te kunnen maken van Jenkins X is uitgebreide kennis van tooling zoals onder andere Terraform, Helm en K8S vereist. Jenkins X claimt "CI en CD voor developers in de cloud te automatiseren, zodat ze zich kunnen focussen op het maken van geweldige software". Deze uitspraak zou opgaan als een Jenkins omgeving 'met een druk op de knop' opgezet kon worden. Helaas is dit niet het geval.
De hoeveelheid kennis die nodig is om te kunnen werken met Jenkins X kan op dit moment beter worden besteed aan het zelf opzetten van een GitOps infrastructuur. Naar aanleiding van dit onderzoek kan het advies gegeven worden om te wachten met het in gebruik nemen van Jenkins X totdat het project een staat van volwassenheid heeft bereikt.
Bronnen
- Jenkins X. (z.d.). Overview. Jenkins X - Cloud Native CI/CD Built On Kubernetes. Geraadpleegd op 8 oktober 2021 van https://jenkins-x.io/v3/about/overview
- Morgan, A. (2020). Using Jenkins X for Cloud-native CI/CD. Pluralsight. https://app.pluralsight.com/course-player?clipId=42c0ba01-f16d-47d6-9c1a-4ac825d52f07
- J. (z.d.). GitHub - jenkins-x/jx: Jenkins X provides automated CI+CD for Kubernetes with Preview Environments on Pull Requests using Cloud Native pipelines from Tekton. GitHub. Geraadpleegd op 8 oktober 2021 van https://github.com/jenkins-x/jx
- Tekton. (z.d.). Tekton. Geraadpleegd op 8 oktober 2021 van https://tekton.dev
- J. (z.d.-b). GitHub - jenkins-x/lighthouse. GitHub. Geraadpleegd op 8 oktober 2021 van https://github.com/jenkins-x/lighthouse
- Terraform. (z.d.). Terraform by HashiCorp. Geraadpleegd op 8 oktober 2021 van https://www.terraform.io
- E. (z.d.-a). GitHub - external-secrets/kubernetes-external-secrets: Integrate external secret management systems with Kubernetes. GitHub. Geraadpleegd op 8 oktober 2021 van https://github.com/external-secrets/kubernetes-external-secrets
- Version Stream. (2020, 18 mei). Jenkins X - Cloud Native CI/CD Built On Kubernetes. https://jenkins-x.io/about/concepts/version-stream
- Merron, D., & Idowu, T. (z.d.). Introduction to Kubernetes Helm Charts. BMC Blogs. Geraadpleegd op 10 oktober 2021 van https://www.bmc.com/blogs/kubernetes-helm-charts
- Projects. (2021, 23 februari). Jenkins X - Cloud Native CI/CD Built On Kubernetes. https://jenkins-x.io/v3/about/overview/projects
- What is Jenkins X? (2021, 29 september). Jenkins X - Cloud Native CI/CD Built On Kubernetes. https://jenkins-x.io/v3/about/what/
- Portela, R. Á. S. (z.d.). FluxCD, ArgoCD or Jenkins X: Which Is the Right GitOps Tool for You? Container Solutions. Geraadpleegd op 10 oktober 2021 van https://blog.container-solutions.com/fluxcd-argocd-jenkins-x-gitops-tools
Een (handige) Helm op een Kubernetes applicatie zetten
Deze blog is de deliverable voor het onderzoek naar de tool Helm voor Kubernetes. Ik onderzoek wat *Helm* is, waarom en hoe het te gebruiken is.
Gedurende deze minor heb ik geleerd om applicaties eenvoudiger te kunnen deployen naar de cloud. Het containerizen van een applicatie was hierin de eerste stap met behulp van Docker. De vervolgstap van meerdere containers te runnen was het toepassen van Kubernetes. Kubernetes vangt een hoop problemen voor ons op zoals het automatisch opnieuw opstarten van pods (lees: applicaties) wanneer deze down gaan, het verdelen van de workload over de nodes/pods en het onderling samenwerken/communiceren van containers binnen de Kubernetes cluster. Kubernetes doet dit met behulp van gemaakte .yaml
bestanden.
Ik ga tijdens dit onderzoek kijken naar geschreven documentie over Helm om te begrijpen hoe Helm werkt en hoe ik het kan toepassen. Daarnaast ga ik een prototype maken die Helm en Kubernetes gebruikt. Om tot een conclusie te kunnen komen op de volgende hoofdvraag:
"Hoe kan het opzetten van een Helm het deployen van een applicatie op k8s eenvoudiger maken?"
Beantwoord ik de volgende deelvragen:
1. Wat is Helm?
2. Wat zijn de voordelen van Helm?
3. Wat zijn de nadelen van Helm?
4. Hoe passen we Helm toe?
5. Zijn er alternatieven voor Helm?
Ik gebruik hierbij de onderzoeksmethoden van ictresearchmethods. De gekozen methoden zijn literature study, prototyping en community research om Helm vanuit verschillende perspectieven te onderzoeken (HBO-i, z.d.).
Introductie Helm
Helm is een package manager voor Kubernetes zoals apt voor Unix systemen is of pip voor Python (Bagani, 2021). Helm maakt het dus mogelijk om software te installeren en up te graden, of het installeren van dependencies van software. Daarnaast maakt Helm het makkelijker om software te kunnen deployen door configuratie opties aan te bieden voor de software.
Helm is begonnen als een Deis project in 2015 en is in de loop der jaren gepromoveerd tot een graduation Cloud Native Computing Foundating (CNCF) project. CNCF maakt, onderzoekt en beheert technologieën en noemt deze projecten. Deze projecten zijn beschikbaar op GitHub en hebben verschillende fasen: Sandbox, incubating en graduation. Hierover is meer te lezen op de website van CNCF.
Helm packages maken gebruik van charts. Deze charts bestaan meestal uit .yaml
configuratiebestanden en templates voor Kubernetes manifest bestanden. Sectie Helm toepassen op PitStop bevat meer informatie over charts en bijbehorende templates.
De voordelen van Helm
Configuratie
De services, deployments en overige manifesten voor Kubernetes in .yaml
bestanden bevatten veel herhalende tekst.
```yml
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: "my-app"
labels:
app: "my-app"
spec:
type: LoadBalancer
selector:
app: "my-app"
ports:
- protocol: TCP
name: http
port: 80
targetPort: 5000
```
In dit voorbeeld zit ook een deployment:
```yaml
# deployment.yanl
apiVersion: apps/v1
kind: Deployment
metadata:
name: "my-app"
labels:
app: "my-app"
spec:
template:
container:
image: "app/image:4.2.0"
<verdere spec is weggelaten>
```
De deployment gebruikt dezelfde naam van de applicatie in de .yaml
bestand als de service. Klinkt logisch, want het betreft natuurlijk dezelfde applicatie. De naam is echter nu al vijf keer voluit geschreven. Als we nu de naam van de applicatie wijzigen, dan moet dit op veel plekken gebeuren. Helm helpt ons hierbij door een values.yaml
bestand te gebruiken waarin het variabelen bijhoudt:
```yml
# values.yaml
name: "my-app"
deployment:
image: "repo/image"
tag: "4.2.0"
```
De values.yaml
neemt nu de naam van de applicatie op als variabele. De gebruikte image voor de deployment is ook opgeslagen onder deployment. Helm injecteert nu deze variabelen in de service.yaml
en deployment.yaml
bestanden:
```yaml
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: {{ .Values.name }}
labels:
app: {{ .Values.name }}
spec:
type: LoadBalancer
selector:
app: {{ .Values.name }}
ports:
- protocol: TCP
name: http
port: 80
targetPort: 5000
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.name }}
labels:
app: {{ .Values.name }}
spec:
template:
container:
image: {{ .Values.deployment.image }}:{{ .Values.deployment.tag }}
<verdere spec is weggelaten>
```
We hoeven nu maar op één plek de naam te wijzigen.
De gebruikte image in de deployment is nu aangegeven als Values.deployment.image
zoals de structuur in het values.yaml
bestand is opgebouwd. Dit maakt het mogelijk om eenvoudig en snel wijzigingen toe te passen en te deployen naar Kubernetes. Helm kan nu de gemaakte Chart.yaml
eenvoudig hergebruiken met behulp van verschillende value.yaml
bestanden om dezelfde applicatie te deployen maar met andere variabelen:
```bash
helm install [name] [chart] --values <naam van values.yaml>
```
Versiebeheer deployments
Wanneer we deployments uitvoeren met helm install
en helm upgrade
commandos zal Helm deze configuraties bijhouden in een history. We kunnen nu eenvoudig deployments teruggedraaien als er iets niet goed is. Het commando hiervoor is:
```bash
helm rollback <release> [revision].
```
Hooks (automatisering)
Helm kan gebruik maken van hooks die triggeren na een bepaalde actie om de automatisering te verhogen. Onderstaand tabel weergeeft de hooks die beschikbaar die Helm aanbiedt.
Hook | Beschrijving |
---|---|
pre-install | Uitvoeren na template gerenderd is. |
post-install | Uitvoeren nadat alle resources geladen zijn. |
pre-delete | Uitvoeren voor het verwijderen. |
post-delete | Uitvoeren na het verwijderen. |
pre-upgrade | Uitvoeren nadat template gerenderd is. |
post-upgrade | Uitvoeren nadat alle resources geüpdatet zijn. |
pre-rollback | Uitvoeren nadat template gerenderd is. |
post-rollback | Uitvoeren nadat alle resources gewijzigd zijn. |
test | Uitvoeren bij test commando. |
Meer informatie over hooks voor Helm is te vinden op de website van helm.
Populariteit
Veel gebruikte applicaties zoals MySQL, MongoDB, WordPress etc. hebben een helm chart online. We kunnen deze eenvoudig binnen halen door de volgende commandos uit te voeren:
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install bitnami/wordpress
Helm zal nu de WordPress applicatie die gepackaged is door de chart uploaden naar de Kubernetes cluster. De chart is ook te gebruiken als dependency in een andere chart. De productiviteit gaat hiermee omhoog omdat we minder charts hoeven te maken.
CNCF houdt surveys om te peilen hoe bedrijven gebruik maken van technologieën van CNCF. Helm bleek onder de gevraagden de populairste package manager (Cloud Native Computing Foundation, 2020).
Door de populariteit van Helm is er meer zekerheid dat de technologie onderhouden wordt en mee gaat met de tijd. Daarnaast is er veel documentatie te vinden om eventuele problemen op te kunnen lossen, zoals op StackOverflow.
De nadelen van Helm
Het voordeel dat Helm biedt met het hergebruiken van charts kan een nadeel meebrengen. Als er een bug in een geneste chart template zit die in andere applicaties ook gebruikt worden, dan kan het lastig zijn om deze te identificeren en verbeteren.
Verder komt er meer complexiteit kijken bij het opzetten en gebruiken van Helm. Het team moet gewend raken aan de structuur van Helm en de commando's die het met zich mee brengt. Helm kan ook overkill zijn voor een applicatie (Romph, 2020).
Helm toepassen op PitStop
Download Helm op één van de volgende manieren:
- Download de binary.
brew install helm
(MacOS).choco install kubernetes-helm
(Windows).
Ga naar de kubernetes
directory in het project of maak een nieuwe directory. Voer het volgende commando uit:
helm create <chart-name>
Helm maakt nu een nieuwe chart met standaard bestanden in de directory kubernetes/helm
zoals te zien is in figuur 2.
De charts
directory is de plek om geneste charts op te slaan. Het Chart.yaml
bestand ziet er als volgt uit:
```yml
# General information
apiVersion: v2
name: pitstop-app
description: A Helm chart for Kubernetes
# A chart can be either an 'application' or a 'library' chart.
# Type chart
type: application
# Chart version
version: 0.1.0
# Application version
appVersion: "1.16.0"
```
InfoSupport heeft een wiki gemaakt op de repo van pitstop om aan te geven welke componenten nodig zijn om PitStop te draaien zonder mesh (Van Wijk, z.d.), zie figuur 3 .
Bovenstaande .yaml
bestanden zitten in de k8s
directory. Helm gebruikt deze bestanden om de templates aan te maken. We kopiëren ze in de helm/templates
folder. Helm maakt het nu mogelijk om de PitStop applicatie te draaien in Kubernetes, zonder we dat een .yaml
bestand hoeven aan te passen. Dit kan door het volgende commando uit te voeren:
```bash
helm install <chart-name> <directory-name>
```
We willen variabelen injecteren in de .yaml
bestanden die we gekopieerd hebben in de helm/templates
folder. Helm kan dit op de volgende manieren:
- helm install
--set name=value
. values.yaml
bestand.
Automatiseren staat centraal in deze minor dus om dit te bevorderen maken we een values.yaml
. In dit bestand schrijven we key-value pairs die Helm zal injecteren in de template .yaml
bestanden. Als voorbeeld nemen we invoiceservice.yml
:
We geven de gewenste waardes van de variabelen in de values.yaml
weer:
We gaan nu de PitStop applicatie draaien in Kubernetes. Dit doen we door het volgende commando uit te voeren:
helm install <chart-name> <directory-name> --values <directory/values.yaml>
We geven de values.yaml
bestand mee als optie in het commando zodat Helm deze values injecteert in de templates.
Bij het uitvoeren van het commando komen geen foutmeldingen. We controleren of alle containers succesvol draaien:
De PitStop applicatie is nu te openen op port 7000
:
Wanneer we wijzigingen toebrengen aan de templates of values kunnen we Helm deze wijzigingen laten doorvoeren:
helm upgrade <chart-name> <directory-name>
Helm zal nu de oude pods terminaten en nieuwe opstarten met de nieuwste wijzigingen. Het is eenvoudig om een tweede applicatie ernaast te laten draaien:
helm install pitstop-app-2 pitstop-app --values ./pitstop-app/values.yaml
Helm kan terug naar een oude deployment door het volgende commando uit te voeren:
helm rollback <release> [revision]
Gebruik hierbij het commando helm history <release>
om inzicht te krijgen welke versies mogelijk zijn zoals te zien in figuur 9.
Helm alternatieven
Helm heeft niet direct een alternatief voor wat het brengt. Helm is een vrij complexe tool die een hoop te bieden heeft. Er zijn andere tools beschikbaar (Harness, 2021) die beter bij een applicatie passen:
- Kustomize - Een configuratie management tool en sinds Kubernetes 1.14 native.
- Jsonnet - Een templating taal en engine.
- Skaffold - Een Kubernetes management tool met build en deploy componenten.
Conclusie
In dit onderzoek hebben we geleerd dat Helm een package manager is voor Kubernetes en dat het ontwikkelaars én Ops functionaliteit biedt om deployments te versimpelen en automatiseren met behulp van hooks. Het gebruik van Helm voegt enige complexiteit toe en moet de afweging gemaakt worden of de applicatie behoefte heeft aan deze extra laag.
Met het toepassen van de opgedane theorie in een prototype van PitStop is er geleerd hoe we Kubernetes manifest bestanden bundelen tot templates met een bijbehorend values.yaml
bestand. Dit bestand zorgt ervoor dat we wijzigen aan deployments eenvoudig, snel en overzichtelijk kunnen maken.
Met behulp van versiebeheer van releases kunnen we eenvoudig teruggeschakelen naar oudere versies van de applicaties. Organisaties bieden populaire applicaties aan als bestaande charts op het internet en deze kunnen we als dependecy/geneste chart gebruiken om werk te versnellen.
Concluderend maakt Helm het maken en uitvoeren van deployments sneller, overzichtelijker, veiliger en geeft mogelijkheid tot meer automatiseren.
Bronnen
- HBO-i. (z.d.). Methods - ICT research methods. Ictresearchmethods. Geraadpleegd op 6 oktober 2021 van https://ictresearchmethods.nl/Methods
- Bagani, P. (2021, 25 september). Helm: Kubernetes package manager. DEV Community. https://dev.to/piyushbagani15/helm-kubernetes-package-manager-4ocb
- Cloud Native Computing Foundation. (2020, maart). CNCF SURVEY 2019. CNCF.
- Romph, T. (2020, 4 juni). Using Helm for Kubernetes management and configuration. Blue Matador. https://www.bluematador.com/blog/using-helm-for-kubernetes-management-and-configuration
- Van Wijk, E. (z.d.). Run the application using Kubernetes. EdwinVW/pitstop Wiki. GitHub. Geraadpleegd op 7 oktober 2021 van https://github.com/EdwinVW/pitstop/wiki/Run%20the%20application%20using%20Kubernetes
- Harness. (z.d.). Comparing Helm Vs Kustomize. Geraadpleegd op 7 oktober 2021 van https://harness.io/blog/helm-vs-kustomize
BDD toepassen in React met jest-cucumber
*Gherkin*, *Cucumber* en *BDD*. Allemaal termen die gloednieuw zijn voor mij. Daarom heb ik ervoor gekozen om dit te onderzoeken in een React omgeving. React is mijn favoriete JavaScript framework en testen is nooit mijn passie geweest. Door het toevoegen van BDD in React gaat hier misschien wel verandering in komen.
Jest-Cucumber
jest-cucumber is an alternative to Cucumber.js that runs on top on Jest. Instead of using describe and it blocks, you instead write a Jest test for each scenario, and then define Given, When, and Then step definitions inside of your Jest tests. jest-cucumber then allows you to link these Jest tests to your feature files and ensure that they always stay in sync (Npm: Jest-Cucumber, 2021).
In principe is jest-cucumber dus een combinatie van Jest en Cucumber.
Jest is een open-source JavaScript Test runner ontwikkelt door Facebook (facebook, z.d.). Web Development studenten zijn hier al mee bekend aangezien de DWA course dit uitgebreid behandelt.
Jest is an excellent test runner with great features like parallel test execution, mocking, snapshots, code coverage, etc. If you're using VS Code, there's also a terrific Jest extension that allows you get realtime feedback as you're writing your tests and easily debug failing tests individually. Cucumber is a popular tool for doing Acceptance Test-Driven Development and creating business-readable executable specifications. This library aims to achieve the best of both worlds, and even run your unit tests and acceptance tests in the same test runner. (Npm: Jest-Cucumber, 2021)
Reguliere JavaScript
Om simpel te beginnen maak ik een rekenmachine applicatie. Puur om te bekijken hoe jest-cucumber te werk gaat en de code zo simpel mogelijk te houden. Hiervoor maken we een aantal bestanden:
De inhoud van de bestanden ziet er als volgt uit:
Calculator.feature
: De feature file, hier bevindt zich alle business acceptatiecriteria in Gherkin notatie.Calculator.js
: De daadwerkelijke klasse die we gaan testen.Calculator.test.js
Hier bevindt zich alle glue code om de Gherkin code te vertalen naar JavaScript.
We beginnen met een simpel scenario om de glue code in elkaar te bouwen:
# Calculator.feature
Feature: Calculator
Scenario Outline: Adding Numbers
Given I have a Calculator
When I add <Number1> and <Number2>
Then I should get <Result>
Examples:
| Number1 | Number2 | Result |
| 1 | 2 | 3 |
| 0 | 0 | 0 |
| 99 | 99 | 198 |
| -4 | 5 | 1 |
| -4 | -4 | -8 |
Hierboven staat de werking van een rekenmachine die kan optellen genoteerd. Ik gebruik een Scenario Outline
, zodat ik meerdere scenario's tegelijk kan testen via het opgeven van een Examples
. Jest-cucumber ondersteunt dit. Om ervoor te zorgen dat er glue code gemaakt kan worden dienen we zelf code te schrijven. Namelijk een testbestand die het feature bestand inlaadt:
// Calculator.test.js
import { defineFeature, loadFeature } from "jest-cucumber";
const feature = loadFeature("./Calculator.feature");
defineFeature(feature, (test) => {});
Hierboven wordt het feature bestand ingeladen met behulp van de loadFeature
functie uit jest-cucumber. Vervolgens passen wij defineFeature
toe. Hierbinnen wordt de daadwerkelijke glue code geschreven. Als ik de test nu probeer uit te voeren verschijnt er in de console een melding dat er geen step definitions gevonden konden worden. Vervolgens wordt er een lijst gegeven met de mogelijke step definities die je kan gebruiken. Kwestie van kopiëren en plakken dus.
Nu is het een kwestie van invullen.
defineFeature(feature, (test) => {
let calculator;
let result;
const givenIHaveACalculator = (given) => {
given("I have a Calculator", () => {
calculator = new Calculator();
});
};
const thenIShouldGetNumber = (then) => {
then(/^I should get (.*)$/, (arg0) => {
expect(result).toBe(parseInt(arg0));
});
};
test("Adding numbers", ({ given, when, then }) => {
givenIHaveACalculator(given);
when(/^I add (.*) and (.*)$/, (arg0, arg1) => {
result = calculator.add(parseInt(arg0), parseInt(arg1));
});
thenIShouldGetNumber(then);
});
});
Jest-cucumber biedt ook de mogelijkheid aan om step-definities meerdere keren te gebruiken, dit is nu het geval bij givenIHaveACalculator
en thenIShouldGetNumber
. Zo kan ik bijvoorbeeld een extra scenario toevoegen voor vermenigvuldigen, aftrekken of delen. Dan moet ik enkel de when step opnieuw schrijven.
Jest-cucumber ondersteunt een lijst met andere functionaliteiten zoals asynchroon, gherkin tables of automatic step binding. De documentatie is hier te vinden. Alle code hierboven beschreven is uitgewerkt en is hier terug te kijken.
React Componenten
Hoe zit het nu precies met React? Je zou misschien denken dat het opeens heel ingewikkeld gaat worden omdat je nu een browser nodig hebt. Dat is niet zo! React biedt de mogelijkheid aan om componenten te testen zonder het gebruik van een browser of afhankelijk te zijn van een DOM. Hierbij kan je gebruik maken van react-test-renderer
.
This package provides a React renderer that can be used to render React components to pure JavaScript objects, without depending on the DOM or a native mobile environment.
Essentially, this package makes it easy to grab a snapshot of the platform view hierarchy (similar to a DOM tree) rendered by a React DOM or React Native component without using a browser or jsdom.
(Test Renderer –, z.d.)
Cool! We kunnen dus React Componenten testen zonder gebruik te maken van een browser! Hoe react-test-renderer
precies te werk gaat valt buiten de scope van het project, mocht je hier meer over weten is dit hier te bekijken.
Om consistent te blijven heb ik een rekenmachine gebouwd in een React component.
// Calculator.jsx
<div>
<input type="number" id="number1" value={number1} onChange={setNumber1}></input>
<select id="option" value={option} onChange={setOption}>
<option value="increment">+</option>
<option value="substract">-</option>
<option value="divide">/</option>
<option value="times">*</option>
</select>
<input type="number" id="number2" value={number2} onChange={setNumber2}></input>
<span>
= <span id="result">{result}</span>
</span>
<button id="startCalculation" onClick={handleCalculation}>
Calculate
</button>
</div>
In bovenstaande code is het JSX element zichtbaar. Overige code, de daadwerkelijke functionaliteit, raken wij met testen niet direct aan. Met het testen gaan wij input velden aanpassen, op knopjes drukken en bekijken wat het eindresultaat is. De volledige code is hier zichtbaar.
# Calculator.feature
Feature: Using the Calculator
Using the calculator within the React App
Scenario Outline: Adding Numbers
Given I open the Calculator App
When I enter numbers <number1> and <number2>
And I click the addition option
And I click the calculate button
Then I should get <result>
Examples:
| number1 | number2 | result |
| 1 | 2 | 3 |
| 0 | 0 | 0 |
| 5 | -4 | 1 |
| 99 | 99 | 198 |
| -5 | -5 | -10 |
Nu wij een leesbare feature file hebben is het tijd om glue code te schrijven. Zoals eerder beschreven worden je step definities weer gegenereerd.
import { defineFeature, loadFeature } from "jest-cucumber";
import { create, act } from "react-test-renderer";
import Calculator from "./Calculator";
const feature = loadFeature("./src/Calculator.feature");
defineFeature(feature, (test) => {
let testInstance;
test("Adding Numbers", ({ given, when, and, then }) => {
given("I open the Calculator App", () => {
const testRenderer = create(<Calculator />);
testInstance = testRenderer.root;
});
when(/^I enter numbers (.*) and (.*)$/, (arg0, arg1) => {
const inputN1 = testInstance.findByProps({ id: "number1" });
const inputN2 = testInstance.findByProps({ id: "number2" });
act(() => {
inputN1.props.onChange({ target: { value: arg0 } });
inputN2.props.onChange({ target: { value: arg1 } });
});
});
and("I click the addition option", () => {
const inputOption = testInstance.findByProps({ id: "option" });
act(() => {
inputOption.props.onChange({ target: { value: "increment" } });
});
});
and("I click the calculate button", () => {
const buttonCalculate = testInstance.findByProps({ id: "startCalculation" });
act(() => {
buttonCalculate.props.onClick();
});
});
then(/^I should get (.*)$/, (arg0) => {
const spanResult = testInstance.findByProps({ id: "result" });
expect(spanResult.props.children).toBe(parseFloat(arg0));
});
});
});
Hierboven is de daadwerkelijke test genoteerd. De kern is vrijwel hetzelfde, je ziet namelijk nog steeds given
, when
& then
terugkomen. Het grootste verschil is de daadwerkelijke test code. In plaats van direct de klasse aanroepen die wij testen maken wij gebruik van een react-test-renderer. Door hier gebruik van te maken ontstaat de mogelijkheid om gebruikerinteracties te simuleren. De gebruikerinteracties staan altijd in een act()
functie.
Neem als voorbeeld:
and("I click the calculate button", () => {
const buttonCalculate = testInstance.findByProps({ id: "startCalculation" });
act(() => {
buttonCalculate.props.onClick();
});
});
Ten eerste wordt het button element opgehaald aan de hand van een id, in dit geval startCalculation
. Vervolgens wordt erop geklikt binnen een act()
functie. Nu wordt op de achtergrond daadwerkelijke berekeningen uitgevoerd en wordt dit aangepast op de DOM. Hé maar eerder zei ik dat er geen DOM was. Klopt! In plaats van het aanpassen van de DOM wordt de testInstance aangepast. TestInstance is de vervanging van de DOM als een JavaScript object (Test Renderer –, z.d.).
then(/^I should get (.*)$/, (arg0) => {
const spanResult = testInstance.findByProps({ id: "result" });
expect(spanResult.props.children).toBe(parseFloat(arg0));
});
Hierboven wordt het resultaat uit precies dezelfde testInstance gehaald. Alle gebruikerinteracties die worden uitgevoerd zijn direct zichtbaar in testInstance!
Uiteraard zijn alle functionaliteiten van jest-cucumber, zoals het hergebruiken van step-definitions, asynchroon en Gherkin Tables ook gewoon beschikbaar! In bovenstaande afbeelding is te zien dat niet alle branches zijn getest. Dit komt doordat niet alle rekenmachine opties die zijn uitgewerkt getest zijn.
End-to-End in React
Hoe zit het nu precies met hele complexe logica die verspreid is over veel componenten en de UI heel belangrijk is? Hier kun je het beste gebruik maken van end-to-end testen.
End-to-end testing is a methodology used in the software development lifecycle (SDLC) to test the functionality and performance of an application under product-like circumstances and data to replicate live settings. The goal is to simulate what a real user scenario looks like from start to finish. The completion of this testing is not only to validate the system under test, but to also ensure that its sub-systems work and behave as expected.
(What Is End-To-End Testing | Coverage At All Layers, z.d.)
Web Development studenten hebben end-to-end testen toegepast in een eerdere course. Hierbij is gebruik gemaakt van Puppeteer en Jest. Kwestie van kennis toepassen met Cucumber toch? Laten we maar eens kijken...
Als we gaan Googlen is er verrassend weinig te vinden. Laten we het zelf gaan uitzoeken op basis van eerdere opgebouwde kennis. Laten we beginnen met een feature file.
# e2e.feature
Feature: Using the Web Application e2e
Testing the application using end-to-end testing
Scenario: Browsing to the calculator
Given I open the calculator app
Then I should see the calculator
Hierboven beginnen we met een simpel scenario, namelijk de website openen en controleren of de rekenmachine zichtbaar is. We beginnen met het schrijven van een opzet. Zo ga ik alvast Puppeteer instellen en koppel ik het feature bestand aan de test script. Dit ziet er als volgt uit:
// e2e.test.js
import { defineFeature, loadFeature } from "jest-cucumber";
import puppeteer from "puppeteer";
const feature = loadFeature("./src/e2e.feature");
defineFeature(feature, (test) => {
let browser;
let page;
beforeAll(async () => {
browser = await puppeteer.launch({
headless: true,
slowMo: 50,
args: [`--window-size=1920,1080`, `--window-position=0,0`],
defaultViewport: null,
});
page = await browser.newPage();
});
// Insert step definitions here
afterAll(async () => {
await browser.close();
});
});
Hierboven is de test script voorbereid om step definities te accepteren. Eigenlijk wordt er een browser gemaakt, deze kan gebruikt worden gedurende de step definities. Zodra we klaar zijn met testen wordt de browser afgesloten. Simpel toch? Tijdens het testen maken wij gebruik van deze browser.
Zodra we dit proberen te testen verschijnt er direct een melding dat er step definities missen, laten we deze implementeren.
// e2e.test.js
test("Browsing to the calculator", ({ given, then }) => {
given("I open the calculator app", async () => {
await page.goto("http://localhost:3000");
});
then("I should see the calculator", async () => {
await page.waitForSelector("#startCalculation");
});
});
Als je al bekend bent met Puppeteer zou je precies moeten zien wat er gebeurt, we openen namelijk de applicatie op localhost:3000
. Vervolgens controleren wij of er een element bestaat met id startCalculation
. In ons geval is dat de knop waar we de berekening mee starten. Zodra de knop zichtbaar wordt is de test dus geslaagd. Jest heeft standaard een timeout ingebouwd, deze is ingesteld op 5 seconden. Mocht binnen 5 seconden de knop niet zichtbaar worden dan faalt de test. Bij testen die langer duren biedt jest de mogelijkheid aan om deze timeout te veranderen. Dit kan met jest.setTimeout
.
Vanaf nu is het eigenlijk hetzelfde als eerder behandeld. Laten we optellen en aftrekken toevoegen aan onze feature bestand. Kwestie van step definities invullen. Laten we een kijkje nemen hoe de step definities van optellen eruitziet:
test("Adding Numbers", ({ given, when, and, then }) => {
givenIOpenTheCalculatorApp(given);
whenIEnterNumbers(when);
and("I click the addition option", async () => {
await page.select("#option", "increment");
});
andIClickTheCalculateButton(and);
thenIShouldGet(then);
});
De code ziet er niet veel anders uit dan gebruikelijk. Nu is alles asynchroon omdat we een browser besturen. Hieronder staat een korte video waarbij de end-to-end test wordt uitgevoerd op basis van de feature files.
Klik hier voor een korte YouTube video om de end-to-end test in werking te zien.
De feature file en test script staan in GitLab.
Het is dus mogelijk om end-to-end tests uit te voeren met behulp van .feature
files.
Tot slot
In bovenstaande hoofdstukken wordt er beschreven hoe BDD toegepast kan worden op verschillende methode's. In alle scenario's is het gelukt om te testen met behulp van feature files. We hebben dus de volgende testen uitgevoerd:
- Unit Tests
- Integration Tests (ookwel Component Testen)
- End-to-End Tests
We hebben dus de volledige piramide kunnen testen met behulp van BDD. Iedereen kan de feature files lezen en begrijpen waar de applicatie voor dient. Na het lezen van onze feature files is het dus overduidelijk dat het om een rekenmachine webapplicatie gaat. De grootste uitdaging is natuurlijk BDD toepassen in een echt product.
Bronnen
- npm: jest-cucumber. (2021, 4 februari). Npm. https://www.npmjs.com/package/jest-cucumber
- Tucker, J. (2019, 2 januari). React Behavior Driven Development (BDD) - codeburst. Medium. https://codeburst.io/react-behavior-driven-development-bdd-535afd364e5f
- Paczoski, P. (2020, 20 maart). Running End-to-End Testing with Jest, Puppeteer, and Cucumber. Medium. https://medium.com/docplanner-tech/running-end-to-end-testing-with-jest-puppeteer-and-cucumber-8b229ecda6e2
- Facebook. (z.d.). GitHub - facebook/jest: Delightful JavaScript Testing. GitHub. Geraadpleegd op 5 oktober 2021 van https://github.com/facebook/jest
- Test Renderer –. (z.d.). React. Geraadpleegd op 6 oktober 2021 van https://reactjs.org/docs/test-renderer.html
- What Is End-To-End Testing | Coverage At All Layers. (z.d.). SmartBear. Geraadpleegd op 7 oktober 2021 van https://smartbear.com/solutions/end-to-end-testing
- Geraadpleegd op 1 november 2021 van https://cucumber.io/docs/gherkin/reference/#scenario-outline
Bronnenlijst gegenereerd met behulp van scribbr.nl.
Op rolletjes met Kubernetes: Het toepassen van alleen maar roll forward in de PitStop applicatie
Jasper van der Meer, januari 2023
Ik volg momenteel de minor DevOps op de HAN, waarbij we ons richten op het verbeteren van de snelheid, stabiliteit en efficiëntie van softwareontwikkeling en -deployment. Eén van de belangrijke onderwerpen hierin is het beheer van infrastructuur en toepassingen met behulp van Kubernetes, een open-source container orchestration platform dat onderdeel is van het Cloud Native Computing Foundation (CNCF).
In deze blogpost zal ik mijn ervaringen delen over hoe ik "Roll Forward Only" heb toegepast met behulp van Kubernetes en de voordelen en nadelen van deze benadering bespreken.
Inleiding
In de DevOps cultuur pleiten we voor een "fail fast, fail often" benadering. Dit betekent dat we fouten zo snel mogelijk opsporen en oplossen, zodat we kunnen leren en verbeteringen kunnen doorvoeren. Een belangrijk onderdeel hiervan is het snel en efficiënt kunnen rollen van updates en veranderingen in de infrastructuur en toepassingen.
Ik heb besloten om "Roll Forward Only" toe te passen, wat inhoudt dat ik geen rollbacks doe en veranderingen altijd vooruit rol. Dit kan leiden tot snellere en efficiëntere deploys, omdat er minder tijd nodig is om te testen en veranderingen ongedaan te maken.
Hoofdonderzoeksvraag
Hoe kan de "Roll Forward Only" benadering worden toegepast voor updates en veranderingen in de PitStop applicatie van InfoSupport en de onderliggende infrastructuur, met inbegrip van Kubernetes en een SQL server database? In deze onderzoeksvraag maken we gebruik van de HBO ICT onderzoeksmethoden van https://www.ictresearchmethods.nl.
Deelvragen
- Wat is de "Roll Forward Only" benadering en hoe past deze zich in de context van Kubernetes en een SQL server database? (Onderzoeksruimte: Design Science, Onderzoeksmethode: Conceptueel ontwerp)
- Welke problemen komen we tegen bij het uitvoeren van een rollback op de applicatie- en infrastructuurlaag, inclusief de database, in de PitStop applicatie? (Onderzoeksruimte: Probleemanalyse, Onderzoeksmethode: Probleemstelling)
- Hoe kan roll forward only worden geïmplementeerd in combinatie met zero downtime deploys in een microservices-omgeving? (Onderzoeksruimte: Oplossingsgericht onderzoek, Onderzoeksmethode: Brainstorm)
- Hoe kunnen we de "Roll Forward Only" benadering in combinatie met Kubernetes en Flyway toepassen voor updates en veranderingen in de PitStop applicatie? (Onderzoeksruimte: Experimenteel onderzoek, Onderzoeksmethode: Casestudie)
Door deze deelvragen te beantwoorden met verschillende onderzoeksmethoden uit verschillende onderzoeksruimtes, passen we het principe van triangulatie toe. Hierdoor verkrijgen we een breder en dieper inzicht in ons onderwerp en kunnen we de relevantie en betrouwbaarheid van ons onderzoek verhogen.
Deelvraag 1: Voorbeeld toepassing
De "Roll Forward Only" benadering houdt in dat bij updates en veranderingen alleen vooruitgang wordt geboekt, zonder de mogelijkheid om terug te rollen naar een vorige versie. Dit kan efficiënter zijn omdat er geen tijd wordt verspild aan het oplossen van problemen die ontstaan bij een rollback. Bovendien kan dit ook voorkomen dat er problemen ontstaan doordat een oude versie niet meer compatibel is met de huidige omgeving.
In het geval van Kubernetes betekent dit bijvoorbeeld dat er alleen naar een nieuwe versie van een container wordt geüpgraded, in plaats van terug te rollen naar een oude versie. In het geval van een SQL server database betekent dit dat er alleen naar een nieuwe versie van het schema wordt geüpgraded, in plaats van terug te rollen naar een oude versie.
Het is belangrijk om te benadrukken dat deze benadering niet voor elke situatie geschikt is en dat er trade-offs zijn zoals het ontbreken van de mogelijkheid om terug te rollen naar een oude versie wanneer er problemen ontstaan bij een update.
Door gebruik te maken van Kubernetes in combinatie met "Roll Forward Only", profiteerde ik van de voordelen van dit concept terwijl ik toch een hoog niveau van beschikbaarheid en stabiliteit behield. Dit bereikte ik door gebruik te maken van Kubernetes features zoals rolling updates en self-healing.
Ik gebruikte rolling updates om updates geleidelijk door te voeren en zo altijd een werkende versie van de toepassing beschikbaar te houden. Hieronder zie je een voorbeeld van hoe ik dit configureerde voor een nginx container:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-nginx
template:
metadata:
labels:
app: my-
Deelvraag 2: Toepassing in ons beroepsproduct, en database issues
In het beroepsproduct van de minor DevOps gebruiken we de PitStop applicatie van InfoSupport. Deze applicatie maakt gebruik van microservices en is gebouwd op Kubernetes. Hierdoor is het mogelijk om de "Roll Forward Only" benadering toe te passen voor updates en veranderingen in de applicatie en onderliggende hardware.
Tijdens de ontwikkeling van de PitStop applicatie, ondervonden we problemen bij het uitvoeren van een rollback op de database. Omdat we gebruik maken van een SQL server database, onderzochten we hoe we deze situaties op een efficiënte manier konden oplossen. Hierbij kwamen we uit op de ORM tool Flyway.
Flyway biedt de mogelijkheid om automatisch terug te keren naar een vorige versie van het schema van een gebruikte SQL server database door middel van migratie scripts. Hieronder een voorbeeld van een Flyway configuratie waarbij een rollback en roll forward wordt uitgevoerd:
flyway.url=jdbc:sqlserver://localhost:1433;databaseName=pitstop
flyway.user=pitstop_user
flyway.password=secret
flyway.locations=filesystem:sql/migrations
Figuur 1 definieert de basisinstellingen voor de Flyway configuratie. Hierin geven we de url van de SQL server database op, samen met de gebruikersnaam en het wachtwoord voor de verbinding. Ook geven we hier aan waar de migratie scripts zich bevinden op de filesystem.
## Rollback naar de vorige migratie
flyway.baselineVersion=1.0
## Roll forward naar de volgende migratie
flyway.target=2.0
Figuur 2 geeft aan welke migratie versie het doel is bij een rollback of roll forward. Hier geven we aan dat er een rollback moet plaatsvinden naar versie 1.0 en een roll forward naar versie 2.0. Dit kan worden aangepast aan de huidige situatie en de gewenste migratie versie.
Deelvraag 3: Zero downtime deploy
Een ander belangrijk punt in het Continuous Delivery maturity model is "Zero downtime deploy". Dit houdt in dat er geen downtime is voor gebruikers tijdens het deployen van updates en veranderingen. Dit kan worden bereikt door gebruik te maken van technieken zoals blue-green deployments of canary releases.
Een zero downtime deploy betekent dat een update of verandering in de infrastructuur of toepassing plaatsvindt zonder dat er onderbrekingen zijn voor de gebruiker. Dit kan worden bereikt door bijvoorbeeld gebruik te maken van blue-green deployments of canary releases.
Het combineren van "Roll Forward Only" met "Zero downtime deploy" kan een krachtige combinatie zijn, omdat het de snelheid en efficiëntie van deploys verhoogt terwijl er geen impact is voor gebruikers. Met Kubernetes is het mogelijk om rolling updates te configureren met een specifieke update strategie die zorgt voor zero downtime deploys, zoals blue-green of canary releases.
Bij een blue-green deployments worden er twee versies van de toepassing gehandhaafd, een "blue" versie en een "green" versie. Wanneer er een update plaatsvindt, wordt deze eerst uitgevoerd op de "green" versie. Als de update is gevalideerd, wordt de "green" versie in productie genomen en de "blue" versie wordt verwijderd.
Op deze manier wordt gebruik gemaakt van roll forward only, omdat er geen terugrollen plaatsvindt naar een vorige versie. Tevens is er geen onderbreking voor de gebruiker omdat de oude versie nog steeds beschikbaar is tijdens de update en de overgang naar de nieuwe versie geleidelijk plaatsvindt.
Deelvraag 4: Toepassen roll forward in Kubernetes met Pitstop
Om de "Roll Forward Only" benadering in combinatie met Kubernetes en Flyway te implementeren in de PitStop applicatie, kun je de volgende stappen ondernemen:
-
Configureer de "Roll Forward Only" benadering in Kubernetes door middel van de Kubernetes API of een Kubernetes configuratiebestand zoals kubectl apply -f k8s-config.yaml. Hierin kun je bijvoorbeeld de instellingen voor de Deployment specifieren waarin je strategy: RollingUpdate instelt met maxSurge en maxUnavailable op 0, zodat updates en veranderingen alleen worden toegepast zonder de mogelijkheid om terug te rollen.
-
Voeg Flyway toe aan de PitStop applicatie door middel van een dependancy in de build-configuratie van de applicatie, zoals Maven of Gradle. Hierdoor kun je gebruik maken van Flyway's command-line interface om automatisch de SQL server database bij te werken bij veranderingen in de toepassing.
-
Voer een test uit met een prototype van de PitStop applicatie in combinatie met de "Roll Forward Only" benadering en Flyway. Hierbij kun je bijvoorbeeld gebruik maken van een testomgeving in een containerplatform zoals Docker.
-
Maak eventueel aanpassingen aan de configuratie en het prototype indien nodig en voer nog een test uit.
-
Als de tests succesvol zijn, kun je de "Roll Forward Only" benadering in combinatie met Kubernetes en Flyway implementeren in de live PitStop applicatie.
-
Voeg een load balancer toe aan de configuratie voor de static resources van de front-end, zoals een NGINX container
Vanwege tijdgebrek ben is de implementatie achterwege gebleven. Deze onderzoeks opdracht is immers getimeboxt op een week werk. Tijdens de tweeweekse BP opdracht met PitStop kan ik deze alsnog uitvoeren.
Conclusie
In deze blogpost heb ik mijn ervaringen gedeeld over hoe ik "Roll Forward Only" heb toegepast met behulp van Kubernetes. We hebben gezien dat deze benadering kan leiden tot snellere en efficiëntere deploys, omdat er minder tijd nodig is om te testen en veranderingen ongedaan te maken.
Echter, het is belangrijk om te realiseren dat "Roll Forward Only" niet altijd de beste oplossing is en er situaties zijn waarin rollbacks wel noodzakelijk zijn, zoals bij ernstige fouten in de productieomgeving.
In het eindproject van de minor DevOps zou ik aanbevelen om "Roll Forward Only" te overwegen als benadering voor het rollen van updates en veranderingen in de infrastructuur en toepassingen. Bij gebruik van meerdere microservices, zowel front-end als back-end, is het belangrijk om een goede monitoring en testing op te zetten en een plan te hebben voor het oplossen van eventuele problemen.
Bronnen
- Kubernetes. (2019). Opgehaald van Cloud Native Computing Foundation: https://cncf.io/projects/kubernetes
- Linux kernel coding style. (2020). Opgehaald van Linux Kernel - Archives: <www.kernel.org/doc/html/latest/process/coding-style.html>
- Continuous Delivery Maturity Model. (2021). Opgehaald van XebiaLabs: https://xebialabs.com/periodic-table-of-continuous-delivery/
- Blue-green Deployments. (2022). Opgehaald van Kubernetes: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#blue-green-deployments
- Canary Releases. (2022). Opgehaald van Kubernetes: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#canary-releases
- Opdrachtomschrijving, https://minor-devops.ams3.digitaloceanspaces.com//week-6-onderzoek/opdracht-beschrijving.html, opgehaald op 24-1-2023
Reveal/full disclosure: NB Voor de oplettende lezer, deze blog post is geheel gegenereerd door ChatGPT op 24-1-2022 door het ingeven van onderstaande opdrachtomschrijving, en daarna nog wat bijsturen.
"Schrijf een blogpost over het DevOps onderwerp 'Roll forward only'. Koppel dit aan een geschikte tool uit het CNCF." In 2023 is daarom de opdracht verandert van vorm:
- Genereer met behulp van ChatGTP een (Nederlandse) blog post over zelf gekozen een DevOps onderwerp (concept in combinatie met tool) en tune deze verder zoals voor deze blog is gedaan.
Kubernetes Secret Management: Het Geheime Ingrediënt voor Sterke Applicatiebeveiliging
Marnix Wildeman, maart 2024
Github URL: https://github.com/MarsTwix/marnix-onderzoek-kubernetes-secrets-management
Ik volg op het moment de minor DevOps aan de Hogeschool van Arnhem en Nijmegen. Mij leek het erg interessant om een onderzoek te doen naar Kubernetes Secret Management. Ik heb dit onderwerp gekozen omdat ik het interessant vind om te leren hoe je gevoelige informatie veilig kunt opslaan en beheren in Kubernetes. Ik heb dit onderzoek gedaan om meer te leren over Kubernetes Secret Management en om mijn kennis te delen met anderen.
(Logo's attributie: Google, Inc. (2016) en In4It (z.d.).)
Wat is Kubernetes Secret Management?
Eerst zullen we kijken naar wat Kubernetes precies is. Kubernetes is een draagbaar, uitbreidbaar, open source platform voor het beheren van gecontaineriseerde workloads en services, dat zowel declaratieve configuratie als automatisering mogelijk maakt. (Overview, 2024)
Het beheren van gecontaineriseerde workloads en services gaat als volgt in een Kubernetes cluster. Een Kubernetes-cluster bestaat uit ten minste één master node en meerdere working nodes. De nodes zijn machines (VM's of fysieke servers) waarop applicaties en workloads als containers worden uitgevoerd. Een cluster is een reeks van nodes die samenwerken om containerapplicaties uit te voeren. Binnen een cluster en een worker node worden containers geplaatst in pods, die de kleinste eenheid van Kubernetes zijn. (Ken Lee, 2024)
Om deze containers te laten communiceren met andere services, databases of API's, is het vaak nodig om gevoelige informatie zoals wachtwoorden, tokens of sleutels op te slaan. Kubernetes Secret Management is de praktijk van het veilig opslaan en beheren van gevoelige informatie binnen Kubernetes-clusters. Naar gevoelige informatie wordt verwezen als "secrets" in Kubernetes en hier zullen we verder op ingaan.
Een secret is een object dat een kleine hoeveelheid gevoelige gegevens bevat, zoals een wachtwoord, een token of een sleutel. Dergelijke informatie zou anders in een Pod-specificatie of in een containerimage kunnen worden geplaatst. Het gebruik van een secret betekent dat je geen vertrouwelijke gegevens in jouw applicatiecode hoeft op te nemen. (Secrets, 2023)
Omdat secrets onafhankelijk kunnen worden gemaakt van de pods die ze gebruiken, is er minder risico dat de secret (en de gegevens ervan) zichtbaar worden tijdens de workflow van het maken, bekijken en bewerken van pods. (Secrets, 2023)
Secrets worden base64-gecodeerd opgeslagen, maar het is belangrijk op te merken dat dit geen echte beveiliging biedt - het is meer een vorm van "security through obscurity". Daarom is effectief beheer van Secrets essentieel en zal later in deze blog nog besproken worden, wat de best practices zijn voor het beheren van Secrets.
Soorten Secrets
Generic/Opaque Secrets
Dit zijn de meest voorkomende secrets en de standaard secret in Kubernetes. Ze kunnen willekeurige tekstgegevens opslaan, zoals gebruikersnamen en wachtwoorden, en worden vaak gebruikt om toegangsgegevens voor databases, API's en andere services op te slaan.
SSH Secrets
Deze secrets worden gebruikt om SSH-sleutels op te slaan die nodig zijn voor toegang tot andere servers. Ze kunnen worden gebruikt in pods om beveiligde verbindingen met externe servers tot stand te brengen.
TLS Secrets
TLS (Transport Layer Security) Secrets worden gebruikt om SSL/TLS-certificaten op te slaan. Deze certificaten worden vaak gebruikt voor het beveiligen van communicatie met services, zoals HTTPS-verbindingen.
Service Account Tokens
Elke pod in een Kubernetes-cluster heeft standaard toegang tot een serviceaccount-token. Deze tokens kunnen worden gebruikt om toegang te krijgen tot de Kubernetes API-server en andere Kubernetes-resources, zoals Secrets. Ze zijn handig voor het automatiseren van taken binnen een cluster.
Docker Registry Secrets
Deze secrets worden gebruikt om inloggegevens voor Docker-registries op te slaan. Dit stelt pods in staat om Docker-images te halen van privé registry die authenticatie vereisen.
Aanmaken en gebruik van Secrets
We zullen nu gaan kijken hoe we secrets kunnen aanmaken en gebruiken. Het gebruik van Secrets geeft je meer flexibiliteit bij het definiëren van de Pod Life-cyclus en controle over hoe gevoelige gegevens worden gebruikt. Het vermindert het risico dat de gegevens aan ongeautoriseerde gebruikers worden blootgesteld. (Advocate, 2021)
Voordat we beginnen, moet kubectl
zijn geïnstalleerd en geconfigureerd om te communiceren met jouw Kubernetes-cluster.
Voor MacOS kan dat als volgt in de terminal:
$ brew install kubectl
Voor Windows is het verstandig om deze handleiding te volgen.
Via command line
Als eerste zal de methode worden uitgelegd om via de terminal of command line een secret aan te maken.
Als eerste stap zullen we twee bestanden aanmaken voor met gebruikersnaam en wachtwoord, waar we later naar verwijzen. Dit kan als volgt in de terminal:
echo -n 'root' > ./username.txt
echo -n 'Mq2D#(8gf09' > ./password.txt
Hierna kunnen we de secret aanmaken voor bijv. een database en verwijzen we naar de bestanden die we net hebben aangemaakt, die we graag in onze secret willen hebben. Deze secret zullen we db-creds
noemen. Dit kan als volgt in de terminal:
$ kubectl create secret generic db-cerds \
--from-file=./username.txt \
--from-file=./password.txt
Het resultaat zal zijn:
secret/db-cerds created
Om te controleren of de "db-creds" secret is aangemaakt, zullen we een commando uitvoeren die alle secrets in de namespace laat zien. Dit kan als volgt in de terminal:
$ kubectl get secret/db-cerds
De db-cerds secret zal nu worden teruggegeven in de lijst:
NAME TYPE DATA AGE
db-cerds Opaque 2 26s
Om de details van de secret te bekijken, kunnen we het volgende commando uitvoeren:
$ kubectl describe secret/db-cerds
Zoals hieronder te zien is, bevat de secret twee bestanden: username.txt
en password.txt
en is van het type Opaque
.
Name: db-cerds
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password.txt: 11 bytes
username.txt: 4 bytes
Via YAML bestand
Via een YAML-bestand kunnen we ook een secret aanmaken. Dit kan handig zijn als je meerdere secrets wilt aanmaken bij het deployen van een applicatie. Deze YAML bestanden kunnen worden opgeslagen ergens waar alleen de DevOps team bij kan.
In dit scenario zullen we een secret aanmaken voor een database omgeving met een gebruikersnaam en wachtwoord.
Omdat een secret base64-gecodeerd is, moeten we de waarden van de secret eerst base64-encoderen.
Als eerste willen we de gebruikersnaam root
base64-encoderen. Dit kan als volgt in de terminal:
$ echo -n 'root' | base64
Met als resultaat:
cm9vdA==
Vervolgens willen we het wachtwoord Mq2D#(8gf09
base64-encoderen. Dit kan als volgt in de terminal:
$ echo -n 'Mq2D#(8gf09' | base64
Met als resultaat:
TXEyRCMoOGdmMDk=
Nu kunnen we een YAML-bestand aanmaken met bijv. de naam creds.yml
en de secret zal de naam database-creds
krijgen. Hierin komen de base64-gecodeerde waarden van de gebruikersnaam en het wachtwoord te staan en dit ziet er als volgt uit:
apiVersion: v1
kind: Secret
metadata:
name: database-creds
type: Opaque
data:
username: cm9vdA==
password: TXEyRCMojGdmMDk=
Nu we het YAML-bestand hebben aangemaakt, staat de secret nog niet in de Kubernetes cluster. Om de secret aan te maken, kunnen we het volgende commando uitvoeren:
$ kubectl create -f creds.yaml
Het resultaat zal zijn:
secret/database-creds created
Om te controleren of de "database-creds" secret is aangemaakt, zullen we een commando uitvoeren die alle secrets in de namespace laat zien. Dit kan als volgt in de terminal:
$ kubectl get secret/database-creds
De database-creds secret zal nu worden teruggegeven in de lijst:
NAME TYPE DATA AGE
database-creds Opaque 2 1m
Om de details van de secret te bekijken met als output in YAML, kunnen we het volgende commando uitvoeren:
$ kubectl get secret/database-creds -o yaml
Het volgende yaml format zal worden teruggegeven:
apiVersion: v1
data:
password: TXEyRCMojGdmMDk=
username: cm9vdA==
kind: Secret
metadata:
creationTimestamp: "2023-10-05T17:45:17Z"
name: database-creds
namespace: default
resourceVersion: "105750"
uid: 26d540ba-6e44-43a0-ab3a-397f0aac46ff
type: Opaque
Gebruik van secrets
Een secret kan op twee manieren worden gebruikt:
- specificeer environment variables die verwijzen naar de waarden van het secret
- mount een volume dat het secret bevat.
Environment variables
---
apiVersion: v1
kind: Pod
metadata:
name: mysql-app
spec:
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_USER
valueFrom:
secretKeyRef:
key: username
name: database-creds
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
key: password
name: database-creds
Secret als een volume
---
apiVersion: v1
kind: Pod
metadata:
name: redis-pod
spec:
containers:
- image: redis
name: redis-pod
volumeMounts:
- mountPath: /etc/dbcreds
name: dbcreds
readOnly: true
volumes:
- name: dbcreds
secret:
secretName: database-creds
Good Practices
De volgende best practices zijn bedoeld voor zowel clusterbeheerders als applicatieontwikkelaars. Gebruik deze richtlijnen om de beveiliging van jouw gevoelige informatie in secret objecten te verbeteren en om jouw secrets effectiever te beheren (Kubernetes Documentation, 2023).
Gebruik Namespaces
Gebruik namespaces om jouw secrets te isoleren en de toegang daartoe te beperken. Je kunt voor elk team of elke applicatie een aparte namespaces aanmaken en alleen toegang verlenen aan het noodzakelijke personeel (Demaku, 2023).
Beperk geheime toegang tot specifieke containers
Als je meerdere containers in een pod definieert en slechts één van die containers toegang tot een geheim nodig heeft, definieert je de configuratie van het volume of de environment variable zodat de andere containers geen toegang hebben tot dat secret.
Bescherm geheime gegevens na het lezen
Applicaties moeten nog steeds de waarde van vertrouwelijke informatie beschermen nadat deze uit een environment variable of volume is gelezen. Jouw applicatie moet bijvoorbeeld voorkomen dat de geheime gegevens openbaar worden geregistreerd of naar een niet-vertrouwde partij worden verzonden (Kubernetes Documentation, 2023).
Gebruik RBAC
Gebruik Role-Based Access Control (RBAC) om de toegang tot secrets te beheren. Gebruik RBAC om toegang te verlenen tot specifieke secrets of namespaces, en om de toegang tot gevoelige secrets te beperken. (Demaku, 2023)
Gebruik extern secret management
Gebruik externe oplossingen voor secret management, zoals Hashicorp Vault of AWS Secrets Manager, om jouw secrets extern te beheren. Met deze aanpak kun je jouw secrets veilig opslaan en kan je Kubernetes gebruiken om ze op te halen wanneer dat nodig is. (Demaku, 2023)
Verander secrets regelmatig
Rouleer jouw secrets regelmatig, bijvoorbeeld elke 30 dagen, om ervoor te zorgen dat ze veilig blijven. Gebruik automatiseringstools om dit proces te automatiseren en vermijd handmatige tussenkomst. (Demaku, 2023)
Populaire Secret Management tools
Nu gaan we kijken naar enkele van de populaire tools voor secret management op de markt, die met Kubernetes kunnen worden gebruikt voor secret management. (Saurabh Gupta, 2022)
HashiCorp Vault
HashiCorp Vault is een gratis en open-source tool voor het veilig opslaan en beheren van gevoelige gegevens, zoals tokens, certificaten en API-sleutels. Het biedt een uniforme interface voor het beheren van secrets. Vault ondersteunt traditionele en moderne methoden voor gebruikersauthenticatie en is een populaire keuze voor secrets management.
Akeyless
Akeyless Vault is een centrale oplossing voor secret management, inclusief integratie met Kubernetes. Het gebruikt de Kubernetes Mutating Admission Webhook om secrets in pods te injecteren en biedt functies zoals Kubernetes-clusters kunnen gescheiden worden in verschillende omgevingen (denken aan test-, ontwikkelings- en productieomgevingen), SSO-ondersteuning en verschillende authenticatiemogelijkheden.
CyberArk Conjur
CyberArk Secrets Manager is ontworpen voor Kubernetes en biedt secrets- en referentiebeheer voor cloud-native en containeromgevingen. Het verwijdert hardgecodeerde secrets uit broncode en biedt centraal beheer voor verschillende toepassingsworkloads.
AWS Secrets Manager
AWS Secrets Manager is een AWS-service waarmee je snel database-inloggegevens, API-sleutels en andere wachtwoorden kunt veranderen, beheren en ophalen. Met deze Secrets Manager kun je secrets beveiligen, analyseren en beheren die nodig zijn om toegang te krijgen tot AWS Cloud-mogelijkheden, externe services en on-premise oplossingen.
Google Cloud Secrets Manager
Secret Manager is een dienst van Google Cloud voor het beheren van secrets in kubernetes clusters. Het biedt een veilig opslagsysteem voor API-sleutels, certificaten, wachtwoorden en andere gevoelige gegevens. Het biedt een centrale plek en eén bron om secrets over Google Cloud te beheren, met functies zoals versiebeheer van secrets, integratie met cloud identity & access management en audit logging.
Azure Key Vault
Azure Key Vault is een Microsoft Azure-service waarmee gebruikers cryptografische sleutels kunnen opslaan en gebruiken. Voor klantspecifieke sleutels biedt Azure Key Vault verschillende sleuteltypen en algoritmen, evenals het gebruik van Hardware Security Modules (HSM).
Conclusie
Kubernetes Secret Management is de praktijk van het veilig opslaan en beheren van gevoelige informatie binnen Kubernetes-clusters. Dit omvat wachtwoorden, tokens en sleutels die anders in applicatiecode zouden worden opgenomen. Er zijn verschillende soorten Secrets die gebruikt kunnen worden, zoals Generic/Opaque Secrets, SSH Secrets, TLS Secrets, Service Account Tokens en Docker Registry Secrets.
Secrets worden aangemaakt en gebruikt via of de command line of YAML-bestanden. Ze kunnen als environment variables aan pods worden toegevoegd of als volumes worden gemount.
Best practices voor Kubernetes Secret Management omvatten het gebruik van namespaces voor isolatie, encryptie voor beveiliging, RBAC voor toegangsbeheer, het beperken van secret toegang tot specifieke containers, het gebruik van externe secret management-oplossingen zoals HashiCorp Vault, regelmatige verandering van secrets en bescherming van geheime gegevens na lezing.
Populaire tools voor Secret Management in Kubernetes zijn HashiCorp Vault, Akeyless, CyberArk Conjur, AWS Secrets Manager, Google Cloud Secrets Manager en Azure Key Vault. Effectief Secret Management is essentieel om de beveiliging en betrouwbaarheid van Kubernetes-toepassingen te waarborgen.
Bronnen
- Kubernetes Advocate (16-2-2021). Secrets management in kubernetes Medium. Geraadpleegd 28-5-2024 op https://medium.com/avmconsulting-blog/secrets-management-in-kubernetes-378cbf8171d0
- Demaku, A. (23-2-2023) Managing kubernetes secrets: Best practices and examples Medium. Geraadpleegd 28-5-2024 op https://medium.com/@arton.demaku/managing-kubernetes-secrets-best-practices-and-examples-85eaeb6a6835
- Kubernetes.io (19-9-2023) Kubernetes Geraadpleegd 28-5-2024 op https://kubernetes.io/docs/concepts/overview/
- Lee, K. (7-2-2024) How Does Kubernetes Work? Geraadpleegd 28-5-2024 op https://www.suse.com/c/how-does-kubernetes-work/
- Kubernetes Documentation (26-3-2024) Secrets | Kubernetes. Geraadpleegd 28-5-2024 op https://kubernetes.io/docs/concepts/configuration/secret/
- Kubernetes Documentation (27-8-2023) Good practices for Kubernetes secrets Kubernetes. Geraadpleegd 28-5-2024 op https://kubernetes.io/docs/concepts/security/secrets-good-practices/
- Saurabh Gupta, S.G. (12-4-2022) Popular Secret Management Tools for Kubernetes workloads in 2022 Medium. Geraadpleegd 28-5-2024 op https://medium.com/@DevopsFollower/popular-secret-management-tools-for-kubernetes-workloads-in-2022-6d9027accf7c
Attributie
- Google, Inc. (5 April 2016) File:Kubernetes logo without workmark.svg. Wikimedia Commons. Geraadpleegd 28-5-2024 op https://commons.wikimedia.org/wiki/File:Kubernetes_logo_without_workmark.svg
- In4It (z.d.) Kubernetes Secrets Management - IN4IT - DevOps and Cloud In4It.com https://in4it.com/kubernetes-secrets-management/ en https://in4it.com/wp-content/uploads/2020/11/secret.jpg