Kubernetes

Containers (zie ook mijn pagina over Docker) zijn populair in het gebruik omdat ze minder resources gebruiken dan complete Virtuele Machines. Voor elke applicatie kunnen één of meerdere containers gemaakt worden en samen vormen zij de complete applicatie. Denk bijvoorbeeld aan een WordPress website container die samenwerkt met een mariaDB database container.

Mocht het complexer worden dan kan ‘Docker Swarm‘ gebruikt worden. Een alternatief is de container-orchestrator ‘Kubernetes‘. Het verschil tussen de twee is niet eenduidig aan te wijzen, alhoewel Kubernetes uitgereider is en meer mogelijkheden geeft om de containers te beheren. Beiden maken gebruik van clusters om hierin de containers te laten ‘draaien’ en managen de schaalbaarheid (en beschikbaarheid) van de applicatie. In dit artikel kijken we naar Kubernetes.

Kubernetes werkt met ‘Environments‘. Elke environment kun je zien als een applicatie met alle bijbehorende onderdelen. In de environment worden de containers gedefinieerd en die worden ‘pods’ genoemd. Er kunnen dus meerdere pods binnen één environment aanwezig zijn, minimaal is één pod de basis. Pods worden onderscheiden met een ‘label‘ ter herkenning. Vervolgens kunnen er TCP-poorten gekoppeld worden naar de ‘buitenkant’ zodat de environment (applicatie) bereikbaar is. Deze poorten worden aangegeven met ‘services‘.

De ‘loadbalancer‘ is een belangrijk onderdeel van Kubernetes en deze heeft als taak om de efficientie van de nodes binnen een cluster te sturen. Dat kan zijn om meerdere nodes bij te schakelen bij hoge belasting van het systeem, of nodes op verschillende (cloud) systemen te groeperen voor een hogere (geografische) bereikbaarheid. Zelfs verschillende cloud- en on-premise systemen kunnen hiermee samenwerken voor hoge beschikbaarheid.

Om kubernetes te kunnen gebruiken op bv. een Mac computer zijn twee componenten noodzakelijk: MiniKube en KubeCTL. Daarnaast heb een hypervisor nodig, bijvoorbeeld VirtualBox.

Installeer KubeCTL met het volgende commando (MacOS):

$brew install kubernetes-cli

Installeer MiniKube (v0.31.0) met het volgende commando (MacOS):

$curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.31.0/minikube-darwin-amd64
$chmod +x minikube
$sudo cp minikube /usr/local/bin/
$rm minikube

Om nu een Kubernetes cluster te starten, geef het volgende commando:

$minikube start

Dit zal een VM aanmaken in bv. VirtualBox en de status hiervan kan opgevraagd worden met:

$minikube status

Om nu docker te laten connecten met de minikube VM dienen de variabelen bekend gemaakt te worden:

$eval $(minikube docker-env)

en hierna kunnen de docker containers getoond worden met:

$docker ps

Nu kunnen ‘environments’ met ‘pods’ gemaakt worden! Laten we een TomCat webservers starten met behulp van Kubernetes. Eerst maken we een directory genaamd tomcat met hierin een deployment.yml bestand.

$mkdir tomcat
$cd tomcat
$vi deployment.yml

De inhoud van deployment.yml:

apiVersion: apps/v1beta2
kind: Deployment
metadata:  
name: tomcat-deployment
spec:
  selector:
    matchLabels:
      app: tomcat
  replicas: 1
  template:
    metadata:
      labels:
        app: tomcat
    spec:
     containers:
     - name: tomcat
     image: tomcat:9.0
     ports:
     - containerPort: 8080

Meer details over de commando’s kan hier gevonden worden: https://kubernetes.io/docs/reference/kubectl/cheatsheet/

Om nu dit deployment-bestand te gebruiken en te starten zodat de TomCat server bereikbaar is op de aangegeven port 8080, dienen twee commando’s gegeven te worden. De eerste zal het deployment-bestand inlezen en pods aanmaken (kubelet) en het tweede commando ‘exposed‘ de TCP port van de node naar de buitenwereld. MiniKube (kube-proxy) zal een lokale poort ‘mappen’ naar deze poort 8080 en we vinden de URL hiervoor met het derde commando.

$kubectl apply -f ./deployment.yml
$kubectl expose deployment tomcat-deployment --type=NodePort

$minikube service tomcat-deployment --url

Nu kan TomCat server op mijn systeem bereikt worden op http://192.168.99.100:32741

Andere commando’s:

$kubectl get pods
$kubectl port-forward tomcat-deployment-56ff5c79c5-7gjwg 8080:8080
$kubectl attach tomcat-deployment-56ff5c79c5-7gjwg
$kubectl exec -ti tomcat-deployment-56ff5c79c5-7gjwg bash