Kubernetes Pods & Containers

In deze post worden de volgende onderdelen behandeld: hoe applicatieconfiguratie gerealiseerd kan worden via ConfigMaps en Secrets en hoe deze data gekoppeld kan worden aan containers, het beheren van container resources middels resource requests en limits, de inspectie van container health via liveness, startup en readiness probes, de aanpak van restart en self-healing met behulp van restart policies en een eerste kennismaking met multi-container pods.

Application Configuration

Application conifguration is het geven van dynamische waarden naar een applicatie of container gedurende de runtime.

Configmap

Application Configuration kan worden gerealiseerd via een ConfigMap, deze slaan data op in de vorm van een key-value map.

apiVersion: v1 
kind: ConfigMap
metadata:
  name: my-configmap
data:
  key1: value1
  key2: value2
  key3:
    subkey: 
      morekeys: data
      evenmore: some more data
  key4: | 
    multi line data
    is also possible

Secrets

Ook is het mogelijk om key values door te geven via een secret, secrets zijn in essentie hetzelfde als een ConfigMap maar zijn ontwikkeld om vertrouwelijke data zoals API keys veiliger op te slaan

apiVersion: v1 
kind: Secret
metadata: 
  name: my-secret
type: Opaque
data: 
  username: user
  password: mypass

Link

Om een container of pod vervolgens deze data te laten gebruiken kan de volgende template worden gebrukt:

spec:
  containers:
  - . . .
    env:
    - name: ENVVAR 
      valueFrom:
        configMapKeyRef:
          name: my-configmap
          key: mykey

Het is ook mogelijk om de link uit te voeren door middel van een volume mount, deze ziet er als volgt uit:

volumes: 
- name: secret-vol 
  secret: 
    secretName: my-secret

Container Resources

Resource Requrest maken het mogelijk om een hoeveelheid resources te definieren, die een pod kan en mag gebruiken. een ResourceRequest is geen minimum of maximum.

apiVersion: v1 
kind: Pod 
metadata: 
  name: my-pod 
spec: 
  containers:
 - name: busybox
   image: busybox
   resources: 
     requests: 
       cpu: "250m" 
       memory: "128Mi" 

Resource Limits

Resource Limits kunnen zoals de naam zegt gebruikt worden om de hoeveelheid beschikbare resource voor een container te limiteren. Dit wordt gewaardborgt door de container runtime.

apiVersion: v1
kind: Pod 
metadata: 
  name: my-pod 
spec: 
  containers: 
  - name: busybox
    image: busybox 
    resources: 
      limits: 
        cpu: "250m"
        memory: "128Mi"

Container Health

Kubernetes biedt de mogelijkheid tot het inspecteren van de container health, om zo downtime te minimaliseren.

Liveness Probe

Een Liveness Probe kijkt automatisch of de container nog in een gezonde staat is. Op default settings zou Kubernetes een container alleen als down zien als een proces stopt, dit kan worden aangepast met een Liveness Probe.

livenessProbe:
  exec:
    command:
      - cat
      - /tmp/healthy
    initialDelaySeconds: 5
    periodSeconds: 5

Startup Probes

Vrijwel gelijk aan een Liveness probe, echter werken deze niet consistent, maar alleen tijdens het opstarten, waarna de startup probe afsluit als de container succesvol is opgestart.

startupProbe:
  httpGet:
    path: /healthz
    port: liveness-port
  failureThreshold: 30
  periodSeconds: 10

Readiness Probe

Een Readiness probe wordt gebruikt om te kijken wanneer eeen container klaar is om requests te ontvangen, dit houdt in dat een service pas requests naar een pod zal sturen wanneer de readiness probe heeft aangegeven dat de pod klaar is.

readinessProbe:
  exec:
    command:
    - cat
    - /tmp/healthy
  initialDelaySeconds: 5
  periodSeconds: 5

Restart and Self-Healing

Wanneer een container crashed kan Kubernetes automatisch een container restarten. dit wordt vastgesteld op basis van Restart policies.

Always

Always is de default policy, deze houdt in dat een container altijd zal restarten wanneer de pod uit gaat, ook wanneer een container afsluit omdat deze succesvol zijn doel heeft berijkt.

OnFailure

OnFailure kan gebruikt worden om een pod te restarten wanneer deze crashed, dit houdt in dat er niets wordt gerestart op het moment dat een container succesvol zijn doel heeft berijkt.

Never

De container zal hoe dan ook niet restarten.

Multi-container pod

Een multi-container pod heeft meerdere containers, diue dezelfde resources delen, dit kan gaan over dingen als netwerk en opslag.