
Paljud arvavad, et piisab rakenduse viimisest Kubernetes'i (kas siis Helmâiga vĂ”i kĂ€sitsi) â ja kĂ”ik on hĂ€sti. Kuid asi ei ole nii lihtne.
Meeskond TÔlkinud DevOps-insener Julian Gindi artikkel. Ta rÀÀgib, milliste takistustega tema ettevÔte migratsiooni kÀigus silmitsi seisis, et te ei langeks samadesse auhindadesse.
Esimene samm: podide pÀringute ja piirangute seadistamine
Alustame puhta keskkonna seadistamisest, milles meie podid töötavad. Kubernetes saab suurepĂ€raselt hakkama podide planeerimise ja rikkeolukordade haldamisega. Kuid selgub, et planeerija ei saa mĂ”nikord podi asetada, kui tal on raske hinnata, kui palju ressursse on tal vaja eduka töö jaoks. Just siin tulevad mĂ€ngu ressursi pĂ€ringud ja piirangud. Palju arutelusid kĂ€ivad selle ĂŒle, mis on parim lĂ€henemine pĂ€ringute ja piirangute seadistamiseks. MĂ”nikord tundub, et see on pigem kunst kui teadus. Siin on meie lĂ€henemine.
Podide pÀringud (pod requests) on pÔhivÀÀrtus, mida planeerija kasutab podi optimaalseks paigutamiseks.
Kuna : filtreerimise etapis mÀÀratakse kindlaks sÔlmed, kuhu podi vÔib plaanida. NÀiteks filter PodFitsResources kontrollib, kas sÔlmes on ressursse, et rahuldada konkreetsete podide ressursi pÀringuid.
Kasutame rakenduste pĂ€ringuid nii, et nende pĂ”hjal saab hinnata, kui palju ressursse tĂ”eliselt on rakendusele normaalseks tööks vajalik. Nii suudab planeerija realistlikult sĂ”lmi paigutada. Esialgu tahtsime seadistada pĂ€ringud ĂŒle, et tagada igale podile piisavalt suuri ressursse, kuid mĂ€rkasime, et planeerimisaeg kasvas mĂ€rkimisvÀÀrselt, ning mĂ”ned podid ei saanud tĂ€ielikult planeeritud, nagu ei oleks neile mingit ressursi pĂ€ringut laekunud.
Sellisel juhul viis planeerija sageli podid âvĂ€ljaâ ja ei suutnud neid uuesti planeerida, kuna halduskiht ei teadnud, kui palju ressursse rakendusele tuleks, ja see on planeerimise algoritmi vĂ”tmeelement.
Podide piirangud (pod limits) on podile selgema piiranguna. See on maksimaalne ressursi maht, mille klaster eraldab konteinerile.
Taaskord, ... : kui konteinerile on mÀÀratud 4 GiB mĂ€lu piirang, sunnib kubelet (ja konteineri kĂ€ituskeskkond) seda kasutama. KĂ€ituskeskkond ei luba konteineril kasutada rohkem kui mÀÀratud ressursside piirang. NĂ€iteks, kui konteineris olev protsess ĂŒritab kasutada rohkem lubatud mĂ€lumahtu, lĂ”petab sĂŒsteemifikaader selle protsessi vigaga âmĂ€lu lĂ”ppâ (OOM).
Konteiner vÔib alati kasutada rohkem ressursse, kui on mÀÀratud ressursi taotlemisel, kuid kunagi ei tohi ta kasutada rohkem kui on mÀÀratud piirangus. Selle mÔistmine on keeruline, kuid see on vÀga oluline.
Ideaalis soovime, et podi ressursi nĂ”udmised muutuksid protsessi elutsĂŒkli jooksul, segamata teisi sĂŒsteemi protsesse â see on piirangute seadmise eesmĂ€rk.
Kahjuks ei saa ma anda konkreetseid juhiseid, milliseid vÀÀrtusi mÀÀrata, kuid meie jÀrgime jÀrgmisi reegleid:
- Kasvatuskatsetamise tööriistaga modelleerime pÔhitaseme liiklust ja jÀlgime podi ressursikasutust (mÀlu ja protsessor).
- MÀÀrame podi nÔudmised meelevaldselt madalale tasemele (ressursi piirang on umbes 5 korda suurem kui nÔudmiste vÀÀrtus) ja jÀlgime. Kui nÔudmised on liiga madalad, ei saa protsess alata, mis sageli pÔhjustab Go ajalisi salakavalikke vigu.
Soovin mÀrkida, et kÔrgemad ressursipiirangud raskendavad planeerimist, kuna pod vajab sihtsÔlme, millel on piisavalt vabu ressursse.
Kujutlege olukorda, kus teil on kergekaaluline veebiserver vÀga kÔrgete ressursipiirangutega, nÀiteks 4 GB mÀlu. TÔenÀoliselt tuleb see protsess horisontaalselt skaleerida ja iga uus moodul tuleb planeerida sÔlme, millel on vÀhemalt 4 GB vaba mÀlu. Kui sellist sÔlme pole, peab klaster lisama uue sÔlme, et seda podi töödelda, mis vÔib vÔtta aega. Oluline on saavutada minimaalne erinevus ressursinÔuete ja -piirangute vahel, et tagada kiire ja sujuv skaleerimine.
Teine etapp: Liveness ja Readiness testide seadistamine
See on veel ĂŒks delikaatne teema, mida arutatakse sageli Kubernetes'i kogukonnas. On oluline mĂ”ista elujĂ”udluskatsete (Liveness) ja valmiduskatsete (Readiness) olemust, kuna need tagavad tarkvara stabiilse töö ja minimeerivad seisakuaega. Kui neid pole Ă”igesti seadistatud, vĂ”ivad need aga tĂ”siselt mĂ”jutada teie rakenduse jĂ”udlust. Allpool on lĂŒhike kokkuvĂ”te mĂ”lema katse olemusest.
ElujÔudlus nÀitab, kas konteiner töötab. Kui see ebaÔnnestub, tapab kubelet konteineri ja aktiveerib sellel taastamisstrateegia. Kui konteineril pole elujÔudluskatset, siis on vaikimisi olekuks Ônnestumine, nagu öeldakse .
ElujÔudluskatsetel peaks olema madalad nÔudmised, st nad ei tohi tarbida palju ressursse, kuna neid kÀivitatakse sageli ja need peavad teavitama Kubernetes'i, et rakendus on töötav.
Kui seadistate parameetri kÀivitamiseks iga sekundi tagant, lisab see 1 pÀringu sekundis, seega arvestage, et selle liikluse töötlemiseks on vaja lisajÔude.
Meie ettevÔttes kontrollivad elujÔudluskatsetes rakenduse pÔhikomponente, isegi kui andmed (nÀiteks eemal olevast andmebaasist vÔi vahemÀlust) pole tÀielikult kÀttesaadavad.
Oleme rakendustes seadnud töökindluse lÔpp-punkti, mis lihtsalt tagastab vastuskoodi 200. See tÀhendab, et protsess on kÀivitatud ja suudab pÀringutele vastata (aga mitte veel liiklusele).
Katsed Valmidus nÀitab, kas konteiner on valmis pÀringutele vastama. Kui valmiduskatse ebaÔnnestub, eemaldab lÔpp-punktide kontroller poodi IP-aadressi kÔikidest teenuse lÔpp-punktidest, mis vastavad poele. See on samuti toodud Kubernetes'i dokumentatsioonis.
Valmiduskatsetel on suuremad ressursinÔudmised, kuna need peavad jÔudma taustale viisil, mis nÀitab rakenduse valmidust pÀringute vastuvÔtmiseks.
Kogukonnas arutatakse palju, kas otse andmebaasile pöörduda. Arvestades kulusid (kontrollid toimuvad sageli, kuid neid saab reguleerida), oleme otsustanud, et teatud rakenduste puhul loetakse valmisolek teenindada liiklust kehtivaks ainult pÀrast seda, kui on kontrollitud, et andmebaasist tagastatakse kirjed. HÀsti lÀbi mÔeldud valmisoleku proovid on taganud kÔrgema kÀttesaadavuse taseme ja vÀlistanud seiskumised juurutamise ajal.
Kui otsustate teha andmebaasi pÀringu rakenduse valmisoleku kontrollimiseks, veenduge, et see maksaks vÔimalikult vÀhe. VÔtame nÀiteks selle pÀringu:
SELECT small_item FROM table LIMIT 1Siin on nÀide, kuidas me neid kahte vÀÀrtust Kuberneteses seadistame:
livenessProbe:
httpGet:
path: /api/liveness
port: http
readinessProbe:
httpGet:
path: /api/readiness
port: http periodSeconds: 2
Saate lisada mÔned tÀiendavad konfigureerimise parameetrid:
initialDelaySecondsâ kui palju sekundite jooksul peaks kuluma konteineri kĂ€ivitamise ja pinda proovide kĂ€ivitamise vahel.periodSecondsâ ootamise intervall katsete tegemise vahel.timeoutSecondsâ sekundite arv, pĂ€rast millega peetakse pinda rikki. Tavaline ajavahemik.failureThresholdâ katsete ebaĂ”nnestumise arv enne, kui pind saadab taaskĂ€ivitamise signaali.successThresholdâ eduka proovi arv enne, kui pind lĂ€heb valmisoleku seisundisse (pĂ€rast rikete, kui pind taaskĂ€ivitub vĂ”i taastub).
Kolmas samm: pinda vaikevÔrgupoliitikate seadistamine
Kuberneteses on "tasane" vÔrgu topoloogia, kus kÔik pinnad suhtlevad omavahel otse. MÔnes olukorras ei ole see soovitav.
Potentsiaalne turvaprobleem seisneb selles, et kurjategija vĂ”ib kasutada ĂŒhte haavatavat rakendust, et suunata liiklust kĂ”ikidele pinna vĂ”rku. Nagu paljudes turvavaldkondades, kehtib siin minimaalsete Ă”iguste printsiip. Ideaalis peab vĂ”rgupoliitikad selgelt mÀÀratlema, millised ĂŒhendused pindade vahel on lubatud ja millised mitte.
NĂ€iteks allpool on lihtne poliitika, mis keelab kogu sissetuleva liikluse teatud nimeruumis:
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
spec:
podSelector: {}
policyTypes:
- Ingress
Selle konfiguratsiooni visualiseerimine:

(https://miro.medium.com/max/875/1*-eiVw43azgzYzyN1th7cZg.gif)
Rohkem detaile .
Neljas samm: mittetavaline kÀitumine hukkude ja alguse konteinerite abil
Ăks meie peamisi ĂŒlesandeid oli tagada Kubernetes'e juurutamised, ilma et arendajatele tekiks seiskumisi. See on keeruline, kuna rakenduste sulgemisviise ja nende kasutatud ressursside vabastamise vĂ”imalusi on palju.
Eriti suured raskused tekkisid . Me mĂ€rkasime, et nende podide jĂ€rjestikuse juurutamise ajal katkestati aktiivsed ĂŒhendused enne eduka sulgemise lĂ”puleviimist.
PĂ€rast ulatuslikku uurimistööd internetis selgus, et Kubernetes ei oota, kuni Nginxi ĂŒhendused on ammendatud, enne kui podi sulgeb. Pre-stop huki abil integreerisime sellise funktsionaalsuse ja vabanesime tĂ€ielikult seisakutest:
lifecycle:
preStop:
exec:
command: ["/usr/local/bin/nginx-killer.sh"]
Ja siin on nginx-killer.sh:
#!/bin/bash
sleep 3
PID=$(cat /run/nginx.pid)
nginx -s quit
while [ -d /proc/$PID ]; do
echo "Waiting while shutting down nginx..."
sleep 10
done
Veel ĂŒks ÀÀrmiselt kasulik paradigma on init-konteinerite kasutamine konkreetsete rakenduste kĂ€ivitamiseks. See on eriti kasulik, kui teil on ressursimahukas andmebaasi migratsiooniprotsess, mis tuleb algatada enne rakenduse kĂ€ivitamist. Selle protsessi jaoks saate samuti mÀÀrata kĂ”rgema ressursi limiidi, ilma et peaksite seda limiiti seadma pĂ”hietendusele.
Teine levinud skeem on salajastele ligipÀÀs init-konteineris, mis edastab need volitused pÔhikomponendile, vÀltides seadusliku juurdepÀÀsu salajastele otse pÔhikomponendist.
Nagu tavaliselt, kĂŒsite dokumentatsioonist: init-konteinerid kĂ€ivitavad ohutult kasutaja koodi vĂ”i utiliite, mis muidu vĂ€hendaksid rakenduse konteineri pildi turvalisust. Hoides eraldi tarbetud tööriistad, piirate rakenduse konteineri pildi rĂŒnde pinda.
Viies samm: tuuma seadistamine
LÔpetuseks rÀÀgime pisut edasijÔudnud tehnikast.
Kubernetes on erakordselt paindlik platvorm, mis vĂ”imaldab kĂ€itada töökoormusi nii, nagu te seda soovite. Meil on mitmeid kĂ”rge tootlikkusega rakendusi, mis nĂ”uavad tohutult palju ressursse. Ulatuslikul koormustestimisel avastasime, et ĂŒks rakendustest peab liikluse oodatavat koormust silmas pidades vaeva.
Kubernetes vĂ”imaldab kĂ€ivitada privileeritud konteineri, mis muudab tuuma parameetreid ainult konkreetse podi jaoks. Siin on, mida me kasutasime maksimaalse avatud ĂŒhenduste arvu muutmiseks:
initContainers:
- name: sysctl
image: alpine:3.10
securityContext:
privileged: true
command: ['sh', '-c', "sysctl -w net.core.somaxconn=32768"]
See on keerukam tehnika, mida ei pruugita sageli vajada. Kuid kui teie rakendus vaevu talub suurt koormust, vÔite proovida mÔningaid neist parameetritest seadistada. TÀiendav teave selle protsessi ja erinevate vÀÀrtuste seadistamise kohta on, nagu alati, .
KokkuvÔtteks
Kuigi Kubernetes vÔib tunduda valmis lahendusena "karbist vÀlja", on rakenduste sujuvaks toimimiseks vajalik vÔtta mÔned olulised sammud.
Kogu Kubernetesesse migreerimise jooksul on oluline jĂ€rgida "koormustestis tsĂŒklit": kĂ€ivitate rakenduse, testeeri seda koormuse all, jĂ€lgige mÔÔdikuid ja kĂ€itumist skaleerimise ajal, seadistate konfiguratsiooni nende andmete alusel, seejĂ€rel kordate tsĂŒklit.
Hinnake realistlikult oodatavat liiklust ja proovige sellest ĂŒle jĂ”uda, et nĂ€ha, millised komponendid murduvad esimesena. Sellise iteratiivse lĂ€henemisega vĂ”ib piisata vaid mĂ”ne ĂŒlaltoodud soovituse jĂ€rgimisest, vĂ”i vĂ”ib olla vajalik sĂŒgavam seadistamine.
KĂŒsi endalt alati jĂ€rgmisi kĂŒsimusi:
- Kui palju ressursse rakendused kasutavad ja kuidas see maht muutub?
- Millised on tegelikud skaleerimise nÔuded? Kui palju liiklust keskmiselt rakendus talub? Aga tippkoormuse ajal?
- Kui sageli vajab teenus horisontaalset skaleerimist? Kui kiiresti tuleb uusi pode tööle vÔtta, et liiklust vastu vÔtta?
- Kuidas toimub pode korrektne lĂ”petamine? Kas see on vajalik? Kas on vĂ”imalik saavutada ĂŒleslaadimist ilma seisakuteta?
- Kuidas minimeerida turvariske ja piirata kahju mistahes kompromiteeritud pode puhul? Kas mÔnel teenusel on Ôigusi vÔi juurdepÀÀse, mida nad ei vaja?
Kubernetes pakub uskumatu platvormi, mis vÔimaldab rakendada parimaid praktikaid tuhandete teenuste juurutamiseks klastrisse. Siiski on kÔik rakendused erinevad. MÔnikord nÔuab juurutamine natuke rohkem tööd.
Ănneks pakub Kubernetes vajalikke seadistusi, et saavutada kĂ”ik tehnilised eesmĂ€rgid. Kasutades ressursside pĂ€ringute ja piiride kombinatsiooni, Liveness ja Readiness proove, init-konteinereid, vĂ”rgu poliitikaid ning kohandatud tuuma seadistust, saate saavutada kĂ”rge jĂ”udluse koos tĂ”rke taluvuse ja kiire skaleeritavusega.
Mida veel lugeda:
- .
- .
- .
Allikas: habr.com
