Skip to content

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:

Gerelateerde Interne Documentatie