Chiudemu i buchi in u cluster Kubernetes. Rapportu è trascrizione cù DevOpsConf

Pavel Selivanov, architettu di suluzione Southbridge è maestru di Slurm, hà datu un discursu à DevOpsConf 2019. Questa conversazione face parte di unu di i temi di u cursu avanzatu di Slurm Mega Kubernetes.

Slurm Basic: Introduzione à Kubernetes si svolge in Mosca u 18-20 nuvembre.
Slurm Mega: peeking under the hood of Kubernetes - Mosca, 22-24 nuvembre.
Slurm Online: I dui corsi Kubernetes sempre disponibile.

Sottu u cut - trascrizione di u rapportu.

Bona sera, culleghi è simpatizzanti. Oghje vi parleraghju di sicurità.

Vecu chì ci sò assai persone di sicurità in a sala oghje. Mi scusemu in anticipu à voi s'ellu aduprate termini da u mondu di a sicurità micca cusì cumu fate.

Hè accadutu chì circa sei mesi fà, un cluster Kubernetes publicu hè cascatu in e mo mani. Public - significa chì ci sò n-èsimu numeru di spazii di nomi, in questi spazii di nomi ci sò utilizatori isolati in u so spaziu di nomi. Tutti questi utilizatori appartenenu à diverse cumpagnie. Ebbè, era presumitu chì stu cluster deve esse usatu cum'è CDN. Questu hè, vi danu un cluster, dà un utilizatore quì, andate quì in u vostru spaziu di nome, implementate i vostri fronti.

A mo cumpagnia precedente hà pruvatu à vende un tali serviziu. E mi hè statu dumandatu à chjappà u cluster nantu à u sughjettu - sì una tale suluzione hè adattata o micca.

Sò ghjuntu à questu cluster. Mi sò datu diritti limitati, spaziu di nomi limitatu. Quì, i picciotti anu capitu ciò chì hè a sicurità. Leghjenu ciò chì u cuntrollu di l'accessu basatu in u rolu (RBAC) hè in Kubernetes - è l'anu torciatu per ùn pudè eseguisce pods separatamente da implementazioni. Ùn mi ricordu micca u prublema ch'e aghju pruvatu à risolve eseguendu un pod senza implementazione, ma vulia veramente eseguisce solu un pod. Aghju decisu per a furtuna per vede ciò chì i diritti aghju in u cluster, ciò chì possu fà, ciò chì ùn possu micca, ciò chì anu cacciatu quì. À u listessu tempu, vi dicu ciò chì anu cunfiguratu incorrectamente in RBAC.

Hè accadutu chì in dui minuti aghju avutu un amministratore à u so cluster, hà guardatu tutti i spazii di nomi vicini, vitti i fronti di produzzione di cumpagnie chì avianu digià compru u serviziu è implementatu quì. Appena m'aghju firmatu per ùn vene à qualchissia in fronte è mette qualchì ghjuramentu nantu à a pagina principale.

Vi diceraghju cù esempi cumu l'aghju fattu è cumu per difende.

Ma prima, lasciami presentà. Mi chjamu Pavel Selivanov. Sò un architettu per Southbridge. Capiscu Kubernetes, DevOps è ogni tipu di roba fantastica. L'ingegneri di Southbridge è eiu custruemu tuttu, è sò cunsultendu.

In più di e nostre attività principali, avemu lanciatu pocu prughjetti chjamati Slurms. Cerchemu di purtà a nostra capacità di travaglià cù Kubernetes à e masse un pocu, per insignà à l'altri persone cumu travaglià ancu cù K8.

Chì ne parleraghju oghje. U tema di u rapportu hè evidenti - nantu à a sicurità di u cluster Kubernetes. Ma vogliu dì subitu chì stu tema hè assai grande - è per quessa vogliu specificà subitu ciò chì certamenti ùn parlerai micca. Ùn parleraraghju micca di i termini pirati chì sò digià abusati centu volte in Internet. Ogni RBAC è certificati.

Parlaraghju di ciò chì mi ferisce è i mo culleghi da a sicurità in un cluster Kubernetes. Avemu vistu questi prublemi sia cù i fornituri chì furniscenu clusters Kubernetes sia cù i clienti chì venenu à noi. È ancu per i clienti chì venenu à noi da altre cumpagnie amministrative di cunsulenza. Questu hè, a scala di a tragedia hè assai grande in fattu.

Litteralmente trè punti chì parleraghju oghje:

  1. Diritti d'utilizatore versus diritti di pod. I diritti di l'utilizatori è i diritti di pod ùn sò micca listessa cosa.
  2. Raccolta di informazioni nantu à u cluster. Dimustraraghju chì pudete cullà tutte l'infurmazioni chì avete bisognu da un cluster senza avè diritti speciali in questu cluster.
  3. Attaccu DoS à u cluster. S'ellu ùn riescite à cullà l'infurmazioni, puderemu mette u cluster in ogni casu. Parlaraghju di attacchi DoS nantu à elementi di cuntrollu di cluster.

Un'altra cosa generale chì mencioneraghju hè ciò chì aghju pruvatu tuttu, nantu à quale possu dì sicuru chì tuttu funziona.

Comu basa, pigliamu a stallazione di un cluster Kubernetes cù Kubespray. Se qualchissia ùn sapi micca, questu hè in realtà un inseme di roli per Ansible. Avemu aduprà tuttu u tempu à u travagliu. U bonu hè chì pudete rotulà in ogni locu - è pudete rotulà nantu à i pezzi di ferru, è in un locu in u nuvulu. Un metudu di stallazione hè adattatu in principiu per tuttu.

In questu cluster, avè Kubernetes v1.14.5. Tuttu u cluster Cube, chì avemu da cunsiderà, hè divisu in namespaces, ogni namespace appartene à una squadra separata, i membri di sta squadra anu accessu à ogni namespace. Ùn ponu micca andà in spazii di nomi diffirenti, solu à u so propiu. Ma ci hè un certu contu amministratore chì hà diritti à tuttu u cluster.

Chiudemu i buchi in u cluster Kubernetes. Rapportu è trascrizione cù DevOpsConf

Aghju prumessu chì a prima cosa chì averemu hè di ottene diritti di amministratore à u cluster. Avemu bisognu di un pod preparatu apposta chì romperà u cluster Kubernetes. Tuttu ciò chì avemu da fà hè di applicà à u cluster Kubernetes.

kubectl apply -f pod.yaml

Questa poda vene à unu di i maestri di u cluster Kubernetes. È u cluster hà felice di rinvià un schedariu chjamatu admin.conf dopu. In Cuba, stu schedariu guarda tutti i certificati di amministratore, è à u stessu tempu l'API di cluster hè cunfigurata. Hè cusì faciule per uttene l'accessu amministratore, pensu, à u 98% di i clusters Kubernetes.

In novu, stu pod hè statu fattu da un sviluppatore in u vostru cluster, chì hà accessu à implementà e so pruposte in un picculu spaziu di nomi, hè tuttu chjapputu da RBAC. Ùn avia micca diritti. Tuttavia, u certificatu hè tornatu.

È avà nantu à un focu preparatu apposta. Lanciamu nantu à ogni imagine. Pigliemu debian:jessie cum'è un esempiu.

Avemu qualcosa cum'è questu:

tolerations:
-   effect: NoSchedule 
    operator: Exists 
nodeSelector: 
    node-role.kubernetes.io/master: "" 

Cosa hè a tolleranza? I maestri in un cluster Kubernetes sò generalmente etichettati cù una cosa chjamata taint. E l'essenza di sta "infezzione" hè chì dice chì i baccelli ùn ponu esse attribuiti à i nodi maestri. Ma nimu ùn si preoccupa di indicà in ogni pod chì hè tolerante di "infezzione". A sezione di Tolerazione dice solu chì, se NoSchedule hè stallatu nantu à qualchì node, allora u nostru pod hè tolerante à una tale infezione - è ùn ci hè micca prublemi.

In più, dicemu chì u nostru pod ùn hè micca solu tollerante, ma vole ancu chjappà u maestru apposta. Perchè i maestri anu u più diliziosu chì avemu bisognu - tutti i certificati. Dunque, dicemu nodeSelector - è avemu una etichetta standard nantu à i maestri, chì permette di selezziunà da tutti i nodi di u cluster esattamente quelli nodi chì sò maestri.

Cù sti dui rùbbriche, ghjunghjerà di sicuru à u maestru. È serà permessu di campà quì.

Ma solu vene à u maestru ùn hè micca abbastanza per noi. Ùn ci darà nunda. Allora dopu avemu sti dui cose:

hostNetwork: true 
hostPID: true 

Specificemu chì u nostru pod chì simu in esecuzione vive in u spaziu di nomi di u kernel, u spaziu di nomi di a rete è u spaziu di nomi PID. Una volta chì un pod hè in esecuzione nantu à u maestru, serà capace di vede tutte l'interfacce reale, in diretta di quellu node, sente tuttu u trafficu, è vede i PID di tutti i prucessi.

Allora tocca à i picculi cosi. Pigliate etcd è leghje ciò chì vulete.

A cosa più interessante hè sta funzione Kubernetes, chì hè quì per automaticamente.

volumeMounts:
- mountPath: /host 
  name: host 
volumes:
- hostPath: 
    path: / 
    type: Directory 
  name: host 

È a so essenza hè chì pudemu, in u pod chì lanciamu, ancu senza diritti à questu cluster, dì chì vulemu creà un voluminu di u tipu hostPath. Allora pigliate a strada da l'ospitu nantu à quale avemu da principià - è pigliate cum'è voluminu. E poi chjamemu nome: host. Muntemu tuttu questu hostPath in u pod. In questu esempiu, à u cartulare / host.

Una volta ripeteraghju. Avemu dettu à u pod di vene à u maestru, uttene hostNetwork è hostPID quì - è muntate tutta a radica di u maestru in questu pod.

Capite chì in Debian avemu bash in esecuzione, è sta bash funziona per noi cum'è root. Hè vale à dì, avemu ghjustu a radica nantu à u maestru, mentre ùn avemu micca diritti in u cluster Kubernetes.

Allora tuttu u compitu hè di andà in u cartulare / host / etc / kubernetes / pki, se ùn sò micca sbagliatu, pigliate quì tutti i certificati maestri di u cluster è, per quessa, diventate l'amministratore di u cluster.

Quandu si vede cusì, questi sò alcuni di i diritti più periculosi in pods, indipendentemente da quali diritti l'utilizatore hà:
Chiudemu i buchi in u cluster Kubernetes. Rapportu è trascrizione cù DevOpsConf

Se aghju diritti per eseguisce un pod in un spaziu di nomi di cluster, allora questu pod hà questi diritti per automaticamente. Puderaghju eseguisce pods privilegiati, chì in generale sò tutti i diritti, praticamenti arradicate un node.

U mo preferitu hè Root user. È Kubernetes hà questa opzione Run As Non-Root. Questu hè un tipu di prutezzione contru un pirate. Sapete ciò chì hè u "virus moldavu"? Sè di colpu site un pirate è ghjuntu à u mo cluster Kubernetes, allora noi, poveri amministratori, dumandemu: "Per piacè indicà in i vostri pods cù quale piraterete u mo cluster, eseguite cum'è non-root. Altrimenti, vi sarà chì vi principiatu u prucessu in u vostru baccelli sottu à a ràdica, è sarà assai fàciule per voi à marcianise mi. Prutetevi, per piacè ".

U voluminu di u percorsu di l'ospitu - in my opinion, u modu più veloce per ottene u risultatu desideratu da u cluster Kubernetes.

Ma chì fà cù tuttu questu?

Pensieri chì deve vene à qualsiasi amministratore normale chì scontra Kubernetes: "Iè, vi aghju dettu, Kubernetes ùn funziona micca. Hà buchi in questu. È tuttu u Cube hè una merda ". In fatti, ci hè una cosa cum'è a documentazione, è s'è vo circate quì, allora ci hè una sezione Politica di Sicurezza Pod.

Questu hè un ughjettu yaml - pudemu creà in u cluster Kubernetes - chì cuntrolla l'aspettu di sicurità in a descrizzione di i pods. Hè, in fattu, cuntrolla i diritti per utilizà qualsiasi hostNetwork, hostPID, certi tipi di volumi chì sò in i pods à l'iniziu. Cù l'aiutu di a Politica di Sicurezza di Pod, tuttu questu pò esse descrittu.

A cosa più interessante di a Politica di Sicurezza di Pod hè chì in u cluster Kubernetes, tutti l'installatori di PSP ùn sò micca solu descritti in ogni modu, sò solu disattivati ​​per automaticamente. A Politica di Sicurezza di Pod hè attivata cù u plugin d'admission.

D'accordu, implementemu a Politica di Sicurezza di Pod à u cluster, dicemu chì avemu alcuni pods di serviziu in u spaziu di nomi, à quale solu l'amministratori anu accessu. Diciamu, in tuttu u restu, i baccelli anu diritti limitati. Perchè i sviluppatori più probabili ùn anu micca bisognu di eseguisce pods privilegiati nantu à u vostru cluster.

È paremu d'esse bè. È u nostru cluster Kubernetes ùn pò micca esse pirate in dui minuti.

Ci hè un prublema. Hè assai prubabile, sè vo avete un cluster Kubernetes, allora u monitoraghju hè stallatu in u vostru cluster. Aghju ancu s'impegna à predichendu chì se u vostru cluster hà monitoru, allora si chjama Prometheus.

Ciò chì vi dicu avà serà validu sia per l'operatore Prometheus sia per Prometheus consegnatu in a so forma pura. A quistione hè, se ùn possu micca uttene un amministratore à u cluster cusì rapidamente, allora questu significa chì aghju bisognu di circà più. È possu circà cù u vostru monitoraghju.

Probabilmente, tutti leghjenu i stessi articuli nantu à Habré, è u monitoraghju hè situatu in u spaziu di nome di monitoraghju. U graficu Helm hè chjamatu apprussimatamente u stessu per tutti. A mo ipotesi hè chì, se fate l'installazione stabile/prometheus, duvete finisce cù quasi i stessi nomi. È ancu più prubabilmente ùn aghju micca da guessà u nome DNS in u vostru cluster. Perchè hè standard.

Chiudemu i buchi in u cluster Kubernetes. Rapportu è trascrizione cù DevOpsConf

Dopu, avemu un certu dev ns, in quale pudete eseguisce un certu pod. E poi da questu pod hè assai faciule fà cusì:

$ curl http://prometheus-kube-state-metrics.monitoring 

prometheus-kube-state-metrics hè unu di l'esportatori prometheus chì recullà metriche da l'API Kubernetes stessu. Ci hè assai dati quì, ciò chì corre in u vostru cluster, ciò chì hè, chì prublemi avete cun ellu.

Cum'è un esempiu simplice:

kube_pod_container_info{namespace="kube-system",pod="kube-apiserver-k8s-1",container="kube-apiserver",image=

"gcr.io/google-containers/kube-apserver:v1.14.5"

,image_id=»docker-pullable://gcr.io/google-containers/kube- apiserver@sha256:e29561119a52adad9edc72bfe0e7fcab308501313b09bf99df4a96 38ee634989″,container_id=»docker://7cbe7b1fea33f811fdd8f7e0e079191110268f2 853397d7daf08e72c22d3cf8b»} 1

Facendu una semplice dumanda di curl da un pod senza privilegiu, pudete uttene infurmazioni cum'è questu. Se ùn sapete micca quale versione di Kubernetes site in esecuzione, vi dicerà facilmente.

È a cosa più interessante hè chì in più di u fattu chì accede à kube-state-metrics, pudete ancu accede direttamente à Prometheus stessu. Pudete cullà metriche da quì. Pudete ancu custruisce metriche da quì. Ancu teoricamente, pudete custruisce una tale dumanda da un cluster in Prometheus, chì solu l'apagarà. È u vostru monitoraghju generalmente cesserà di travaglià da u cluster.

E quì a quistione hè digià s'ellu ci hè un monitoraghju esternu chì monitora u vostru monitoraghju. Aghju avutu l'uppurtunità di operà in un cluster Kubernetes senza cunsequenze per mè stessu. Ùn sapete mancu ch'e aghju travagliatu quì, postu chì u monitoraghju ùn ci hè più.

Cum'è cù a PSP, si sente chì u prublema hè chì tutte queste tecnulugii di fantasia - Kubernetes, Prometheus - ùn funzionanu micca è sò pieni di buchi. Micca essatamente.

Ci hè una cosa cusì - pulitica di rete.

Sè vo site un amministratore nurmale, allura u più prubabile sapete nantu à a Politica di a Rete chì questu hè un altru yaml, di quale ci sò digià dofiga in u cluster. E Politiche di a Rete ùn sò definitivamente micca necessariu. E ancu s'è avete lettu ciò chì hè a Politica di a Rete, ciò chì hè un firewall yaml di Kubernetes, vi permette di limità i diritti d'accessu trà spazii di nomi, trà pods, allora avete decisu chì u firewall yaml in Kubernetes hè basatu annantu à l'astrazioni prossime ... No-nè. Di sicuru, ùn hè micca necessariu.

Ancu s'è i vostri specialisti di sicurità ùn anu micca dettu chì cù l'aiutu di u vostru Kubernetes, pudete custruisce un firewall assai faciule è simplice, è assai granulare. S'ellu ùn sanu micca questu è ùn ti tira micca: "Bè, dà, dà ..." Allora in ogni casu, avete bisognu di a Politica di a Rete per bluccà l'accessu à certi lochi di serviziu chì pudete tirà da u vostru cluster. senza alcuna auturizazione.

Cum'è in l'esempiu ch'e aghju datu, pudete tirà e metriche di u statu di kube da ogni spaziu di nomi in u cluster Kubernetes senza avè nisun dirittu per fà. I pulitichi di a rete anu chjusu l'accessu da tutti l'altri spazii di nomi à u spaziu di nomi di monitoraghju è, per esse, tuttu: senza accessu, senza prublemi. In tutti i charts chì esistenu, tramindui u prometheu standard è u prometeu chì hè in l'operatore, ci hè solu una opzione in i valori di u timone per simplificà e pulitiche di rete per elli. Basta à accende lu è si travaglia.

Ci hè veramente un prublema quì. Essendu un amministratore barbutu normale, probabilmente avete decisu chì e pulitiche di rete ùn sò micca necessariu. E dopu avè lettu ogni tipu d'articuli nantu à risorse cum'è Habr, avete decisu chì a flanella, soprattuttu cù u modu host-gateway, hè u megliu chì pudete sceglie.

Chì deve fà?

Pudete pruvà à redistribuisce a suluzione di rete chì avete in u vostru cluster Kubernetes, pruvate à rimpiazzà cù qualcosa di più funziunale. Nantu à u listessu Calico, per esempiu. Ma subitu vogliu dì chì u compitu di cambià a suluzione di rete in u cluster Kubernetes di travagliu hè abbastanza micca trivial. L'aghju risoltu duie volte (e duie volte, però, in teoria), ma avemu ancu dimustratu cumu fà in Slurms. Per i nostri studienti, avemu dimustratu cumu cambià a suluzione di rete in un cluster Kubernetes. In principiu, pudete pruvà à assicurà chì ùn ci hè micca un downtime in u cluster di produzzione. Ma probabilmente ùn avete micca successu.

È u prublema hè in realtà risolta assai simplice. Ci sò certificati in u cluster, è sapete chì i vostri certificati andaranu male in un annu. Ebbè, è di solitu una suluzione normale cù certificati in u cluster - perchè andemu à piglià un bagnu di vapore, suscitaremu un novu cluster vicinu à ellu, lasciate persu in u vechju, è redistribuisce tuttu. True, quandu si putrezza, tuttu si stende per un ghjornu, ma dopu un novu cluster.

Quandu suscita un novu cluster, à u stessu tempu inserisce Calico invece di flanella.

Cosa da fà s'ellu avete certificati emessi per centu anni è ùn avete micca ritruvà u cluster? Ci hè una tale cosa Kube-RBAC-Proxy. Questu hè un sviluppu assai bellu, vi permette di incrustà cum'è un containeru sidecar à qualsiasi pod in un cluster Kubernetes. È in realtà aghjunghje l'autorizazione attraversu u RBAC di Kubernetes stessu à stu pod.

Ci hè un prublema. Nanzu, sta suluzione Kube-RBAC-Proxy hè stata integrata in u prometeu di l'operatore. Ma tandu era andatu. Avà e versioni muderni s'appoghjanu nantu à u fattu chì avete pulitiche di rete è chjude cù elli. È cusì avete da riscrive un pocu u graficu. In fatti, s'è tù vai stu repository, Ci sò esempi di cumu utilizà cum'è sidecars, è i charts anu da esse riscritti minimamente.

Ci hè un altru picculu prublema. Ùn solu Prometheus dà e so metriche à qualcunu. In u nostru casu, tutti i cumpunenti di u cluster Kubernetes sò ancu capaci di dà e so metriche.

Ma cum'è aghju dettu, se ùn pudete micca accede à u cluster è raccoglie l'infurmazioni, pudete almenu fà male.

Allora vi mustraraghju rapidamente duie manere chì un cluster Kubernetes pò esse malatu.

Riderete quandu vi dicu, sò dui casi di a vita vera.

Metudu unu. Esaurimentu di risorse.

Lancemu un altru pod speciale. Avarà sta sezione.

resources: 
    requests: 
        cpu: 4 
        memory: 4Gi 

Cum'è sapete, e dumande hè a quantità di CPU è memoria chì hè riservata nantu à l'ospitu per pods di richieste specifiche. Se avemu un host di quattru core in u cluster Kubernetes, è quattru pods CPU ghjunghjenu quì cù richieste, allora ùn ci ponu più pods cù richieste à questu host.

Se esegui un tali pod, allora emette u cumandamentu:

$ kubectl scale special-pod --replicas=...

Allora nimu altru puderà implementà à u cluster Kubernetes. Perchè tutti i nodi saranu senza richieste. È cusì fermaraghju u vostru cluster Kubernetes. Se aghju fattu questu in a sera, allora i dispiegamenti ponu esse firmati per un bellu pezzu.

Se guardemu di novu à a documentazione di Kubernetes, vedemu una cosa chjamata Limit Range. Stabilisce e risorse per l'oggetti cluster. Pudete scrive un ughjettu Limit Range in yaml, appricà à certi spazii di nomi - è più in questu spaziu di nomi pudete dì chì avete risorse per i pods predeterminati, massimi è minimi.

Cù l'aiutu di una tale cosa, pudemu limità l'utilizatori in spazii di nomi specifichi di u produttu di squadra da a capacità di indicà ogni tipu di cose brutte nantu à i so pods. Ma sfurtunatamenti, ancu s'è vo dite à l'utilizatore chì ùn pudete micca eseguisce pods cù richieste per più di una CPU, ci hè un cumandamentu di scala cusì maravigliosa, bè, o attraversu u dashboard ponu fà scala.

È questu hè induve u numeru dui entra. Run 11 111 111 111 111 pods. Hè undici miliardi. Questu ùn hè micca perchè aghju fattu un tali numeru, ma perchè l'aghju vistu stessu.

Storia vera. A tarda sera stava per lascià l'uffiziu. Fighjulu, un gruppu di sviluppatori hè pusatu in u cantonu è frenetamente facenu qualcosa cù laptops. Vaiu versu i picciotti è dumandu: "Chì vi hè accadutu?"

Un pocu prima, à nove ore di sera, unu di i sviluppatori andava in casa. È aghju decisu: "Avà scalaraghju a mo applicazione à unu". Aghju pressatu unu, è l'Internet hè diventatu un pocu sordu. Hà pressatu quellu di novu, hà pressatu quellu, preme Enter. Pigliò tuttu ciò chì pudia. Allora l'Internet hè vinutu à a vita - è tuttu hà cuminciatu à scala finu à questa data.

True, sta storia ùn hè micca accadutu nantu à Kubernetes, à quellu tempu era Nomad. Hè finitu cù u fattu chì dopu à una ora di i nostri tentativi di piantà Nomad da tentativi stubborn di scala, Nomad hà rispostu chì ùn hà micca firmatu di scala è ùn faria nunda di più. "Sò stancu, partu". È si vultò.

Naturalmente aghju pruvatu à fà u listessu in Kubernetes. Undici miliardi di pods Kubernetes ùn hà micca piaciutu, disse: "Ùn possu micca. Supera i tappi interni. Ma 1 pods puderianu.

In risposta à un miliardo, u Cube ùn si ritirò in sè stessu. Hè veramente cuminciatu à scala. Più u prucessu andava, u più tempu hà pigliatu per creà novi pods. Ma ancu u prucessu continuò. L'unicu prublema hè chì, se possu eseguisce pods in u mo namespace indefinitu, allora ancu senza richieste è limiti, possu eseguisce un tale numeru di pods cù certi compiti chì cù l'aiutu di sti travaglii i nodi cumincianu à aghjunghje da a memoria, nantu à u CPU. Quandu eseguiu tanti pods, l'infurmazioni da elli devenu entre in u almacenamiento, questu, etcd. È quandu entra troppu infurmazione, l'almacenamiento cumencia à rinvià troppu lentamente - è Kubernetes cumencia à diventà contu.

È un prublema più ... Comu sapete, i cuntrolli di Kubernetes ùn sò micca un tipu di cosa centrale, ma parechji cumpunenti. Ci hè, in particulare, un gestore di controller, scheduler è cusì. Tutti sti picciotti cumincianu à fà un travagliu stupidu innecessariu à u stessu tempu, chì cù u tempu hà da cumincià à piglià più è più tempu. U gestore di u controller creerà novi pods. Scheduler hà da pruvà à truvà un novu node per elli. I novi nodi in u vostru cluster sò prubabilmente esceranu prestu. U cluster Kubernetes cumincerà à curriri sempre più lentamente.

Ma aghju decisu di andà ancu più luntanu. Comu sapete, Kubernetes hà una cosa chjamata serviziu. Ebbè, per difettu in i vostri clusters, u più prubabile, u serviziu travaglia cù e tavule IP.

Se correte un billion pods, per esempiu, è poi utilizate un script per furzà Kubernetis à creà novi servizii:

for i in {1..1111111}; do
    kubectl expose deployment test --port 80  
        --overrides="{"apiVersion": "v1", 
           "metadata": {"name": "nginx$i"}}"; 
done 

In tutti i nodi di u cluster, più è più novi regule iptables seranu generati apprussimatamente simultaneamente. Inoltre, un miliardo di reguli iptables seranu generati per ogni serviziu.

Aghju verificatu tuttu questu nantu à parechji milla, finu à una decina. È u prublema hè chì digià à questu limitu hè abbastanza problematicu per fà ssh à u node. Perchè i pacchetti, chì passanu per tante catene, cumincianu à sentu micca assai bè.

È questu hè ancu tuttu risoltu cù l'aiutu di Kubernetes. Ci hè un tali oggettu Quota di risorse. Stabilisce u numeru di risorse è oggetti dispunibili per u spaziu di nomi in u cluster. Pudemu creà un oggettu yaml in ogni spaziu di nomi di cluster Kubernetes. Cù l'aiutu di questu ughjettu, pudemu dì chì avemu un certu nùmeru di dumande, limiti attribuiti per questu spaziu di nome, è in più pudemu dì chì hè pussibule di creà 10 servizii è 10 pods in questu namespace. È un solu sviluppatore pò ancu sfracicà in a sera. Kubernetes li dicerà: "Ùn pudete micca scalà i vostri pods à una tale quantità, perchè supera a quota di risorse". Eccu, prublema risolta. Documentazione quì.

Un prublema nasce in cunnessione cù questu. Sentite quantu hè difficiule di creà un spaziu di nomi in Kubernetes. Per creà, ci vole à piglià in contu una mansa di cose.

Quota di risorsa + Limit Range + RBAC
• Crea un namespace
• Crea dentro limitrange
• Crea dentro resourcequota
• Crea un serviziu di serviziu per CI
• Crea rolebinding per CI è utilizatori
• Optionally lanciari i pods serviziu nicissariu

Dunque, pigliendu sta opportunità, vogliu sparte i mo sviluppi. Ci hè una cosa chjamata operatore SDK. Questu hè u modu in u cluster Kubernetes per scrive dichjarazioni per questu. Pudete scrive dichjarazioni cù Ansible.

À u principiu, avemu scrittu in Ansible, è dopu aghju vistu ciò chì l'operatore SDK era è riscrivite u rolu Ansible in un operatore. Questa dichjarazione permette di creà un ughjettu in u cluster Kubernetes chjamatu cumandamentu. Dentru u cumandamentu, vi permette di discrive in yaml l'ambiente per questu cumandamentu. È in l'ambienti di a squadra, ci permette di discrìviri chì avemu attribuitu tanti risorse.

Little facilitatore di stu prucessu cumplessu.

È in cunclusioni. Chì fà cù tuttu questu?
Primu. A Politica di Sicurezza di Pod hè bona. E malgradu u fattu chì nimu di l'installatori di Kubernetes l'utilizanu finu à questu ghjornu, avete sempre bisognu di usà in i vostri clusters.

A pulitica di a rete ùn hè micca una altra funzione inutile. Questu hè ciò chì hè veramente necessariu in u cluster.

LimitRange / ResourceQuota - hè ora di utilizà. Avemu cuminciatu à aduprà assai tempu fà, è per un bellu pezzu era sicuru chì tutti senza eccezzioni l'utilizanu. Hè risultatu chì questu hè raru.

In più di ciò chì aghju mintuatu durante u rapportu, ci sò funzioni indocumentati chì permettenu di attaccà u cluster. Rilasciatu recentemente grande analisi di vulnerabilità Kubernetes.

Alcune cose sò cusì tristi è ferite. Per esempiu, in certi cundizioni, i cubelets in un cluster Kubernetes ponu dà u cuntenutu di u repertoriu warlocks, è à un utilizatore micca autorizatu.

ccà ci sò struzzioni nantu à cumu ripruduce tuttu ciò chì aghju dettu. Ci sò fugliali cù esempi di pruduzzione, cumu ResourceQuota, Politica di Sicurezza Pod pare. È tuttu questu pò esse toccu.

Grazie à tutti.

Source: www.habr.com

Add a comment