Innovatie & Strategie

Dit is een bijdrage van Itility
Cloud
Deep dive in Kubernetes en StorageOS

Deep dive in Kubernetes en StorageOS

Leer meer over Kubernetes in de deep dive van onze stack engineer Dennis Verdonshot.

1 november 2019
Door: Itility, partner

Leer meer over Kubernetes in de deep dive van onze stack engineer Dennis Verdonshot.

Kubernetes is een container orchestration tool, ook wel k8s genoemd. Het is in 2014 ontwikkeld door Google en is vanaf versie v1.0 overgedragen aan de Cloud Native Foundation. Sindsdien is Kubernetes hard gegroeid. Binnen onze Itility Stack Community hebben we er alleen nog niet mee kunnen spelen. Daarom besloot ik mezelf te trakteren op een deep dive, waarover ik in dit blog mijn bevindingen deel.

De Kubernetes-tool maakt het mogelijk containerapplicaties te gebruiken op elke cloud en ze te beheren zoals je dat zelf wil. Het is het ideale platform voor applicaties die gebaseerd zijn op een microservices-architectuur. Interessant, want veel bedrijven onderzoeken de mogelijkheden van containers om software efficiënter in te zetten en development teams te versnellen. 

Mijn reis door Kubernetes
Samen met een vriend ben ik flink wat weekenden bezig geweest om Kubernetes en Linux te leren kennen. Toen we begonnen hadden we allebei veel ervaring met Virtual Machine-technologie, maar containers waren voor ons beiden nieuw terrein. Daarnaast moesten we de fijne kneepjes van Linux nog leren kennen. 

Het installeren van Kubernetes was in het begin een uitdaging op zichzelf. Je kunt kiezen uit vele configuraties en vele manieren om die te installeren. Na een aantal weken proberen kregen we het door en begonnen we langzaam de automation tools te gebruiken. Hoewel netwerk en storage lastig bleef. Helemaal als je dit zelf op VM’s in een thuis gehoste Linux-omgeving probeert uit te voeren.

Mijn Linux stack
Mijn basic desktop gebruikte ik als ‘server’. Deze beschikt over veel RAM en snelle opslag. Hij heeft een Ryzen gen1-processor met 32GB RAM en een snelle SSD op M2. Verder draait hij Proxmox – een open source virtualisatieomgeving gebaseerd op KVM. Deze draait VM’s op dezelfde manier als vCenter. 

Weergave van een Kubernetes-cluster

Een van de VM’s op mijn computer is een Gitlab-server die code opslaat, alles documenteert en CI/CD pipelines runt. Er draait ook een Puppet-server die alle VM’s na de initiële deployment in desired state houdt via een Gitlab CI/CD pipeline. Het Kubernetes-cluster draait op 4 CentOS7 VM’s en is gedeployed met Kubespray. Kubespray is een Github-project dat gebruik maakt van Ansible om automatisch Kubernetes op verschillende systemen te deployen.

Hoe Kubernetes werkt
Eerst iets over Kubernetes, want wat is het precies? Een container orchestration tool die container images kan deployen vanuit een container registry. Het voegt mogelijkheden toe zoals service, storage orchestration, geautomatiseerde rollouts en rollbacks, self-healing en secret management. Al die functies samen zorgt Kubernetes voor het maken en beheren van containers op enterprise-niveau.

Een voorbeeld: als een WordPress-applicatie communiceert met een database-dienst in een andere container, kun je een configuratiebestand maken waarin je opgeeft welke services je wilt aanspreken, hoe deze met elkaar moeten communiceren en hoe deze gebruikt moet worden. Als de applicatie eenmaal draait, zorgt Kubernetes voor zaken als schalen, de failover en load balancing.

De Kubernetes pod
Een pod is een groep containers met shared storage, netwerk en namespaces die samen worden geclusterd. Pods zijn tijdelijke entiteiten; wat betekent dat als een pod wordt beëindigd, je deze niet meer kan activeren. Er moet dan een nieuwe pod worden aangemaakt. Het is dan ook essentieel om goed na te denken over hoe je je data opslaat. Want als je storage ook tijdelijk is, wordt deze ook verwijderd als de pod ophoudt te bestaan. Verderop in deze blog ga ik dieper in op storage en leg ik uit hoe je persistent storage zo inricht dat je data veilig blijft. 

Helm: flexibele configuratie
Kubernetes is geconfigureerd om met behulp van Helm eenvoudig applicaties uit te rollen op basis van Helm configuration files. Hoewel Kubernetes zelf ook containers en objecten kan deployen met kubectl en YAML-bestanden, wordt dit al snel complex. Je moet namelijk alle objecten opzetten en daarbij ook configureren hoe deze samenwerken.

En daar helpt Helm je. Want Helm kan complete sets van containers en objecten deployen dankzij zogenoemde charts. Een soort packages die het mogelijk maken om standaard, geconfigureerde charts te gebruiken en deze naar wens aan te passen. Dit helpt applicaties snel te deployen. 

Helm zelf is een command line-tool die een container genaamd Tiller gebruikt om te communiceren met je Kubernetes-cluster. Met de Helm command feature kun je in één command eenvoudig voorgeconfigureerde charts deployen vanuit de Helm-repository. In een later stadium kun je de lifecycle beheren of verwijderen wat je hebt gedeployd.

Custom config files
Laten we eens kijken hoe eenvoudig Helm werkt, ook als je custom configuratie wil toevoegen. De eerste stap is het inspecteren van de chart, je doet dat door het volgende te typen:

          helm inspect values stable/mariadb 

Nu kun je de config .yaml file aanpassen en alle opties opzoeken zoals extra persistent storage. In onderstaand voorbeeld activeren we de persistent storage om een persistent volume claim te gebruiken dat speciaal voor onze MariaDB deployment is voorgeconfigureerd:

          persistence:
            enabled: true    # Enable persistence using an existing PVC    
            existingClaim: mariadb-pvc
            mountPath: /bitnami/mariadb

Sla het bestand nu op als config.yaml en run het:

          helm install -f config.yaml stable/mariadb 

Dit maakt werken met Kubernetes zo makkelijk – of je nu MariaDB installeert of zelfs een opslagdienst als StorageOS. Voer een helm install uit samen met de config files die je gespecificeerd hebt en klaar ben je. 

Kubernetes en StorageOS

Storage

Tot zover het eenvoudige deel. De grote uitdaging begint zodra je storage wil regelen binnen Kubernetes. Als je je Kubernetes deployed op Google Cloud krijg je daar een kant en klare StorageClass bij die binnen enkele minuten gebruiksklaar is. 

Een StorageClass gebruik je om een stuk persistent storage te creëren door een PVC (Persistent Volume Claim) te maken met de naam van de StorageClass erin. De StorageClass creëert vervolgens automatisch een PV (Persistent Volume) die de storage levert en garandeert dat de data bewaard blijft wanneer een container wordt beëindigd.

Maar: als je Kubernetes buiten een grote cloud provider gebruikt, of op Linux VM’s, is er geen kant en klare StorageClass beschikbaar. De opties die overblijven: je lokale folder, NFS storage en iSCSI. Voor al deze opties moet je PV’s en PVC’s maken, wat veel werk kost om te onderhouden. Daarnaast is het lastig te automatiseren, want de kans op dataverlies neemt toe op het moment dat je een fout maakt. 

Kortom, kan dit makkelijker? Er zijn wel manieren om een storage provider te installeren die Storage Classes levert op ijzer of VM Kubernetes-installaties. Helaas waren de meeste zo beperkt dat ik ze niet kon gebruiken in mijn kleine thuislab. Na een aantal opties te hebben geprobeerd, kwam ik erachter dat StorageOS wel een manier biedt om StorageClasses te maken.

StorageOS

StorageOS

StorageOS biedt cloud-native persistent software-defined storage voor containers. Het kan eenvoudig worden geïnstalleerd via Helm en integreert met Kubernetes. StorageOS creëert persistent volumes in een map en repliceert deze naar andere nodes met behulp van een storage pool. Hierdoor zijn ze high available en uitbreidbaar. StorageOS is onafhankelijk van de onderliggende storage en draait op Baremetal, VM’s en cloud-providers.

Zonder licentie kun je tot 100GB aan opslag gebruiken. Met een gratis developer-licentie kan dit worden uitgebreid tot 500GB. Enterprise-licenties bieden onbeperkte opslag.

StorageOS van binnenuit
StorageOS deploys DaemonSet met 1 container per Kubernetes node en de storage wordt beheerd via StorageClasses of Persistent Volume Claims. StorageOS biedt thin provisioned storage die opgeslagen staat in de map /var/lib/storageos/data. Het werkt het beste om een aparte schijf te koppelen aan deze map. Elke container kan StorageOS virtuele volumes plaatsen. Dit kan vanuit elke host, ongeacht of de host het volume al bevat.

StorageOS gebruikt compressie en encryptie om prestaties te verbeteren, de hoeveelheid gebruikte opslag te verminderen en de volumes te beveiligen. Namespaces kunnen worden gebruikt om meerdere teams van verschillende projecten gebruik te laten maken van dezelfde opslag. Je kan ook policies gebruiken om toegang te geven aan specifieke gebruikers. 

Over het algemeen is StorageOS een eenvoudige manier om storage geautomatiseerd te beheren in Kubernetes. Het kan schalen van een klein lab tot aan een grote enterprise en biedt een consistente en beheerbare manier om storage te gebruiken voor je containers.

Je eerste stappen Kubernetes
Als ik me verdiep in een nieuw onderwerp, dan wil ik er ook alle ins en outs van weten. Spelen met de Kubernetes-technologie was dan ook erg leuk. In eerste instantie leek de techniek vrij overweldigend, maar toen ik de fundamentals onder de knie had, kon ik duidelijk zien hoe dit veel tijd en geld bespaart voor enterprise-scale applicaties. Het was mijn tijd dan ook meer dan waard. Ik zie veel potentie en kan niet wachten om de technologie te introduceren bij onze klanten.

Wil jij ook aan de slag met Kubernetes? Dit is waar ik begon.

Lees ook een van onze andere deep dives, of blogs over software automation, stack en cloud. 

Reactie toevoegen