π¦ 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
| Tier | Redundantie | Uptime | Max. downtime/jaar |
|---|---|---|---|
| Tier 1 | Geen | 99.67% | 28.8 uur |
| Tier 2 | Gedeeltelijk | 99.74% | 22 uur |
| Tier 3 | Meerdere paden, 1 actief | 99.98% | 1.6 uur |
| Tier 4 | Volledig redundant | 99.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
| Aspect | On-Premise | Cloud |
|---|---|---|
| Kosten | Hoog upfront (CAPEX) | Pay-as-you-go (OPEX) |
| Onderhoud | Eigen IT-team nodig | Provider beheert alles |
| Schaalbaarheid | Moeilijk/traag | On-demand in minuten |
| Betrouwbaarheid | Kwetsbaar voor uitval | Redundante infra wereldwijd |
| Security | Eigen verantwoordelijkheid | Shared 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
| Model | Beschrijving | Verantw. gebruiker | Voorbeeld Azure |
|---|---|---|---|
| IaaS Infra as a Service | Ruwe compute: VM's, opslag, netwerk, OS | Hoog β alles boven hardware | Virtual Machines |
| PaaS Platform as a Service | Pre-configured platforms: DB, webserver, dev-tools | Middel β apps & data | Azure Web Apps |
| SaaS Software as a Service | Kant-en-klare software (e-mail, CRM) | Laag β enkel gebruik | Microsoft 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
π€ Waarom containers?
Probleem: meerdere kleine apps op aparte VM's = verspilling. Elke VM heeft een volledig OS β veel overhead.
π VM vs Container
| Aspect | VM | Container |
|---|---|---|
| OS | Volledige eigen kernel + drivers | Deelt kernel van de host |
| Grootte | Gigabytes (incl. OS) | Megabytes (enkel filesystem) |
| Startup | Minuten | Seconden |
| Isolatie | Volledige hardware-isolatie | OS-niveau isolatie |
| Beheerd door | Hypervisor (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.
π 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
| Commando | Beschrijving |
|---|---|
docker run <image> | Maakt altijd een NIEUWE container aan en start die |
docker run -it | Interactieve terminal (stdin attached) |
docker run -d | Detached mode (achtergrond) |
docker run -p 8080:80 | Port mapping: host:container |
docker run -P | Alle EXPOSED poorten automatisch naar random host-poorten mappen |
docker run -e VAR=val | Environment variabele instellen |
docker run -v host:container | Volume / bind mount koppelen (bv. -v $(pwd):/app) |
docker run --name naam | Container een naam geven |
docker run --network net | Container aan een specifiek netwerk koppelen |
docker ps | Toont draaiende containers |
docker ps -a | Alle 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> sh | Voer 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.
| Type | Beschrijving |
|---|---|
| Volume | Docker-beheerde opslag in /var/lib/docker/volumes. Makkelijk backuppen, deelbaar. |
| Bind Mount | Deelt een map van je computer met de container. Beide zien dezelfde bestanden. |
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
docker run hello-world uitvoert en de image niet lokaal aanwezig is?docker run -it alpine ash, maakt een bestand "hello.txt", en daarna docker run alpine ls. Wat zie je?docker run en docker start?πΈ Methode 1: Instance Promotion (commit)
Start een container interactief β installeer software β commit als image.
π Methode 2: Dockerfile (aanbevolen)
Instructies in een tekstbestand β reproduceerbaar, deelbaar, versiebeheersbaar.
π Dockerfile Instructies
| Instructie | Functie | Voorbeeld |
|---|---|---|
FROM | Basis image (verplicht, eerste lijn) | FROM python:3.9-slim |
RUN | Commando uitvoeren TIJDENS build | RUN apt-get install -y curl |
COPY | Bestanden kopiΓ«ren van host naar image | COPY app.py /app/app.py |
WORKDIR | Werkdirectory instellen | WORKDIR /app |
CMD | Standaard commando bij container start (overschrijfbaar) | CMD ["python","app.py"] |
ENTRYPOINT | Vaste startcommando (niet overschrijfbaar) | ENTRYPOINT ["python"] |
EXPOSE | Documenteert poort (publiceert NIET) | EXPOSE 80 443 |
ENV | Env-variabele (beschikbaar bij build & runtime) | ENV PORT=8080 |
ARG | Build-time variabele (ENKEL tijdens build, NIET bij runtime) | ARG VERSION=1.0 |
ADD | Zoals COPY maar ook URLs en auto-unzip van tar-archief | ADD archive.tar.gz /app/ |
π Volledig voorbeeld: NodeJS app
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).
Twee images met dezelfde base image (bv. Alpine) delen dezelfde onderste laag (zelfde SHA256 hash).
π Push naar Docker Hub
De suffix :latest overschrijft de laatste versie. Gebruik versienummers voor releases (bv. :v1.2.0).
π― QUIZ β Crafting a Container
βΎ 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.
β GitHub Actions β Hoe werkt het?
- GitHub zoekt naar
.ymlbestanden 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
π Workflow Sleutelwoorden
name: naam van de workflowon: trigger-event (push, pull_request, ...)branches: welke branches triggerenjobs: verzameling van takenruns-on: type runner (ubuntu-latest)needs: dependency op andere jobsteps: stappen in een jobuses: gebruik een bestaande Actionrun: shell-commando uitvoerenwith: 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?
| Term | Staat voor | Wanneer bereikt? |
|---|---|---|
| CI Continuous Integration | Automatisch code testen bij elke push | Na de Test-stap in de pipeline |
| CD Continuous Delivery | Software automatisch gereed maken voor deployment (bv. Docker image bouwen) | Na de Release-stap (package/container) |
| CD Continuous Deployment | Software automatisch deployen naar productie | Na de Deploy-stap (live zetten) |
π SonarCloud β Code Kwaliteit
SonarCloud analyseert code automatisch in de pipeline. Issue-categorieΓ«n:
| Categorie | Betekenis |
|---|---|
| π Bugs | Code die onjuist gedrag veroorzaakt (logica-fout) |
| π Vulnerabilities | Security-risico's die dringend gefixed moeten worden (bv. SQL injection) |
| π‘ Security Hotspots | Gevoelige code die een review nodig heeft (bv. encryptie-logica) |
| β’ Code Smells | Slechte 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)
De delivery en deploy jobs draaien parallel omdat ze allebei needs: test hebben (niet van elkaar afhankelijk).
π― QUIZ β DevOps & Pipelines
needs: test in een GitHub Actions job?π Drie Taaltypen
| Type | Hoe? | Build nodig? | Talen |
|---|---|---|---|
| Interpreted | Interpreter leest & voert code lijn per lijn uit (runtime) | Nee | Python, JavaScript, Ruby, PHP |
| Compiled | Compiler vertaalt naar machine code (.exe) voor een specifiek platform | Ja β .exe | C, C++, Go, Rust |
| Hybrid | Compiled naar bytecode (.class), dan geΓ―nterpreteerd door JVM/CLR | Ja β .jar/.dll | Java, 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.
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.
π¦ Maven Commando's
| Commando | Wat doet het? | Output |
|---|---|---|
mvn compile | Compileert .java naar .class bestanden | /target/classes/ |
mvn test | Bouwt code eerst, daarna unit tests uitvoeren | Test-resultaten |
mvn package | Bouwt + test + verpakt in .jar bestand (ook tests) | /target/*.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.
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)
π¦ 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
π³ 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.
β 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 commando | Docker Compose equivalent |
|---|---|
docker run -d --name mydb -p 3307:3306 -e MYSQL_ROOT_PASSWORD=abc123 mysql:latest | Zie YAML hieronder |
β Docker Compose Commando's
| Commando | Functie |
|---|---|
docker compose up -d | Start alle services in achtergrond |
docker compose up --remove-orphans | Start op en verwijdert verouderde containers |
docker compose down | Stop en verwijder containers |
docker compose build | Herbouwt images van Dockerfiles |
docker compose ps | Lijst van alle services in het project |
docker compose -p naam up -d | Deploy met custom projectnaam |
π Containers verbinden + Netwerken
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 containertypeimage: Docker Hub image gebruikenbuild: Dockerfile bouwen (geeft map op)container_name: naam van de containerports: host:container port mappingenvironment: env-variabelenvolumes: persistente opslagdepends_on: wacht op andere servicenetworks: welk netwerk de service gebruiktenv_file: .env bestand ladenrestart: herstart-policy (unless-stopped)
π― QUIZ β IaC & Docker Compose
depends_on in een docker-compose.yml?build: ./app in plaats van image: naam in Docker Compose?β± 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
| Pijler | Wat? | Gebruik |
|---|---|---|
| π Logs | Chronologisch record van events met tijdstempel | Debugging, security auditing, incident response |
| π Metrics | Numerieke data: CPU, geheugen, response time | Real-time gezondheid, trends, KPIs |
| π¨ Alerts | Notificaties bij drempelwaarden of patronen | Snel reageren op problemen |
π Python Logging Module
| Level | Gebruik |
|---|---|
DEBUG | Gedetailleerde info voor diagnose (niet in productie) |
INFO | Bevestiging dat alles werkt zoals verwacht |
WARNING | Potentieel probleem, geen fout maar let op |
ERROR | Serieus probleem, functie niet uitgevoerd |
CRITICAL | Programma kan mogelijk niet verder |
π 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
/metricsendpoint - PromQL: eigen query-taal voor data analyseren
- Stand-alone opslag: eigen time series database
- Configureerbaar via
prometheus.yml
β prometheus.yml Structuur
Default metrics_path = /metrics. De naam app:8000 verwijst naar de Docker Compose service-naam.
π Stack: FastAPI + Prometheus + Grafana
- FastAPI: app die
/metricsendpoint exposeert viaprometheus_fastapi_instrumentator - Prometheus: scrapet elke 5-15s de
/metricsendpoints en bewaart de data - Grafana: verbindt met Prometheus als datasource, toont dashboards
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.