Kubernetes Fundamentals
Introductie
Deze technische documentatie behandelt de fundamentele concepten van Kubernetes, specifiek toegespitst op de development- en productieomgevingen binnen HappyHorizon Tilburg. De handleiding veronderstelt basiskennis van Unix/CLI-commando's en containerisatie.
Vereiste Software
Voor effectief gebruik van het Kubernetes platform zijn de volgende tools vereist:
| Software | Functie | Minimale Versie | Download Link |
|---|---|---|---|
kubectl |
Kubernetes command-line interface | v1.24+ | kubectl.docs.kubernetes.io |
Google Cloud SDK |
Google Cloud Platform tooling | 440.0.0+ | cloud.google.com/sdk |
Minikube |
Lokale Kubernetes development | v1.30+ | minikube.sigs.k8s.io |
Helm |
Kubernetes package manager | v3.11+ | helm.sh |
kubectx/kubens |
Context en namespace switching | - | github.com/ahmetb/kubectx |
Installatieprocedure
# MacOS installatie via Homebrew
brew install kubectl
brew install google-cloud-sdk
brew install minikube
brew install helm
brew install kubectx
# Verificatie van installaties
kubectl version --client
gcloud version
minikube version
helm version
kubectx --version
Core Concepten
1. Pods
Een Pod vormt de fundamentele deployment-eenheid binnen Kubernetes. Pods bevatten één of meerdere containers die gezamenlijk worden uitgevoerd op dezelfde host met gedeelde netwerk en storage resources.
Belangrijkste Pod-eigenschappen:
- Atomiciteit: Pods worden altijd samen geplaatst en geschaald
- Ephemeral: Pods zijn vergankelijk; bij herstart krijgen ze een nieuwe identiteit
- Shared context: Containers in een pod delen IP-adres, poortruimte en storage volumes
- Single-node: Een pod draait altijd volledig op één node, nooit verdeeld
Voorbeeld van een basis Pod-configuratie:
apiVersion: v1
kind: Pod
metadata:
name: example-pod
labels:
app: web-service
environment: development
annotations:
description: "Voorbeeld pod voor documentatie"
spec:
containers:
- name: nginx
image: nginx:stable
ports:
- containerPort: 80
protocol: TCP
resources:
requests:
memory: "64Mi"
cpu: "100m"
limits:
memory: "128Mi"
cpu: "200m"
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
2. Deployments
Deployments beheren de levenscyclus van Pods en faciliteren gecontroleerde updates van applicaties. Ze bieden declaratieve updates voor Pods en ReplicaSets.
Belangrijkste Deployment-functies:
- Declarative updates: Specificeer gewenste staat in plaats van stapsgewijze instructies
- Rolling updates: Gefaseerde updates zonder downtime
- Rollback capability: Eenvoudig terugdraaien naar vorige versies
- Scaling: Horizontaal schalen van applicatie-instanties
- Pausing/resuming: Tijdelijk pauzeren van updates voor complexe veranderingen
Voorbeeld van een Deployment-configuratie:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment
labels:
app: web-service
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
selector:
matchLabels:
app: web-service
template:
metadata:
labels:
app: web-service
spec:
containers:
- name: nginx
image: nginx:stable
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "100m"
limits:
memory: "128Mi"
cpu: "200m"
env:
- name: ENVIRONMENT
value: "development"
3. Services
Services bieden stabiele netwerk-endpoints voor toegang tot Pods binnen het cluster, ongeacht de levenscyclus van individuele Pods.
Service Types:
- ClusterIP: Default type, intern toegankelijk binnen cluster
- NodePort: Exposeert service op elke Node's IP op een statische poort
- LoadBalancer: Creëert externe cloud load balancer (GCP/AWS/Azure)
- ExternalName: Mappt service naar externe DNS naam
Voorbeeld van verschillende Service types:
# ClusterIP (default) - Intern toegankelijk binnen cluster
apiVersion: v1
kind: Service
metadata:
name: web-service-internal
spec:
selector:
app: web-service
ports:
- port: 80
targetPort: 80
type: ClusterIP
# NodePort - Exposeert service op elke Node's IP
apiVersion: v1
kind: Service
metadata:
name: web-service-nodeport
spec:
selector:
app: web-service
ports:
- port: 80
targetPort: 80
nodePort: 30080 # Optioneel: 30000-32767
type: NodePort
# LoadBalancer - Creëert externe load balancer (GCP)
apiVersion: v1
kind: Service
metadata:
name: web-service-public
spec:
selector:
app: web-service
ports:
- port: 80
targetPort: 80
type: LoadBalancer
4. ConfigMaps & Secrets
ConfigMaps en Secrets beheren respectievelijk configuratiedata en gevoelige informatie, waardoor deze gescheiden blijven van de container images.
ConfigMap gebruiksmethoden:
- Environment variables: Direct injecteren als omgevingsvariabelen
- Command-line arguments: Injecteren als commandline argumenten
- Volume mounts: Mounten als configuratiebestanden
ConfigMap voorbeeld:
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
DATABASE_URL: "mysql:3306"
API_VERSION: "v1"
app.properties: |
environment=development
log.level=INFO
feature.x=enabled
Secret types:
- Opaque: Generieke secrets (default)
- kubernetes.io/tls: TLS certificaten
- kubernetes.io/dockerconfigjson: Docker registry authenticatie
Secret voorbeeld:
apiVersion: v1
kind: Secret
metadata:
name: app-secrets
type: Opaque
data:
# Let op: waardes moeten base64 gecodeerd zijn
database-password: cGFzc3dvcmQ= # 'password' in base64
api-key: VGhpc0lzQVNlY3JldEtleQ== # 'ThisIsASecretKey' in base64
Het gebruik van secrets in een pod:
apiVersion: v1
kind: Pod
metadata:
name: secret-example-pod
spec:
containers:
- name: app
image: example-app:latest
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: app-secrets
key: database-password
volumeMounts:
- name: secret-volume
mountPath: "/etc/secrets"
readOnly: true
volumes:
- name: secret-volume
secret:
secretName: app-secrets
Veelgebruikte kubectl Commando's
De volgende commando's zijn essentieel voor dagelijkse Kubernetes operaties:
Resource Management
# Namespace management
kubectl get namespaces
kubectl create namespace [namespace-naam]
kubectl config set-context --current --namespace=[namespace-naam]
# Pods
kubectl get pods [-o wide]
kubectl describe pod [pod-naam]
kubectl logs [pod-naam] [-c container-naam] [--previous]
kubectl exec -it [pod-naam] -- /bin/bash
kubectl port-forward [pod-naam] 8080:80
# Deployments
kubectl get deployments
kubectl scale deployment [deployment-naam] --replicas=3
kubectl rollout status deployment [deployment-naam]
kubectl rollout history deployment [deployment-naam]
kubectl rollout undo deployment [deployment-naam] [--to-revision=2]
kubectl set image deployment/[deployment-naam] [container]=[image]:[tag]
# Services
kubectl get services
kubectl describe service [service-naam]
kubectl expose deployment [deployment-naam] --port=80 --target-port=8080
# ConfigMaps en Secrets
kubectl get configmaps
kubectl get secrets
kubectl create configmap [naam] --from-file=[bestand]
kubectl create secret generic [naam] --from-literal=key=value
# Context en Namespace
kubectl config get-contexts
kubectl config use-context [context-naam]
kubectl config set-context --current --namespace=[namespace]
Debugging & Troubleshooting
# Diagnostische commando's
kubectl get events --sort-by=.metadata.creationTimestamp
kubectl describe node [node-naam]
kubectl top pods
kubectl top nodes
# Applicatie debugging
kubectl logs [pod-naam] --tail=100
kubectl logs [pod-naam] -f
kubectl exec -it [pod-naam] -- /bin/sh
kubectl debug [pod-naam] -it --image=busybox --target=[container-naam]
# Connectiviteits-testing
kubectl run -it --rm debug --image=busybox -- sh
kubectl run -it --rm debug --image=nicolaka/netshoot -- sh
Lokale Ontwikkeling met Minikube
Deze sectie behandelt het opzetten en gebruiken van Minikube voor lokale ontwikkeling.
Minikube Basisbeheer
# Start minikube met extra resources
minikube start --cpus=4 --memory=8g --driver=hyperkit
# Controleer status
minikube status
# Open dashboard
minikube dashboard
# Integreer Docker met minikube
eval $(minikube docker-env)
docker build -t local-app:latest .
# Stop en verwijder
minikube stop
minikube delete
Verschillen tussen Minikube en GKE
| Aspect | Minikube | GKE |
|---|---|---|
| Schaal | Single-node | Multi-node productie cluster |
| Resources | Beperkt tot lokale machine | Schaalt met cloud resources |
| Persistentie | Beperkte persistentie opties | Volledig beheerde persistent disks |
| Netwerk | Beperkte networking features | Load balancing, ingress, etc. |
| Add-ons | Handmatig te installeren | Voorgeïnstalleerde add-ons |
| Autoscaling | Niet beschikbaar | Horizontale pod/node autoscaling |
| Security | Minimale security features | IAM, RBAC, node security, etc. |
| Monitoring | Beperkte monitoring | Cloud Monitoring en Logging |
Troubleshooting Handleiding
Volg deze systematische aanpak voor het diagnosticeren van veelvoorkomende problemen:
1. Pod start niet (CrashLoopBackOff, ImagePullBackOff, Error)
Diagnostische stappen:
# Bekijk gedetailleerde status
kubectl describe pod [pod-naam]
# Controleer logs
kubectl logs [pod-naam] [-c container-naam] [--previous]
# Bekijk recente events
kubectl get events --sort-by='.lastTimestamp' | grep [pod-naam]
Veelvoorkomende oorzaken en oplossingen:
- ImagePullBackOff
- Controleer image naam en tag spelling
- Verifieer registry credentials
-
Controleer network connectivity naar registry
-
CrashLoopBackOff
- Bekijk container logs voor applicatie errors
- Controleer resource limieten (OOMKilled)
- Verifieer command en arguments
-
Controleer volume mounts en config
-
Error/ContainerCreating
- Controleer node capaciteit
- Verifieer PVC status (bij storage gebruik)
- Controleer node connectivity
2. Service niet bereikbaar
Diagnostische stappen:
# Controleer service definitie
kubectl get svc [service-naam] -o yaml
# Controleer endpoint connectiviteit
kubectl get endpoints [service-naam]
# Verifieer pod selector match
kubectl get pods --selector=app=[app-label]
# Test connectiviteit vanuit cluster
kubectl run -it --rm debug --image=busybox -- wget -O- [service-naam]:[poort]
Veelvoorkomende oorzaken en oplossingen:
- Geen endpoints zichtbaar
- Labels/selectors komen niet overeen
- Pods zijn niet Ready (readiness probe faalt)
-
Pods draaien in andere namespace
-
Service zichtbaar maar niet bereikbaar
- Controleer targeting port vs container port
- Verifieer DNS resolution
- Controleer netwerk policies
- Check firewall regels (bij LoadBalancer/NodePort)
3. Resource Quota's en Limieten
# Controleer resource gebruik
kubectl top pods
kubectl top nodes
# Controleer resource quota's
kubectl describe resourcequota
kubectl describe limitrange
Aanvullende Bronnen
Om je Kubernetes kennis verder te verdiepen, bekijk: