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 , 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 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 , enne kui need avaldatakse Chartmusesse.
Chartâi arendamise töökĂ€igu ĂŒldine ĂŒlevaade
- Pipeliini ĂŒlesannete seadistamine spetsifikatsiooni jĂ€rgi kvaliteedikontrolliks (lint, ĂŒksuste testimine).
- Docker'i pildi saatmine koos Python'i tööriistadega, mis juurutavad meie rakendused.
- Keskkonna seadistamine harunime jÀrgi.
- Kubernetes yaml failide kontrollimine Kubevalâi abil.
- Chartâi ja selle vanemate chartâide (chartâid, mis sĂ”ltuvad muudetavast chartâist) versiooni automaatne tĂ”stmine.
- Chart'i saatmine Chartmuseumisse, mis vastab oma keskkonnale
Erinevuste haldamine klastrites
Klastrite föderatsioon
Oli aeg, mil kasutasime , 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-central1Globaalne 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: 3Teenuse 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 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: OpaqueProbleemid 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 , 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 . 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
