Cloud Republic

Applicatie uitrollen met Kubernetes

applicatie uitrollen met Kubernetes
In deze blog geven we je een volledig lesje over wat Kubernetes (K8s) is, hoe je het gebruikt en hoe je ermee start. Ook rollen we een voorbeeld applicatie uit in Wordpress.

In deze blog ga ik uitleggen wanneer je Kubernetes kan gebruiken, hoe je ermee kunt starten op AKS en hoe je een applicatie kunt uitrollen. Als voorbeeld gaan we een wordpress applicatie uitrollen op Kubernetes.

Waarom heb ik Kubernetes nodig

Ik hoor vaak het argument: “Waarom zou ik Kubernetes gebruiken, we hebben alles via Paas en Faas.” Wij vanuit Cloud Republic kiezen ook meestal voor een serverless architectuur. Serverless is lekker schaalbaar, gemakkelijk om mee te starten en goedkoop. Echter is Kubernetes ook geen vervanging voor Paas of Faas maar juist is een toevoeging aan je toolbox.

Je kan een hele hoop oplossingen kwijt in Paas en Faas maar niet voor alles is Paas of Faas de juiste oplossing. Bijvoorbeeld:

  • Als je complexe architecturen hebt kan dit een uitdaging zijn; Als je software of odbc drivers moet installeren op de host om je applicatie werkend te maken, speciale versies van frameworks nodig hebt of applicaties zoals een Jenkins server of een Zalenium test platform moet hosten.
  • Als je volledige controle wilt hebben over je infrastructuur; Je wilt bijvoorbeeld controle over de manier van schalen of het maximum aantal instanties, of je wilt een blue-green deployment doen.
  • Als je legacy applicaties wilt hosten.
  • Als je geen vendor lock wilt hebben; Je kan je containers gemakkelijk verplaatsen naar een andere cloud provider of naar je eigen datacenter.
  • Als je data niet in de cloud mag staan; Kubernetes is dan zeker een goed alternatief.
  • Als de applicaties schaalbaar zijn tot een aantal instanties; Op een paas omgeving kun je standaard niet verder schalen dan 20 instanties in serverless is standaard het maximum instanties gelimiteerd tot 200.
  • Als je een standaard deploy methode hebt voor elke applicatie; Het maakt niet uit of je een Nodejs, een .Net Core of een Java applicatie of een standaard CMS systeem. De deploy methode is altijd het uitrollen van een container welke alle dependencies bevat.

Hoe Kubernetes je kan helpen

Kubernetes, ook wel k8s genoemd, is een open-source systeem beheerder van grote groepen containers en containerized applicaties. Met de software zijn containers te groeperen en eenvoudig(er) te beheren. Kubernetes kan je onder andere helpen met de volgende zaken:

1. Service discovery en loadbalancing

Kubernetes kan de load van applicaties verdelen over de verschillende instanties van de applicatie zodat de load verdeelt wordt over de verschillende instanties. Als je de applicatie gaat schalen zullen de nieuwe instanties worden toegevoegd aan de interne dns server en wordt het binnenkomend verkeer verdeeld over de nieuwe instanties.

Elke pod waar Kubernetes een poort heeft gepubliceerd zal bereikbaar zijn doormiddel van een service (bijv. een database server.) Deze services worden toegevoegd aan een service registry. Als een pod vervolgens verbinding wil maken met de database pod gaat dit via de service. Aan het service registry zal gevraagd worden naar welk endpoint er verbonden dient te worden. Mocht er een service bijkomen of mochten er meer pods beschikbaar zijn door een schaling, dan worden deze toegevoegd. Mocht er één niet meer werken dan wordt de service registry bijgewerkt.

Applicatie uitrollen op Kubernetes

2. Storage orchestration

In Kubernetes heb je de mogelijkheid om een gedeelde storage in te stellen op je cluster. Stel je voor dat je een MySql server draait dan wil je niet dat als je MySql container stuk gaat en je database weg, is omdat deze werd opgeslagen in je container.
Belangrijke data, die je niet kwijt wilt raken, moet je niet in je container opslaan. Je kan hiervoor een persistant volume aanmaken en deze koppelen aan een folder in je container. Zo staanje database bestanden op een plaats buiten je container, wanneer je deze gaat schalen a of deze niet meer werkt. Tevens is het gemakkelijker om je bestanden te backuppen op een gedeelde storage dan in verschillende containers.

Er zijn veel providers welke ondersteuning bieden aan Kubernetes:

  • awsElasticBlockStore
  • azureDisk
  • azureFile
  • gcePersistentDisk
  • iscsi
  • local
  • nfs

kubernetes

3. Geautomatiseerd applicaties updaten en terug rollen

In Kubernetes kun je geautomatiseerd je applicaties updaten zonder downtime. Je kan opgeven hoeveel pods er offline mogen zijn tijdens een update van de applicatie en kunt ook opgeven dat er extra pods moeten worden aangemaakt tijdens de update. Zo blijft je applicatie op de gewenste hoeveelheid instanties. Mocht de nieuwe versie toch niet goed zijn, dan is deze gemakkelijk terug te rollen omdat Kubernetes een history bijhoudt van de gedeployde versies.

kubernetes

4. Automatische verdeling van resources

Kubernetes verdeeld automatisch de containers over de nodes gebaseerd op de resource requirements en de beschikbaarheid op de nodes. Nodes kunnen worden voorzien van labels zodat alleen bepaalde workloads daar mogen draaien. Dit is iets anders als loadbalancing, bij loadbalancing wordt de load verdeelt over meerder pods maar deze zouden best op dezelfde node kunnen staan. Hierdoor zou een node het een stuk drukker krijgen dan een andere node in je cluster.

kubernetes

5. Automatische herstelling

Mocht er een workload niet meer goed functioneren dan kan Kubernetes zelf een nieuwe versie van de pod opstarten. Of de pod nog goed functioneert kan op meerdere manieren gecontroleerd worden.

In een Dockerfile is een ENTRYPOINT gedefinieerd . Zodra dit proces niet meer beschikbaar is zal de pod gestopt worden.

FROM mcr.microsoft.com/dotnet/core/runtime:3.1
COPY --from=build-env /app/out .

# Start
ENTRYPOINT ["dotnet", "AuditlogService.dll"]

In een pod definitie kun je een livenessProbe instellen met bijvoorbeeld een URL. De URL wordt gecontroleerd en wanneer de response van de URL anders is dan een status code 200, zal de pod als unhealthy worden gezien.

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: auditlogservice
  name: auditlogservice
spec:
  containers:
  - image: marcoippel/auditlogservice:1.0
    name: auditlogservice
    resources: {}
    livenessProbe:
      httpGet:
        path: /health
    readinessProbe:
      httpGet:
        path: /ready
  dnsPolicy: ClusterFirst
  restartPolicy: Never
status: {}

6. Secret en configuration beheer

In Kubernetes kun je secrets en configuraties aanmaken die gebruikt kunnen worden in de applicaties. Deze objecten zijn op alle nodes beschikbaar en worden beheerd door Kubernetes. Secrets en configuraties kunnen worden uitgelezen als environment variabelen of als een volume worden gemount in de pod.

kubernetes

Hoe begin je met Kubernetes

Het is aan te raden om een managed instantie van Kubernetes af te nemen bij een public cloud provider. Bij een managed Kubernetes instantie hoef je je niet meer druk te maken over de installatie en configuratie van het cluster. Het kost namelijk veel tijd om een goed werkend en een veilig cluster te bouwen. Je moet blijven monitoren of het cluster nog goed werkt en zelf alerts instellen om op de hoogte gehouden te worden als het cluster niet goed functioneert. Omdat Kubernetes zo uitgebreid is kan er ook veel misgaan, waardoor je zelf moet gaan troubleshooten en oplossen.

Er zijn heel veel varianten van Kubernetes te krijgen. Enkele voorbeelden zijn:

In deze blog gaan we het verder over AKS hebben, dit is de managed Kubernetes oplossing van Azure.

Wat is AKS

AkS staat voor Azure Kubernetes Service, een managed service van Azure om je Kubernetes workload op te draaien. AKS is volledig in Azure geïntegreerd, het maakt bijvoorbeeld gebruik van Azure monitoring en alerting. Je kunt bijvoorbeeld zien wat de status is van je cluster en hoe je containers draaien. Je kunt op containerniveau inloggen en de logfiles per container bekijken. Ook kan je door middel van een terminal direct inloggen op de container. Azure DevOps heeft een hele goede integratie met AKS wat het mogelijk maakt om gemakkelijk applicaties te deployen op je Kubernetes cluster. In een andere blog zal ik in detail ingaan op DeVops in combinatie met Kubernetes.

kubernetes

Een overzicht van de monitoring in AKS.

Hoe installeer je AKS

AKS kun je volledig installeren door middel van de Azure cli. Voer onderstaande commando’s uit om AKS te installeren.

# maak een resource groep aan.
az group create --name kubernetesdemo --location west-europe

# maak een kubernetes cluster aan met twee workers.
az aks create --resource-group kubernetesdemo --name demo --node-count 2 --enable-addons monitoring --generate-ssh-keys

# installeer kubectl als deze nog niet id geinstalleerd
az aks install-cli

# haal de credentials op van je cluster en voeg deze toe aan je kubectl config
az aks get-credentials --resource-group kubernetesdemo --name demo

Nu ben je klaar om applicaties te deployen op Kubernetes.

Hoe deploy je applicaties op Kubernetes

Kubernetes bestaat uit verschillende componenten, namelijk:

  • Een ingresscontroller: Een soort van reverse proxy welke het verkeer op basis van de inkomende url het verkeer naar een bepaalde service kan sturen.
  • Een service: Een object wat een pod exposed naar buiten. De reden dat hier een apart object voor gebruikt wordt, is dat je voorkomt dat, wanneer je een pod connect op het ipadres en de pod wordt verplaatst naar een andere node, je een ander ip-adres krijgt.
  • Een pod: Een wrapper om een of meerdere containers.
  • Een persistant volume claim: Een reservering op een persistant volume.
  • Een persistant volume: Een stuk storage wat beschikbaar is gesteld door een administrator.
  • Een secret: Een object waar je gevoelige informatie kunt opslaan en beheren, zoals wachtwoorden, OAuth-tokens en ssh-sleutels.

Om componenten uit te rollen op Kubernetes moeten we deze beschrijven in yaml. Deze yaml zal vervolgens worden geserialiseerd naar Kubernetes objecten.

Een voorbeeld Wordpress applicatie uitrollen op Kubernetes

Om een voorbeeld wordpress applicatie uit te rollen hebben we de volgende yaml nodig:

apiVersion: v1
kind: Namespace
metadata:
  creationTimestamp: null
  name: wordpress
spec: {}
status: {}
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: demo 
  namespace: wordpress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: demo-kubernetes.westeurope.cloudapp.azure.com
    http:
      paths:
      - backend:
          serviceName: wordpress
          servicePort: 80
        path: /
---
apiVersion: v1
data:
  password: d2Vsa29tMDE=
kind: Secret
metadata:
  creationTimestamp: null
  name: mysql-pass
  namespace: wordpress
---
apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
  namespace: wordpress
spec:
  ports:
    - port: 3306
  selector:
    app: wordpress
    tier: mysql
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  labels:
    app: wordpress
  namespace: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
  namespace: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim
---
apiVersion: v1
kind: Service
metadata:
  name: wordpress
  labels:
    app: wordpress
  namespace: wordpress
spec:
  ports:
    - port: 80
  selector:
    app: wordpress
    tier: frontend
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wp-pv-claim
  labels:
    app: wordpress
  namespace: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
  labels:
    app: wordpress
  namespace: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: frontend
    spec:
      containers:
      - image: wordpress:5.3.2-apache
        name: wordpress
        env:
        - name: WORDPRESS_DB_HOST
          value: wordpress-mysql
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 80
          name: wordpress
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /var/www/html
      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: wp-pv-claim

We kunnen deze yaml uitvoeren door het volgende commando uit te voeren:

 
kubectl apply -f wordpress.yaml

Dit commando zal de yaml naar de api sturen van Kubernetes en de objecten aanmaken of updaten. Als alles goed is gegaan hebben we de onderstaande applicatie uitgerold:

kubernetes

Moet ik al die yaml zelf typen?

De wordpress applicatie bestaat uit ongeveer 171 regels yaml code welke ook nog eens op de juiste manier moet inspringen. Moet je dat echt allemaal zelf typen? Nee gelukkig niet! Je kunt het grootste deel van de yaml laten genereren, zoals ik je hieronder laat zien. Als voorbeeld nemen we een deployment object.

 
kubectl create deployment my-dep --image=busybox -o yaml --dry-run > deployment.yaml

We maken hier een deployment aan met als naam my-dep, als image gebruiken we busybox. We doen een dry-run zodat we niets aanmaken en doen een output naar yaml. Dit alles schrijven we weg in een deployment.yaml bestand. Dit kunnen we doen voor al de objecten die we nodig hebben.

Het resultaat ziet er als volgt uit:

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: my-dep
  name: my-dep
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-dep
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: my-dep
    spec:
      containers:
      - image: busybox
        name: busybox
        resources: {}
status: {}

Welke resources zijn handig om te bekijken

  • Ik luister graag in de auto naar podcasts. Een hele goede podcast is die van Bret Fisher. Hij is een docker captain en hij heeft elke week een live stream op youtube en hij maakt hier ook podcasts van alles gaat over docker, docker swarm en Kubernetes.
  • Als je wilt beginnen met Kubernetes op je computer dan is k3d een hele goede optie. Het is een gestripte versie van Kubernetes met een hele handige installer erbij.
  • Als je aan de slag wilt met Kubernetes en niet meteen een cluster op je pc wilt installeren dan kun je terecht op Katakoda. Het is een omgeving waar je voor een uur een tijdelijk cluster kunt starten. Er zijn ook korte cursussen aanwezig welke je dan kunt uitvoeren op het cluster.
  • Als je iets langer wilt spelen met Kubernetes dan kun je terecht op play with Kubernetes. Dit is ook een gevirtualiseerde omgeving welke 4 uur beschikbaar is.
  • Mocht je een cursus willen doen, dan kan ik je echt de cursussen aanraden van KodeKloud op udemy. Dit zijn hele duidelijke cursussen en als bonus heb je toegang tot een online leeromgeving waar je allerlei opdrachten kunt uitvoeren.

Conclusie

Ondanks dat Kubernetes een enorme steile leercurve heeft, is het wanneer je het eenmaal door hebt een geweldig platform om je applicaties op te hosten. Je kunt er alle complexe applicaties op hosten maar je kunt er ook gewoon je Azure functions op hosten. Je hebt met Kubernetes een volledige gereedschapskist om al je oplossingen in te hosten. Met een hosted oplossing op bijv. AKS wordt al heel veel complexiteit uit handen genomen.

Meer tips & nieuws van onze developers

Cloud Solutions Architect
Aan het woord

Cloud Developer aan het woord: Daan

Cloud Solution Architect Daan startte twee jaar geleden bij Cloud Republic. Hoewel hij niet per se op zoek was naar een nieuwe uitdaging, is hij

blogs

Afstuderen bij Cloud Republic

In februari startten Luca, Nadim en Remco als afstudeerstagiairs bij Cloud Republic, met ieder hun eigen opdracht. Wij vroegen de stagiairs hoe hun eerste maand

Altijd de laatste .NET trends en development nieuws in je inbox?

Schrijf je in voor Dev News, onze nieuwsbrief. Zo weet je zeker dat altijd op de hoogte blijft van de laatste trends & ontwikkeling die voor jou relevant zijn.

Cloud Republic

Janssoniuslaan 80

3528 AJ Utrecht

 

info@cloudrepublic.nl