Rakenduste juurutamine mitmetes Kubernetes klastrites Helmiga

Kuidas Dailymotion kasutab Kubernetes't: rakenduste juurutamine

Me Dailymotion'is alustasime Kubernetes'e kasutamist tootmisest 3 aastat tagasi. Kuid rakenduste juurutamine mitmetes klastrites on tĂ”eline vĂ€ljakutse, mistĂ”ttu oleme viimastel aastatel pĂŒĂŒdnud oma tööriistu ja töövooge parandada.

Kust see kÔik algas

Siin rÀÀgime, kuidas me juurutame oma rakendusi mitmetes Kubernetes'i klastrites ĂŒle maailma.

KĂŒsimisel, kuidas juurutada mitmeid Kubernetes'i objekte korraga, kasutame Helm, ja kĂ”ik meie chart'id on salvestatud ĂŒhes git-repos. Rakenduse tĂ€ieliku stack'i juurutamiseks, mis koosneb mitmest teenusest, kasutame nn ĂŒldist chart'i. See on pĂ”himĂ”tteliselt chart, mis mÀÀratleb sĂ”ltuvused ja vĂ”imaldab algatada API ning selle teenused ĂŒhe kĂ€suga.

Lisaks oleme kirjutanud vĂ€ikese Python'i skripti Helm'i peale, et teha kontrollimisi, luua chart'e, lisada salajasi andmeid ja juurutada rakendusi. KĂ”iki neid ĂŒlesandeid tĂ€idetakse keskse CI platvormi abil docker'i pildi kaudu.

LĂ€heme asja juurde.

MÀrkus. Kui te seda loete, on esimene Helm 3 versiooni kandidaat juba vÀlja kuulutatud. Peamine versioon sisaldab hulga parandusi, mille eesmÀrgiks on lahendada mÔned eelmisel ajal tekkinud probleemid.

Chart'ide arendamise töövoog

Rakenduste jaoks kasutame harude loomist ja otsustasime selle sama lÀhenemise rakendada ka chart'idele.

  • Haru dev kasutatakse chart'ide loomiseks, mis testitakse arendusklastrites.
  • Kui pull-ettepanek esitatakse master, kontrollitakse neid stseeni tasemel.
  • LĂ”puks loome pull-ettepaneku, et edastada muudatused haru prod ja rakendada need tootmises.

Igal keskkonnal on oma privaatne repos, mis hoiab meie chart'e, ja me kasutame Chartmuseum'i kÔigi kasulike API-dega. Nii tagame ranget isoleeritust keskkondade vahel ja controlime chart'e reaalsetes tingimustes, enne kui kasutame neid tootmises.

Chart'ide reposid erinevates keskkondades

Tasub mĂ€rkida, et kui arendajad saadavad haru dev, saadetakse nende chart'i versioon automaatselt dev Chartmuseum'i. Nii kasutavad kĂ”ik arendajad ĂŒhte dev reposi ja tuleb hoolikalt mĂ€rkida oma chart'i versioon, et mitte kogemata kasutada kellegi teise muudatusi.

Veel meer, meie vÀike Python skript kontrollib Kubernetes objekte Kubernetes OpenAPI spetsifikatsioonide pÔhjal Kubeval, enne kui need avaldatakse Chartmusesse.

Chart’i arendamise töökĂ€igu ĂŒldine ĂŒlevaade

  1. Pipeliini ĂŒlesannete seadistamine spetsifikatsiooni jĂ€rgi gazr.io kvaliteedikontrolliks (lint, ĂŒksuste testimine).
  2. Docker'i pildi saatmine koos Python'i tööriistadega, mis juurutavad meie rakendused.
  3. Keskkonna seadistamine harunime jÀrgi.
  4. Kubernetes yaml failide kontrollimine Kubeval’i abil.
  5. Chart’i ja selle vanemate chart’ide (chart’id, mis sĂ”ltuvad muudetavast chart’ist) versiooni automaatne tĂ”stmine.
  6. Chart'i saatmine Chartmuseumisse, mis vastab oma keskkonnale

Erinevuste haldamine klastrites

Klastrite föderatsioon

Oli aeg, mil kasutasime Kubernetes klastrite föderatsiooni, kus Kubernetes objekte sai kuulutada ĂŒhe API lĂ”pp-punkti kaudu. Kuid tekkisid probleemid. NĂ€iteks teatud Kubernetes objekte ei saanud föderatsiooni lĂ”pp-punktis luua, mistĂ”ttu oli keeruline hallata ĂŒhendatud objekte ja muid objekte eraldi klastrite jaoks.

Probleemi lahendamiseks hakkasime haldama klastreid sÔltumatult, mis lihtsustas protsessi oluliselt (kasutades föderatsiooni esimest versiooni; teises vÔis midagi muutuda).

Geograafiliselt jaotatud platvorm

Praegu on meie platvorm jaotatud kuude regioonide vahel — kolm kohalikku ja kolm pilves.


Jaotatud juurutamine

Globaalne Helm'i vÀÀrtus

4 globaalset Helm'i vÀÀrtust aitavad mÀÀratleda erinevusi klastrite vahel. KÔikide meie chart'ide jaoks on minimaalsed vaikevÀÀrtused.

global:
  cloud: True
  env: staging
  region: us-central1
  clusterName: staging-us-central1

Globaalne vÀÀrtus

Need vÀÀrtused aitavad mÀÀratleda konteksti meie rakendustele ja neid kasutatakse erinevatel ĂŒlesannetel: jĂ€lgimine, jĂ€litamine, logimine, vĂ€listes kĂ”nedes osalemine, skaleerimine jne.

  • "cloud": meil on hĂŒbriidne Kubernetes platvorm. NĂ€iteks meie API juurutatakse GCP tsoonides ja meie andmekeskustes.
  • "env": mĂ”ned vÀÀrtused vĂ”ivad erineda mitte-toimivates keskkondades. NĂ€iteks ressursside mÀÀratlemised ja automaatse skaleerimise konfiguratsioon.
  • "region": see teave aitab mÀÀrata klastri asukohta ja seda saab kasutada vĂ€liste teenuste lĂ€hima lĂ”pp-punkti mÀÀramiseks.
  • "clusterName": kui ja millal tahame mÀÀrata vÀÀrtuse eraldi klastri jaoks.

Siin on konkreetne nÀide:

{{
/* Tagastab GraphQL-i horisontaalse podi autoskaalija koopiate arvu */}}
{{- define "graphql.hpaReplicas" -}}
{{- if eq .Values.global.env "prod" }}
{{- if eq .Values.global.region "europe-west1" }}
minReplicas: 40
{{- else }}
minReplicas: 150
{{- end }}
maxReplicas: 1400
{{- else }}
minReplicas: 4
maxReplicas: 20
{{- end }}
{{- end -}}

Helmi mall nÀide

See loogika on mÀÀratletud abimallis, et mitte ummistada Kubernetes YAML-i.

Rakenduse vÀljakuulutamine

Meie juurutustööriistad pÔhinevad mitmel YAML-failil. Siin on nÀide, kuidas me kuulutame vÀlja teenuse ja selle skaleerimis-topoloogia (koopiate arv) klastris.

releases:
  - foo.world

foo.world:                # VĂ€ljalaske nimi
  services:               # Dailymotioni rakenduste/projektide loetelu
    foobar:
      chart_name: foo-foobar
      repo: git@github.com:dailymotion/foobar
      contexts:
        prod-europe-west1:
          deployments:
            - name: foo-bar-baz
              replicas: 18
            - name: another-deployment
              replicas: 3

Teenuse mÀÀratlemine

See on skeem kÔigist sammudest, mis mÀÀratlevad meie juurutusprotsessi. Viimane samm juurutab rakenduse samal ajal mitmes töökllastri.


Jenkinsis juurutamise sammud

Aga saladused?

Turvalisuse osas jÀlgime kÔiki saladusi erinevatest kohtadest ja hoiame neid unikaalses salvestusruumis Vault Pariisis.

Meie juurutustööriistad tÔmbavad saladuste vÀÀrtusi Vaultist ja kui on aeg juurutamiseks, sisestavad nad need Helmisse.

Selle jaoks oleme mÀÀratlenud vastavuse Vaultis olevate saladuste ja meie rakenduste vajalike saladuste vahel:

salad:                                                                                                                                                                                                        
     - secret_id: "stack1-app1-password"                                                                                                                                                                                  
       contexts:                                                                                                                                                                                                   
         - name: "default"                                                                                                                                                                                         
           vaultPath: "\/kv\/dev\/stack1\/app1\/test"                                                                                                                                                               
           vaultKey: "password"                                                                                                                                                                                    
         - name: "cluster1"                                                                                                                                                                           
           vaultPath: "\/kv\/dev\/stack1\/app1\/test"                                                                                                                                                               
           vaultKey: "password"

  • Oleme mÀÀratlenud ĂŒldised pĂ”himĂ”tted, mida tuleb jĂ€rgida saladuste registreerimisel Vaultis.
  • Kui saladus kuulub kindlasse konteksti vĂ”i klastrisse, tuleb lisada konkreetne kirje. (Siin on kontekstis cluster1 saladuse stack-app1-password jaoks oma vÀÀrtus).
  • Muidu kasutatakse vÀÀrtust vaikimisi.
  • Iga punkti jaoks selles loendis lisatakse Kubernetes'i saladusse vĂ”ti-vÀÀrtus paar. SeetĂ”ttu on saladuse mall meie chartides vĂ€ga lihtne.

apiVersion: v1
data:
{{- range $key,$value := .Values.secrets }}
  {{ $key }}: {{ $value | b64enc | quote }}
{{ end }}
kind: Secret
metadata:
  name: "{{ .Chart.Name }}"
  labels:
    chartVersion: "{{ .Chart.Version }}"
    tillerVersion: "{{ .Capabilities.TillerVersion.SemVer }}"
type: Opaque

Probleemid ja piirangud

Töötamine mitme repodega

Praegu jagame chartide ja rakenduste arendust. See tĂ€hendab, et arendajad peavad töötama kahes git-repos, ĂŒks rakenduse jaoks ja teine selle juurutamise mÀÀratlemiseks Kubernetesis. 2 git-repositooriumi tĂ€hendab 2 tööprotsessi ja algajal on lihtne segadusse minna.

Üldiste chartide haldamine on tĂŒlikas

Nagu me juba mainisime, on ĂŒldised chartid vĂ€ga mugavad sĂ”ltuvuste mÀÀratlemiseks ja mitme rakenduse kiireks juurutamiseks. Kuid me kasutame --reuse-values, et vĂ€ltida kĂ”igi vÀÀrtuste edastamist iga kord, kui me rakendust, mis kuulub sellesse ĂŒldisesse charti, juurutame.

TĂ”husa pideva tarnimise protsessis on meil vaid kaks vÀÀrtust, mis pidevalt muutuvad: koopiate arv ja pildi silt (versioon). Teised, stabiilsemad vÀÀrtused muudetakse kĂ€sitsi ja see on ĂŒsna keeruline. Veelgi enam, ĂŒks viga ĂŒldise chart'i juurutamisel vĂ”ib viia tĂ”siste tĂ”rgeteni, nagu oleme oma kogemustest kogenud.

Mitme konfiguratsioonifaili uuendamine

Kui arendaja lisab uue rakenduse, peab ta muutma mitmeid faile: rakenduse kuulutamise, saladuste nimekirja, rakenduse lisamise sĂ”ltuvustesse, kui see kuulub ĂŒldisesse chart'i.

Jenkins'i Ôigused on Vault'is liiga laiad

Praegu on meil ĂŒks AppRole, mis loeb kĂ”iki saladusi Vault'ist.

TagasivÔtmise protsess ei ole automatiseeritud

TagasivÔtmiseks tuleb kÀivitada kÀsk mitmel klastril, mis on eksitav. Teeme seda toimingut kÀsitsi, et kindlalt nÀidata Ôiget versiooniidentifikaatorit.

Liigume GitOps'i suunas

Meie eesmÀrk

Soovime tuua chart'i tagasi rakenduse repository'sse, mida ta juurutab.

TöökÀik on sama, nagu arenduses. NÀiteks, kui haru saadetakse masterisse, siis juurutamine kÀivitatakse automaatselt. Peamine erinevus sellise lÀhenemise ja hetke töökÀigu vahel on see, et kÔike hallatakse git'is (ise rakendus ja kuidas seda Kubernetes'es juurutada).

Eeliseid on mitu:

  • Oluliselt arendajale arusaadavam . Lihtsam on Ă”ppida, kuidas kohandada muudatusi kohalikus chart'is.
  • Teenuse juurutamise mÀÀratlemine saab toimuda seal, kus on kood teenusest.
  • Üldiste chart'ide eemaldamise haldamine. Teenusel on oma Helm'i vĂ€ljaanne. See vĂ”imaldab hallata rakenduse elutsĂŒklit (tagasivĂ”tt, uuendus) kĂ”ige vĂ€iksemal tasemel, et mitte mĂ”jutada teisi teenuseid.
  • Git'i eelised chart'ide haldamiseks: muudatuste tĂŒhistamine, auditi ajalugu jne. Kui chart'i muudatus tuleb tĂŒhistada, saab seda teha git'i abil. Juurutamine kĂ€ivitatakse automaatselt.
  • VĂ”ib mĂ”elda töövoo tĂ€iustamisele selliste tööriistade abil nagu Skaffold, millega arendajad saavad testida muudatusi kontekstis, mis sarnaneb tootmistingimustele.

Kaks sammu migreerimise

Meie arendajad on kasutanud seda töövoogu juba 2 aastat, nii et me vajame vÔimalikult sujuvat migratsiooni. SeetÔttu otsustasime lisada vaheetapi teele eesmÀrgile.
Esimene etapp on lihtne:

  • SĂ€ilitame sarnase struktuuri rakenduste kĂ€itamise seadistamiseks, kuid ĂŒhes objektis nimega DailymotionRelease.

apiVersion: "v1"
kind: "DailymotionRelease"
metadata:
  name: "app1.ns1"
  environment: "dev"
  branch: "mybranch"
spec:
  slack_channel: "#admin"
  chart_name: "app1"
  scaling:
    - context: "dev-us-central1-0"
      replicas:
        - name: "hermes"
          count: 2
    - context: "dev-europe-west1-0"
      replicas:
        - name: "app1-deploy"
          count: 2
  secrets:
    - secret_id: "app1"
      contexts:
        - name: "default"
          vaultPath: "\/kv\/dev\/ns1\/app1\/test"
          vaultKey: "password"
        - name: "dev-europe-west1-0"
          vaultPath: "\/kv\/dev\/ns1\/app1\/test"
          vaultKey: "password"

  • 1 vĂ€ljalaskmine rakendusele (ilma ĂŒldiselt chartideta).
  • Chartid rakenduse git-repositooriumis.

Me oleme rÀÀkinud kĂ”ikide arendajatega, nii et migratsiooniprotsess on juba alanud. Esimest etappi juhitakse endiselt CI platvormi abil. Varsti kirjutan veel ĂŒhe postituse teisest etapist: kuidas me lĂ€ksime ĂŒle GitOps töövoole Flux. RÀÀgin, kuidas me kĂ”ik seadistasime ja milliste raskustega silmitsi seisime (mitmed repositooriumid, saladused jne). JĂ€lgige uudiseid.

Siin proovime kirjeldada meie edusamme rakenduste juurutamise töövoos viimastel aastatel, mis viis meid mÔteteni GitOps lÀhenemise osas. Me ei ole veel eesmÀrgile jÔudnud ja anname tulemuste kohta teada, kuid oleme praegu veendunud, et tegime Ôigesti, kui otsustasime kÔik lihtsustada ja viia arendajate harjumustele lÀhemale.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster