Så driftsätter du Helm charts automatiskt till ett Kubernetes-kluster
Sami Alajrami
Sami is a DevOps consultant in our Oslo office. He comes from Palestine and has a PhD in Computing Science from Newcastle University. Sami’s previous work focused on cloud-based software development, model-based engineering, and safety-critical systems. He’s also an INTJ.
Livscykelhantering av Helm charts är en manuell uppgift. Med Helmsman kan du automatisera livscykelhanteringen av dina Helm charts med hjälp av deklarativa konfigurationsfiler.
Helm paketerar Kubernetes-applikationer som återanvändbara, anpassningsbara och delbara paket som kallas ”charts”. Helmsman lägger till ett abstraktionslager runt Helm och gör det möjligt för användare att deklarativt definiera önskat tillstånd för sina Helm charts i ett Kubernetes-kluster.
Därför skapade vi Helmsman
När vi arbetade med att driftsätta Atlassian-produkter i ett Kubernetes-kluster för en kund började vi med att skapa Kubernetes-manifestfiler för de Kubernetes-objekt som behövdes. Vi behövde automatisera driftsättningen av dessa objekt i klustret varje gång vi pushade ändringar till vårt Git-repo. Därför skapade vi ett eget skript i vår CI-pipeline. De åtgärder vi ville stödja var att skapa, ta bort, uppgradera och flytta Kubernetes-objekt till olika namespaces. Allteftersom projektet fortskred blev skriptet snabbt komplext och svårt att underhålla. Det behövde uppdateras varje gång vi lade till ett nytt Kubernetes-objekt. Vi började använda Helm eftersom det hjälpte oss att samla flera Kubernetes-objekt i en enhet: ett ”chart”. Då blev CI-skriptet lite enklare, men behövde fortfarande uppdateras regelbundet med nya charts. Och vad händer om vi behöver återskapa den här lösningen för en annan kund? Då måste vi kopiera och anpassa CI-skriptet.
Vi behövde ett mer dynamiskt och mindre interaktivt sätt att göra detta på. Då föddes idén om att definiera ett ”önskat tillstånd” – som beskriver vilka charts vi vill ha och var i klustret de ska finnas – samt ett verktyg som är tillräckligt smart för att se till att detta tillstånd uppnås. Ungefär som infrastructure as code, men för Helm charts (Kubernetes-appar). När vi ändrar det önskade tillståndet kan verktyget förstå vilka ändringar som behövs och genomföra dem åt oss. På så sätt behöver vi bara underhålla vårt önskade tillstånd och låta verktyget hantera logiken för hur det implementeras. Vi kallade verktyget ”Helmsman” eftersom det fungerar som en autopilot för ditt Kubernetes-kluster.
Hur fungerar Helmsman?
Helmsman får sina instruktioner från en deklarativ fil som kallas Desired State File (DSF). Den underhålls av användaren (Kubernetes-administratören) och versionshanteras vanligtvis. DSF:er följer en specifikation som gör det möjligt för användaren att definiera hur man ansluter till ett Kubernetes-kluster, vilka namespaces som ska användas eller skapas, vilka Helm-repon som ska användas för att hitta charts samt vilka instanser (även kallade releases) av chartet som ska installeras, tas bort, återställas eller uppgraderas – och med vilka indataparametrar.
Helmsman tolkar dina önskemål från DSF-filen och jämför dem med det som körs i det angivna klustret. Verktyget är tillräckligt smart för att avgöra vilka ändringar som behöver tillämpas för att uppfylla dina önskemål, utan att behöva underhålla eller lagra ytterligare information någonstans.
En enkel DSF-fil ser ut som exemplet nedan (som fungerar med minikube):
[metadata] org = "example.com" # using a minikube cluster [settings] kubeContext = "minikube" [namespaces] [namespaces.staging] protected = false [namespaces.production] protected = true [helmRepos] stable = "https://kubernetes-charts.storage.googleapis.com" incubator = "http://storage.googleapis.com/kubernetes-charts-incubator" [apps] [apps.artifactory] name = "artifactory-prod" # should be unique across all apps description = "production artifactory" namespace = "production" enabled = true chart = "stable/artifactory" version = "6.2.0" # chart version valuesFile = "../my-artificatory-production-values.yaml" [apps.jenkins-test] name = "jenkins-test" # should be unique across all apps description = "test release of jenkins, testing xyz feature" namespace = "staging" enabled = true chart = "stable/jenkins" version = "0.9.1" # chart version valuesFile = "../my-jenkins-testing-values.yaml" </code>Vad erbjuds?
Utöver att driftsätta Helm charts från kod ger Helmsman dig följande funktioner:
Enkelt deklarativt format: använder TOML-formatet, som inte bryr sig om blanksteg. Hurra!
Portabelt: kan användas för att hantera driftsättning av charts i valfritt Kubernetes-kluster. De enda beroenden som krävs är helm och kubectl.
Planera, visa, tillämpa: du kan köra Helmsman för att skapa och visa en plan, med eller utan att köra den.
Flera användningsalternativ: kan användas som ett binärt verktyg eller en Docker-avbildning.
Idempotent: så länge din fil för önskat tillstånd inte ändras kan du köra Helmsman flera gånger och få samma resultat.
Fortsätt efter fel: om driftsättningen bara lyckas delvis på grund av att driftsättningen av ett specifikt chart misslyckas kan du åtgärda ditt Helm chart och köra Helmsman igen, utan att först behöva återställa de delar som lyckades.
Överföring av secrets: från miljövariabler till charts.
Hämtning av K8S-secrets och Helm charts: från privata molnbuckets. För närvarande stöds både AWS och GCS.
Skyddade releases/namespaces: mot oavsiktliga commits.
Mer information om dessa funktioner finns i dokumentationen.
Open Source
Helmsman har hjälpt oss, och vi delar gärna verktyget med communityn. Det är open source, och vi välkomnar alla former av bidrag och feedback. Projektet finns på GitHub.
- Cloud
Subscribe to our newsletter
Related blogs