Kubernetes Pod Allocation

In deze post worden de verschillende mechanismen voor het schedulen binnen Kubernetes toegelicht. Er wordt uitgelegd hoe de Kubernetes scheduler een geschikte node kiest voor pods, hoe met behulp van nodeSelector en nodeName de plaatsing kan worden beperkt of specifiek aangewezen, en hoe DaemonSets zorgen voor een consistente deployment van pods op alle nodes. Daarnaast komt ook aan bod hoe static pods en de daarmee samenhangende mirror pods bijdragen aan een alternatieve benadering van podbeheer binnen het cluster.

Scheduling

Kubernetes Scheduler

De Kubernetes scheduler zoekt een geschikte node uit voor elke pod, waarbij deze rekening houdt met:

  • Resource Requests vs. Node Resources
  • Configuratie die scheduling aanpast door node labels

nodeSelector

Een nodeSelector kan worden geconfigureerd om te limiteren op welke nodes een pod geplaatst kan worden. dit gebeurt op basis van labels:

spec:
  containers:
  - name: nginx
    image: nginx
  nodeSelector:
    mylabel: myvalue

Nu zal de nodeSelector deze pod alleen schedulen op een node met het label: mylabel: myvalue

nodeName

nodeName wordt gebruikt om de scheduler volledig te bypassen, door de node waar je een pod wilt hebben staan specifiek te definieren.

spec:
  containers: 
  - name: nginx
    image: nginx 
  nodeName: k8s-worker1 

DaemonSet

Een DaemonSet draait automatisch een kopie van een pod op elke node, ook wanneer er een nieuwe node wordt toegevoegd terwijl de daemonset al bestaat.

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: kube-system
  labels:
    k8s-app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd-elasticsearch
  template:
    metadata:
      labels:
        name: fluentd-elasticsearch
    spec:
      tolerations:
      - key: node-role.kubernetes.io/control-plane
        operator: Exists
        effect: NoSchedule
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      containers:
      - name: fluentd-elasticsearch
        image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log

Pods

Static Pods

Een Static Pod is een pod die direct wordt gemanaged door een kubelet op een node, en niet door de K8S API.

Mirror Pods

Een mirror pod wordt aangemaakt met elke static pod, deze mirror pods maken het mogelijk om de status te zien via de K8S API.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80