Pavel Selivanov, Southbridge lahenduste arhitekt ja SlŃŃm'i Ă”petaja, esines DevOpsConf 2019 konverentsil ettekandega. See ettekande on osa sĂŒvitsi mineva kursuse teemadest Kubernetes'e kohta "SlŃŃm Mega".
toimub Moskvas 18-20. novembril.
â Moskvas, 22-24. novembril.
on alati saadaval.

Allpool â ettekande dekodeerimine.
Tere pÀevast, kolleegid ja nende toetajad. TÀna rÀÀgin ma turvalisusest.
Ma nÀen, et saalis on tÀna palju turbeeksperte. Vabandan ette, kui kasutan turvamaailmast termineid, mis ei pruugi teie jaoks harjumuspÀraselt kÔlada.
Nii juhtus, et umbes pool aastat tagasi sattus mulle kĂ€tte ĂŒks avalik Kubernetes'i klaster. Avalik â tĂ€hendab, et seal on n-ö erinevad namespaces, kus on kasutajad, kes on isoleeritud oma namespaces. KĂ”ik need kasutajad kuuluvad erinevatele ettevĂ”tetele. Eeldati, et seda klastrit tuleb kasutada CDN-ina. See tĂ€hendab, et teile antakse klaster, antakse sinna kasutaja, tulete oma namespace'i, ja panne oma esikĂŒljed ĂŒles.
Minu eelmisel ettevĂ”ttel oli sama teenus mĂŒĂŒgis. Mind paluti katsetada klastrit, et nĂ€ha, kas selline lahendus sobib vĂ”i mitte.
Sisenesin sellesse klastrisse. Mul anti piiratud Ă”igused, piiratud namespace. Seal mĂ”isteti, mis on turvalisus. Nad lugesid, mis on Kubernetes'e Role-based access control (RBAC) â ja seadistati nii, et ma ei saanud pod'e eraldi kĂ€ivitada dĂ©ployement'itest. Ei mĂ€leta, millist ĂŒlesannet ma pĂŒĂŒdsin lahendada, kui ĂŒritasin kĂ€ivitada pod'i ilma dĂ©ployement'ita, aga ma tĂ”eliselt tahtsin lihtsalt pod'i kĂ€ivitada. Otsustasin Ă”nne nimel vaadata, millised Ă”igused mul klastris on, mida ma saan teha, mida mitte, ja mida nad seal seadistanud on. Samuti rÀÀgin, mis neil RBAC-s valesti on seadistatud.
Nii juhtus, et kahe minuti pÀrast sain admini Ôigused nende klastrisse, vaatasin kÔikidesse naaber-namespacetesse, nÀgin seal jooksmas tootmisfrontide ettevÔtteid, kes olid juba teenuse ostnud ja déployinud. Ma pidin end vaevu tagasi hoidma, et mitte kellelegi fronti minna ja peamise lehe alla mingit roppust panna.
Kannan nÀidete abil, kuidas ma seda tegin ja kuidas sellest end kaitsta.
Aga kĂ”igepealt tutvustan end. Minu nimi on Pavel Selivanov. Olen ettevĂ”tte Southbridge arhitekt. Tunnen hĂ€sti Kubernetes, DevOpsi ja igasuguseid uusi trende. Meie insenerid Southbridge'is arendavad neid sĂŒsteeme ning mina annan nĂ”u.
Lisaks oma pĂ”hitegevusele kĂ€ivitasime hiljuti projektid, mida nimetame SLErroriteks. PĂŒĂŒame oma oskusi Kubernetesega tuua laiemale publikule, Ă”petades inimesi ka K8s-iga töötama.
Millest ma tĂ€na rÀÀgin. Ettekande teema on ilmselge â Kubernetes'i klastri turvalisus. Kuid tahan kohe öelda, et see teema on vĂ€ga ulatuslik â seetĂ”ttu tahan kohe selgelt öelda, millest ma ei kavatse rÀÀkida. Ma ei rÀÀgi kulunud mĂ”istetest, mis on internetis juba sada korda lĂ€bi kĂ€idud, nagu RBAC ja sertifikaadid.
Ma rÀÀgin sellest, mis muretseb mind ja mu kolleege Kubernetes'i klastri turvalisuse osas. Me nÀeme neid probleeme nii Kubernetes'i klastrite pakkujates kui ka klientides, kes meie juurde tulevad. Ja ka klientides, kes tulevad meile teistest nÔustamisettevÔtetest. See tÀhendab, et tragöödia ulatus on tegelikult vÀga suur.
Kolm pÔhipunkti, millest ma tÀna rÀÀgin:
- Kasutajate Ôigused vs pod'ide Ôigused. Kasutajate ja pod'ide Ôigused ei ole sama asi.
- Klastri teabe kogumine. NÀitan, et saame koguda kogu vajaliku teabe klassdist, ilma et meil oleks eraldi Ôigusi.
- DoS-rĂŒnnak klassdile. Kui me ei suuda teavet koguda, saame siiski klasse toimetada. RÀÀgin DoS-rĂŒnnakutest klastri halduskomponentidele.
Veel ĂŒks ĂŒldine asi, millest ma mainin â millega ma seda kĂ”ike testisin, mille kohta ma kindlasti vĂ”in öelda, et kĂ”ik töötab.
Aluseks vĂ”tame Kubernetes klastrite seadistamise Kubespray abil. Kui keegi ei tea, siis see on tegelikult rollide kogum Ansible'ile. Kasutame seda pidevalt töös. Hea selle juures on see, et saame selle igale poole peale panna â nii riistvarale kui ka kuhugi pilve. Ăks installerimisviis sobib pĂ”himĂ”tteliselt kĂ”ikjale.
Selles klastris on mul Kubernetes v1.14.5. Kogu kubernerite klaster, mida kaalume, on jagatud nimedevaheks (namespace), kus iga nimedevahe kuulub eraldi meeskonnale ning igal meeskonnaliikmel on ligipÀÀs oma nimedevahe. Nad ei saa minna teistesse nimedevahesesse, ainult oma. Kuid on olemas adminni konto, millel on Ôigused kogu klastrile.

Lubasin, et esimesena saame adminni Ôigused klastris. Me vajame spetsiaalselt ette valmistatud podi, mis purustab Kubernetes'e klastri. KÔik, mida peame tegema, on see rakendada Kubernetes'e klastrisse.
kubectl apply -f pod.yamlSee pod jĂ”uab meile ĂŒhele Kubernetes'e klastrite kĂ”rgemale masinale. Ja klaster toob meile pĂ€rast seda rÔÔmuga tagasi faili nimega admin.conf. Kubernerites on selle failis talletatud kĂ”ik adminni sertifikaadid ja seadistatud klastrite API. Nii lihtne on saada adminni ligipÀÀs , arvan, et 98% Kubernetes'e klastritest.
Kordan, et selle podi tegi ĂŒks arendaja teie klastris, kellel on ligipÀÀs oma ettepanekute juurutamiseks ĂŒhes vĂ€ikeses nimedevahes, ta on tĂ€ielikult piiratud RBAC. Tal ei olnud mingeid Ă”igusi. Siiski tagastati sertifikaat.
NĂŒĂŒd rÀÀgime spetsiaalselt ettevalmistatud podist. KĂ€ivitame selle igasuguste kujutistega. NĂ€iteks vĂ”tame debian:jessie.
Meil on selline asi:
tolerations:
- effect: NoSchedule
operator: Exists
nodeSelector:
node-role.kubernetes.io/master: "" Mis on toleration? Kuberneete klastris on meistrid tavaliselt mĂ€rgitud asjaga, mida nimetatakse taint ('mĂŒrg' inglise keeles). Selle «mĂŒrgi» pĂ”hisisu on see, et meistrinodele ei saa pod'e mÀÀrata. Kuid keegi ei takista igal pod'il mĂ€rkida, et ta on «mĂŒrgile» talutav. Toleration jaotis ĂŒtleb just seda, et kui mĂ”nel nodil on NoSchedule, siis meie pod on sellise mĂŒrgiga talutav â ja ei tekki mingeid probleeme.
Edasi liikudes, me ĂŒtleme, et meie pod ei ole lihtsalt talutav, vaid soovib spetsiaalselt minna meistrile. Sest meistrites asub kĂ”ige maitsvam asi, mida me vajame â kĂ”ik sertifikaadid. SeetĂ”ttu me ĂŒtleme nodeSelector â ja meil on standardne silt meistrites, mis vĂ”imaldab valida kĂ”igist klastrinodidest just need nodid, mis on meistrid.
Just nende kahe jaotisega jÔuab pod kindlasti meistrile. Ja tal lubatakse seal elada.
Kuid lihtsalt meistrile tulles ei piisa. See ei anna meile midagi. SeetÔttu on meil kaks olulist aspekti:
hostNetwork: true
hostPID: true Me tÀpsustame, et meie pod, mille me kÀivitame, elab tuuma nimeteenuses, vÔrgunimeteenuses ja PID nimeteenuses. Niipea kui pod kÀivitub meistril, nÀeb ta kÔiki selle sÔlme reaalseid, töötavaid liidesi, kuulab kogu liiklust ja nÀeb kÔiki protsesside PID-sid.
Edasi on vaid vÀike asi. VÔtate etcd ja loete, mida soovite.
KÔige huvitavam on see Kubernetes'i funktsioon, mis seal vaikimisi olemas on.
volumeMounts:
- mountPath: /host
name: host
volumes:
- hostPath:
path: /
type: Directory
name: host Ja selle mĂ”te on see, et me vĂ”ime podis, mille me kĂ€ivitame, isegi ilma Ă”igusteta sellele klastrile, öelda, et soovime luua hostPath tĂŒĂŒpi mahutit. See tĂ€hendab, et vĂ”tame tee hostist, millel me kĂ€ivitume â ja kasutame seda mahutina. Ja kui edasi nimetame selle name: host. Kogu see hostPath monteeritakse podi sisse. Antud nĂ€ites vahemikku /host.
Kordan veel kord. Me ĂŒtlesime podile tulla meistrisse, saada seal hostNetwork ja hostPID â ja kogu meistri juur monteeritakse selle podi sisse.
Te mÔistate, et Debianis töötab meil bash ja see bash töötab meie juures rootina. See tÀhendab, et saime just root-Ôigused meistrile, omamata samas mingeid Ôigusi Kuberneteses.
Edasi on kogu ĂŒlesanne minna konteinerisse kausta /host/etc/kubernetes/pki, kui ma ei eksi, ja vĂ”tta sealt kĂ”ik klastrite meistrisertifikaadid, et vastavalt saada klastrihalduriks.
Kui sellele lahku vaadata, on need ĂŒhed kĂ”ige ohtlikumad Ă”igused konteinerites â olenemata kasutaja Ă”igustest:

Kui mul on Ôigused konteinerite kÀivitamiseks mÔnes klastrinimi ruumis, siis on sellel konteineril need Ôigused vaikimisi olemas. Ma saan kÀivitada privileegitud konteinerid, mis tÀhendab sisuliselt kÔiki Ôigusi, praktiliselt root-Ôigused sÔlmes.
Minu lemmik on Root kasutaja. Aga Kubernetesi jaoks on olemas vÔimalus Run As Non-Root. See on nagu kaitse hÀkkerite eest. Kas teate, mis on "moldova viirus"? Kui te olete kogemata hÀkker ja olete tulnud minu Kubernetesi klastrisse, siis palume me, vaesed administraatorid: "Palun mÀrkige oma podides, millega te minu klastrit hÀkkida plaanite, run as non-root. Sest muidu vÔib juhtuda, et kÀitate protsessi oma podis rootina ja on vÀga lihtne mind hÀkkida. Palun kaitske end ise."
Host path volume â minu arvates kĂ”ige kiirem viis soovitud tulemuse saavutamiseks Kubernetesi klastrist.
Aga mida kÔigega selle teete?
MĂ”tted, mis peaksid tulema igale normaalsele administraatorile, kes kohtub Kubernetesega: "Ah, ma ĂŒtlesin, Kubernetesi ei tööta. Seal on augud. Ja kogu asi on jama." Tegelikult on olemas selline asi nagu dokumentatsioon, ja kui sinna vaadata, siis seal on jagu .
See on selline yaml-objekt, mida saame luua Kubernetes'i klastri raames, mis kontrollib turvaaspekte just pod'ide mÀÀratlemisel. See tĂ€hendab, et see kontrollib Ă”igusi kasutada erinevaid hostNetwork, hostPID ja teatud tĂŒĂŒpi volume, mis on pod'ides kĂ€ivitamisel. Pod Security Policy abil saab kĂ”ike seda kirjeldada.
Pod Security Policy kĂ”ige huvitavam osa on see, et Kubernetes'i klastri kĂ”ik PSP-d pole lihtsalt kirjeldatud, vaid need on vaikimisi vĂ€lja lĂŒlitatud. Pod Security Policy lubatakse admission plugin'i abil.
Nii et juurutame klastri Pod Security Policy, ĂŒtleme, et meil on teatud teenus pod'id nimetehnikas, millele pÀÀsevad ligi ainult adminnid. Ătleme, et kĂ”igil teistel pod'idel on piiratud Ă”igused. Sest tĂ”enĂ€oliselt pole arendajatele vaja teie klastris privileegitud pod'e kĂ€ivitada.
Ja tundub, et kÔik on hÀsti. Meie Kubernetes'i klastrit ei saa kahe minuti jooksul hÀkkida.
Kuid probleem on. TĂ”enĂ€oliselt, kui teil on Kubernetes'i klaster, siis on sellesse installitud jĂ€lgimissĂŒsteem. Ma julgen isegi ennustada, et kui teie klastri jĂ€lgimise sĂŒsteem on olemas, siis see on nimega Prometheus.
See, mida ma praegu rÀÀkima hakkan, kehtib nii Prometheus-operatori kui ka puhta Prometheuse kohta. KĂŒsimus on selles, et kui ma ei suuda klastrisse administraatorit nii kiiresti saada, siis tĂ€hendab see, et pean rohkem otsima. Ja ma saan otsida teie jĂ€lgimise abil.
TÔenÀoliselt on kÔik lugenud samu artikleid Habr's ja jÀlgimine asub nimiruumis monitoring. Helm chart on kÔigil enam-vÀhem sama nimega. Eeldan, et kui teete helm install stable/prometheus, siis on teil umbkaudu sama nimed. Ja tÔenÀoliselt ei pea ma teie klastris DNS-nime Àra arvama. Sest see on standardne.

Edasi on meil mingi dev ns, kus saab kÀivitada mingit podi. Ja sealt podist on vÀga lihtne teha jÀrgmist:
$ curl http://prometheus-kube-state-metrics.monitoring prometheus-kube-state-metrics on ĂŒks Prometheuse eksportija, mis kogub mÔÔdikuid Kubernetes'i API-st. Seal on vĂ€ga palju andmeid selle kohta, mis teil klastris on kĂ€imas, millised need on ja millised probleemid teil nende tegemisega on.
Lihtsaks nÀiteks:
kube_pod_container_info{namespace="kube-system",pod="kube-apiserver-k8s-1",container="kube-apiserver",image=
"gcr.io/google-containers/kube-apiserver:v1.14.5"
,image_id=»docker-pullable://gcr.io/google-containers/kube-apiserver@sha256:e29561119a52adad9edc72bfe0e7fcab308501313b09bf99df4a9638ee634989âł,container_id=»docker://7cbe7b1fea33f811fdd8f7e0e079191110268f2853397d7daf08e72c22d3cf8b»} 1
Lihtsa curl pÀringu tegemisega privileegideta podist saad sellist teavet. Kui te ei tea, millises versioonis Kubernetes on kÀivitatud, siis see rÀÀgib teile selle lihtsalt.
Ja kÔige huvitavam on see, et lisaks sellele, et te pöördute kube-state-metrics'i poole, vÔite samal ajal pöörduda ka Prometheus'e poole otse. Te saate sealt koguda mÔÔdikud. Te vÔite isegi ehitada sealt mÔÔdikud. Teoreetiliselt vÔite koostada sellise pÀringu klastrist Prometheus'e suunas, mis lihtsalt sulgeb selle. Ja teie jÀlgimine peatub tÀielikult klastrist.
Ja nĂŒĂŒd tekib kĂŒsimus, kas mĂ”ni vĂ€line jĂ€lgimine jĂ€lgib teie jĂ€lgimist. Just nĂŒĂŒd sain ma vĂ”imaluse tegutseda Kubernetes'i klastris ilma mingite tagajĂ€rgedeta. Te isegi ei saa teada, et ma seal tegutsen, kuna jĂ€lgimist ei ole enam.
Sarnaselt PSP-le vĂ”ib tunduda, et probleem on selles, et kĂ”ik need moodsad tehnoloogiad â Kubernetes, Prometheus â lihtsalt ei toimi ja on tĂ€is vigu. Tegelikult ei ole see nii.
On selline asi nagu â .
Kui olete normaalne administraator, siis tĂ”enĂ€oliselt teate Network Policy-st, et see on jĂ€rjekordne yaml, mida klastris on ja nii palju. Ja Network Policies pole kindlasti vajalikud. Ja isegi kui olete lugenud, mis on Network Policy, et see on Kubernetes'i yaml-tulemĂŒĂŒr, mis vĂ”imaldab piirata juurdepÀÀsu namespace'de vahel, pod'ide vahel, siis olete kindlasti otsustanud, et yaml-formaadis tulemĂŒĂŒr Kubernetes'is on jĂ€rgmiste abstraktsioonide peal⊠Ei-ei. See pole tĂ”eliselt vajalik.
Isegi kui teie turbespetsialistidele ei ole rÀÀgitud, et teie Kubernetesega saab vĂ€ga lihtsalt ja mugavalt tulemĂŒĂŒri luua, seejuures vĂ€ga granuleeritud. Kui nad ei tea seda veel ja ei kĂŒsi teilt: âNoh, andke, andkeâŠâ Igal juhul on Network Policy teil vajalik, et sulgeda juurdepÀÀs teatud teeninduskohtadele, mis teie klastrist on vĂ”imalik kĂŒlastada ilma mingisuguse volituse olemasoluta.
Nagu eespool mainitud, saab kube state metricsi tĂ”mmata mistahes Kubernetes'i klastris asuvast nimiruumist, omamata selleks mingeid Ă”igusi. VĂ”rgupoliitikad on blokeerinud juurdepÀÀsu kĂ”ikidest teistest nimiruumidest jĂ€lgimisnimiruumi ja nagu niisugune: puudub juurdepÀÀs, puuduvad probleemid. KĂ”ikides chartides, olgu need siis tavaline Prometheus vĂ”i see, mis on operaatori kaudu, on helm'i vÀÀrtustes lihtsalt vĂ”imalus lihtsalt sisse lĂŒlitada vĂ”rgupoliitikad nende jaoks. Lihtsalt tuleb sisse lĂŒlitada ja need hakkavad töötama.
Siin on tĂ”esti ĂŒks probleem. Normaalne administraator oleks tĂ”enĂ€oliselt otsustanud, et vĂ”rgupoliitikad ei ole vajalikud. Lugedes igasuguseid artikleid platformidelt nagu Habr, otsustasite, et flannel, eriti host-gateway reĆŸiimis, on parim, mida valida saate.
Mis teha?
Saate proovida ĂŒmber paigaldada oma Kubernetes klastris olevat vĂ”rgu lahendust ja asendada see millegagi funktsionaalsemaga. NĂ€iteks sama Calico. Kuid tahan kohe öelda, et vĂ”rgu lahenduse vahetamine töötavas Kubernetes klastris on ĂŒsna keeruline ĂŒlesanne. Olen seda kaks korda lahendanud (mĂ”lemal korral teoreetiliselt), kuid isegi SlĂ”rvadel nĂ€itasime, kuidas seda teha. Meie Ă”pikutes nĂ€itasime, kuidas vahetada vĂ”rgu lahendust Kubernetes klastris. ĂhesĂ”naga, vĂ”ite proovida teha nii, et tootmisklastri puhul ei tekiks katkestusi. Kuid tĂ”enĂ€oliselt ei Ă”nnestu teil see.
Ja probleem lahendatakse tegelikult vĂ€ga lihtsalt. Klaster sisaldab sertifikaate, ja teate, et teie sertifikaadid aeguvad aasta pĂ€rast. Tavaline lahendus sertifikaatide puhul klastris on see, et meil pole pĂ”hjust muretseda â me tĂ”stame ĂŒles uue klastri, vanas lastakse lihtsalt aeguda, ja seejĂ€rel kĂ”ik paigaldame ĂŒmber. TĂ”si, kui see aegub, vĂ”ib meil nĂ€dal aega asjad seisma jÀÀda, aga vĂ€hemalt on uus klaster.
Kui tĂ”state ĂŒles uue klastri, pange ka Calico asemele flannel.
Mida teha, kui teil on sertifikaadid, mis on vĂ€ljastatud sadaks aastaks ja te ei kavatse klastrit ĂŒmber paigutada? On olemas selline asi nagu Kube-RBAC-Proxy. See on vĂ€ga lahe areng, mis vĂ”imaldab end integreerida sidecar konteinerina igasse pod'i Kubernetes klastris. Ja see tegelikult lisab sellele pod'ile autentimise lĂ€bi Kubernetes'e RBAC-i.
Ăks probleem on. Varasemalt oli Prometheuse operaatoris see lahendus Kube-RBAC-Proxy sisse ehitatud. Kuid siis seda enam ei olnud. Praegused versioonid toetuvad sellele, et teil on olemas vĂ”rgu poliitika ja saate neid kasutades sulgeda. SeetĂ”ttu tuleb veidi chart'u ĂŒmber kirjutada. Kui te sitouute , seal on nĂ€ited, kuidas seda sidecar'idena kasutada, ja chardi tuleb minimaalselt ĂŒmber kirjutada.
On veel ĂŒks vĂ€ike probleem. Mitte ainult Prometheus ei edasta oma mÔÔdikuid kellelegi. KĂ”ik Kubernetes klastri komponendid oskavad samuti oma mÔÔdikuid edastada.
Aga nagu ma juba ĂŒtlesin, kui ei saa juurdepÀÀsu klastrile ja teavet koguda, siis vĂ€hemalt saab kahju teha.
Nii et ma nÀitan kiiresti kahte viisi, kuidas Kubernetes klastrit kahjustada.
Te naerate, kui ma seda rÀÀgin, need on kaks tÔelist juhtumit.
Esimene viis. Ressursside ammendumine.
KĂ€ivitame veel ĂŒhe spetsiaalse poodi. Sellel on selline osa.
resources:
requests:
cpu: 4
memory: 4Gi Nagu te teate, on requests see arv CPU ja mÀlu, mis hostis reserveeritakse konkreetsete podide jaoks, millel on requests. Kui meil on neljatuumaline host Kubernetes klastris ja sinna tuleb pod, millel on neli CPU requests, siis ei saa sinna rohkem pod'e sellel hostil olla.
Kui ma kÀivitada sellise poodi, siis teen kÀsu:
$ kubectl scale special-pod --replicas=...Siis ei saa keegi enam Kubernetes klastrisse deployida. Sest kĂ”igil nodidel saavad requests otsa. Ja niimoodi ma peatan teie Kubernetes klastrit. Kui ma seda Ă”htul teen, siis vĂ”in deploy'id ĂŒsna pikaks ajaks peatada.
Kui vaatame veel kord Kubernetes'i dokumentatsiooni, siis mĂ€rkame seal mĂ”istet, mida nimetatakse Limit Range. See seab ressursside piirangud klastrite objektidele. Saate kirjutada yaml-faili Limit Range objekti, rakendada selle teatud namespace'idesse â ja pĂ€rast saate öelda, et antud namespace'is on podide jaoks vaikimisi, maksimaalsed ja minimaalsed ressursid.
Sellise lahenduse abil saame piirata kasutajaid konkreetsetes toote namespace'ides, sundides nende podide ressursinĂ”udeid vĂ€hem rikastama. Kuid kahjuks, isegi kui ĂŒtlete kasutajale, et nad ei tohi kĂ€ivitada pod'e, mille nĂ”uded ĂŒletavad ĂŒhte CPU-d, on olemas selline tore kĂ€sk scale, vĂ”i nad saavad seda teha ka lĂ€bi dashboadi.
Ja siit tulebki teine meetod. KĂ€ivitame 11 111 111 111 111 pod'i. See tĂ€hendab ĂŒksteist miljardit. See ei ole sellepĂ€rast, et ma sellist numbrit vĂ€lja mĂ”tlesin, vaid kuna ma ise olen seda nĂ€inud.
TĂ”eline lugu. Hilja Ă”htul, kui ma juba kontorist lahkuma valmis olin, nĂ€gin, et nurga taga istus grupp arendajaid ja tegelesid millegagi oma sĂŒlearvutites. Astusin poisid juurde ja kĂŒsisin: âMis teiega juhtus?â
Veidi varem, kell 9 Ă”htul, kavatses ĂŒks arendajatest koju minna. Ja otsustas: "Ma skaleerin oma rakendust nĂŒĂŒd ĂŒhele." Vajutas ĂŒhte, kuid internet hakkas natuke tĂ”rkeid andma. Ta vajutas veel kord ĂŒhte, ta surus ĂŒhte, klĂ”psas Enterile. Ta nĂ€ppis kĂ”ike, millesse sai. Siis internet taastus â ja kĂ”ik hakkas skaleerima sellele numbrile.
TÔsi, see lugu ei toimunud Kuberneteses, toona oli see Nomad. See lÔppes sellega, et tunni jooksul meie katsetest peatada Nomad selle jÀrjepidevatest skaleerimise katsetest vastas Nomad, et skaleerimist ei lÔpetata ja millegagi muuga tegeleda ei soovita. "Ma olen vÀsinud, ma lahkun." Ja sulgus.
Ma loomulikult proovisin teha sama Kuberneteses. Ăksteist miljardit podi Kuberneteses ei rÔÔmustanud, ta ĂŒtles: "Ei saa. Ăletab sisemised limiidid." Aga 1 000 000 000 podi suutis.
Ăks miljard kuupi ei kadunud. See tĂ”epoolest hakkas skaleerima. Mida kaugemal protsess edasi liikudes, seda rohkem aega kulus uute podide loomisele. Kuid protsess ikkagi jĂ€tkus. Ainuke probleem on see, et kui ma saan oma nimespatsioonis piiramatult pod'e kĂ€ivitada, siis isegi ilma pĂ€ringute ja piiranguteta vĂ”in ma kĂ€ivitada nii palju pod'e, et nende kaudu hakkab mĂ€lu ja protsessori kasutuse osas node'de potentsiaal kuhjuma. Kui ma kĂ€ivitada nii palju pod'e, peavad neist saadud andmed jĂ”udma salvestisse, teisisĂ”nu etcd-sse. Ja kui sinna jĂ”uab liiga palju teavet, hakkab salvestis liiga aeglaselt reageerima â ja Kubernetesel hakkavad tekkima viivitused.
Ja veel ĂŒks probleem ⊠Nagu teate, Kubernetes'i haldamise elemendid ei ole ĂŒks keskne seade, vaid mitu komponenti. Seal on eelkĂ”ige manager controller, scheduler ja nii edasi. KĂ”ik need tegelased hakkavad samal ajal tegema ebaolulist, mĂ”ttetut tööd, mis aja jooksul hakkab vĂ”tma jĂ€rjest rohkem ja rohkem aega. Manager controller loob uusi pod'e. Scheduler pĂŒĂŒab neile leida uut sĂ”lme. Uued sĂ”lmed teie klastris on tĂ”enĂ€oliselt varsti otsas. Kubernetes'i klaster hakkab töötama jĂ€rjest aeglasemalt.
Aga ma otsustasin minna veel kaugemale. Nagu te teate, on Kubernetes'is selline asi nagu teenus. Ja tÔenÀoliselt töötab teie klastrites teenus vaikimisi IP tabelite kaudu.
Kui kÀivitada nÀiteks miljard pod'i ja seejÀrel sundida Kubernetes'it looma uusi teenuseid skripti abil:
for i in {1..1111111}; do
kubectl expose deployment test --port 80
--overrides="{"apiVersion": "v1",
"metadata": {"name": "nginx$i"}}";
done Klastri kÔikidel sÔlmedel genereeritakse umbes samal ajal pidevalt uusi iptables reegleid. Iga teenuse jaoks genereeritakse miljard iptables reeglit.
Olen seda kontrollinud paaril tuhandel, kuni kĂŒmneni. Probleem on selles, et juba selle piiri peal on ssh-le sĂ”lmele ligipÀÀs ĂŒsna keeruline. Kuna paketid, lĂ€bides sellise arvu ahelate kaudu, hakkavad end mitte vĂ€ga hĂ€sti tundma.
Seda saab lahendada ka Kubetnetese abil. Seal on selline objekt nagu Resource quota. See mÀÀrab neespĂ€isale saadaval olevate ressursside ja objektide arvu klastri sees. Saame luua yaml objekti igas Kubetnetese neespĂ€isalas. Selle objekti abil saame öelda, et meil on selle neespĂ€isa jaoks mÀÀratud kindel hulk pĂ€ringuid, limite ja edasi saame öelda, et selles neespĂ€isas on vĂ”imalik luua 10 teenust ja 10 poodi. Ja arendaja saab vaid koguda Ă”htuti. Kubetnetes ĂŒtleb talle: 'Teie poode ei ole vĂ”imalik kasvatada sellesse hulka, kuna see ĂŒletab ressursside kvota.' KĂ”ik, probleem on lahendatud. .
Ăks probleemne moment seondub sellega. Tunnete, kui keeruliseks muutub nimi ruumi loomine Kuberneteses. Selle loomiseks peame arvestama paljude faktoritega.
Ressursikvoot + Piirangute vahemik + RBAC
âą Loome nimi ruumi
âą Loome sisemised piirangute vahemikud
âą Loome sisemised ressursikvoodid
âą Loome service accounti CI jaoks
âą Loome rolli sidumise CI ja kasutajate jaoks
⹠Soovi korral kÀivitame vajalikud teeninduspodid
Seega, kasutades vÔimalust, sooviksin jagada oma arendusi. On olemas selline asi, mida nimetatakse operaatori SDK-ks. See on viis kirjutada Kuberneteses operaatorite jaoks. Saate kirjutada operaatorid Ansible'i abil.
Alguses oli see kirjutatud Ansible'is ja siis vaatasin, et olemas on operaatori SDK, ja kirjutasin Ansible'i rolli operaatoriks ĂŒle. See operaator vĂ”imaldab luua Kuberneteses objekti, mida nimetatakse kĂ€suks. KĂ€su sees lubab see kirjeldada YAML-is keskkonda sellele kĂ€sule. Ja kĂ€su keskkonnas lubab see kirjeldada, kui palju ressursse me eraldame.
VĂ€ike .
Ja lÔpetuseks. Mida kÔigega sellel teha?
Esiteks. Pod Security Policy on hea. Ja kuigi ĂŒkski Kubernetes'e paigaldaja ei kasuta neid siiani, on oluline neid siiski oma klastrites rakendada.
Network Policy ei ole lihtsalt veel ĂŒks tarbetu funktsioon. See on midagi, mida kluster tĂ”eliselt vajab.
LimitRange/ResourceQuota â aeg oleks need kasutusele vĂ”tta. Me oleme neid juba pikka aega kasutanud ja ma olin kindel, et kĂ”ik kasutavad neid, aga selgus, et see on haruldus.
Lisaks sellele, millest ma oma ettekandes rÀÀkisin, on olemas dokumenteerimata funktsioonid, mis vĂ”imaldavad klastrit rĂŒnnata. Hiljuti ilmus .
MÔned asjad on nii kurvad ja hÀirivad. NÀiteks vÔivad Kubernetes'e klastris teatud tingimustel kubeletid kinkida warlocks kausta sisu volitamata kasutajale.
Seal on juhised, kuidas reprodutseerida kÔike, millest ma rÀÀkisin. Seal on failid tootmisnÀidistega, kuidas ResourceQuota ja Pod Security Policy vÀlja nÀevad. Ja seda kÔike saab katsetada.
AitÀh kÔigile.
Allikas: habr.com
