Izvietojiet lietojumprogrammas vairākos Kubernetes klasteros, izmantojot Helm

Kā Dailymotion izmanto Kubernetes: lietojumprogrammu izvietoŔana

Mēs, Dailymotion, sākām izmantot Kubernetes ražoÅ”anā pirms 3 gadiem. Taču lietojumprogrammu izvietoÅ”ana vairākos klasteros ir jautra, tāpēc dažu pēdējo gadu laikā mēs esam mēģinājuÅ”i uzlabot savus rÄ«kus un darbplÅ«smas.

Kur tas sākās

Šeit mēs apskatīsim, kā mēs izvietojam savas lietojumprogrammas vairākos Kubernetes klasteros visā pasaulē.

Lai vienlaikus izvietotu vairākus Kubernetes objektus, mēs izmantojam StÅ«re, un visas mÅ«su diagrammas tiek glabātas vienā git repozitorijā. Lai izvietotu pilnu lietojumprogrammu kopu no vairākiem pakalpojumiem, mēs izmantojam tā saukto kopsavilkuma diagrammu. BÅ«tÄ«bā Ŕī ir diagramma, kas deklarē atkarÄ«bas un ļauj inicializēt API un tās pakalpojumus ar vienu komandu.

Mēs arÄ« uzrakstÄ«jām nelielu Python skriptu uz Helm, lai veiktu pārbaudes, izveidotu diagrammas, pievienotu noslēpumus un izvietotu lietojumprogrammas. Visi Å”ie uzdevumi tiek veikti uz centrālās CI platformas, izmantojot docker attēlu.

Ķeramies pie lietas.

PiezÄ«me. Lasot Å”o, pirmais Helm 3 izlaiduma kandidāts jau ir paziņots. Galvenā versija ietver virkni uzlabojumu, lai risinātu dažas problēmas, ar kurām esam saskāruÅ”ies iepriekÅ”.

Diagrammu izstrādes darbplūsma

Lietojumprogrammām mēs izmantojam sazaroÅ”anu, un mēs nolēmām piemērot to paÅ”u pieeju diagrammām.

  • Filiāle dev izmanto, lai izveidotu diagrammas, kas tiks pārbaudÄ«tas izstrādes klasteros.
  • Kad tiek iesniegts izvilkÅ”anas pieprasÄ«jums meistars, tie tiek pārbaudÄ«ti iestudējumā.
  • Visbeidzot, mēs izveidojam izvilkÅ”anas pieprasÄ«jumu, lai veiktu izmaiņas filiālē prod un pielietot tos ražoÅ”anā.

Katrai videi ir sava privātā repozitorija, kurā tiek glabātas mÅ«su diagrammas, un mēs to izmantojam Chartmuseum ar ļoti noderÄ«gām API. Tādā veidā mēs nodroÅ”inām stingru izolāciju starp vidēm un diagrammu testÄ“Å”anu reālajā pasaulē pirms to izmantoÅ”anas ražoÅ”anā.

Diagrammu krātuves dažādās vidēs

Ir vērts atzÄ«mēt, ka tad, kad izstrādātāji nospiež filiāli izstrādātājam, viņu diagrammas versija tiek automātiski nosÅ«tÄ«ta uz izstrādātāju Chartmuseum. Tādējādi visi izstrādātāji izmanto vienu un to paÅ”u izstrādātāju repozitoriju, un jums rÅ«pÄ«gi jānorāda diagrammas versija, lai nejauÅ”i neizmantotu kāda cita veiktās izmaiņas.

Turklāt mūsu mazais Python skripts apstiprina Kubernetes objektus saskaņā ar Kubernetes OpenAPI specifikācijām, izmantojot Kubeval, pirms tos publicējat Chartmusem.

Diagrammu izstrādes darbplūsmas vispārīgs apraksts

  1. Cauruļvada uzdevumu iestatīŔana atbilstoŔi specifikācijai gazr.io kvalitātes kontrolei (plūksna, vienības pārbaude).
  2. Docker attēla nosÅ«tÄ«Å”ana, izmantojot Python rÄ«kus, kas izvieto mÅ«su lietojumprogrammas.
  3. Vides iestatÄ«Å”ana pēc filiāles nosaukuma.
  4. Kubernetes yaml failu validācija, izmantojot Kubeval.
  5. Automātiski palielināt diagrammas versiju un tās vecākdiagrammas (diagrammas, kas ir atkarīgas no mainītās diagrammas).
  6. Diagrammas iesniegŔana Chartmuseum, kas atbilst tā videi

AtŔķirību pārvaldība starp klasteriem

Klasteru federācija

Bija laiks, kad izmantojām Kubernetes klasteru federācija, kur Kubernetes objektus var deklarēt no viena API galapunkta. Bet radās problēmas. Piemēram, dažus Kubernetes objektus nevarēja izveidot federācijas galapunktā, tāpēc ir grÅ«ti uzturēt apvienotos objektus un citus objektus atseviŔķām kopām.

Lai atrisinātu problēmu, mēs sākām pārvaldÄ«t klasterus neatkarÄ«gi, kas ievērojami vienkārÅ”oja procesu (mēs izmantojām pirmo federācijas versiju; otrajā, iespējams, kaut kas ir mainÄ«jies).

Ģeogrāfiski izplatīta platforma

MÅ«su platforma paÅ”laik ir izplatÄ«ta 6 reÄ£ionos ā€“ 3 lokāli un 3 mākonÄ«.


Izkliedētā izvietoÅ”ana

Globālās Helm vērtības

4 globālās Helm vērtÄ«bas ļauj noteikt atŔķirÄ«bas starp klasteriem. Visām mÅ«su diagrammām ir noklusējuma minimālās vērtÄ«bas.

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

Globālās vērtības

Å Ä«s vērtÄ«bas palÄ«dz noteikt kontekstu mÅ«su lietojumprogrammām un tiek izmantotas dažādiem mērÄ·iem: uzraudzÄ«bai, izsekoÅ”ana, reÄ£istrÄ“Å”ana, ārējo zvanu veikÅ”ana, mērogoÅ”ana utt.

  • "mākonis": mums ir hibrÄ«da Kubernetes platforma. Piemēram, mÅ«su API ir izvietota GCP zonās un mÅ«su datu centros.
  • "env": dažas vērtÄ«bas var mainÄ«ties vidēs, kas nav ražotas. Piemēram, resursu definÄ«cijas un automātiskās mērogoÅ”anas konfigurācijas.
  • "reÄ£ions": Ŕī informācija palÄ«dz noteikt klastera atraÅ”anās vietu, un to var izmantot, lai noteiktu tuvumā esoÅ”os ārējo pakalpojumu galapunktus.
  • "clusterName": ja un kad mēs vēlamies definēt vērtÄ«bu atseviŔķam klasterim.

Šeit ir konkrēts piemērs:

{{/* Returns Horizontal Pod Autoscaler replicas for GraphQL*/}}
{{- 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 -}}

Stūres veidnes piemērs

Å Ä« loÄ£ika ir definēta palÄ«ga veidnē, lai izvairÄ«tos no Kubernetes YAML pārblÄ«vÄ“Å”anas.

Paziņojums par pieteikÅ”anos

MÅ«su izvietoÅ”anas rÄ«ki ir balstÄ«ti uz vairākiem YAML failiem. Tālāk ir sniegts piemērs tam, kā mēs klasterÄ« deklarējam pakalpojumu un tā mērogoÅ”anas topoloÄ£iju (reprodukciju skaitu).

releases:
  - foo.world

foo.world:                # Release name
  services:               # List of dailymotion's apps/projects
    foobar:
      chart_name: foo-foobar
      repo: [email protected]:dailymotion/foobar
      contexts:
        prod-europe-west1:
          deployments:
            - name: foo-bar-baz
              replicas: 18
            - name: another-deployment
              replicas: 3

Pakalpojuma definīcija

Å is ir visu darbÄ«bu izklāsts, kas nosaka mÅ«su izvietoÅ”anas darbplÅ«smu. Pēdējā darbÄ«ba izvieto lietojumprogrammu vairākās darbinieku kopās vienlaikus.


Dženkinsa izvietoŔanas soļi

Kā ar noslēpumiem?

AttiecÄ«bā uz droŔību mēs izsekojam visus noslēpumus no dažādām vietām un glabājam tos unikālā glabātuvē Velvēt ParÄ«zē.

MÅ«su izvietoÅ”anas rÄ«ki iegÅ«st slepenās vērtÄ«bas no Vault un, kad pienāks izvietoÅ”anas laiks, ievieto tās Helm.

Lai to izdarÄ«tu, mēs definējām kartÄ“Å”anu starp Vault noslēpumiem un noslēpumiem, kas nepiecieÅ”ami mÅ«su lietojumprogrammām.

secrets:                                                                                                                                                                                                        
     - 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"

  • Esam definējuÅ”i vispārÄ«gus noteikumus, kas jāievēro, ierakstot noslēpumus pakalpojumā Vault.
  • Ja noslēpums attiecas uz konkrētu kontekstu vai kopu, jums jāpievieno konkrēts ieraksts. (Å eit konteksta klasterim1 ir sava vērtÄ«ba slepenajai steka-app1-parolei).
  • Pretējā gadÄ«jumā tiek izmantota vērtÄ«ba pēc noklusējuma.
  • Katram Ŕī saraksta vienumam Kubernetes noslēpums tiek ievietots atslēgas-vērtÄ«bas pāris. Tāpēc mÅ«su diagrammu slepenā veidne ir ļoti vienkārÅ”a.

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

Problēmas un ierobežojumi

Darbs ar vairākām krātuvēm

Tagad mēs atdalām diagrammu un lietojumprogrammu izstrādi. Tas nozÄ«mē, ka izstrādātājiem ir jāstrādā divās git krātuvēs: viena lietojumprogrammai un otra, lai noteiktu tās izvietoÅ”anu Kubernetes. 2 git krātuves nozÄ«mē 2 darbplÅ«smas, un iesācējs var viegli apjukt.

Vispārināto diagrammu pārvaldība ir apgrūtinājums

Kā jau teicām, vispārÄ«gās diagrammas ir ļoti noderÄ«gas, lai identificētu atkarÄ«bas un ātri izvietotu vairākas lietojumprogrammas. Bet lietojam --reuse-valueslai izvairÄ«tos no visu vērtÄ«bu nodoÅ”anas ikreiz, kad izvietojam lietojumprogrammu, kas ir daļa no Ŕīs vispārÄ«gās diagrammas.

Nepārtrauktā piegādes darbplÅ«smā mums ir tikai divas vērtÄ«bas, kas regulāri mainās: kopiju skaits un attēla tags (versija). Citas, stabilākas vērtÄ«bas tiek mainÄ«tas manuāli, un tas ir diezgan grÅ«ti. Turklāt viena kļūda, izvietojot vispārinātu diagrammu, var izraisÄ«t nopietnas kļūmes, kā mēs esam redzējuÅ”i no mÅ«su paÅ”u pieredzes.

Vairāku konfigurācijas failu atjaunināŔana

Kad izstrādātājs pievieno jaunu lietojumprogrammu, viņam ir jāmaina vairāki faili: lietojumprogrammas deklarācija, noslēpumu saraksts, pievienojot lietojumprogrammu kā atkarību, ja tā ir iekļauta vispārinātajā diagrammā.

Dženkinsa atļaujas pakalpojumā Vault ir pārāk paplaŔinātas

Tagad mums ir viens AppRole, kas nolasa visus noslēpumus no Vault.

AtcelÅ”anas process nav automatizēts

Lai atsauktu, jums ir jāpalaiž komanda vairākos klasteros, un tas ir pilns ar kļūdām. Mēs veicam Å”o darbÄ«bu manuāli, lai nodroÅ”inātu, ka ir norādÄ«ts pareizais versijas ID.

Mēs virzāmies uz GitOps

Mūsu mērķis

Mēs vēlamies atgriezt diagrammu tās izvietotās lietojumprogrammas repozitorijā.

DarbplÅ«sma bÅ«s tāda pati kā izstrādei. Piemēram, kad filiāle tiek virzÄ«ta uz galveno, izvietoÅ”ana tiks aktivizēta automātiski. Galvenā atŔķirÄ«ba starp Å”o pieeju un paÅ”reizējo darbplÅ«smu ir tāda viss tiks pārvaldÄ«ts gitā (pati lietojumprogramma un veids, kā tā tiek izvietota Kubernetes).

Ir vairākas priekŔrocības:

  • Daudz skaidrāks izstrādātājam. Ir vieglāk iemācÄ«ties piemērot izmaiņas vietējā diagrammā.
  • Pakalpojuma izvietoÅ”anas definÄ«ciju var norādÄ«t tajā paŔā vietā, kur kods apkalpoÅ”ana.
  • Vispārējo diagrammu noņemÅ”anas pārvaldÄ«ba. Pakalpojumam bÅ«s savs Helm izlaidums. Tas ļaus pārvaldÄ«t lietojumprogrammas dzÄ«ves ciklu (atcelÅ”anu, jaunināŔanu) mazākajā lÄ«menÄ«, lai neietekmētu citus pakalpojumus.
  • Git priekÅ”rocÄ«bas diagrammas pārvaldÄ«bai: atsaukt izmaiņas, audita žurnāls utt. Ja jums ir jāatsauc izmaiņas diagrammā, varat to izdarÄ«t, izmantojot git. IzvietoÅ”ana sākas automātiski.
  • Varat apsvērt iespēju uzlabot izstrādes darbplÅ«smu, izmantojot tādus rÄ«kus kā Skaffold, ar kuru izstrādātāji var pārbaudÄ«t izmaiņas kontekstā, kas ir tuvu ražoÅ”anai.

Divpakāpju migrācija

MÅ«su izstrādātāji Å”o darbplÅ«smu izmanto jau 2 gadus, tāpēc vēlamies, lai migrÄ“Å”ana bÅ«tu pēc iespējas nesāpÄ«gāka. Tāpēc mēs nolēmām pievienot starpposmu ceļā uz mērÄ·i.
Pirmais posms ir vienkārŔs:

  • Mēs saglabājam lÄ«dzÄ«gu struktÅ«ru lietojumprogrammu izvietoÅ”anas iestatÄ«Å”anai, taču vienā objektā ar nosaukumu 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 izlaidums katrai lietojumprogrammai (bez vispārÄ«gām diagrammām).
  • Diagrammas lietojumprogrammas git repozitorijā.

Mēs esam runājuÅ”i ar visiem izstrādātājiem, tāpēc migrācijas process jau ir sācies. Pirmais posms joprojām tiek kontrolēts, izmantojot CI platformu. DrÄ«zumā uzrakstÄ«Å”u vēl vienu ziņu par otro posmu: kā mēs pārgājām uz GitOps darbplÅ«smu PlÅ«dums. Es jums pastāstÄ«Å”u, kā mēs visu iestatÄ«jām un ar kādām grÅ«tÄ«bām saskārāmies (vairākas krātuves, noslēpumi utt.). Sekojiet jaunumiem.

Å eit mēs esam mēģinājuÅ”i aprakstÄ«t mÅ«su progresu lietojumprogrammu izvietoÅ”anas darbplÅ«smā pēdējos gados, kas radÄ«ja domas par GitOps pieeju. Mēs vēl neesam sasnieguÅ”i mērÄ·i un ziņosim par rezultātiem, taču tagad esam pārliecināti, ka rÄ«kojāmies pareizi, kad nolēmām visu vienkārÅ”ot un tuvināt izstrādātāju paradumiem.

Avots: www.habr.com

Pievieno komentāru