Rakenduste juurutamine mitmetes Kubernetes klastrites Helmiga

Kuidas Dailymotion kasutab Kubernetes't: rakenduste juurutamine

Me Dailymotionis oleme hakanud Kubernetes't tootmises kasutama kolm aastat tagasi. Ent rakenduste juurutamine mitmel klastril on olnud paras vĂ€ljakutse, seetĂ”ttu oleme viimastel aastatel pĂŒĂŒdnud oma tööriistu ja töövooge tĂ€iustada.

Kust kÔik algas

Siin rÀÀgime, kuidas me juurutame oma rakendusi mitmel Kubernetes klastril ĂŒle kogu maailma.

KĂŒsimuseks, kuidas korraga mitut Kubernetes objekti juurutada, me kasutame Helm, ja kĂ”ik meie chart'id on hoitud ĂŒhes git-repos. TĂ€ieliku rakenduste virna juurutamiseks mitmest teenusest kasutame nii nimetatud koondchart'i. Essentsiaalselt on see chart, mis kuulutab vĂ€lja sĂ”ltuvused ja vĂ”imaldab initsialiseerida API-d ja selle teenuseid ĂŒhe kĂ€suga.

Oleme ka kirjutanud vĂ€ikese Python skripti Helm'i kohale, et teostada kontrollid, luua chart'e, lisada salajaid ja juurutada rakendusi. KĂ”ik need ĂŒlesanded tĂ€idetakse keskses CI platvormis docker'i abil.

Liigume oluliste asjade juurde.

MÀrge. Kui te seda loete, on Helm 3 esimene versioonkandidaat juba vÀlja kuulutatud. Peamine versioon sisaldab mitmeid tÀiustusi, mis on suunatud varasemate probleemide lahendamisele.

Chartide arendamise töövoog

Rakenduste jaoks kasutame haru loomist ja otsustasime selle lÀhenemise rakendada ka chartide puhul.

  • Haru dev kasutatakse chartide loomiseks, mida testitakse arendusklastrites.
  • Kui pull-ettepanek esitatakse master, kontrollitakse neid stendis.
  • LĂ”puks loome pull-ettepaneku, et edastada muudatused harusse prod ja rakendada neid tootmises.

Igal keskkonnal on oma privaatne hoidla, mis salvestab meie chartid, ja kasutame Chartmuseum kuna see pakub vÀga kasulikke API-sid. Nii garantii, et keskkondade vahel on range isoleeritus ja chartide testimine reaalses olukorras enne nende tootmisesse rakendamist.

Chartide hoidlad erinevates keskkondades

Oluline on mĂ€rkida, et kui arendajad saadavad dev haru, saadetakse nende charti versioon automaatselt dev Chartmuseumisse. SeelĂ€bi kasutavad kĂ”ik arendajad ĂŒhte dev hoidlat ja on oluline tĂ€pselt nĂ€idata oma charti versioon, et mitte kasutada kellegi teise muudatusi.

Lisaks kontrollib meie vÀike Python skript Kubernetes objekti nende Kubernetes OpenAPI spetsifikatsioonide jÀrgi. Kubeval, enne nende avaldamist Chartmuseumis.

Charti arendusprotsessi ĂŒldine kirjeldus

  1. Töövooprotsessi ĂŒlesannete seadmine spetsifikatsiooni jĂ€rgi gazr.io kvaliteedikontrolli (lint, unit-test) jaoks.
  2. Docker pildi saatmine koos Python tööriistadega, mis kÀivitavad meie rakendusi.
  3. Keskkonna seadistamine haru nime jÀrgi.
  4. Kubernetes yaml failide kontrollimine Kubeval abil.
  5. Charti ja selle vanemate chartide (chartide, mis sÔltuvad muudetavast chartist) automaatne versiooni tÔstmine.
  6. Charti saatmine Chartmuseumisse, mis vastab tema keskkonnale.

Klastrite erinevuste haldamine

Klastrite föderatsioon

Oli aeg, mil me kasutasime Kubernetesi klastrite föderatsiooni., kus Kubernetes objektide vĂ€ljakuulutamiseks oli ĂŒks API lĂ”pp-punkt. Kuid tekkisid probleemid. NĂ€iteks ei olnud mĂ”ningaid Kubernetes objekte vĂ”imalik liidusĂ”lmes luua, seetĂ”ttu oli keeruline hallata ĂŒhendatud objekte ja teisi objekte eraldi klastrite jaoks.

Probleemi lahendamiseks hakkasime haldama klasse iseseisvalt, mis lihtsustas protsessi oluliselt (kasutasime föderatsiooni esimest versiooni; teises vÔis midagi muutuda).

Geograafiliselt jaotatud platvorm

Praegu on meie platvorm jaotatud 6 regiooni — 3 kohalikku ja 3 pilve.


Jaotatud kasutuselevÔtt

Globaalne Helm vÀÀrtused

4 globaalse vÀÀrtuse Helm abil on vÔimalik mÀÀratleda erinevusi klastrite vahel. KÔikide meie graafikute jaoks on minimaalsed vaikimisi vÀÀrtused.

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

Globaalsed vÀÀrtused

Need vÀÀrtused aitavad mÀÀratleda meie rakenduste konteksti ja neid kasutatakse erinevate ĂŒlesannete jaoks: jĂ€lgimine, jĂ€litus, logimine, vĂ€liste kutsungite tegemine, skaleerimine jne.

  • «cloud»: meil on hĂŒbri Kubernetes platvorm. NĂ€iteks meie API paigaldatakse GCP piirkondadesse ja meie andmekeskustesse.
  • «env»: mĂ”ned vÀÀrtused vĂ”ivad muutuda mitte-toimivates keskkondades. NĂ€iteks ressursi mÀÀratlused ja automaatse skaleerimise konfiguratsioon.
  • «region»: see teave aitab mÀÀrata klastrite asukohta ja vĂ”ib olla kasulik lĂ€himate lĂ”pp-punktide mÀÀramisel vĂ€listest teenustest.
  • «clusterName»: kui ja millal me soovime mÀÀrata vÀÀrtuse konkreetse klastrile.

Siin on konkreetne nÀide:

{{/* Tagastab horisontaalse podi automaat skaalastamise replikad GraphQL jaoks */}}
{{- 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 segada Kubernetes YAML faili.

Rakenduse kuulutamine

Meie paigaldustööriistad pÔhinevad mitmetel YAML failidel. Allpool on nÀide, kuidas me kuulutame teenuse ja selle skaleerimise topoloogia (replikate arv) klastris.

vÀljalaset:
  - foo.world

foo.world:                # VĂ€ljalase nimi
  teenused:               # Dailymotioni rakenduste/projektide nimekiri
    foobar:
      chart_name: foo-foobar
      repo: git@github.com:dailymotion/foobar
      kontekstid:
        prod-europe-west1:
          juurutamised:
            - nimi: foo-bar-baz
              koopiad: 18
            - nimi: another-deployment
              koopiad: 3

Teenuse mÀÀratlemine

See on skeem kÔigist sammudest, mis mÀÀratlevad meie juurutamisprotsessi. Viimane samm juurutab rakenduse korraga mitmes tööklastris.


Jenkins'i juurutamise sammud

Aga saladused?

Mis puudutab turvalisust, siis jÀlgime kÔiki saladusi erinevates kohtades ja hoiame neid unikaalses salvestuses Vault Pariis.

Meie juurutamisriistad vÔtavad saladuste vÀÀrtused Vaultist ja kui on juurutamise aeg, sisestavad need Helm'i.

Selle jaoks oleme mÀÀratlenud vastenduse Vaultis olevate saladuste ja meie rakendustes vajalike saladuste vahel:

saladused:                                                                                                                                                                                                        
     - secret_id: "stack1-app1-password"                                                                                                                                                                                  
       kontekstid:                                                                                                                                                                                                   
         - nimi: "vaikimisi"                                                                                                                                                                                         
           vaultPath: "/kv/dev/stack1/app1/test"                                                                                                                                                               
           vaultKey: "salasÔna"                                                                                                                                                                                    
         - nimi: "cluster1"                                                                                                                                                                           
           vaultPath: "/kv/dev/stack1/app1/test"                                                                                                                                                               
           vaultKey: "salasÔna"

  • Oleme mÀÀratlenud ĂŒldised reeglid, mida tuleb jĂ€rgida saladuste salvestamisel Vaulti.
  • Kui saladus kuulub teatud konteksti vĂ”i klastri juurde, tuleb lisada konkreetne kirje. (Siin kontekstis cluster1 on stack-app1-password-i saladusel oma tĂ€hendus).
  • Muudel juhtudel kasutatakse vÀÀrtust vaikimisi.
  • Iga punkti jaoks selles loendis Kubernetes'i saladuses sisestatakse vĂ”tme-vÀÀrtuse paar. SeetĂ”ttu on meie chartide saladuse mall 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 hoidla jaoks

Praegu eristame chartide ja rakenduste arendamist. See tĂ€hendab, et arendajad peavad töötama kahes git-hoidlas: ĂŒks rakenduse jaoks ja teine selle Kubernetes'i juurutamise mÀÀratlemiseks. 2 git-hoidlat tĂ€hendab 2 tööprotsessi ja uue inimese on lihtne segadusse ajada.

Üldiste chartide haldamine on tĂŒlikas

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

JĂ€tkuva tarneprotsessis on meil vaid kaks vÀÀrtust, mis pidevalt muutuvad: koopiate arv ja pildimĂ€rgis (versioon). Teised, stabiilsemad vÀÀrtused, muutuvad kĂ€sitsi, mis on ĂŒsna keeruline. Veelgi enam, ĂŒks viga ĂŒldise chart'i juurutamises vĂ”ib pĂ”hjustada tĂ”siseid tĂ”rkeid, nagu oleme oma kogemustest Ă”ppinud.

Mitme konfiguratsioonifaili vÀrskendamine

Kui arendaja lisab uue rakenduse, peab ta muutma mitmeid faile: rakenduse kuulutamine, saladuste loetelu, rakenduse lisamine sĂ”ltuvustesse, kui see kuulub ĂŒldisse chart'i.

Jenkinsi load on Vaultis liiga laiad

Praegu on meil ĂŒks AppRole, mis loeb kĂ”iki saladusi Vaultist.

Tagasipöördumise protsess ei ole automatiseeritud

Tagasipöördumiseks tuleb kÀivitada kÀsk mitmes klastris, mis on vigadele avatud. Sooritatav toiming on kÀsitsi, et tagada Ôige versioonitunnuse mÀÀramine.

Liigume GitOps'i suunas

Meie eesmÀrk

Soovime tuua chart'i rakenduse reposse, mida see juurutab.

TööpÔhimÔte jÀÀb samaks kui arenduses. NÀiteks, kui haru saadetakse masteri, kÀivitub juurutamine automaatselt. Peamine erinevus sellise lÀhenemise ja praeguse tööprotsessi vahel on see, et kÔike hallatakse git'is (rakendus ise ja selle juurutamise viis Kuberneteses).

Eeliseid on mitu:

  • Palju selgem arendajale. Lihtsam on Ă”ppida rakendama muudatusi kohalikus chartis.
  • Teenuse juurutamise mÀÀratlemine saab toimuda seal, kus on kood teenusest.
  • Üldiste chartide eemaldamise haldamine. Teenusel on oma Helm'i vĂ€ljaanne. See vĂ”imaldab hallata rakenduse elutsĂŒklit (tagasipööramine, uuendamine) kĂ”ige vĂ€iksemal tasandil, et mitte hĂ€irida teisi teenuseid.
  • Git'i eelised chartide haldamisel: muudatuste tĂŒhistamine, auditilogid jne. Kui charti muudatust on vaja tĂŒhistada, saab seda teha git'i abiga. Juurutamine kĂ€ivitub automaatselt.
  • Saab mĂ”elda arendusprotsessi tĂ€iustamisele selliste tööriistadega nagu Skaffold, millega arendajad saavad teste teha muutustes, mis on lĂ€hedased tootmisprotsessile.

Kahe-etapiline migratsioon

Meie arendajad on seda töövoogu kasutanud juba 2 aastat, seega vajame maksimaalselt sujuvat migratsiooni. SeetÔttu otsustasime lisada vaheetapi teele.
Esimene etapp on lihtne:

  • Hoidame sarnast struktuuri rakenduste vĂ€lja tĂ”stmise 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Ă€ljalase rakenduse kohta (ilma ĂŒldistatud chartideta).
  • Chartid rakenduse git-repositooriumis.

RÀÀkisime kĂ”igi arendajatega, seega on migratsiooniprotsess juba alanud. Esimene etapp on endiselt kontrolli all CI platvormi kaudu. Peagi kirjutan veel ĂŒhe postituse teise etapi kohta: kuidas me lĂ€ksime ĂŒle GitOps töövoole. Flux. RÀÀgin, kuidas me kĂ”ik seadistasime ja milliste raskustega silmitsi seisisime (mitmed ladustamised, saladused jne). JĂ€lgige meie uudiseid.

Siin ĂŒritasime kirjeldada meie edusamme rakenduste juurutamise tööprotsessis viimase paari aasta jooksul, mis viis meid mĂ”tetele GitOps lĂ€henemisviisi kohta. Me pole veel eesmĂ€rgini jĂ”udnud ja anname tulemuste kohta teada, kuid oleme nĂŒĂŒd veendunud, et tegime Ă”igesti, kui otsustasime kĂ”ik lihtsustada ja viia arendajate harjumustele lĂ€hemale.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster