Defnyddio cymwysiadau ar draws nifer o glystyrau Kubernetes gyda Helm

Sut mae Dailymotion yn defnyddio Kubernetes: Defnyddio Cymwysiadau

Fe wnaethom ni yn Dailymotion ddechrau defnyddio Kubernetes wrth gynhyrchu 3 blynedd yn Γ΄l. Ond mae defnyddio cymwysiadau ar draws clystyrau lluosog yn hwyl, felly dros yr ychydig flynyddoedd diwethaf rydym wedi bod yn ceisio gwella ein hoffer a'n llifoedd gwaith.

Ble y dechreuodd

Yma byddwn yn ymdrin Γ’ sut rydym yn defnyddio ein cymwysiadau ar draws nifer o glystyrau Kubernetes ledled y byd.

I ddefnyddio gwrthrychau Kubernetes lluosog ar unwaith, rydym yn defnyddio Helm, ac mae ein holl siartiau'n cael eu storio mewn un ystorfa git. I ddefnyddio pentwr cais llawn o nifer o wasanaethau, rydym yn defnyddio'r siart crynhoi fel y'i gelwir. Yn y bΓ΄n, mae hwn yn siart sy'n datgan dibyniaethau ac yn caniatΓ‘u ichi gychwyn yr API a'i wasanaethau gydag un gorchymyn.

Fe wnaethom hefyd ysgrifennu sgript Python bach ar ben Helm i wneud gwiriadau, creu siartiau, ychwanegu cyfrinachau, a defnyddio cymwysiadau. Perfformir yr holl dasgau hyn ar lwyfan CI canolog gan ddefnyddio delwedd docwr.

Gadewch i ni gyrraedd y pwynt.

Nodyn. Wrth i chi ddarllen hwn, mae'r ymgeisydd rhyddhau cyntaf ar gyfer Helm 3 eisoes wedi'i gyhoeddi. Mae'r brif fersiwn yn cynnwys llu o welliannau i fynd i'r afael Γ’ rhai o'r materion yr ydym wedi dod ar eu traws yn y gorffennol.

Llif gwaith datblygu siartiau

Rydym yn defnyddio canghennu ar gyfer ceisiadau, a phenderfynom ddefnyddio'r un ymagwedd at siartiau.

  • Cangen dev a ddefnyddir i greu siartiau a fydd yn cael eu profi ar glystyrau datblygu.
  • Pan gyflwynir cais tynnu i meistr, maent yn cael eu gwirio yn y llwyfannu.
  • Yn olaf, rydym yn creu cais tynnu i ymrwymo'r newidiadau i'r gangen prod a'u cymhwyso wrth gynhyrchu.

Mae gan bob amgylchedd ei storfa breifat ei hun sy'n storio ein siartiau, ac rydyn ni'n eu defnyddio Amgueddfa Siart gydag APIs defnyddiol iawn. Fel hyn rydym yn sicrhau arwahanrwydd llym rhwng amgylcheddau a phrofi siartiau yn y byd go iawn cyn eu defnyddio wrth gynhyrchu.

Storfeydd siartiau mewn gwahanol amgylcheddau

Mae'n werth nodi, pan fydd datblygwyr yn gwthio cangen datblygu, bod fersiwn o'u siart yn cael ei gwthio'n awtomatig i'r dev Chartmuseum. Felly, mae pob datblygwr yn defnyddio'r un ystorfa datblygu, ac mae angen i chi nodi'ch fersiwn chi o'r siart yn ofalus er mwyn peidio Γ’ defnyddio newidiadau rhywun arall yn ddamweiniol.

Ar ben hynny, mae ein sgript Python bach yn dilysu gwrthrychau Kubernetes yn erbyn manylebau Kubernetes OpenAPI gan ddefnyddio Ciwbfal, cyn eu cyhoeddi ar Chartmusem.

Disgrifiad cyffredinol o'r llif gwaith datblygu siart

  1. Sefydlu tasgau piblinell yn unol Γ’'r fanyleb gazr.io ar gyfer rheoli ansawdd (lint, uned-prawf).
  2. Gwthio delwedd docwr gydag offer Python sy'n defnyddio ein cymwysiadau.
  3. Sefydlu'r amgylchedd yn Γ΄l enw cangen.
  4. Dilysu ffeiliau Kubernetes yaml gan ddefnyddio Kubeval.
  5. Cynyddwch fersiwn siart a'i siartiau rhiant yn awtomatig (siartiau sy'n dibynnu ar newid y siart).
  6. Cyflwyno siart i Amgueddfa Siart sy'n cyfateb i'w hamgylchedd

Rheoli gwahaniaethau ar draws clystyrau

Ffederasiwn y Clystyrau

Roedd yna amser pan fyddwn ni'n defnyddio ffederasiwn o glystyrau Kubernetes, lle gellid datgan gwrthrychau Kubernetes o un pwynt terfyn API. Ond cododd problemau. Er enghraifft, ni ellid creu rhai gwrthrychau Kubernetes ym mhen draw'r ffederasiwn, gan ei gwneud hi'n anodd cynnal gwrthrychau ffederal a gwrthrychau eraill ar gyfer clystyrau unigol.

I ddatrys y broblem, fe ddechreuon ni reoli'r clystyrau'n annibynnol, a oedd yn symleiddio'r broses yn fawr (fe wnaethon ni ddefnyddio'r fersiwn gyntaf o ffedereiddio; efallai bod rhywbeth wedi newid yn yr ail).

Llwyfan wedi'i ddosbarthu'n geo

Ar hyn o bryd mae ein platfform wedi'i ddosbarthu ar draws 6 rhanbarth - 3 yn lleol a 3 yn y cwmwl.


Defnydd Dosbarthedig

Gwerthoedd Helm Byd-eang

Mae 4 gwerth Helm byd-eang yn eich galluogi i nodi gwahaniaethau rhwng clystyrau. Mae gan bob un o'n siartiau werthoedd lleiaf diofyn.

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

Gwerthoedd byd-eang

Mae'r gwerthoedd hyn yn helpu i ddiffinio'r cyd-destun ar gyfer ein cymwysiadau ac fe'u defnyddir at wahanol ddibenion: monitro, olrhain, logio, gwneud galwadau allanol, graddio, ac ati.

  • "cwmwl": Mae gennym lwyfan Kubernetes hybrid. Er enghraifft, mae ein API yn cael ei ddefnyddio mewn parthau GCP ac yn ein canolfannau data.
  • "env" : Mae'n bosibl y bydd rhai gwerthoedd yn newid ar gyfer amgylcheddau nad ydynt yn cynhyrchu. Er enghraifft, diffiniadau adnoddau a ffurfweddiadau graddio awtomatig.
  • "rhanbarth": Mae'r wybodaeth hon yn helpu i bennu lleoliad y clwstwr a gellir ei defnyddio i bennu pwyntiau terfyn cyfagos ar gyfer gwasanaethau allanol.
  • "clusterName": os a phryd rydym am ddiffinio gwerth ar gyfer clwstwr unigol.

Dyma enghraifft benodol:

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

Enghraifft templed Helm

Diffinnir y rhesymeg hon mewn templed cynorthwyydd er mwyn osgoi annibendod Kubernetes YAML.

Cyhoeddiad Cais

Mae ein hoffer lleoli yn seiliedig ar ffeiliau YAML lluosog. Isod mae enghraifft o sut rydym yn datgan gwasanaeth a'i dopoleg graddio (nifer o atgynyrchiadau) mewn clwstwr.

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

Diffiniad Gwasanaeth

Dyma amlinelliad o'r holl gamau sy'n diffinio ein llif gwaith lleoli. Mae'r cam olaf yn defnyddio'r cais i glystyrau o weithwyr lluosog ar yr un pryd.


Camau Defnyddio Jenkins

Beth am gyfrinachau?

O ran diogelwch, rydym yn olrhain yr holl gyfrinachau o wahanol leoedd ac yn eu storio mewn claddgell unigryw Bwlch ym Mharis.

Mae ein hoffer lleoli yn tynnu gwerthoedd cyfrinachol o Vault a, phan ddaw amser defnyddio, eu mewnosod yn Helm.

I wneud hyn, fe wnaethom ddiffinio mapio rhwng y cyfrinachau yn Vault a'r cyfrinachau sydd eu hangen ar ein cymwysiadau:

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"

  • Rydym wedi diffinio rheolau cyffredinol i'w dilyn wrth gofnodi cyfrinachau yn Vault.
  • Os yw'r gyfrinach yn berthnasol i gyd-destun neu glwstwr penodol, mae angen ichi ychwanegu cofnod penodol. (Yma mae gan y clwstwr cyd-destun1 ei werth ei hun ar gyfer y cyfrinair stack-app1-cyfrinair cyfrinachol).
  • Fel arall defnyddir y gwerth yn ddiofyn.
  • Ar gyfer pob eitem yn y rhestr hon yn Kubernetes gyfrinach mewnosodir pΓ’r gwerth allwedd. Felly, mae'r templed cyfrinachol yn ein siartiau yn syml iawn.

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

Problemau a chyfyngiadau

Gweithio gyda storfeydd lluosog

Nawr rydym yn gwahanu datblygiad siartiau a chymwysiadau. Mae hyn yn golygu bod yn rhaid i ddatblygwyr weithio mewn dwy storfa git: un ar gyfer y cais, ac un ar gyfer diffinio ei ddefnydd i Kubernetes. Mae storfa 2 git yn golygu 2 lif gwaith, ac mae'n hawdd i newbie ddrysu.

Mae rheoli siartiau cyffredinol yn drafferth

Fel y dywedasom eisoes, mae siartiau generig yn ddefnyddiol iawn ar gyfer nodi dibyniaethau a defnyddio cymwysiadau lluosog yn gyflym. Ond rydym yn defnyddio --reuse-valueser mwyn osgoi pasio'r holl werthoedd bob tro rydym yn defnyddio cymhwysiad sy'n rhan o'r siart cyffredinol hwn.

Mewn llif gwaith cyflwyno parhaus, dim ond dau werth sydd gennym sy'n newid yn rheolaidd: nifer y replicas a'r tag delwedd (fersiwn). Mae gwerthoedd eraill, mwy sefydlog yn cael eu newid Γ’ llaw, ac mae hyn yn eithaf anodd. Ar ben hynny, gall un camgymeriad wrth ddefnyddio siart gyffredinol arwain at fethiannau difrifol, fel y gwelsom o'n profiad ein hunain.

Diweddaru ffeiliau cyfluniad lluosog

Pan fydd datblygwr yn ychwanegu cais newydd, mae'n rhaid iddo newid sawl ffeil: y datganiad cais, y rhestr o gyfrinachau, gan ychwanegu'r cais fel dibyniaeth os yw wedi'i gynnwys yn y siart cyffredinol.

Mae caniatadau Jenkins yn rhy estynedig yn Vault

Nawr mae gennym ni un AppRole, sy'n darllen yr holl gyfrinachau o'r Vault.

Nid yw'r broses dychwelyd yn awtomataidd

I ddychwelyd, mae angen i chi redeg y gorchymyn ar sawl clwstwr, ac mae hyn yn llawn gwallau. Rydym yn cyflawni'r llawdriniaeth hon Γ’ llaw i sicrhau bod yr ID fersiwn cywir wedi'i nodi.

Rydym yn symud tuag at GitOps

Ein nod

Rydym am ddychwelyd y siart i gadwrfa'r rhaglen y mae'n ei defnyddio.

Bydd y llif gwaith yr un fath ag ar gyfer datblygiad. Er enghraifft, pan fydd cangen yn cael ei gwthio i feistroli, bydd y defnydd yn cael ei sbarduno'n awtomatig. Y prif wahaniaeth rhwng y dull hwn a'r llif gwaith presennol fyddai hynny bydd popeth yn cael ei reoli mewn git (y cais ei hun a'r ffordd y caiff ei ddefnyddio yn Kubernetes).

Mae yna nifer o fanteision:

  • Llawer cliriach ar gyfer y datblygwr. Mae'n haws dysgu sut i gymhwyso newidiadau mewn siart leol.
  • Gellir nodi'r diffiniad o ddefnydd gwasanaeth yr un lle Γ’'r cod gwasanaeth.
  • Rheoli dileu siartiau cyffredinol. Bydd gan y gwasanaeth ei ryddhad Helm ei hun. Bydd hyn yn caniatΓ‘u ichi reoli cylch oes y cais (dychwelyd, uwchraddio) ar y lefel leiaf, er mwyn peidio ag effeithio ar wasanaethau eraill.
  • Manteision git ar gyfer rheoli siartiau: dadwneud newidiadau, log archwilio, ac ati. Os oes angen i chi ddadwneud newid i siart, gallwch wneud hyn gan ddefnyddio git. Mae'r gosodiad yn cychwyn yn awtomatig.
  • Efallai y byddwch yn ystyried gwella eich llif gwaith datblygu gydag offer fel Sgaffald, lle gall datblygwyr brofi newidiadau mewn cyd-destun sy'n agos at gynhyrchu.

Mudo dau gam

Mae ein datblygwyr wedi bod yn defnyddio'r llif gwaith hwn ers 2 flynedd bellach, felly rydym am i'r mudo fod mor ddi-boen Γ’ phosibl. Felly, penderfynasom ychwanegu cam canolradd ar y ffordd at y nod.
Mae'r cam cyntaf yn syml:

  • Rydym yn cadw strwythur tebyg ar gyfer sefydlu gosodiad cymhwysiad, ond mewn un gwrthrych o'r enw 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 datganiad fesul cais (heb siartiau cyffredinol).
  • Siartiau yn ystorfa git y cymhwysiad.

Rydym wedi siarad Γ’'r holl ddatblygwyr, felly mae'r broses fudo eisoes wedi dechrau. Mae'r cam cyntaf yn dal i gael ei reoli gan ddefnyddio'r llwyfan CI. Byddaf yn ysgrifennu post arall yn fuan am gam dau: sut y gwnaethom symud i lif gwaith GitOps gyda Fflwcs. Byddaf yn dweud wrthych sut y gwnaethom sefydlu popeth a pha anawsterau y daethom ar eu traws (storfeydd lluosog, cyfrinachau, ac ati). Dilynwch y newyddion.

Yma rydym wedi ceisio disgrifio ein cynnydd yn y llif gwaith defnyddio cymwysiadau dros y blynyddoedd diwethaf, a arweiniodd at feddyliau am ddull GitOps. Nid ydym wedi cyrraedd y nod eto a byddwn yn adrodd ar y canlyniadau, ond nawr rydym yn argyhoeddedig ein bod wedi gwneud y peth iawn pan benderfynon ni symleiddio popeth a dod ag ef yn agosach at arferion datblygwyr.

Ffynhonnell: hab.com

Ychwanegu sylw