Nota. transl.: L-awturi ta 'dan l-artikolu huma inġiniera minn kumpanija Ċeka żgħira, pipetail. Irnexxielhom jgħaqqdu lista mill-isbaħ ta' [xi drabi banali, iżda xorta] problemi urġenti ħafna u kunċetti żbaljati relatati mal-operat tar-raggruppamenti ta' Kubernetes.
Matul is-snin ta’ użu ta’ Kubernetes, ħdimna ma’ numru kbir ta’ raggruppamenti (kemm ġestiti kif ukoll mhux immaniġġjati - fuq GCP, AWS u Azure). Maż-żmien, bdejna nindunaw li xi żbalji kienu kontinwament ripetuti. Madankollu, m’hemmx mistħija f’dan: il-biċċa l-kbira għamilna aħna stess!
L-artiklu fih l-iżbalji l-aktar komuni u jsemmi wkoll kif tikkoreġihom.
1. Riżorsi: talbiet u limiti
Dan l-oġġett żgur jistħoqqlu l-eqreb attenzjoni u l-ewwel post fil-lista.
Talba CPU normalment jew mhux speċifikat xejn jew għandu valur baxx ħafna (biex tpoġġi kemm jista 'jkun imżiewed fuq kull node). Għalhekk, in-nodi jsiru mgħobbija żżejjed. F'ħinijiet ta' tagħbija għolja, is-saħħa tal-ipproċessar tan-nodu tiġi utilizzata bis-sħiħ u tagħbija tax-xogħol partikolari tirċievi biss dak li "talbet" minn throttling tas-CPU. Dan iwassal għal aktar latenza tal-applikazzjoni, timeouts, u konsegwenzi oħra spjaċevoli. (Aqra aktar dwar dan fit-traduzzjoni reċenti l-oħra tagħna: “Limiti tas-CPU u throttling aggressiv f'Kubernetes"- madwar. trad.)
BestEffort (estremament ebda irrakkomandat):
resources: {}
Talba għal CPU estremament baxxa (estremament ebda irrakkomandat):
resources:
Requests:
cpu: "1m"
Min-naħa l-oħra, il-preżenza ta 'limitu ta' CPU tista 'twassal għal qbiż mhux raġonevoli taċ-ċikli tal-arloġġ mill-imżiewed, anki jekk il-proċessur tan-node ma jkunx mgħobbi għal kollox. Għal darb'oħra, dan jista' jwassal għal aktar dewmien. Il-kontroversja tkompli madwar il-parametru Kwota tas-CFS tas-CPU fil-qalba tal-Linux u t-throttling tas-CPU skont il-limiti stabbiliti, kif ukoll id-diżattivazzjoni tal-kwota tas-CFS... Alas, il-limiti tas-CPU jistgħu jikkawżaw aktar problemi milli jistgħu jsolvu. Aktar informazzjoni dwar dan tista’ ssibha fil-link hawn taħt.
Għażla eċċessiva (impenn żejjed) problemi tal-memorja jistgħu jwasslu għal problemi akbar. Li jintlaħaq il-limitu tas-CPU jinvolvi taqbeż iċ-ċikli tal-arloġġ, filwaqt li jintlaħaq il-limitu tal-memorja jinvolvi l-qtil tal-pod. Qatt osservajt OOMkill? Iva, dan huwa eżattament dak li qed nitkellmu.
Trid timminimizza l-probabbiltà li dan iseħħ? Tallokax iżżejjed il-memorja u uża QoS Garantit (Kwalità tas-Servizz) billi tistabbilixxi t-talba għall-memorja għal-limitu (bħal fl-eżempju hawn taħt). Aqra aktar dwar dan fi preżentazzjonijiet Henning Jacobs (Inġinier Ewlieni f'Zalando).
X'se jgħin potenzjalment meta jiġu stabbiliti riżorsi?
Bil metriċi-server tista 'tara l-konsum attwali tar-riżorsi tas-CPU u l-użu tal-memorja mill-imżiewed (u l-kontenituri ġewwa fihom). Ħafna probabbli, diġà qed tużah. Eżegwixxi l-kmandi li ġejjin:
kubectl top pods
kubectl top pods --containers
kubectl top nodes
Madankollu, juru biss użu kurrenti. Jista 'jtik idea approssimattiva tal-ordni tal-kobor, iżda fl-aħħar mill-aħħar ser ikollok bżonn storja ta’ bidliet fil-metriċi matul iż-żmien (biex twieġeb mistoqsijiet bħal: "X'kienet l-ogħla tagħbija tas-CPU?", "X'kienet it-tagħbija l-bieraħ filgħodu?", eċċ.). Għal dan tista 'tuża Prometheus, DataDog u għodod oħra. Huma sempliċiment jiksbu metriċi minn metrics-server u jaħżnuhom, u l-utent jista 'jistaqsihom u jippjanahom kif xieraq.
VerticalPodAutoscaler tippermetti awtomatizza dan il-proċess. Huwa jsegwi l-istorja tal-użu tas-CPU u tal-memorja u jistabbilixxi talbiet u limiti ġodda bbażati fuq din l-informazzjoni.
L-użu tal-qawwa tal-kompjuter b'mod effiċjenti mhuwiex biċċa xogħol faċli. Qisu tilgħab it-Tetris il-ħin kollu. Jekk qed tħallas wisq għall-qawwa tal-kompjuter b'konsum medju baxx (jiġifieri ~ 10%), nirrakkomandaw li tħares lejn prodotti bbażati fuq AWS Fargate jew Virtual Kubelet. Huma mibnija fuq mudell ta' kontijiet bla server/paga għal kull użu, li jista' jirriżulta li jkun irħas f'kundizzjonijiet bħal dawn.
2. Sondi ta 'ħajja u prontezza
B'mod awtomatiku, il-kontrolli tal-ħajja u tal-prontezza mhumiex attivati f'Kubernetes. U kultant jinsew jixgħelhom...
Imma kif inkella tista 'tibda servizz mill-ġdid fil-każ ta' żball fatali? U l-load balancer kif jaf li pod huwa lest li jaċċetta t-traffiku? Jew li tista' timmaniġġja aktar traffiku?
Dawn it-testijiet ħafna drabi huma konfużi ma 'xulxin:
Ħajja — kontroll tas-"sopravivenza", li jerġa' jibda l-pod jekk ifalli;
Prontezza — verifika tal-prontezza, jekk tfalli, skonnettja l-pod mis-servizz Kubernetes (dan jista’ jiġi ċċekkjat bl-użu kubectl get endpoints) u t-traffiku ma jasalx lejh sakemm il-kontroll li jmiss jitlesta b'suċċess.
Dawn iż-żewġ kontrolli MAGĦMULA MATUL IĊ-ĊIKLU TAL-ĦAJJA KOLLHA TAL-POD. Huwa importanti ħafna.
Kunċett żbaljat komuni huwa li s-sondi ta' prontezza jitħaddmu biss mal-istartjar sabiex il-balancer ikun jista' jkun jaf li l-pod huwa lest (Ready) u jistgħu jibdew jipproċessaw it-traffiku. Madankollu, din hija biss waħda mill-għażliet għall-użu tagħhom.
Ieħor hija l-possibbiltà li ssir taf li t-traffiku fuq il-pod huwa eċċessiv u jgħabbiha żżejjed (jew il-pod jwettaq kalkoli li jużaw ħafna riżorsi). F'dan il-każ, il-kontroll tal-prontezza jgħin naqqas it-tagħbija fuq il-miżwed u "kessaħ".. It-tlestija b'suċċess ta 'verifika ta' prontezza fil-futur tippermetti żid it-tagħbija fuq il-powd mill-ġdid. F'dan il-każ (jekk it-test ta' prontezza jfalli), in-nuqqas tat-test tal-ħajja jkun kontroproduttiv ħafna. Għaliex terġa 'tibda pod li huwa b'saħħtu u jaħdem iebes?
Għalhekk, f'xi każijiet, l-ebda verifika hija aħjar milli tippermettilhom b'parametri kkonfigurati ħażin. Kif intqal hawn fuq, jekk verifika tal-ħajja kopji kontroll tal-prontezza, allura inti fl-inkwiet kbir. Għażla possibbli hija li jiġi kkonfigurat test ta' prontezza bissU ħajja perikoluża ħalli fil-ġenb.
Iż-żewġ tipi ta' kontrolli m'għandhomx ifallu meta d-dipendenzi komuni jfallu, inkella dan iwassal għal falliment kaskata (bħal valanga) tal-imżiewed kollha. Fi kliem ieħor, tagħmilx ħsara lilek innifsek.
3. LoadBalancer għal kull servizz HTTP
X'aktarx, għandek servizzi HTTP fil-cluster tiegħek li tixtieq tibgħat lid-dinja ta' barra.
Jekk tiftaħ is-servizz bħala type: LoadBalancer, il-kontrollur tiegħu (skont il-fornitur tas-servizz) se jipprovdi u jinnegozja LoadBalancer estern (mhux neċessarjament jaħdem fuq L7, iżda saħansitra anke fuq L4), u dan jista 'jaffettwa l-ispiża (indirizz IPv4 statiku estern, qawwa tal-kompjuter, kontijiet kull sekonda ) minħabba l-ħtieġa li jinħoloq numru kbir ta' tali riżorsi.
F'dan il-każ, huwa ħafna aktar loġiku li tuża bilanċjar tat-tagħbija esterna waħda, li tiftaħ is-servizzi bħala type: NodePort. Jew aħjar, jespandu xi ħaġa simili nginx-ingress-kontrollur (Jew traefik), li se jkun l-uniku wieħed Node Port endpoint assoċjat mal-bilanċjar tat-tagħbija esterna u se rotta traffiku fil-cluster bl-użu ingress-Riżorsi Kubernetes.
Servizzi oħra intra-cluster (mikro) li jinteraġixxu ma 'xulxin jistgħu "jikkomunikaw" bl-użu ta' servizzi bħal ClusterIP u mekkaniżmu ta 'skoperta tas-servizz integrat permezz tad-DNS. Sempliċement tużax id-DNS/IP pubbliku tagħhom, peress li dan jista’ jkollu impatt fuq il-latenza u jżid l-ispiża tas-servizzi tal-cloud.
4. Autoscaling cluster mingħajr ma jitqiesu l-karatteristiċi tiegħu
Meta żżid nodi u tneħħihom minn raggruppament, m'għandekx tistrieħ fuq xi metriċi bażiċi bħall-użu tas-CPU fuq dawk in-nodi. L-ippjanar tal-pods għandu jqis ħafna restrizzjonijiet, bħall-affinità pod/node, taints u tollerazzjonijiet, talbiet għar-riżorsi, QoS, eċċ. L-użu ta 'autoscaler estern li ma jqisx dawn l-isfumaturi jista' jwassal għal problemi.
Immaġina li ċertu pod għandu jkun skedat, iżda l-qawwa kollha disponibbli tas-CPU hija mitluba/żarmata u l-pod jeħel fi stat Pending. Autoscaler estern jara t-tagħbija medja tas-CPU kurrenti (mhux dik mitluba) u ma jibdax espansjoni (scale-out) - ma żżidx nodu ieħor. Bħala riżultat, dan il-pod mhux se jkun skedat.
F'dan il-każ, reverse scaling (scale-in) — it-tneħħija ta' nodu minn cluster hija dejjem aktar diffiċli biex tiġi implimentata. Immaġina li għandek pod stateful (b'ħażna persistenti konnessa). Volumi persistenti normalment jappartjenu għal żona ta’ disponibbiltà speċifika u mhumiex replikati fir-reġjun. Għalhekk, jekk autoscaler estern iħassar node ma 'dan il-pod, allura l-iskeder ma jkunx jista' jiskeda dan il-pod fuq node ieħor, peress li dan jista 'jsir biss fiż-żona tad-disponibbiltà fejn tinsab il-ħażna persistenti. Pod se jkun mwaħħla fl-istat Pending.
Popolari ħafna fil-komunità Kubernetes cluster-autoscaler. Hija taħdem fuq cluster, tappoġġja APIs minn fornituri ewlenin tal-cloud, tqis ir-restrizzjonijiet kollha u tista 'skala fil-każijiet ta' hawn fuq. Hija kapaċi wkoll tiżdied filwaqt li żżomm il-limiti kollha stabbiliti, u b'hekk tiffranka l-flus (li inkella jintefqu fuq kapaċità mhux użata).
5. It-traskurazzjoni tal-kapaċitajiet IAM/RBAC
Oqgħod attent li tuża utenti IAM b'sigrieti persistenti għal magni u applikazzjonijiet. Organizza aċċess temporanju billi tuża rwoli u kontijiet tas-servizz (kontijiet tas-servizz).
Ħafna drabi niltaqgħu mal-fatt li ċ-ċwievet tal-aċċess (u s-sigrieti) huma hardcoded fil-konfigurazzjoni tal-applikazzjoni, kif ukoll intraskuraw ir-rotazzjoni tas-sigrieti minkejja li għandna aċċess għal Cloud IAM. Uża rwoli IAM u kontijiet tas-servizz minflok utenti fejn xieraq.
Insa dwar kube2iam u mur direttament għar-rwoli IAM għall-kontijiet tas-servizz (kif deskritt fi nota bl-istess isem Štěpán Vraný):
Ukoll, tagħtix privileġġi ta' kontijiet ta' servizz u profili ta' istanza admin и cluster-adminjekk ma jkollhomx bżonnha. Dan huwa ftit aktar diffiċli biex jiġi implimentat, speċjalment fl-RBAC K8s, iżda definittivament jiswa l-isforz.
6. Tiddependix fuq l-anti-affinità awtomatika għall-imżiewed
Immaġina li għandek tliet repliki ta' xi skjerament fuq node. In-nodu jaqa ', u flimkien miegħu r-repliki kollha. Sitwazzjoni spjaċevoli, hux? Imma għaliex ir-repliki kollha kienu fuq l-istess node? Kubernetes mhux suppost li jipprovdi disponibbiltà għolja (HA)?!
Sfortunatament, l-iskeder Kubernetes, fuq inizjattiva tiegħu stess, ma jikkonformax mar-regoli ta 'eżistenza separata (anti-affinità) għall-imżiewed. Għandhom jiġu ddikjarati b'mod espliċitu:
// опущено для краткости
labels:
app: zk
// опущено для краткости
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: "app"
operator: In
values:
- zk
topologyKey: "kubernetes.io/hostname"
Dak kollox. Issa l-imżiewed se jkunu skedati fuq nodi differenti (din il-kundizzjoni hija kkontrollata biss waqt l-iskedar, iżda mhux waqt it-tħaddim tagħhom - għalhekk requiredDuringSchedulingIgnoredDuringExecution).
Hawnhekk qed nitkellmu podAntiAffinity fuq nodi differenti: topologyKey: "kubernetes.io/hostname", - u mhux dwar żoni ta' disponibbiltà differenti. Biex timplimenta HA sħiħ, ser ikollok tħaffer aktar fil-fond f'dan is-suġġett.
7. Injora PodDisruptionBudgets
Immaġina li għandek tagħbija ta' produzzjoni fuq cluster Kubernetes. Perjodikament, in-nodi u l-cluster innifsu jridu jiġu aġġornati (jew dekummissjonati). PodDisruptionBudget (PDB) huwa xi ħaġa bħal ftehim ta’ garanzija ta’ servizz bejn amministraturi ta’ clusters u utenti.
PDB jippermettilek tevita interruzzjonijiet tas-servizz ikkawżati minn nuqqas ta' nodi:
F'dan l-eżempju, inti, bħala utent tar-raggruppament, tiddikjara lill-amministraturi: "Ħej, għandi servizz ta 'zookeeper, u tagħmel x'tagħmel, nixtieq li jkolli mill-inqas 2 repliki ta' dan is-servizz dejjem disponibbli."
Kunċett żbaljat komuni huwa li jekk tuża tagħbija mhux prod fi spazju tal-isem wieħed u tagħbija prod f'ieħor, allura dawn mhux se jinfluwenzaw lil xulxin bl-ebda mod... Madankollu, ċertu livell ta 'iżolament jista' jinkiseb bl-użu ta 'talbiet/limitazzjonijiet tar-riżorsi, l-iffissar ta' kwoti, u l-iffissar ta 'prijorityClasses. Xi iżolament "fiżiku" fil-pjan tad-dejta huwa pprovdut minn affinitajiet, tollerazzjonijiet, tbajja (jew nodeseletturi), iżda separazzjoni bħal din hija pjuttost ikkumplikata timplimenta.
Dawk li għandhom bżonn jgħaqqdu ż-żewġ tipi ta' xogħol fl-istess cluster se jkollhom jittrattaw il-kumplessità. Jekk ma jkunx hemm ħtieġa bħal din, u inti tistax taffordja li jkollok wieħed cluster wieħed aktar (ngħidu aħna, fi sħaba pubblika), allura huwa aħjar li tagħmel dan. Dan se jikseb livell ferm ogħla ta 'insulazzjoni.
9. externalTrafficPolicy: Raggruppament
Ħafna drabi aħna nosservaw li t-traffiku kollu ġewwa l-cluster jiġi permezz ta’ servizz bħal NodePort, li għalih hija stabbilita l-politika default externalTrafficPolicy: Cluster... Dan ifisser li Node Port hija miftuħa fuq kull node fil-cluster, u tista 'tuża kwalunkwe wieħed minnhom biex jinteraġixxu mas-servizz mixtieq (sett ta' imżiewed).
Fl-istess ħin, imżiewed reali assoċjati mas-servizz NodePort imsemmi hawn fuq huma ġeneralment disponibbli biss fuq ċertu subsett ta’ dawn in-nodi. Fi kliem ieħor, jekk nikkonnettja ma 'node li m'għandux il-pod meħtieġ, se jgħaddi t-traffiku lejn nodu ieħor, iżżid hops u ż-żieda fil-latenza (jekk in-nodi jinsabu f'żoni ta 'disponibbiltà/ċentri tad-dejta differenti, il-latency tista' tkun pjuttost għolja; barra minn hekk, l-ispejjeż tat-traffiku tal-ħruġ se jiżdiedu).
Min-naħa l-oħra, jekk ċertu servizz Kubernetes għandu sett ta 'politika externalTrafficPolicy: Local, allura NodePort jiftaħ biss fuq dawk in-nodi fejn il-miżwed meħtieġa jkunu attwalment qed jaħdmu. Meta tuża load balancer estern li jiċċekkja l-istat (kontroll tas-saħħa) endpoints (kif tagħmel AWS ELB), Hu se tibgħat traffiku biss lin-nodi meħtieġa, li se jkollu effett ta 'benefiċċju fuq id-dewmien, il-ħtiġijiet tal-kompjuters, il-kontijiet tal-ħruġ (u s-sens komun jiddetta l-istess).
Hemm ċans kbir li diġà qed tuża xi ħaġa simili traefik jew nginx-ingress-kontrollur bħala punt ta 'tmiem NodePort (jew LoadBalancer, li juża wkoll NodePort) biex iwassal it-traffiku ta' dħul HTTP, u l-issettjar ta 'din l-għażla jista' jnaqqas b'mod sinifikanti l-latency għal tali talbiet.
В din il-pubblikazzjoni Tista' titgħallem aktar dwar externalTrafficPolicy, il-vantaġġi u l-iżvantaġġi tagħha.
10. Tintrabatx ma 'clusters u tabbużax mill-pjan ta' kontroll
Qabel, kienet id-drawwa li s-servers isejħu b'ismijiet proprji: Anton, HAL9000 u Colossus... Illum ġew sostitwiti minn identifikaturi ġenerati bl-addoċċ. Madankollu, il-vizzju baqa ', u issa ismijiet proprji jmorru għall-clusters.
Storja tipika (ibbażata fuq avvenimenti reali): kollox beda bi prova tal-kunċett, għalhekk il-cluster kellu isem kburi ittestjar… Għaddew is-snin u Għadha tintuża fil-produzzjoni, u kulħadd jibża’ imissha.
M'hemm xejn pjaċevoli dwar clusters li jinbidlu f'annimali domestiċi, għalhekk nirrakkomandaw li tneħħihom perjodikament waqt il-prattika irkupru minn diżastru(dan jgħin inġinerija tal-kaos - madwar. trad.). Barra minn hekk, ma jagħmilx ħsara li taħdem fuq is-saff ta 'kontroll (pjan ta' kontroll). Li tibża’ tmissu mhux sinjal tajjeb. Eċċ mejta? Guys, int verament fl-inkwiet!
Min-naħa l-oħra, m'għandekx titwassal bil-manipulazzjoni tagħha. Biż-żmien is-saff ta 'kontroll jista' jsir bil-mod. Probabbilment, dan huwa dovut għal numru kbir ta 'oġġetti li qed jinħolqu mingħajr ir-rotazzjoni tagħhom (sitwazzjoni komuni meta tuża Helm b'settings default, u huwa għalhekk li l-istat tiegħu f'configmaps/sigrieti mhux aġġornat - bħala riżultat, eluf ta' oġġetti jakkumulaw f' is-saff ta 'kontroll) jew b'editjar kostanti ta' oġġetti kube-api (għal skalar awtomatiku, għal CI/CD, għal monitoraġġ, reġistru tal-avvenimenti, kontrolluri, eċċ.).
Barra minn hekk, nirrakkomandaw li tiċċekkja l-ftehimiet SLA/SLO mal-fornitur Kubernetes ġestit u tagħti attenzjoni lill-garanziji. Il-bejjiegħ jista 'jiggarantixxi kontroll disponibbiltà saff (jew is-sottokomponenti tiegħu), iżda mhux id-dewmien p99 tat-talbiet li tibgħatlu. Fi kliem ieħor, tista 'tidħol kubectl get nodes, u tirċievi tweġiba biss wara 10 minuti, u dan mhux se jkun ksur tat-termini tal-ftehim tas-servizz.
11. Bonus: bl-użu tal-aħħar tikketta
Iżda dan diġà huwa klassiku. Dan l-aħħar iltqajna ma 'din it-teknika inqas spiss, peress li ħafna, wara li tgħallmu minn esperjenza qarsa, waqfu jużaw it-tikketta :latest u beda pinning verżjonijiet. Ħura!
Tistenniex li kollox jaħdem mil-lum għal għada: Kubernetes mhuwiex rimedju. App ħażina se jibqa' hekk anke f'Kubernetes (u probabbilment se tmur għall-agħar). In-nuqqas ta 'attenzjoni se jwassal għal kumplessità eċċessiva, xogħol bil-mod u stressanti tas-saff ta' kontroll. Barra minn hekk, tirriskja li titħalla mingħajr strateġija ta' rkupru minn diżastru. Tistenniex li Kubernetes jipprovdi iżolament u disponibbiltà għolja barra mill-kaxxa. Jqatta' ftit ħin biex l-applikazzjoni tiegħek tkun tassew cloud native.
Tista' ssir familjari ma' l-esperjenzi bla suċċess ta' diversi timijiet fi din il-ġabra ta’ stejjer minn Henning Jacobs.
Dawk li jixtiequ jżidu mal-lista ta 'żbalji mogħtija f'dan l-artikolu jistgħu jikkuntattjawna fuq Twitter (@MarekBartik, @MstrsObserver).