Doel
Dit de eerste in een over een jaar lopende reeks van samenhorende computerprojecten.
In deze projecten ga ik proberen een volledige en realistische eCommerce-applicatie “demo-shop” te ontwikkelen.
Tegelijk wil ik ook een een software-fabriek uitbouwen in de vorm van geautomatiseerde CI/CD pipelines.
De resulterende applicatie zal gedeployed worden in een kubernetes-omgeving en ook publiek toegankelijk gemaakt worden.
De applicatie met gebruikte infrastructuur wil ik ook voorzien van monitoring en een notificatie-systeem voor probleem-melding.
Applicatie-development en -operaties worden zoveel mogelijk geautomatiseerd en herbruikbaar gemaakt voor andere toekomstige applicaties.
In deze eerste oplevering wil ik volgende zaken realiseren:
- installeer en maak kennis met kubernetes
- deploy bestaande zelfgemaakte applicaties in een kubernetes cluster
- ontwerp een real-world eCommerce applicatie,
en maak de overeenkomstige applicatie-documentatie met diagramma’s aan - maak schema-migratie en (test)data-migratie scripts voor de database aan
- ontwikkel de core van de full-stack web-applicatie met externe configuratie en logging
- ontwikkel web-services die REST en gRPC als API protocol gebruiken
- maak het eerste, snelle build-gedeelte van een CI pipeline aan
met compile, unit tests, code coverage checks, static code analysis checks en SBOM generation - dit snelle build-gedeelte van een CI pipeline moet automatisch uitgevoerd worden,
voordat een feature branch gemerged wordt in de master branch van de source code repo;
nog beter is deze static code analysis checks ook lokaal uit te voeren vooraf aan iedere commit - uitvoering van manuele tests door individuele developer
(aparte applicatie runtime environment “local-devapp” per developer nodig)
Dit project zorgt dus voor de realisatie van volgende (blauwe) gedeeltes van de pipelines:
Resultaat
1 - Installeer en bestudeer Kubernetes
Om de portabiliteit, schaalbaarheid en beschikbaarheid van mijn programma’s te verhogen,
ga ik kubernetes als software-platform gebruiken voor container orchestration.
Portabiliteit betekent dat kubernetes zowat op alle linux distros kan geïnstalleerd en gebruikt worden,
om applicaties schaalbaar en met hoge beschikbaarheid te deployen.
Kubernetes is hierdoor zowat de standaard geworden in bedrijven en voor Cloud providers.
Als eerste heb de architectuur en basiswerking van Kubernetes geleerd via een online cursus.
Daarna heb ik verschillende kubernetes distros vergeleken, en “K3s/K3d” als lichtgewicht implementatie gekozen
(vs standard kubernetes K8s, Openshift, Talos Linux, Minikube, Kind, Microk8s).
Om kubernetes te installeren, diende ik hardware en virtuele machines te voorzien.
Daarna diende ik hierop de gewenste cluster architectuur en namespaces uit te bouwen.
Ik creeerde volgende 3 kubernetes-omgevingen:
- kubernetes cluster “local-devapp” voor local development en exploratie:
op mijn development pc/laptop installeerde ik “Rancher Desktop”;
ik maakte gebruik van een one-node-cluster met K3s en een multi-node-cluster met K3d,
die dynamisch gecreeerd en verwijderd worden wanneer nodig - kubernetes cluster “home-devdep” voor centrale app development en deployment tools:
ik maakte hiervoor gebruik van een one-node-cluster met K3s,
en kocht hiervoor een refurbished business-grade machine aan;
later kan deze cluster uitgebreid worden met extra nodes - kubernetes cluster “home-prodapp” voor in productie gedeployde applicaties:
ik maakte hiervoor gebruik van een one-node-cluster met K3s,
en kocht hiervoor een refurbished business-grade machine aan;
later zal deze cluster uitgebreid worden met extra nodes
De aankoopprijs van deze 2 machines moest binnen mijn jaarlijks budget van 500 eur vallen.
Ik kocht volgende 2 gereviseerde business-grade mini pc’s met een laag energieverbruik,
en installeerde hierop K3s Kubernetes:
HP EliteDesk 800 G5 USFF - Intel Core i5-9e Gen (6 cores/6 threads) - 16 GB DDR4 SDRAM - 256 GB SSD
2 - Deploy bestaande applicaties in Kubernetes
2.1 - Bestudeer application deployment in Kubernetes
Ik leerde als eerste om applicaties te deployen en gebruiken op “home-prodapp” kubernetes cluster.
Kubernetes geeft ondersteuning om de schaalbaarheid en beschikbaarheid te verbeteren in 3 belangrijke domeinen:
- computing resources:
deze worden “Workloads” genoemd in Kubernetes;
kubernetes specifieert “Long-Running / Continuous” workload types (DaemonSet, Deployment, StatefulSet),
en “Batch / Scheduled” workload types (Jobs, CronJobs);
in deze post zullen we enkel “DaemonSet”, “Deployment” en “StatefulSet” als workload types bekijken - storage resources:
deze worden “Volumes” genoemd in Kubernetes;
kubernetes specifieert vele types die opgedeeld worden in “Ephemeral & Temporary”, “Node-Local” en “Persistent & Networked” volume types;
in deze post zullen we enkel “emptyDir” & “configMap” & “secret” als Ephemeral,
“hostPath” als Node-Local en “nfs” & “csi” als Persistent volume types bekijken - networking resources:
deze worden “Services, Load Balancing, and Networking” genoemd in Kubernetes;
kubernetes specifieert “ClusterIP” (default), “NodePort”, “LoadBalancer”, “ExternalName” en “HeadlessService” als service types;
in deze post zullen we enkel “NodePort” en “LoadBalancer” als service types bekijken
Voor de studie van deze kubernetes support voor applicaties, creeerde ik 2 namespaces in de “home-prodapp” cluster:
- “ops” namespace:
hierin zullen app en infra monitoring tools geinstalleerd worden;
op dit ogenblik werden nog geen tools geselecteerd, en zal “nginx” als vervanger voor leerdoeleinden gebruikt worden - “demo” namespace:
hierin zullen de reeds bestaande, zelf gemaakte “demo_hello2” en “demo_todo2” app opnieuw geinstalleerd worden

2.2 - Deploy nginx app als DaemonSet workload
Using kubectl and raw kubernetes manifests (in yaml);
Kubernetes “DaemonSet” as workload type and “emptyDir” & “nfs” as volume types
2.3 - Deploy demo-hello app als Deployment workload
Using config management tools: Helm (vs Kustomize);
Kubernetes “Deployment” as workload type and “configMap” & “secret” as volume types
2.4 - Deploy demo-todo app met database als StatefulSet workload
Using popular tools: k9s, kubectx & kubens, kube-ps1, stern, kubetail, kube-shell, kubeadm;
Kubernetes “Deployment” & “StatefulSet” as workload types
and “hostPath” & “nfs” & “csi” (Container Storage Interface) as volume types;
Kubernetes controller vs operator;
Using “MariaDB Community operator” for database scaling and backup
2.5 - Maak Kubernetes applicaties publiek toegankelijk
Make “demo_hello2” and “demo_todo2” publicly accessible,
using Cloudflare Tunneling and Kubernetes “LoadBalancer” service type
3 - Ontwerp de demo-shop applicatie en creëer database
4 - Onwikkel web gui en services met initiele applicatie logica
5 - Aanmaak van eerste unit tests en CI pipeline
Kubernetes CI Tools: Forgejo Actions (vs GitHub/Gitlab Actions, Jenkins Pipelines)
6 - Vervolledig eerste versie van demo-shop app en CI pipeline
maak het eerste, snelle build-gedeelte van een CI pipeline (Continuous Integration) aan met:
- compile
- unit tests
- code coverage checks
- static code analysis checks:
“secret scanner”,
“software composition analysis” aka SCA,
en “static application security testing” aka SAST - “software bill of materials” (aka SBOM) generation
7 - Deploy demo-shop app in Kubernetes
Automatiseer deployment in Kubernetes
Kubernetes GitOps CD Tools: FluxCD (vs ArgoCD, Jenkins-X)