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 , 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 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. , enne nende avaldamist Chartmuseumis.
Charti arendusprotsessi ĂŒldine kirjeldus
- Töövooprotsessi ĂŒlesannete seadmine spetsifikatsiooni jĂ€rgi kvaliteedikontrolli (lint, unit-test) jaoks.
- Docker pildi saatmine koos Python tööriistadega, mis kÀivitavad meie rakendusi.
- Keskkonna seadistamine haru nime jÀrgi.
- Kubernetes yaml failide kontrollimine Kubeval abil.
- Charti ja selle vanemate chartide (chartide, mis sÔltuvad muudetavast chartist) automaatne versiooni tÔstmine.
- Charti saatmine Chartmuseumisse, mis vastab tema keskkonnale.
Klastrite erinevuste haldamine
Klastrite föderatsioon
Oli aeg, mil me kasutasime , 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-central1Globaalsed 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: 3Teenuse 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 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: OpaqueProbleemid 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 , 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. . 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
