Helm chartien automaattinen käyttöönotto Kubernetes-klusteriin
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.
Helm chartien elinkaaren hallinta on manuaalinen tehtävä. Helmsmanin avulla voit automatisoida Helm chartien elinkaaren hallinnan deklaratiivisten määritystiedostojen avulla.
Helm paketoi Kubernetes-sovellukset uudelleenkäytettäviksi, muokattaviksi ja jaettaviksi paketeiksi, joita kutsutaan "charteiksi". Helmsman tuo Helmin ympärille abstraktiokerroksen ja antaa käyttäjille mahdollisuuden määritellä deklaratiivisesti Helm chartien tavoitetilan Kubernetes-klusterissa.
Miksi loimme Helmsmanin
Työskennellessämme Atlassian-tuotteiden käyttöönoton parissa asiakkaan Kubernetes-klusterissa aloitimme luomalla Kubernetes-manifestitiedostoja tarvittaville Kubernetes-objekteille. Halusimme automatisoida näiden objektien käyttöönoton klusterissa aina, kun viemme muutoksia git-repositoryymme. Tätä varten loimme oman skriptin CI-putkeemme. Halusimme tukea muun muassa Kubernetes-objektien luomista, poistamista, päivittämistä ja siirtämistä eri namespaceihin. Projektin edetessä kävi nopeasti ilmi, että skriptistä tuli monimutkainen ja vaikeasti ylläpidettävä. Sitä piti päivittää aina, kun lisäsimme uuden Kubernetes-objektin. Aloimme käyttää Helmiä, sillä se auttoi meitä ryhmittelemään useita Kubernetes-objekteja yhdeksi kokonaisuudeksi eli "chartiksi". CI-skriptistä tuli hieman yksinkertaisempi, mutta sitäkin piti edelleen päivittää säännöllisesti uusilla charteilla. Entä jos meidän pitäisi toteuttaa sama kokonaisuus toiselle asiakkaalle? Silloin meidän pitäisi kopioida ja mukauttaa CI-skripti.
Tarvitsimme dynaamisemman ja vähemmän vuorovaikutteisen tavan tehdä tämä. Syntyi ajatus "tavoitetilan" määrittelystä – siitä, mitkä chartit haluamme klusteriin ja mihin – sekä työkalusta, joka varmistaa älykkäästi tämän tilan toteutumisen. Ajatuksena oli infrastructure as code, mutta Helm charteille eli Kubernetes-sovelluksille. Kun muutamme tavoitetilaa, työkalu ymmärtää tarvittavat muutokset ja toteuttaa ne puolestamme. Näin meidän tarvitsee ylläpitää vain tavoitetilaa ja voimme antaa työkalun huolehtia toteutuslogiikasta. Nimesimme työkalun "Helmsmaniksi", koska se toimii Kubernetes-klusterisi autopilottina.
Miten Helmsman toimii?
Helmsman saa navigointiohjeensa käyttäjän eli Kubernetes-ylläpitäjän ylläpitämästä deklaratiivisesta Desired State File (DSF) -tiedostosta, joka on yleensä versionhallinnassa. DSF-tiedostot noudattavat määritystä, jonka avulla käyttäjä voi määritellä, miten Kubernetes-klusteriin yhdistetään, mitä namespaceja käytetään tai luodaan, mitä Helm-repositoryja käytetään chartien löytämiseen sekä mitkä chartin instanssit eli releaset asennetaan, poistetaan, palautetaan tai päivitetään ja millä syöteparametreilla.
Helmsman tulkitsee toiveesi DSF-tiedostosta ja vertaa niitä määritetyssä klusterissa käynnissä olevaan tilanteeseen. Se pystyy selvittämään, mitä muutoksia tarvitaan toiveidesi toteuttamiseksi, ilman että sen tarvitsee ylläpitää tai tallentaa lisätietoja mihinkään.
Yksinkertainen DSF näyttää alla olevan esimerkin kaltaiselta (ja toimii minikuben kanssa):
[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>Mitä se tarjoaa?
Sen lisäksi, että Helmsman ottaa Helm chartit käyttöön koodista, se tarjoaa seuraavat ominaisuudet:
Yksinkertainen deklaratiivinen muoto: käytössä on Toml-muoto, joka ei välitä välilyönneistä! Hurraa!
Se on siirrettävä: voit hallita sillä chartien käyttöönottoja missä tahansa Kubernetes-klusterissa. Sen ainoat riippuvuudet ovat helm ja kubectl.
Suunnittele, tarkastele, toteuta: voit ajaa Helmsmanin luodaksesi ja tarkastellaksesi suunnitelmaa joko toteuttamalla sen tai ilman toteutusta.
Useita käyttötapoja: sitä voi käyttää binäärityökaluna tai Docker-imagena.
Idempotentti: niin kauan kuin tavoitetilatiedostosi ei muutu, voit suorittaa Helmsmanin useita kertoja ja saada saman tuloksen.
Jatka virheiden jälkeen: jos käyttöönotto jää osittaiseksi tietyn chartin käyttöönoton epäonnistuessa, korjaa Helm chartisi ja suorita Helmsman uudelleen ilman, että sinun tarvitsee ensin palauttaa onnistuneita osia.
Salaisuuksien välittäminen: ympäristömuuttujista charteille.
K8S-salaisuuksien ja Helm chartien noutaminen: yksityisistä pilvitallennuspalveluista. Tällä hetkellä tuettuja ovat AWS ja GCS.
Suojatut releaset ja namespacet: suoja tahattomia commiteja vastaan.
Lisätietoja näistä ominaisuuksista löydät dokumentaatiosta.
Avoin lähdekoodi
Helmsman on ollut meille hyödyksi, ja jaamme sen mielellämme yhteisön kanssa. Se on avointa lähdekoodia, ja otamme mielellämme vastaan kaikenlaisia kontribuutioita ja palautetta. Projektia ylläpidetään GitHubissa.
- Pilvi
Subscribe to our newsletter
Related blogs