Pavel Selivanov, lahenduste arhitekt Southbridge'is ja Slurma Ă”petaja, esitles ettekannet DevOpsConf 2019. See ettekand on osa sĂŒvainte kursusest Kubernetes "Slurma Mega".
toimub Moskvas 18.-20. novembril.
â Moskvas, 22.-24. novembril.
saadaval igal ajal.

Allpool â ettekande ĂŒlevaade.
Tere pÀevast, kolleegid ja tÔrjujad. TÀna rÀÀgin ma turvalisusest.
NÀen, et saalis on tÀna palju turvaeksperte. Vabandan ette, kui kasutan turvamaailmast termineid, mis ei pruugi teie jaoks tuttavad olla.
Nii juhtus, et umbes kuus kuud tagasi sattusin ma ĂŒhte avalikku Kubernetes'e klastrisse. Avalik â tĂ€hendab, et seal on n-ö erinevad namespaces, milles on kasutajad, kes on oma namespaces eraldi. KĂ”ik need kasutajad kuuluvad erinevatesse ettevĂ”tetesse. Eeldati, et seda klastrit kasutatakse CDN-ina. See tĂ€hendab, et teile antakse klaster, antakse sinna kasutaja, te tulete oma namespace'i, deponeerite oma esindused.
Minu endisele ettevĂ”ttele pĂŒĂŒti sellist teenust mĂŒĂŒa. Ja mind paluti uurida, kas see lahendus sobib vĂ”i mitte.
LĂ€ksin ma selle klastrisse. Mul anti piiratud Ă”igused, piiratud namespace. Seal olid inimesed, kes mĂ”istsid, mis on turvalisus. Nad olid lugenud, mis on Kubernetes'e pĂ”hine juurdepÀÀsu kontroll (RBAC) â ja nad olid selle seadnud nii, et ma ei saanud kĂ€itada pod'e eraldi deployement'idest. Ei mĂ€leta, missugust ĂŒlesannet ma ĂŒritasin lahendada, kĂ€itades pod'i ilma deployement'ita, aga mulle vĂ€ga meeldis lihtsalt pod'iga katsetada. Otsustasin juhuslikult uurida, mis Ă”igused mul klastris on, mida ma saan ja mida mitte, mida nad seal kokku keeranud olid. Ăhtlasi rÀÀgin, mis on nende RBAC-is valesti seadistatud.
Nii juhtus, et kahe minuti pĂ€rast sain adminni Ă”igused nende klastrisse, vaatasin kĂ”iki naaber namespaces'e, nĂ€gin seal töötavaid tootmisfrontte ettevĂ”tetelt, kes olid juba teenuse ostnud ja oma asjad ĂŒles seadnud. Pidin end vaevu tagasi hoidma, et mitte kellegi veebilehe esilehele sobitada mĂ”nda roppust.
RÀÀgin nÀidete abil, kuidas ma seda tegin ja kuidas sellise asja eest kaitsta.
Aga alustuseks tutvustan end. Minu nimi on Pavel Selivanov. Olen Southbridge'i arhitekt. Ma oskan Kubernetesest, DevOpsist ja muudest trendikatest asjadest rÀÀkida. Koos Southbridge'i inseneridega ehitame me seda kÔike, mina teen konsultatsioone.
Peale pÔhitegevuse oleme hiljuti kÀivitanud projektid, mida nimetatakse Slörmideks. Me proovime oma oskusi Kuberneteses natuke laiemalt jagada, Ôpetada teisi inimesi ka K8s-iga töötama.
Millest ma tĂ€na rÀÀgin. Esitluse teema on ilmne â Kubernetes'i klastrite turvalisus. Kuid tahan kohe öelda, et see teema on vĂ€ga suur â ja seetĂ”ttu tahan kohtuda nende punktidega, millest ma kindlasti ei rÀÀgi. Ma ei hakka rÀÀkima kulunud terminoloogiatest, mis on internetis juba sada korda lĂ€bi vaieldud. KĂ”ik sellised RBAC'id ja sertifikaadid.
RÀÀgin sellest, mis muret teeb mulle ja mu kolleegidele Kubernetes'i klastrite turvalisuses. NÀeme neid probleeme nii Kubernetese klastreid pakkuvatelt teenusepakkujatelt kui ka klientidelt, kes meile pöörduvad. Ja isegi klientidelt, kes tulevad meile teistelt konsultatsioonihaldusettevÔtetelt. Seega, tragöödia ulatus on tegelikult vÀga suur.
Kokku kolm punkti, millest ma tÀna rÀÀgin:
- Kasutajate Ă”igused vs pod'ide Ă”igused. Kasutajate Ă”igused ja pod'ide Ă”igused â see pole sama asi.
- Teabe kogumine klastrist. NÀitan, et klastrist saab kogu vajaliku teabe koguda, ilma eriliste Ôigusteta.
- DoS-rĂŒnnak klastrile. Kui me ei saa teavet koguda, suudame siiski klastrit kokku varistada. RÀÀgin DoS-rĂŒnnakutest klastrite juhtkomponentide peale.
Veel ĂŒks ĂŒldine asi, millest mainin â milles ma seda kĂ”ike testisin, milles ma kindlasti vĂ”in öelda, et see kĂ”ik töötab.
VĂ”tame aluseks Kubernetes'i klastrite loomise Kubespray abil. Kui keegi ei tea, siis see on tegelikult Ansible'i jaoks mĂ”eldud rollide kogum. Kasutame seda pidevalt töös. See on hea, sest seda saab rakendada igasugustele seadmetele â nii metallile kui ka pilve. Ăks installatsiooni viis sobib igasuguste jaoks.
Selles klastris on mul Kubernetes v1.14.5. Kogu Kubase klaster, mida me vaatame, on jagatud nime ruumideks, iga nime ruum kuulub erinevale meeskonnale, ja igal meeskonna liikmel on juurdepÀÀs oma nime ruumile. Nad ei saa siseneda teistesse nime ruumidesse, vaid ainult oma. Kuid on olemas ĂŒhe adminni konto, millel on Ă”igused kogu klastrile.

Lubasin, et esimesena saadakse adminni Ôigused klastrile. Meile on vajalik spetsiaalselt ette valmistatud pod, mis lÔhub Kubernetes klastrit. KÔik, mida peame tegema, on see klastrisse rakendada.
kubectl apply -f pod.yamlSee pod saabub ĂŒhe klastrite Kubernetes juhtkonda. Ja klaster tagastab meile seejĂ€rel faili nimega admin.conf. Selles failis hoitakse kĂ”iki adminni sertifikaate ja samal ajal on seadistatud klastrite API. Nii lihtne on saada adminni juurdepÀÀs, ma arvan, et 98% Kubernetes klastritest.
Korraks, see pod tegi ĂŒks arendaja teie klastris, kellel on juurdepÀÀs oma ettepanekute rakendamiseks ĂŒhte vĂ€ikesse nime ruumi, ta on tĂ€ielikult RBAC poolt piiratud. Tal polnud mingeid Ă”igusi. Kuid sellest hoolimata tagastati sertifikaat.
NĂŒĂŒd rÀÀkides spetsiaalselt ette valmistatud podist. KĂ€ivitame selle mis tahes pildiga. NĂ€iteks vĂ”tame debian:jessie.
Meil on selline asi:
tolerations:
- effect: NoSchedule
operator: Exists
nodeSelector:
node-role.kubernetes.io/master: "" Mis on toleration? Kubernetes klastris on juhid tavaliselt mĂ€rgitud asjaga, mida nimetatakse taint ("saaste" inglise keeles). Selle "saaste" mĂ”te on see, et juhitavaid sĂŒdamikke ei saa mÀÀrata podide jaoks. Kuid keegi ei takista igas podis mĂ€rkida, et ta on saaste suhtes tolerantne. Toleration sektsioon ĂŒtleb just seda, et kui mĂ”nel sĂŒdamekesel on NoSchedule, siis on meie pod sellele saastele tolerantne â ja mingeid probleeme ei teki.
Edasi, me ĂŒtleme, et meie pod ei ole lihtsalt tolerantne, vaid soovib tungida spetsiaalselt juhile. Kuna juhil on kĂ”ik maitsvamad asjad, mida me vajame â kĂ”ik sertifikaadid. SeetĂ”ttu ĂŒtleme nodeSelector â ja meil on standardne label juhtidel, mis vĂ”imaldab valida kogu klastrist just need sĂŒdamikud, mis on juhid.
Just selliste kahe sektsiooni puhul tuleb pod kindlasti juhile. Ja talle lubatakse seal elada.
Kuid lihtsalt juhile jÔudmine ei ole piisav. See ei pruugi midagi anda. SeetÔttu on meil sellised kaks asja:
hostNetwork: true
hostPID: true Me mÀrgime, et meie pod, mille me kÀivitame, elab kerni namespaces, network namespaces ja PID namespaces. Kui pod on masternodes kÀivitunud, suudab see nÀha kÔiki tÔelisi, elavaid liideseid selle nodi peal, kuulata kogu liiklust ja nÀha kÔiki protsesside PID-sid.
Edasi on jÀÀnud vÀike asi. VÔtke etcd ja looge, mida soovite.
KÔige huvitavam on see, et see on Kubernetes'e vÔimalus, mis on seal vaikimisi olemas.
volumeMounts:
- mountPath: /host
name: host
volumes:
- hostPath:
path: /
type: Directory
name: host Ja selle olemus on see, et me saame podis, mille me kĂ€ivitame, isegi ilma Ă”igusteta sellele klastrile, öelda, et soovime luua hostPath tĂŒĂŒpi volume. See tĂ€hendab, et viimased teeme raja hostist, kus me kĂ€ivitume â ja vĂ”tame selle volume'ina. Edasi nimetame selle name: host. Kogu hostPath monteerime podi sisse. KĂ€esoleval juhul kausta /host.
Kordan veel kord. Me ĂŒtlesime podile tulla masternodele, saada hostNetwork ja hostPID â ning monteerida kogu master root sellesse podi.
Sa aru, et Debiani sĂŒsteemis meil töötab bash ja see bash töötab meil rootina. See tĂ€hendab, et saime just ruuti masterisse, omamata mingit Ă”igust Kubernetes'e klastris.
Edasi on kogu ĂŒlesanne minna podisse kausta /host /etc/kubernetes/pki, kui ma ei eksi, ning vĂ”tta sealt kĂ”ik klastrimasteri sertifikaadid ja seega saada klastrihalduriks.
Kui sellesse vaadata, siis need on ĂŒheks kĂ”ige ohtlikumaks Ă”iguseks podides â hoolimata sellest, millised Ă”igused on kasutajal:

Kui mul on Ôigused kÀivitada pod mingis klastrinamespace'is, siis on selle podi Ôigused vaikimisi olemas. Ma saan kÀivitada privileegitud pode, mis antud juhul on kÔik Ôigused, praktiliselt root nodi.
Minu lemmik on Root user. Ja Kubernetesel on selline valik nagu Run As Non-Root. See on nagu kaitse hÀkkerite eest. Kas te teate, mis on 'Moldova viirus'? Kui te olete Àkki hÀkker ja tulite minu Kubernetes'e klastrisse, siis me, vaesed administraatorid, palume: "Palun mÀÀrake oma podides, millega te hakkate mu klastrit hÀkkima, run as non-root. Vastasel juhul vÔib juhtuda, et kÀivitate protsessi oma podis rootina ja teil on vÀga lihtne mind hÀkkida. Palun kaitske end ise."
Host path volume â minu arvates on see kĂ”ige kiirem viis saada soovitud tulemus Kubernetes'e klastrist.
Aga mis nendega kÔigega teha?
MĂ”tted, mis peaksid tulema iga normaalse administraatori juurde, kes seisab silmitsi Kubernetesega: âAha, ma ĂŒtlesin ju, et Kubernetes ei tööta. Seal on augud. Ja kogu Kubernetes on jama.â Tegelikult on olemas selline asi nagu dokumentatsioon, ja kui sinna vaadata, siis seal on jaotis .
See on selline yaml-objekt â me saame seda luua Kubernetes'e klastris â mis kontrollib turvaaspekte just podide kirjelduses. See tĂ€hendab, et see kontrollib Ă”igusi hostNetwork, hostPID ja teatud tĂŒĂŒpi volume'ite kasutamiseks, mis on podides kĂ€ivitamisel. Pod Security Policy abil saab kĂ”ik need aspektid kirjeldada.
KĂ”ige huvitavam Pod Security Policy juures on see, et Kubernetes'e klastri kĂ”ik PSP-d ei ole mitte lihtsalt kuidagi mÀÀratletud, vaid nad on vaikimisi vĂ€lja lĂŒlitatud. Pod Security Policy aktiveeritakse admission plugin'i abil.
Olgu, deployime klastrisse Pod Security Policy, ĂŒtleme, et meil on teenuslikud podid mingis nimepaikuses, kuhu pÀÀsevad ligi ainult adminnid. Ătleme, et kĂ”igil ĂŒlejÀÀnud podidel on piiratud Ă”igused. Sest tĂ”enĂ€oliselt ei vaja arendajad teie klastris privileege Ă€ratavaid pode.
Ja meil tundub, et kÔik on hÀsti. Ja meie Kubernetes'e klastrit ei saa kahe minutiga hÀkkida.
Kuid on probleem. TÔenÀoliselt, kui teil on Kubernetes'e klaster, siis on teie klastris installitud jÀlgimine. Ma isegi julgen ennustada, et kui teie klastris on jÀlgimine, siis kutsutakse seda Prometheuseks.
See, mida ma praegu rÀÀgin, kehtib nii Prometheus operaatori kui ka puhta Prometheuse kohta. KĂŒsimus on selles, et kui ma ei saa nii kiiresti administraatorit klastrisse, siis tĂ€hendab see, et pean rohkem otsima. Ja ma saan otsida oma jĂ€lgimise abil.
TĂ”enĂ€oliselt on kĂ”ik lugenud samu artikleid Habr's ja jĂ€lgimine on nimepaikuses monitoring. Helm chart kĂ”igil on enam-vĂ€hem sama nimega. Ma arvan, et kui teete helm install stable/prometheus, siis ĂŒtlete, et teil on umbes samad nimed. Ja isegi 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 mingi 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 eksportijatest, mis kogub mÔÔdikud Kubernetes API-st. Seal on palju andmeid selle kohta, mis on teie klastris kĂ€imas, milline see on ja millised probleemid teil sellega on.
Lihtsa nÀitena:
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 tegemine mitteprivilegeeritud podist vÔimaldab saada sellist teavet. Kui te ei tea, millises Kubernetes versioonis te olete, siis see rÀÀgib teile kergesti.
Ja kĂ”ige huvitavam on see, et lisaks sellele, et te pöördute kube-state-metrics poole, vĂ”ite sama hĂ€sti pöörduda ka otse Prometheuse poole. Te saate sealt mÔÔdikud koguda. Te isegi saate sealt mÔÔdikud genereerida. Teoreetiliselt saate koostada sellise pĂ€ringu klastrist Prometheusse, mis lihtsalt vĂ€ljalĂŒlitab selle. Ja teie jĂ€lgimine lĂ”petab klastrist ĂŒldse töötamise.
Ja siin tekib kĂŒsimus, kas mĂ”ni vĂ€line jĂ€lgimine jĂ€lgib teie jĂ€lgimist. Just nĂŒĂŒd sain vĂ”imaluse tegutseda Kubernetes klastris tĂ€ielikult tagajĂ€rgedeta. Te isegi ei saa teada, et ma seal tegutsemisega olen, kuna jĂ€lgimist lihtsalt ei ole.
Just nagu PSP-ga, on tunne, et probleem on selles, et kĂ”ik need moes tehnoloogiad â Kubernetes, Prometheus â nad lihtsalt ei tööta ja on tĂ€is auke. Tegelikult ei ole.
On olemas selline asi â .
Kui te olete normaalne admin, siis tÔenÀoliselt teate, et Network Policy on jÀrjekordne yaml, mida klastris on juba piisavalt. Ja Network Policies ei ole tÔenÀoliselt vajalikud. Ja isegi kui te lugesite, mis on Network Policy, et see on Kubernetes yaml-tuli, mis vÔimaldab piirata juurdepÀÀsu Ôiguslikke suhteid nimede vahel, podide vahel, siis te olete kindlasti otsustanud, et yaml-formaadis tuli Kuberneteses jÀrgmistes abstraktsioonides... Ei-ei. See ei ole kindlasti vajalik.
Isegi kui teie turbespetsialistid ei tea, et teie Kuberneteses on vĂ€ga lihtne ja kerge ehitada tulemĂŒĂŒri, veelgi detailsemalt. Kui nad seda veel ei tea ja ei torma kĂŒsima: "No andke, andke..." Siiski on Network Policy teil vajalik, et piirata juurdepÀÀsu teatud teenuskohtadele, millesse vĂ”ib teie klastri kaudu ligipÀÀsu saada, ilma igasuguse autoriseerimiseta.
Nagu nÀidatud nÀites, on vÔimalik kube state metrics'i kasutada igast nimiruumist Kuberneteses, ilma et selleks Ôiguseid oleks. Network policies on piiranud juurdepÀÀsu kÔigist teistest nimiruumidest jÀlgimise nimiruumi, ja nagu ka kÔik: ei ole juurdepÀÀsu, ei ole probleemi. KÔikides olemasolevates chartides, nii standartse Prometheuse kui ka selle Prometheuse puhul, mis on operaatoris, on lihtsalt values failis olemas valik, et aktiveerida network policies nende jaoks. Lihtsalt tuleb aktiveerida ja need hakkavad tööle.
TĂ”si, siin on ĂŒks probleem. Normaalsena tavatavate adminnina on tĂ”enĂ€oliselt otsustanud, et network policies ei ole vajalikud. Ja lugedes igasuguseid artikleid ressurssidelt nagu Habr, otsustasite, et flannel, eriti host-gateway reĆŸiimis, on parim valik, mida saate teha.
Mida teha?
VĂ”ite proovida taastada oma Kuberneteses oleva vĂ”rgu lahenduse, proovida asendada seda millegi funktsionaalsemaga. NĂ€iteks Calicoga. Kuid öelda tuleb, et vĂ”rgu lahenduse vahetamine töötavas Kuberneteses ei ole just triviaalne ĂŒlesanne. Olen selle kaks korda lahendanud (mĂ”lemad korrad kĂŒll teoreetiliselt), aga meil oli isegi Slurmides nĂ€idatud, kuidas seda teha. Meie koolitatavatele nĂ€itasime, kuidas vahetada vĂ”rgu lahendust Kuberneteses. PĂ”himĂ”tteliselt vĂ”ite proovida teha nii, et tootmisklastris ei esineks seisakut. Kuid tĂ”enĂ€oliselt ei Ă”nnestu teil midagi.
Probleemi lahendamine on tegelikult vĂ€ga lihtne. Klaster sisaldab sertifikaate, ja te teate, et teie sertifikaadid lĂ€hevad aasta pĂ€rast kehtetuks. Noh, ja tavaliselt on klastris normaalne lahendus sertifikaatide puhul â miks peaksime vaeva nĂ€gema, tĂ”stame kĂ”rvale uue klastri, vanas laseme sellel minna, ja kĂ”ik taaskĂ€ivitame. TĂ”si, kui see aegub, seisab meil pĂ€ev aega, kuid selle vĂ”rra uue klastriga.
Uut klastri tÔstes, asetage samal ajal Calico flanneli asemel.
Mida teha, kui teil on sertifikaadid, mis on vĂ€lja antud sajaks aastaks ja te ei plaani klastrit ĂŒle deponeerida? On olemas selline asi nagu Kube-RBAC-Proxy. See on tĂ”eliselt Ă€ge arendamine, mis vĂ”imaldab end sisestada sidecar konteinerina ĂŒkskĂ”ik millisesse pod'i Kubernetes klastris. Ja see annab tegelikult sellele pod'ile autoriseerimise lĂ€bi Kubernetes'i RBAC-i.
Ăks probleem on. Varem oli Prometheuse operaatoris see Kube-RBAC-Proxy lahendus sisse ehitatud. Kuid seda pole enam. TĂ€napĂ€evaste versioonide puhul lĂ€htutakse sellest, et teil on olemas vĂ”rgu poliitika ja te sulgete nende abil. SeetĂ”ttu tuleb natuke graafikut ĂŒmber kirjutada. Tegelikult, kui te kĂŒlastate , seal on nĂ€ited, kuidas seda kasutada sidecar'ideena, ja graafikut tuleb minimaalselt ĂŒmber kirjutada.
On veel ĂŒks vĂ€ike probleem. Mitte ainult Prometheus ei anna oma mÔÔtmeid kellelegi. KĂ”ik Kubernetes klastri komponendid oskavad ka oma mÔÔtmeid anda.
Aga nagu ma juba ĂŒtlesin, kui te ei saa klastrile ligi ja teavet koguda, siis saate vĂ€hemalt kahjulik olla.
Seega nÀitan kiiresti kahte viisi, kuidas Kubernetes klastrit kahjustada.
Te naerate, kui ma seda rÀÀgin, need on kaks juhtumit reaalsest elust.
Esimene meetod. Ressursside kurnamine.
KĂ€ivitame veel ĂŒhe spetsiaalse pod'i. Sellel on selline sektsioon.
resources:
requests:
cpu: 4
memory: 4Gi Kuidas te teate, requests â see on see CPU ja mĂ€lu maht, mis hostis reserveeritakse konkreetsete pod'ide jaoks koos requests'iga. Kui meil on neli tuuma host Kubernetes klastris ja sinna tuleb pod, mille requests on neli CPU, siis ei saa sellele hostile enam ĂŒhtegi muud pod'i koos requests'iga tulla.
Kui ma kÀitan sellise pod'i, siis annan kÀsu:
$ kubectl scale special-pod --replicas=...Siis ei saa keegi enam Kubernetes klastrisse deponeerida. Sest kĂ”igil sĂ”lmedel lĂ”ppevad requests. Ja seelĂ€bi peatan teie Kubernetes klastrit. Kui ma seda Ă”htul teen, siis vĂ”ivad depood ĂŒsna pikaks ajaks peatuda.
Kui vaatame veel kord Kubernetes'e dokumentatsiooni, siis nÀeme mÔistet, mida kutsutakse Limit Range'iks. See mÀÀratleb ressursid klastrielementidele. Sa saad kirjutada yaml objekti Limit Range, rakendada selle kindlatesse nimiruumi ja seejÀrel selle nimiruumi öelda, et sul on pod'de jaoks vaikimisi, maksimaalsed ja minimaalsed ressursid.
Selle abil saame piirata kasutajaid konkreetses tootenimiruumi meeskondade vĂ”imalustes mÀÀrata oma pod'idesse igasuguseid jama. Kuid kahjuks, isegi kui sa ĂŒtled kasutajale, et ei tohi kĂ€ivitada pod'e, mille nĂ”uded ĂŒletavad ĂŒhte CPU-d, on olemas selline imeline kĂ€sk scale, vĂ”i nad vĂ”ivad seda teha ka dashboardi kaudu.
Ja sealt tulebki number kaks. KĂ€ivitame 11 111 111 111 111 pod'i. See on ĂŒksteist miljardit. See ei ole sellepĂ€rast, et ma sellist numbrit vĂ€lja mĂ”tlesin, vaid seetĂ”ttu, et ma olen seda ise nĂ€inud.
TĂ”eline lugu. Hilisel Ă”htul olin juba lahkumiseks valmis. Vaatan, et nurga taga istub grupp arendajaid ja tegeleb millegagi arvutitega. LĂ€hene ja kĂŒsin: âMis teil juhtus?â
Veidi varem, umbes kell ĂŒheksa Ă”htul, olid ĂŒhe arendaja plaanid koju minna. Ta mĂ”tles: âMa skaleerin oma rakendust ĂŒhekohaliseks.â Vajutas ĂŒhekohale, kuid internet veidi viibis. Ta vajutas veel kord ĂŒhekohale, ta surus ĂŒhekohale, klĂ”psas Enter'ile. Ta proovis kĂ”ike, mis tal vĂ”imalik oli. Siis internet Ă€rkas ellu â ja kĂ”ik hakkas skaleeruma sellele numbrile.
TĂ”si, see lugu ei toimunud Kubernetes'es, tookord oli see Nomad. See lĂ”ppes sellega, et pĂ€rast tunni jagu katseid Nomad'it peatada, teatas Nomad, et ta ei lakka skaleerumast ja ei hakkagi millegagi muuga tegelema. âMa olen vĂ€sinud, ma lahkun.â Ja sulges ennast.
JĂ”udsin loomulikult proovida sama teha ka Kubernetes'es. Ăksteist miljardit pod'i Kubernetes mind rÔÔmustanud, ta ĂŒtles: âEi saa. Ăletab sise limite.â Kuid 1 000 000 000 pod'i suutis.
Vastupidiselt ei piirdunud ĂŒks miljard Pod'i endasse. Ta tĂ”epoolest hakkas skaleeruma. Mida edasi protsess liikuda jĂ”udis, seda rohkem aega lĂ€ks uute podide loomisele. Kuid protsess jĂ€tkus. Ainuke probleem on see, et kui ma saan oma nimiruumis piiramatult pod'e kĂ€ivitada, siis isegi ilma nĂ”udmiste ja piiranguteta saan ma kĂ€ivitada nii palju pod'e, et nende ĂŒlesannetega hakkavad noodid mĂ€lus ja CPU-s kokku langema. Kui ma kĂ€ivitan nii palju pod'e, peab teave nendest jĂ”udma salvestusse, nimelt etcd. Ja kui sinna jĂ”uab liiga palju teavet, hakkab salvestus liiga aeglaselt andmeid vĂ€ljastama â ja Kubernetesel algavad probleemid.
Ja veel ĂŒks probleem... Nagu te teate, Kubernetes'e juhtimisseadmed ei ole lihtsalt ĂŒks keskmine element, vaid mitu kompoonent. Seal on eriti kontrollija, ajakava jne. KĂ”ik need tĂŒĂŒbid hakkavad samal ajal tĂ€itma tarbetut tĂŒhist tööd, mis aja jooksul hakkab nĂ”udma ĂŒha rohkem aega. Kontrollija hakkab uusi pod'e looma. Ajakava pĂŒĂŒab neile leida uut nooti. Uued noodid teie klastris on tĂ”enĂ€oliselt varsti otsakorral. Kubernetes alustab ĂŒha aeglasemat tööd.
Kuid ma otsustasin minna veelgi kaugemale. Nagu te teate, on Kubernetes'es ĂŒks element, mida nimetatakse teenuseks. Noh, ja tĂ”enĂ€oliselt töötavad teie klastrites teenused IPTables'i abil.
Kui me nĂ€iteks kĂ€ivitame ĂŒhe miljardi pod'i ja siis skripti abil sundida Kubernetes'e looma uusi teenuseid:
for i in {1..1111111}; do
kubectl expose deployment test --port 80
--overrides="{"apiVersion": "v1",
"metadata": {"name": "nginx$i"}}";
done Klastri kÔigil noodidel genereeritakse ligikaudu samal ajal jÀrjest uusi ja uusi IPTables'i reegleid. Iga teenuse puhul genereeritakse umbes miljard IPTables'i reeglit.
Ma kontrollisin kĂ”iki neid asju paaritel tuhandetel, kuni kĂŒmme. Ja probleem on see, et juba sellel lĂ€vel on sissetoomine SSH nooti ĂŒsna problemaatiline. Kuna paketid, lĂ€bides sellist arvu ahelaid, hakkavad end mitte vĂ€ga hĂ€sti tundma.
Jah, see kĂ”ik lahendatakse Kubernetes'e abil. Seal on selline objekt nagu Resource quota. See mÀÀrab inimruumile ligipÀÀsetavate ressursside ja objektide arvu klastri piires. Me saame luua YAML objekti igas Kubernetes'i nimiruumis. Selle objekti abil saame öelda, et antud nimiruumile on eraldatud kindel arv nĂ”udmisi, limiite, ja edasi saame öelda, et selles nimiruumis on vĂ”imalik luua 10 teenust ja 10 konteinerit. Ja arendaja vĂ”ib igal Ă”htul muretult puhkama minna. Kubernetes ĂŒtleb talle: âEi, sa ei saa oma konteinereid sellisesse arvu skaleerida, kuna see ĂŒletab ressursikvooti.â KĂ”ik, probleem on lahendatud. .
Ăks probleemne hetk sellega seoses tekib. Tunnete, kui keeruliseks muutub Kubernetes'es nimiruumide loomine. Selleks, et seda luua, peame arvestama paljude asjadega.
Resource quota + Limit Range + RBAC
âą Loome nimiruum
âą Loome sees limitrange
âą Loome sees resourcequota
âą Loome serviceaccount'i CI jaoks
âą Loome rolebinding'i CI ja kasutajate jaoks
⹠Valikuliselt kÀivitame vajalikud teeninduskonteinerid
SeetÔttu tahan ma kasutada juhust ja jagada oma arengutegevusi. On olemas selline asi nagu operaatori SDK. See on viis kirjutada Kubernetes'e klastri jaoks operaatorite loomise vÔimalusi. Te saate kirjutada operaatorite abil Ansible'iga.
Esialgu oli meil kirjutatud Ansible peale, kuid hiljem vaatasin, et on olemas operaatori SDK ja tÔlgendasin Ansible'i rolli operaatoriks. See operaator vÔimaldab meil luua Kubernetes'e klastri objekti, mida nimetatakse kÀsuks. KÀsu sees vÔimaldab see YAML formaadis keskkonda selle kÀsu jaoks kirjeldada. Ja kÀsu keskkonnas vÔimaldab see kirjeldada, kui palju ressursse me eraldame.
VĂ€ike .
Ja lÔpetuseks. Mida kÔigega selle kohta teha?
Esiteks. Pod Security Policy â see on hea. Ja kuigi ĂŒkski Kubernetes'i installija ei kasuta neid siiani, on siiski teie klastrites neid vaja kasutada.
Network Policy â see ei ole lihtsalt veel ĂŒks tarbetu funktsioon. See on midagi, mis on klastri jaoks tĂ”eliselt vajalik.
LimitRange/ResourceQuota â aeg on hakata kasutama. Me oleme juba seda kasutanud ja olin pikka aega kindel, et kĂ”ik rakendavad seda. Olin eksinud, see on haruldane.
Lisaks sellele, millest ma oma ettekandes rÀÀkisin, on olemas dokumenteerimata funktsioonid, mis vĂ”imaldavad rĂŒnnata klastrit. Hiljuti ilmus .
MÔned asjad on nii kurvad ja solvad. NÀiteks teatavatel tingimustel vÔivad klastris oleva kubelet'id anda warlocks kausta sisu, ja seda autoriseerimata kasutajale.
seal on juhised, kuidas kÔik, millest ma rÀÀkisin, taastada. Seal on failid toodangunÀidistega, kuidas ResourceQuota ja Pod Security Policy vÀlja nÀevad. Ja kÔike seda saab Katsuda.
AitÀh kÔigile.
Allikas: habr.com
