Cloud &
DevOps

// Thomas More Kempen β€” Volledige studiegids

0 / 0 vragen correct
01 β€” ☁ The Cloud

πŸ“¦ On-Premise β†’ Cloud

Vroeger: servers in een serverruimte op het bedrijfsperceel (on-premise). Nadelen:

  • πŸ’° Hoge initiΓ«le kosten (hardware, licenties)
  • πŸ”§ Veel onderhoud & IT-personeel nodig
  • πŸ“‰ Beperkte schaalbaarheid
  • πŸ“΅ Lage betrouwbaarheid (geen redundantie)
  • πŸ”“ Volledige verantwoordelijkheid voor security

🏒 Datacenter Evolutie

Bedrijven centraliseerden server-ruimtes in datacenters: dedicated gebouwen met power, koeling, security en backup. Vereist speciale voorzieningen:

  • ⚑ PDUs (Power Distribution Units), UPS, diesel generators
  • ❄ Hot/cold aisle cooling, CRAC-systemen
  • 🧯 Mantraps, gasblusinstallaties, camera's

πŸ“Š Uptime Institute β€” Tier Systeem

TierRedundantieUptimeMax. downtime/jaar
Tier 1Geen99.67%28.8 uur
Tier 2Gedeeltelijk99.74%22 uur
Tier 3Meerdere paden, 1 actief99.98%1.6 uur
Tier 4Volledig redundant99.995%26.3 min

Redundantie = kritieke componenten dupliceren zodat als één faalt, de andere het overneemt. Vb.: dubbele voedingen, meerdere internet-providers.

πŸ‡§πŸ‡ͺ Belgische datacenter voorbeelden: LCL (Brussels-West, Antwerpen, Diegem) • Interxion / Digital Realty (Zaventem) • Greenhouse Datacenters • Microsoft & Google cloud regio's.

🎩 Private Cloud

Bedrijf bouwt/huurt datacenter en biedt hosting aan. Voorbeeld: RCloud (Inetum-RealDolmen) in LCL/InterXion.

βœ… Privacy (exacte locatie bekend), maatwerk, eigen ingenieurs ter plaatse
⚠ Langzamer, duurder, minder services

🌎 Public Cloud

Hyperscale datacenters wereldwijd. AWS, Azure, GCP, IBM Cloud. Exacte locatie servers onbekend.

βœ… Snel starten, cost-effective, grote variΓ«teit
⚠ Privacy-wetten lastiger, geen maatwerk

🌐 Hybrid Cloud

Combinatie van public + private. Best of both worlds. Voorbeeld in BelgiΓ«: Cegeka.

Er zijn ook andere modellen: Co-location (ruimte verhuren in datacenter), Community cloud, Multi-cloud.

βš– Cloud vs On-Premise β€” Voordelen Cloud

AspectOn-PremiseCloud
KostenHoog upfront (CAPEX)Pay-as-you-go (OPEX)
OnderhoudEigen IT-team nodigProvider beheert alles
SchaalbaarheidMoeilijk/traagOn-demand in minuten
BetrouwbaarheidKwetsbaar voor uitvalRedundante infra wereldwijd
SecurityEigen verantwoordelijkheidShared responsibility + tools

πŸ“ˆ Scalability vs Elasticity

Load Balancing: verdeelt werkbelasting over meerdere servers.

Scalability: manueel of via regels extra servers opstarten als een drempel overschreden wordt. Minder dynamisch.

Elasticity: automatisch en sneller, volgt vraag real-time op. Kostenoptimalisatie.

πŸ“Ά HA & DR

High Availability (HA): zorgt dat services altijd beschikbaar zijn. Gebruikt geo-redundantie (β‰₯200 km afstand).

Disaster Recovery (DR): backup + herstel bij grote rampen. Gebruikt beschikbaarheidszones/regio's.

πŸ›‘ Security: Confidentiality & Integrity

Encryptie: data onleesbaar maken, enkel te ontcijferen met sleutel.
Firewalls: in/uitgaand verkeer filteren.
Authenticatie: identiteit verifiΓ«ren (wachtwoord, token, biometrie).
Autorisatie: toegangsniveaus bepalen via policies/rollen.

Confidentialiteit: data alleen toegankelijk voor bevoegden.
Integriteit: data alleen aanpasbaar door bevoegden.

☁ Service Modellen

ModelBeschrijvingVerantw. gebruikerVoorbeeld Azure
IaaS Infra as a ServiceRuwe compute: VM's, opslag, netwerk, OSHoog β€” alles boven hardwareVirtual Machines
PaaS Platform as a ServicePre-configured platforms: DB, webserver, dev-toolsMiddel β€” apps & dataAzure Web Apps
SaaS Software as a ServiceKant-en-klare software (e-mail, CRM)Laag β€” enkel gebruikMicrosoft 365

πŸ”΅ Azure β€” Sleutelconcepten

  • Regions: geografisch gebied met 1+ datacenters. Ondersteunt HA en DR. Vb.: "West Europe".
  • Availability Zones: fysiek gescheiden datacenters binnen één regio.
  • Subscriptions: billing/management grens. Één account kan meerdere subscriptions hebben.
  • Resource Groups: logische container voor gerelateerde resources. Heeft naam + locatie.

πŸ’° Azure Factuurpunten

  • Service type: compute per uur/seconde, storage per GB
  • Usage: hoeveel je verbruikt
  • Location: Japan duurder dan India
  • Performance tier: A/B/D/F-series VM's hebben elk eigen prijs

Tools: Pricing Calculator, Cost Management Portal, Billing Alerts.

Optimaliseren: juiste service level kiezen, auto-scaling, reserved instances (tot 72% korting).

🎯 QUIZ β€” The Cloud

V1
Welke Tier van het Uptime Institute heeft volledig redundante paden (beide actief) en een verwachte uptime van 99.995%?
V2
Wat is het verschil tussen Scalability en Elasticity?
V3
Een klant wil een VM huren waarbij hij het OS zelf installeert en configureert. Welk service model past hier het best?
V4
Welke eigenschap is een voordeel van Private Cloud ten opzichte van Public Cloud?
V5
Welke Azure-resource is een logische container die gerelateerde services groepeert en waarop je policies en tags kan toepassen?
V6
Wat is Geo-Redundantie in de context van High Availability?
vragen correct
02 β€” πŸ“¦ Containers

πŸ€” Waarom containers?

Probleem: meerdere kleine apps op aparte VM's = verspilling. Elke VM heeft een volledig OS β†’ veel overhead.

Oplossing: containers β€” kleine, geΓ―soleerde omgevingen met enkel de applicatiecode + dependencies. Delen de kernel van de host β†’ veel minder overhead.

πŸ†š VM vs Container

AspectVMContainer
OSVolledige eigen kernel + driversDeelt kernel van de host
GrootteGigabytes (incl. OS)Megabytes (enkel filesystem)
StartupMinutenSeconden
IsolatieVolledige hardware-isolatieOS-niveau isolatie
Beheerd doorHypervisor (ESXi, KVM, Hyper-V)Container engine (Docker, LXC)

🐧 Wat is een Kernel?

De kernel is de kern van een OS: beheert communicatie tussen hardware en software (geheugen, processen, schijf, system calls). Containers delen de host-kernel β†’ ze kunnen geen ander OS draaien dan het host-OS.

βš™ Processen & PID 1 in een Container

Elke container draait één hoofdproces (PID 1). Dit proces controleert de volledige lifecycle:

  • Container stopt als PID 1 stopt β€” ook al lopen andere achtergrondprocessen nog
  • Container heeft altijd minstens 1 actief proces nodig
  • Docker = wrapper rond een proces (met eigen filesystem & netwerk)

Flags die het procesgedrag bepalen: -it (interactief, stdin open) en -d (detached, achtergrond).

πŸ“¦ Structuur van een Container

  • Filesystem: gebaseerd op een base image (bv. Alpine of Debian)
  • Applicatie: de code die de logica uitvoert
  • Dependencies: system libraries (openssl), taal-specifiek (Python), tools (git)
  • Configuratie: env-variabelen, poort, log-niveau, DB-connectionstring

πŸ“… Geschiedenis van Containers

  • 2001: Linux-VServer β€” eerste container-technologie op Linux
  • 2008: LXC (Linux Containers) β€” combineert cgroups (resources alloceren) + namespaces (resources isoleren)
  • 2013: Docker β€” game-changer, portabele container images, grote community
  • 2014: Kubernetes β€” orchestratie van containers op schaal (van Google)
  • 2014: Open Container Initiative (OCI) β€” standaardisatie van container-formaten
  • Nu: AWS ECS, Google GKE, Azure Kubernetes Service (AKS)

πŸͺ Docker: Images vs Containers

Container Image = een statisch snapshot/template met alle files, dependencies en configuratie. Zoals een koekjesvorm (cookie cutter).

Container = een runtime instantie van een image. Efemeer (gemakkelijk aanmaken/stoppen/verwijderen). Wijzigingen in een container beΓ―nvloeden de image NIET. Zoals een koekje gebakken met de koekjesvorm.

Docker Hub = cloud-gebaseerde registry voor het delen van container images. Bevat officiΓ«le images (nginx, mysql, tensorflow). Je kan images pushen en pullen.

πŸ” Alpine Linux

Minimalistisch, small image size, snel te starten, weinig resources. Mist veel standaard libraries. Gebruikt apk als package manager. Voorkeur in containers.

🐧 Debian Linux

Stabiel, groot software-repository, meer libraries beschikbaar. Grotere image size. Gebruikt apt als package manager. Geschikter voor complexe apps.

πŸ–₯ Docker Commando's

CommandoBeschrijving
docker run <image>Maakt altijd een NIEUWE container aan en start die
docker run -itInteractieve terminal (stdin attached)
docker run -dDetached mode (achtergrond)
docker run -p 8080:80Port mapping: host:container
docker run -PAlle EXPOSED poorten automatisch naar random host-poorten mappen
docker run -e VAR=valEnvironment variabele instellen
docker run -v host:containerVolume / bind mount koppelen (bv. -v $(pwd):/app)
docker run --name naamContainer een naam geven
docker run --network netContainer aan een specifiek netwerk koppelen
docker psToont draaiende containers
docker ps -aAlle containers (ook gestopt)
docker start <id>Start gestopte container opnieuw (GEEN nieuwe)
docker stop <id>Stop een draaiende container
docker rm <id>Verwijder een container
docker exec -it <id> shVoer commando uit in draaiende container
docker attach <id>Verbind CLI aan draaiende container
docker logs <id>Logs bekijken van container

πŸšͺ Poorten: Houses & Doors

IP/hostname = huisadres. Poortnummer = deurnummer. Poort 80 = HTTP, 22 = SSH, 3306 = MySQL.

-p 3307:3306 β†’ host poort 3307 mapt naar container poort 3306.

Port conflict: twee services op dezelfde host-poort = onmogelijk. Oplossing: andere host-poort kiezen (bv. 3308:3306).

πŸ“ Volumes & Bind Mounts

Containers zijn efemeer β†’ data gaat verloren bij verwijderen. Oplossing: volumes.

TypeBeschrijving
VolumeDocker-beheerde opslag in /var/lib/docker/volumes. Makkelijk backuppen, deelbaar.
Bind MountDeelt een map van je computer met de container. Beide zien dezelfde bestanden.
docker volume create myvol docker volume ls docker volume inspect myvol docker volume rm myvol docker volume prune docker run -v myvol:/data image

MySQL voorbeeld: -v mysqldata:/var/lib/mysql β†’ data blijft bestaan ook na container removal.

⚑ Redis

Redis = in-memory key-value database. Extreem snel. Docker image: redis.

  • Caching
  • Pub/sub systemen
  • Session storage
  • Rate limiting

🎯 QUIZ β€” Containers

V1
Wat is het fundamentele verschil tussen een container engine (Docker) en een hypervisor?
V2
Wat gebeurt er als je docker run hello-world uitvoert en de image niet lokaal aanwezig is?
V3
Je draait: docker run -it alpine ash, maakt een bestand "hello.txt", en daarna docker run alpine ls. Wat zie je?
V4
Je wil een MySQL container starten die in de achtergrond draait op host-poort 3307. Welk commando is correct?
V5
Wat is het verschil tussen docker run en docker start?
vragen correct
03 β€” πŸ— Crafting a Container

πŸ“Έ Methode 1: Instance Promotion (commit)

Start een container interactief β†’ installeer software β†’ commit als image.

# 1. Start container docker run -it ubuntu bash # 2. Installeer iets apt-get install -y figlet exit # 3. Commit als image docker commit <container_id> docker image tag <id> ourfiglet

πŸ“„ Methode 2: Dockerfile (aanbevolen)

Instructies in een tekstbestand β†’ reproduceerbaar, deelbaar, versiebeheersbaar.

# Dockerfile FROM ubuntu RUN apt-get update && apt-get install -y figlet
docker build -t ourfiglet .

πŸ“– Dockerfile Instructies

InstructieFunctieVoorbeeld
FROMBasis image (verplicht, eerste lijn)FROM python:3.9-slim
RUNCommando uitvoeren TIJDENS buildRUN apt-get install -y curl
COPYBestanden kopiΓ«ren van host naar imageCOPY app.py /app/app.py
WORKDIRWerkdirectory instellenWORKDIR /app
CMDStandaard commando bij container start (overschrijfbaar)CMD ["python","app.py"]
ENTRYPOINTVaste startcommando (niet overschrijfbaar)ENTRYPOINT ["python"]
EXPOSEDocumenteert poort (publiceert NIET)EXPOSE 80 443
ENVEnv-variabele (beschikbaar bij build & runtime)ENV PORT=8080
ARGBuild-time variabele (ENKEL tijdens build, NIET bij runtime)ARG VERSION=1.0
ADDZoals COPY maar ook URLs en auto-unzip van tar-archiefADD archive.tar.gz /app/

🌐 Volledig voorbeeld: NodeJS app

DOCKERFILE FROM alpine RUN apk update && apk add nodejs COPY . /app WORKDIR /app CMD ["node", "index.js"]
# Bouwen met tag en versienummer docker build -t hello:v0.1 . # Draaien docker container run hello:v0.1

De tag na : is de versie. Default = latest.

πŸ§… Image Layers & Caching

Elke Dockerfile-instructie maakt een nieuwe laag. Lagen zijn immutable (niet aanpasbaar).

Bij docker build: als een laag ongewijzigd is, gebruikt Docker de cache β†’ sneller bouwen.

Bij het draaien van een container wordt er een extra schrijfbare laag bovenop gelegd (changes worden hier bijgehouden).

# Layers bekijken docker history hello:v0.1 # Inspect layers als JSON docker image inspect --format "{{ json .RootFS.Layers }}" hello:v0.1

Twee images met dezelfde base image (bv. Alpine) delen dezelfde onderste laag (zelfde SHA256 hash).

πŸš€ Push naar Docker Hub

# Build met jouw Docker ID in de naam docker build -t JOUW_ID/testwebsite:latest . # Login docker login -u JOUW_ID -p JOUW_WACHTWOORD # Push docker push JOUW_ID/testwebsite:latest

De suffix :latest overschrijft de laatste versie. Gebruik versienummers voor releases (bv. :v1.2.0).

🎯 QUIZ β€” Crafting a Container

V1
Welke Dockerfile instructie voert een commando uit TIJDENS het bouwen van de image (niet bij het starten van de container)?
V2
Wat doet EXPOSE in een Dockerfile?
V3
Je past de index.js aan en bouwt v0.2. Je merkt dat stap 2 (RUN apk add nodejs) de cache gebruikt. Wat betekent dit?
V4
Wat is het verschil tussen CMD en ENTRYPOINT?
vragen correct
04 β€” β™Ύ DevOps & Pipelines

β™Ύ Wat is DevOps?

DevOps = set van practices, tools en cultuurfilosofie die software development en IT operations automatiseert en integreert. Doel: de kloof tussen Developers en Operations overbruggen voor betere samenwerking en efficiΓ«ntie.

De DevOps lifecycle heeft 8 fasen (∞-vorm): Plan β†’ Code β†’ Build β†’ Test β†’ Release β†’ Deploy β†’ Operate β†’ Monitor β†’ terug naar Plan.

βš™ GitHub Actions β€” Hoe werkt het?

  • GitHub zoekt naar .yml bestanden in .github/workflows/
  • Bij een trigger (bv. push) start GitHub een runner virtual machine in de cloud voor elke job
  • De stappen worden uitgevoerd in die VM
  • Na de job wordt de VM vernietigd

πŸ“‹ Workflow.yml Structuur

YAML name: Pipeline # naam in GitHub UI on: push: branches: [ main ] # trigger bij push naar main permissions: contents: write # schrijfrechten voor workflow jobs: mijn-job: runs-on: ubuntu-latest # type runner VM needs: andere-job # wacht op andere-job steps: - name: Stap beschrijving uses: actions/checkout@v2 # built-in action - name: Run commando run: echo "hello" with: # parameters voor 'uses' key: value

πŸ”‘ Workflow Sleutelwoorden

  • name: naam van de workflow
  • on: trigger-event (push, pull_request, ...)
  • branches: welke branches triggeren
  • jobs: verzameling van taken
  • runs-on: type runner (ubuntu-latest)
  • needs: dependency op andere job
  • steps: stappen in een job
  • uses: gebruik een bestaande Action
  • run: shell-commando uitvoeren
  • with: parameters voor een Action

πŸ” GitHub Secrets

Gevoelige info (wachtwoorden, tokens) veilig opslaan. Beschikbaar via ${{ secrets.NAAM }}.

Instellen via: Settings β†’ Secrets and variables β†’ Actions β†’ New repository secret

Voorbeelden: DOCKERHUB_USERNAME, DOCKERHUB_PASSWORD, GITHUB_TOKEN (automatisch door GitHub).

πŸ“ˆ CI / CD / CD β€” Wat is het verschil?

TermStaat voorWanneer bereikt?
CI Continuous IntegrationAutomatisch code testen bij elke pushNa de Test-stap in de pipeline
CD Continuous DeliverySoftware automatisch gereed maken voor deployment (bv. Docker image bouwen)Na de Release-stap (package/container)
CD Continuous DeploymentSoftware automatisch deployen naar productieNa de Deploy-stap (live zetten)

πŸ” SonarCloud β€” Code Kwaliteit

SonarCloud analyseert code automatisch in de pipeline. Issue-categorieΓ«n:

CategorieBetekenis
🐞 BugsCode die onjuist gedrag veroorzaakt (logica-fout)
πŸ”“ VulnerabilitiesSecurity-risico's die dringend gefixed moeten worden (bv. SQL injection)
πŸ›‘ Security HotspotsGevoelige code die een review nodig heeft (bv. encryptie-logica)
☒ Code SmellsSlechte structuur/design β€” geen bug, maar moeilijker te onderhouden

Quality Gate: set drempelwaarden (bv. 0 bugs, 0 vulnerabilities, coverage β‰₯ 80%). Code haalt gate NIET β†’ pipeline faalt β†’ geen deployment.

πŸ— Volledige CI/CD Workflow (website voorbeeld)

YAML jobs: test: # CI: HTML/CSS validatie steps: - uses: actions/checkout@v2 - uses: Cyb3r-Jak3/html5validator-action@v7.2.0 with: { root: ./, css: true } delivery: # CD: Docker image bouwen + pushen needs: test steps: - uses: actions/checkout@v2 - run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/website . - uses: docker/login-action@v1 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/website deploy: # CD: Deploy naar GitHub Pages needs: test steps: - uses: actions/checkout@v2 - uses: peaceiris/actions-gh-pages@v4 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: .

De delivery en deploy jobs draaien parallel omdat ze allebei needs: test hebben (niet van elkaar afhankelijk).

🎯 QUIZ β€” DevOps & Pipelines

V1
Wat is Continuous Integration (CI)?
V2
Wat doet needs: test in een GitHub Actions job?
V3
Waar moet je een workflow.yml bestand plaatsen zodat GitHub Actions het herkent?
V4
Wat is het verschil tussen Continuous Delivery en Continuous Deployment?
vragen correct
05 β€” 🧱 Building Code

🌍 Drie Taaltypen

TypeHoe?Build nodig?Talen
InterpretedInterpreter leest & voert code lijn per lijn uit (runtime)NeePython, JavaScript, Ruby, PHP
CompiledCompiler vertaalt naar machine code (.exe) voor een specifiek platformJa β†’ .exeC, C++, Go, Rust
HybridCompiled naar bytecode (.class), dan geΓ―nterpreteerd door JVM/CLRJa β†’ .jar/.dllJava, C#

πŸ“ Interpreted (Python)

  • ⚑ Langzamer: lijn per lijn
  • πŸ’Ύ Meer geheugen: source + tussenresultaten
  • πŸ”Ž Fouten pas bij runtime
  • βœ… Cross-platform (interpreter installeren)
  • βœ… Dynamic typing mogelijk

πŸ—œ Compiled (C/C++)

  • ⚑ Sneller: al vertaald naar machine code
  • πŸ’Ύ Minder geheugen: geoptimaliseerd
  • πŸ”Ž Fouten bij compile-time (vroeger)
  • ⚠ Platform-specifiek: .exe voor Windows werkt niet op Linux
  • Hercompilatie nodig per platform

β˜• Java: De Hybride Aanpak

Java is compiled + interpreted = cross-platform via de JVM.

Stap 1 (Compiled): javac compileert .java bestanden naar bytecode (.class bestanden). Platform-onafhankelijk!

Stap 2 (Interpreted): De JVM (Java Virtual Machine) laadt de .class bestanden en interpreteert de bytecode naar native machine code. JIT-compilatie voor snelheid.

Resultaat: "Write once, run anywhere" β€” als er een JVM is, draait de code.

πŸ”¨ Maven voor Java

Maven = build automation tool voor Java. Beheert libraries, buildprocess en documentatie. Configureert via pom.xml.

XML (pom.xml) <groupId>fact.it</groupId> <!-- Groep/organisatie --> <artifactId>example-bicycle</artifactId> <!-- Projectnaam --> <version>0.0.1-SNAPSHOT</version> <!-- Versie --> <dependencies>...</dependencies> <!-- Libraries --> <build><plugins>...</plugins></build> <!-- Build plugins -->

πŸ“¦ Maven Commando's

CommandoWat doet het?Output
mvn compileCompileert .java naar .class bestanden/target/classes/
mvn testBouwt code eerst, daarna unit tests uitvoerenTest-resultaten
mvn packageBouwt + test + verpakt in .jar bestand (ook tests)/target/*.jar
# JAR uitvoeren java -jar .\example-bicycle-0.0.1-SNAPSHOT.jar

De naam van de JAR = artifactId + version uit pom.xml.

πŸ§ͺ Unit Tests

Unit tests testen individuele methodes of klassen in isolatie. In Java met JUnit.

JAVA @Test public void testGetEmailAddress() { Student student = new Student("r123456", "Jan", "Janssen"); assertEquals("r123456@student.thomasmore.be", student.getEmailAddress()); }

Maven voert automatisch alle tests uit bij mvn test en mvn package.

🐍 pytest β€” Python Testing

pytest: populair Python test-framework. Eenvoudige syntax, krachtige output.

Gebruikt in DevOps voor het automatisch testen van Python applicaties tijdens CI/CD.

🏷 GitHub Tags & Releases

GitHub Tags: markeren een specifieke versie van de code in Git.

GitHub Releases: volledige release-pakketten gebaseerd op tags (downloadbaar bestand, release notes).

Beide zijn key in de Release en Deploy stappen van de DevOps lifecycle.

🐳 Java in CI/CD Pipeline (GitHub Actions)

YAML jobs: build-and-test: steps: - uses: actions/checkout@v2 - name: Set up JDK 11 uses: actions/setup-java@v2 with: { java-version: '11', distribution: 'adopt' } - name: Test with Maven run: mvn test -B # -B = batch mode (minder output) deliver-container: needs: build-and-test steps: - name: Build JAR run: mvn package -B - name: Build Docker image run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/app . deliver-jar: # Upload als GitHub Artifact needs: build-and-test steps: - uses: actions/upload-artifact@v4 with: name: zipped-project-jar-file path: target/*.jar

πŸ“¦ GitHub Artifacts

Bestanden (bv. .jar, test-resultaten) tijdelijk opslaan op GitHub en beschikbaar stellen voor download. Gebruik: actions/upload-artifact. Zichtbaar in het Actions tab β†’ Summary.

Voordeel: software uitleveren zonder container (alternatief voor Docker Hub).

🎯 QUIZ β€” Building Code

V1
Hoe verschilt Java van pure interpreted talen zoals Python op het gebied van compilatie?
V2
Welk Maven commando bouwt de code, voert unit tests uit EN verpakt alles in een .jar bestand?
V3
Wat is een Unit Test?
V4
Waarom is een .jar bestand handiger dan losse .class bestanden voor distributie?
vragen correct
06 β€” πŸ›³ Infrastructure as Code

πŸ›³ Operate-stap in DevOps

De Operate stap beheert en onderhoudt applicaties en infra na deployment. Focust op vlot, efficiΓ«nt en betrouwbaar draaien in productie.

IaC (Infrastructure as Code) = infra beheren en provisioneren via machine-leesbare definitiebestanden in plaats van manuele processen. Code die ook leesbaar is voor mensen.

βœ… Waarom IaC? Voordelen

  • Automatisering: sneller infra deployen en configureren
  • Samenwerking: configuraties in versiebeheer (Git), wijzigingen traceerbaar
  • Schaalbaarheid: snel up/down schalen via code
  • Reproducibiliteit: zelfde setup in dev, test Γ©n productie
  • Vermindert menselijke fouten: geen manuele stappen

🐳 Docker Compose = IaC

Docker Compose definieert multi-container applicaties in een docker-compose.yml bestand. Declaratief: je beschrijft de gewenste toestand, niet de stappen.

docker run commandoDocker Compose equivalent
docker run -d --name mydb -p 3307:3306 -e MYSQL_ROOT_PASSWORD=abc123 mysql:latestZie YAML hieronder
YAML services: mydb: image: mysql:latest container_name: mydb ports: - "3307:3306" environment: MYSQL_ROOT_PASSWORD: abc123

βš™ Docker Compose Commando's

CommandoFunctie
docker compose up -dStart alle services in achtergrond
docker compose up --remove-orphansStart op en verwijdert verouderde containers
docker compose downStop en verwijder containers
docker compose buildHerbouwt images van Dockerfiles
docker compose psLijst van alle services in het project
docker compose -p naam up -dDeploy met custom projectnaam

πŸ”— Containers verbinden + Netwerken

YAML services: app: build: ./app # bouwt Dockerfile in ./app map networks: example-network: ipv4_address: 172.16.238.10 db: image: mysql:latest volumes: # persistente opslag - db-data:/var/lib/mysql networks: example-network: ipv4_address: 172.16.238.11 depends_on: # wacht op app - app networks: example-network: driver: bridge # containers op zelfde host communiceren

bridge driver: containers op dezelfde host kunnen communiceren.
Containers vinden elkaar via de service-naam (bv. app:8000).

πŸ“‹ Compose YAML Structuur

  • services: elk service = één containertype
  • image: Docker Hub image gebruiken
  • build: Dockerfile bouwen (geeft map op)
  • container_name: naam van de container
  • ports: host:container port mapping
  • environment: env-variabelen
  • volumes: persistente opslag
  • depends_on: wacht op andere service
  • networks: welk netwerk de service gebruikt
  • env_file: .env bestand laden
  • restart: herstart-policy (unless-stopped)

🎯 QUIZ β€” IaC & Docker Compose

V1
Waarom wordt Docker Compose beschouwd als Infrastructure as Code (IaC)?
V2
Wat doet depends_on in een docker-compose.yml?
V3
Je hebt twee MySQL containers nodig maar ze conflicteren op dezelfde poort. Welke configuratie lost dit op?
V4
Wanneer gebruik je build: ./app in plaats van image: naam in Docker Compose?
vragen correct
07 β€” ⏱ Monitoring & More

⏱ Monitor-stap in DevOps

Monitoring = prestaties en gezondheid van applicaties en systemen in real-time bewaken. Sluit de β™Ύ lus: bij fout/bug β†’ terug naar Plan voor nieuwe code.

Doelen: vroege foutdetectie, minimale downtime, security, betere klantenervaring.

πŸ“Š Drie pijlers van Monitoring

PijlerWat?Gebruik
πŸ“‘ LogsChronologisch record van events met tijdstempelDebugging, security auditing, incident response
πŸ“Š MetricsNumerieke data: CPU, geheugen, response timeReal-time gezondheid, trends, KPIs
🚨 AlertsNotificaties bij drempelwaarden of patronenSnel reageren op problemen

πŸ“‘ Python Logging Module

LevelGebruik
DEBUGGedetailleerde info voor diagnose (niet in productie)
INFOBevestiging dat alles werkt zoals verwacht
WARNINGPotentieel probleem, geen fout maar let op
ERRORSerieus probleem, functie niet uitgevoerd
CRITICALProgramma kan mogelijk niet verder
PYTHON import logging logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) # File handler: logt DEBUG en hoger naar bestand fh = logging.FileHandler('myapp.log') fh.setLevel(logging.DEBUG) # Console handler: enkel ERROR en hoger ch = logging.StreamHandler() ch.setLevel(logging.ERROR) formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s') fh.setFormatter(formatter) ch.setFormatter(formatter) logger.addHandler(fh) logger.addHandler(ch)

πŸ“Š Metrics: Operationele voorbeelden

  • CPU Usage: % CPU-gebruik door de service
  • Memory Consumption: hoeveelheid geheugen in gebruik
  • Network I/O: data in/uit de service
  • Disk I/O: lees/schrijf-operaties op schijf
  • Container Health: status van draaiende containers

πŸ”₯ Prometheus

Open-source monitoring toolkit. Slaat metrics op als time series data (metriek + tijdstempel + labels).

Kenmerken:

  • Pull model: Prometheus haalt zelf metrics op bij targets via HTTP /metrics endpoint
  • PromQL: eigen query-taal voor data analyseren
  • Stand-alone opslag: eigen time series database
  • Configureerbaar via prometheus.yml

βš™ prometheus.yml Structuur

YAML global: scrape_interval: 15s # hoe vaak scrapen scrape_configs: - job_name: 'prometheus' # scrape zichzelf scrape_interval: 15s metrics_path: /prometheus/metrics static_configs: - targets: ['localhost:9090'] - job_name: 'app' # scrape de FastAPI app scrape_interval: 5s # vaker, 5 seconden static_configs: - targets: ['app:8000'] # 'app' = service naam in compose!

Default metrics_path = /metrics. De naam app:8000 verwijst naar de Docker Compose service-naam.

πŸ“ˆ Stack: FastAPI + Prometheus + Grafana

  • FastAPI: app die /metrics endpoint exposeert via prometheus_fastapi_instrumentator
  • Prometheus: scrapet elke 5-15s de /metrics endpoints en bewaart de data
  • Grafana: verbindt met Prometheus als datasource, toont dashboards
# Docker Compose netwerk voorbeeld networks: example-network: driver: bridge ipam: config: - subnet: 172.16.238.0/24

Elk component krijgt een vast IP in hetzelfde subnet. Ze communiceren via service-namen.

πŸ“Š Grafana Dashboard Aanmaken (stappen)

  • Grafana β†’ Data Sources β†’ Add Prometheus
  • Create Dashboard β†’ Add Panel
  • Kies een metric (bv. http_requests_total)
  • Pas labels toe (bv. status="500")
  • Stel filters in (tijdsbereik)
  • Pas chart type en titel aan β†’ Save

🎯 KPIs & SLAs

KPIs (Key Performance Indicators): metrics die direct gekoppeld zijn aan klanteneisen. Voorbeelden voor een API:

  • Response Time: tijd om een request te verwerken
  • Error Rate: % requests met fout
  • Availability: % tijd dat de API bereikbaar is

SLA (Service Level Agreement): formeel contract met concrete service levels. Voorbeelden:

  • Response Time ≀ 300ms
  • Error Rate < 1% per maand
  • Availability β‰₯ 99.95% per maand

SLA niet gehaald? β†’ remediation steps of financiΓ«le compensatie.

🚨 Alerts

Alerts worden getriggerd op basis van:

  • Metrics: bv. CPU > 90% voor 5 minuten
  • Logs: bv. ERROR-patroon gedetecteerd

Alert niveaus (vergelijkbaar met logging levels): Warning, Critical. Bij detectie β†’ team verwittigd β†’ snel actie.

πŸ”¨ Load Testing & Locust

Load testing: simuleren van echte gebruikers of zwaar verkeer om te testen hoe het systeem reageert onder stress.

Waarom nuttig: schaalbaarheid testen, bottlenecks ontdekken, storingen voorkomen bij hoog verkeer.

Wanneer: tijdens de Testing of Monitoring stap van de DevOps lifecycle, of voor grote updates/releases.

Locust: open-source load testing tool. Je schrijft Python-code die gebruikersgedrag simuleert.

🎯 QUIZ β€” Monitoring & More

V1
Wat is het "pull model" van Prometheus?
V2
Welk Python logging level gebruik je voor berichten die enkel nuttig zijn tijdens debugging en niet in productie getoond worden?
V3
Wat is een SLA (Service Level Agreement)?
V4
Waarom is de DevOps lifecycle een ∞ (oneindig) symbool?
V5
In de Prometheus+Grafana+FastAPI setup: welke rol speelt Grafana?
vragen correct