Uża applikazzjonijiet f'diversi clusters ta' Kubernetes ma' Helm

Kif Dailymotion juża Kubernetes: Applikazzjoni Skjerament

Aħna f'Dailymotion bdejna nużaw Kubernetes fil-produzzjoni 3 snin ilu. Iżda l-iskjerament ta' applikazzjonijiet f'diversi clusters huwa pjaċevoli, għalhekk matul l-aħħar ftit snin konna qed nippruvaw intejbu l-għodod u l-flussi tax-xogħol tagħna.

Fejn bdiet

Hawnhekk ser inkopru kif niskjeraw l-applikazzjonijiet tagħna f'diversi clusters ta' Kubernetes madwar id-dinja.

Biex nużaw diversi oġġetti Kubernetes f'daqqa, nużaw Helm, u ċ-ċarts kollha tagħna huma maħżuna f'repożitorju git wieħed. Biex niskjeraw munzell sħiħ ta 'applikazzjonijiet minn diversi servizzi, nużaw l-hekk imsejħa chart sommarju. Essenzjalment, din hija chart li tiddikjara dipendenzi u tippermettilek tibda l-API u s-servizzi tagħha bi kmand wieħed.

Aħna ktibna wkoll script Python żgħir fuq Helm biex nagħmlu kontrolli, noħolqu charts, inżidu sigrieti, u niskjeraw applikazzjonijiet. Dawn il-kompiti kollha huma mwettqa fuq pjattaforma CI ċentrali bl-użu ta 'immaġni docker.

Ejja mmorru sal-punt.

Nota. Hekk kif taqra dan, diġà tħabbar l-ewwel kandidat għar-rilaxx għal Helm 3. Il-verżjoni prinċipali fiha għadd sħiħ ta 'titjib biex jindirizzaw xi wħud mill-kwistjonijiet li ltqajna magħhom fil-passat.

Fluss tax-xogħol tal-iżvilupp taċ-ċart

Aħna nużaw fergħat għall-applikazzjonijiet, u ddeċidejna li napplikaw l-istess approċċ għaċ-ċarts.

  • Fergħa dev użati biex jinħolqu charts li se jiġu ttestjati fuq clusters ta 'żvilupp.
  • Meta tintbagħat talba tal-ġibda lil kaptan, huma kkontrollati fl-istadju.
  • Fl-aħħarnett, noħolqu talba ta 'ġibda biex tikkommetti l-bidliet fil-fergħa produzzjoni u japplikawhom fil-produzzjoni.

Kull ambjent għandu repożitorju privat tiegħu stess li jaħżen iċ-ċarts tagħna, u nużaw Chartmuseum b'APIs utli ħafna. B'dan il-mod aħna niżguraw iżolament strett bejn l-ambjenti u l-ittestjar fid-dinja reali ta 'charts qabel nużawhom fil-produzzjoni.

Repożitorji taċ-ċarts f'ambjenti differenti

Ta 'min jinnota li meta l-iżviluppaturi jimbuttaw fergħa ta' dev, verżjoni taċ-ċart tagħhom tiġi awtomatikament imbuttata lejn id-dev Chartmuseum. Għalhekk, l-iżviluppaturi kollha jużaw l-istess repożitorju dev, u għandek bżonn tispeċifika bir-reqqa l-verżjoni tiegħek tat-tabella sabiex ma tużax aċċidentalment il-bidliet ta 'xi ħadd ieħor.

Barra minn hekk, l-iskrittura żgħira tagħna ta' Python jivvalida l-oġġetti Kubernetes kontra l-ispeċifikazzjonijiet ta' Kubernetes OpenAPI billi tuża Kubeval, qabel ma tippubblikahom fuq Chartmusem.

Deskrizzjoni ġenerali tal-fluss tax-xogħol tal-iżvilupp taċ-ċart

  1. Twaqqif ta 'kompiti tal-pipeline skont l-ispeċifikazzjoni gazr.io għall-kontroll tal-kwalità (lint, unit-test).
  2. Imbuttar immaġni docker b'għodod Python li jużaw l-applikazzjonijiet tagħna.
  3. It-twaqqif tal-ambjent bl-isem tal-fergħa.
  4. Il-validazzjoni tal-fajls yaml ta' Kubernetes bl-użu ta' Kubeval.
  5. Żid awtomatikament il-verżjoni ta 'ċart u ċ-ċarts prinċipali tagħha (ċarts li jiddependu fuq iċ-ċart li qed tinbidel).
  6. Tissottometti chart lil Chartmuseum li taqbel mal-ambjent tiegħu

Il-ġestjoni tad-differenzi bejn il-clusters

Federazzjoni ta' Clusters

Kien hemm żmien meta użajna federazzjoni ta' raggruppamenti ta' Kubernetes, fejn l-oġġetti Kubernetes jistgħu jiġu ddikjarati minn endpoint API wieħed. Iżda qamu problemi. Pereżempju, xi oġġetti Kubernetes ma setgħux jinħolqu fl-endpoint tal-federazzjoni, li jagħmilha diffiċli biex jinżammu oġġetti federati u oġġetti oħra għal clusters individwali.

Biex insolvu l-problema, bdejna nimmaniġġjaw ir-raggruppamenti b'mod indipendenti, li ssimplifikat ħafna l-proċess (użajna l-ewwel verżjoni tal-federazzjoni; xi ħaġa setgħet inbidlet fit-tieni).

Pjattaforma ġeo distribwita

Il-pjattaforma tagħna bħalissa hija mqassma fuq 6 reġjuni - 3 lokalment u 3 fil-cloud.


Skjerament Mqassam

Valuri Globali ta' Helm

4 valuri globali ta’ Helm jippermettulek tidentifika d-differenzi bejn il-clusters. Il-mapep kollha tagħna għandhom valuri minimi default.

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

Valuri globali

Dawn il-valuri jgħinu biex jiddefinixxu l-kuntest għall-applikazzjonijiet tagħna u jintużaw għal diversi skopijiet: monitoraġġ, traċċar, illoggjar, jagħmlu sejħiet esterni, skalar, eċċ.

  • "sħaba": Għandna pjattaforma Kubernetes ibrida. Pereżempju, l-API tagħna hija skjerata fiż-żoni tal-GCP u fiċ-ċentri tad-dejta tagħna.
  • "env": Xi valuri jistgħu jinbidlu għal ambjenti mhux tal-produzzjoni. Per eżempju, definizzjonijiet tar-riżorsi u konfigurazzjonijiet ta 'autoscaling.
  • "reġjun": Din l-informazzjoni tgħin tiddetermina l-post tal-cluster u tista 'tintuża biex tiddetermina endpoints fil-qrib għal servizzi esterni.
  • "clusterName": jekk u meta rridu niddefinixxu valur għal cluster individwali.

Hawn eżempju speċifiku:

{{/* 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 -}}

Eżempju tal-mudell tat-tmun

Din il-loġika hija definita f'mudell ta' għajnuna biex tevita l-imbarazz ta' Kubernetes YAML.

Avviż ta' Applikazzjoni

L-għodod tal-iskjerament tagħna huma bbażati fuq fajls YAML multipli. Hawn taħt hemm eżempju ta 'kif aħna niddikjaraw servizz u t-topoloġija tal-iskala tiegħu (numru ta' repliki) fi cluster.

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

Definizzjoni tas-Servizz

Din hija deskrizzjoni ġenerali tal-passi kollha li jiddefinixxu l-fluss tax-xogħol tal-iskjerament tagħna. L-aħħar pass juża l-applikazzjoni għal gruppi multipli ta’ ħaddiema simultanjament.


Passi ta' Skjerament ta' Jenkins

Xi ngħidu dwar is-sigrieti?

Rigward is-sigurtà, aħna nsegwu s-sigrieti kollha minn postijiet differenti u naħżnuhom f'kaxxa-forti unika Vault f’Pariġi.

L-għodod tal-iskjerament tagħna jiġbdu valuri sigrieti minn Vault u, meta jasal iż-żmien tal-iskjerament, daħħalhom f'Helm.

Biex nagħmlu dan, iddefinijna mapping bejn is-sigrieti fil-Vault u s-sigrieti li jeħtieġu l-applikazzjonijiet tagħna:

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"

  • Iddefinijna regoli ġenerali li għandhom isegwu meta nirreġistraw sigrieti fil-Vault.
  • Jekk is-sigriet japplika għal kuntest jew cluster speċifiku, trid iżżid entrata speċifika. (Hawnhekk il-kuntest cluster1 għandu l-valur tiegħu stess għall-munzell sigriet-app1-password).
  • Inkella jintuża l-valur b'kontumaċja.
  • Għal kull oġġett f'din il-lista fi Kubernetes sigriet jiddaħħal par ċavetta-valur. Għalhekk, il-mudell sigriet fil-mapep tagħna huwa sempliċi ħafna.

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

Problemi u limitazzjonijiet

Ħidma ma repożitorji multipli

Issa nisseparaw l-iżvilupp ta 'charts u applikazzjonijiet. Dan ifisser li l-iżviluppaturi jridu jaħdmu f'żewġ repożitorji git: wieħed għall-applikazzjoni, u wieħed għad-definizzjoni tal-iskjerament tagħha għal Kubernetes. 2 repożitorji git ifissru 2 flussi tax-xogħol, u huwa faċli għal newbie li jitħawwad.

Il-ġestjoni ta 'charts ġeneralizzati hija battikata

Kif diġà għidna, iċ-ċarts ġeneriċi huma utli ħafna biex jiġu identifikati d-dipendenzi u jiġu skjerati malajr applikazzjonijiet multipli. Imma nużaw --reuse-valuesbiex nevitaw li ngħaddu l-valuri kollha kull darba li niskjeraw applikazzjoni li hija parti minn din it-tabella ġeneralizzata.

Fi fluss tax-xogħol ta 'kunsinna kontinwu, għandna biss żewġ valuri li jinbidlu regolarment: in-numru ta' repliki u t-tikketta tal-immaġni (verżjoni). Valuri oħra aktar stabbli jinbidlu manwalment, u dan huwa pjuttost diffiċli. Barra minn hekk, żball wieħed fl-iskjerament ta 'chart ġeneralizzat jista' jwassal għal fallimenti serji, kif rajna mill-esperjenza tagħna stess.

Aġġornament ta 'fajls ta' konfigurazzjoni multipli

Meta żviluppatur iżid applikazzjoni ġdida, irid ibiddel diversi fajls: id-dikjarazzjoni tal-applikazzjoni, il-lista tas-sigrieti, iżid l-applikazzjoni bħala dipendenza jekk tkun inkluża fit-tabella ġeneralizzata.

Il-permessi ta' Jenkins huma estiżi wisq fil-Vault

Issa għandna waħda AppRole, li jaqra s-sigrieti kollha mill-Vault.

Il-proċess ta 'rollback mhuwiex awtomatizzat

Biex twaqqaf, għandek bżonn tmexxi l-kmand fuq diversi clusters, u dan huwa mimli żbalji. Aħna nwettqu din l-operazzjoni manwalment biex niżguraw li l-ID tal-verżjoni korretta tkun speċifikata.

Qegħdin nimxu lejn GitOps

L-għan tagħna

Irridu nirritornaw iċ-ċart lir-repożitorju tal-applikazzjoni li tiskjera.

Il-fluss tax-xogħol se jkun l-istess bħal għall-iżvilupp. Pereżempju, meta fergħa tiġi mbuttata biex tikkontrolla, l-iskjerament jiġi attivat awtomatikament. Id-differenza ewlenija bejn dan l-approċċ u l-fluss tax-xogħol attwali tkun dik kollox se jiġi ġestit f'git (l-applikazzjoni nnifisha u l-mod kif tiġi skjerata fil-Kubernetes).

Hemm diversi vantaġġi:

  • Ħafna aktar ċari għall-iżviluppatur. Huwa aktar faċli li titgħallem kif tapplika l-bidliet f'ċart lokali.
  • Id-definizzjoni tal-iskjerament tas-servizz tista' tiġi speċifikata l-istess post bħall-kodiċi servizz.
  • Ġestjoni tat-tneħħija ta 'charts ġeneralizzati. Is-servizz se jkollu r-rilaxx ta' Helm tiegħu stess. Dan jippermettilek timmaniġġja ċ-ċiklu tal-ħajja tal-applikazzjoni (rollback, upgrade) fl-iżgħar livell, sabiex ma taffettwax servizzi oħra.
  • Benefiċċji ta 'git għall-ġestjoni taċ-ċart: ħoll bidliet, log tal-awditjar, eċċ. Jekk għandek bżonn tħoll bidla għal chart, tista 'tagħmel dan billi tuża git. L-iskjerament jibda awtomatikament.
  • Tista' tikkunsidra li ttejjeb il-fluss tax-xogħol tal-iżvilupp tiegħek b'għodod bħal Skaffold, li biha l-iżviluppaturi jistgħu jittestjaw il-bidliet f'kuntest qrib il-produzzjoni.

Migrazzjoni f'żewġ stadji

L-iżviluppaturi tagħna ilhom jużaw dan il-fluss tax-xogħol għal sentejn issa, għalhekk irridu li l-migrazzjoni tkun bla tbatija kemm jista 'jkun. Għalhekk, iddeċidejna li nżidu pass intermedju fit-triq lejn l-għan.
L-ewwel stadju huwa sempliċi:

  • Aħna nżommu struttura simili għat-twaqqif tal-iskjerament tal-applikazzjoni, iżda f'oġġett wieħed imsejjaħ 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 rilaxx għal kull applikazzjoni (mingħajr mapep ġeneralizzati).
  • Ċarts fir-repożitorju git tal-applikazzjoni.

Tkellimna mal-iżviluppaturi kollha, għalhekk il-proċess tal-migrazzjoni diġà beda. L-ewwel stadju għadu kkontrollat ​​bl-użu tal-pjattaforma CI. Jien ser nikteb post ieħor dalwaqt dwar it-tieni fażi: kif aħna mċaqalqa għal fluss tax-xogħol GitOps bi Fluss. Jien ngħidlek kif waqqafna kollox u liema diffikultajiet iltqajna magħhom (repożitorji multipli, sigrieti, eċċ.). Segwi l-aħbarijiet.

Hawnhekk ippruvajna niddeskrivu l-progress tagħna fil-fluss tax-xogħol tal-iskjerament tal-applikazzjoni matul is-snin li għaddew, li wassal għal ħsibijiet dwar l-approċċ GitOps. Għadna ma lħaqniex l-għan u se nirrapportaw dwar ir-riżultati, iżda issa aħna konvinti li għamilna l-aħjar meta ddeċidejna li nissimplifikaw kollox u nressqu eqreb lejn id-drawwiet tal-iżviluppaturi.

Sors: www.habr.com

Żid kumment