Ndandani bolongan ing kluster Kubernetes. Laporan lan transkrip saka DevOpsConf

Pavel Selivanov, arsitek solusi Southbridge lan guru Slurm, menehi presentasi ing DevOpsConf 2019. Dhiskusi iki minangka bagean saka salah sawijining topik kursus sing jero babagan Kubernetes "Slurm Mega".

Slurm Basic: An Introduction to Kubernetes njupuk Panggonan ing Moscow ing November 18-20.
Slurm Mega: looking ing hood saka Kubernetes — Moscow, 22-24 November.
Slurm Online: loro kursus Kubernetes tansah kasedhiya.

Ing ngisor potongan kasebut ana transkrip laporan.

Sugeng siang, rekan-rekan lan sing simpati karo dheweke. Dina iki aku bakal ngomong babagan safety.

Aku weruh sing ana akeh pengawal keamanan ing bale dina. Aku njaluk ngapura kanggo sampeyan sadurunge yen aku nggunakake istilah saka donya keamanan ora persis kaya adat kanggo sampeyan.

Kedaden, kira-kira nem sasi kepungkur aku nemoni siji kluster Kubernetes umum. Umum tegese ana nomer nth saka namespaces; ing namespaces iki ana pangguna diisolasi ing namespace. Kabeh pangguna iki kalebu perusahaan sing beda-beda. Inggih, dianggep manawa kluster iki kudu digunakake minangka CDN. Yaiku, dheweke menehi kluster, menehi pangguna ing kana, sampeyan menyang papan jeneng sampeyan, pasang ngarep sampeyan.

Perusahaanku sadurunge nyoba adol layanan kasebut. Lan aku dijaluk poke kluster kanggo ndeleng yen solusi iki cocok utawa ora.

Aku teka ing kluster iki. Aku diwenehi hak winates, namespace winates. Wong lanang ing kana ngerti apa safety. Dheweke maca babagan kontrol akses adhedhasar peran (RBAC) ing Kubernetes - lan dheweke bengkong supaya ora bisa mbukak pod kanthi kapisah saka penyebaran. Aku ora ngelingi masalah sing aku nyoba kanggo ngatasi kanthi ngetokake pod tanpa penyebaran, nanging aku pancene pengin miwiti mung pod. Kanggo apik luck, Aku mutusaké kanggo ndeleng apa hak aku ing kluster, apa aku bisa nindakake, apa aku ora bisa nindakake, lan apa padha ngaco munggah ana. Ing wektu sing padha, Aku bakal pitutur marang kowe apa padha salah ngatur ing RBAC.

Kedaden ing rong menit aku nampa admin menyang kluster, katon ing kabeh namespaces tetanggan, weruh ana ngarep produksi mlaku perusahaan sing wis tuku layanan lan disebarake. Aku meh ora bisa ngendhegake aku saka menyang ngarep wong lan sijine sawetara tembung sumpah ing kaca utama.

Aku bakal pitutur marang kowe karo conto carane aku nindakake iki lan carane nglindhungi dhewe saka iki.

Nanging luwih dhisik, sumangga kula aturaken. Jenengku Pavel Selivanov. Aku dadi arsitek ing Southbridge. Aku ngerti Kubernetes, DevOps lan kabeh jinis barang sing apik. Insinyur Southbridge lan aku mbangun kabeh iki, lan aku konsultasi.

Saliyane kegiatan utama, kita bubar ngluncurake proyek sing diarani Slurms. Kita nyoba kanggo nggawa kemampuan kita kanggo bisa karo Kubernetes sethitik kanggo massa, kanggo mulang wong liya uga bisa karo K8s.

Apa sing bakal dakkandhakake dina iki? Topik laporan kasebut jelas - babagan keamanan kluster Kubernetes. Nanging aku pengin langsung ngomong yen topik iki gedhe banget - mula aku pengin langsung njlentrehake apa sing ora bakal dakkandhakake. Aku ora bakal ngomong babagan istilah hackneyed sing wis digunakake kaping satus ing Internet. Kabeh jinis RBAC lan sertifikat.

Aku bakal pirembagan bab apa pain kula lan kolega babagan keamanan ing cluster Kubernetes. Kita ndeleng masalah kasebut ing antarane panyedhiya sing nyedhiyakake kluster Kubernetes lan ing antarane klien sing teka menyang kita. Malah saka klien sing teka saka perusahaan admin konsultasi liyane. Tegese, skala tragedi kasebut pancen gedhe banget.

Secara harfiah ana telung poin sing bakal dakkandhakake dina iki:

  1. Hak pangguna vs hak pod. Hak pangguna lan hak pod ora padha.
  2. Ngumpulake informasi babagan kluster. Aku bakal nuduhake yen sampeyan bisa ngumpulake kabeh informasi sing perlu saka kluster tanpa hak khusus ing kluster iki.
  3. serangan DoS ing kluster. Yen kita ora bisa ngumpulake informasi, kita bakal bisa kanggo sijine kluster ing kasus apa wae. Aku bakal ngomong babagan serangan DoS ing unsur kontrol kluster.

Liyane bab umum sing bakal tak sebutno iku aku dites kabeh iki ing, kang aku mesthi bisa ngomong sing kabeh bisa.

Kita njupuk minangka basis instalasi saka cluster Kubernetes nggunakake Kubespray. Yen ana sing ora ngerti, iki sejatine minangka set peran kanggo Ansible. Kita nggunakake terus-terusan ing karya kita. Sing apik yaiku sampeyan bisa muter ing ngendi wae - sampeyan bisa muter menyang potongan wesi utawa menyang awan ing endi wae. Siji cara instalasi dianggo ing asas kanggo kabeh.

Ing kluster iki aku bakal duwe Kubernetes v1.14.5. Kluster Cube kabeh, sing bakal kita nimbang, dipérang dadi ruang jeneng, saben ruang jeneng dadi tim sing kapisah, lan anggota tim iki duwe akses menyang saben ruang jeneng. Dheweke ora bisa pindhah menyang papan jeneng sing beda-beda, mung menyang papan jeneng dhewe. Nanging ana akun admin tartamtu sing nduweni hak kanggo kabeh kluster.

Ndandani bolongan ing kluster Kubernetes. Laporan lan transkrip saka DevOpsConf

Aku janji manawa sing pertama bakal ditindakake yaiku entuk hak admin kanggo kluster kasebut. Kita butuh pod sing disiapake khusus sing bakal ngilangi kluster Kubernetes. Kabeh sing kudu kita lakoni yaiku ngetrapake menyang kluster Kubernetes.

kubectl apply -f pod.yaml

Pod iki bakal teka ing salah sawijining master kluster Kubernetes. Lan sawise iki kluster bakal seneng bali menyang kita file disebut admin.conf. Ing Cube, file iki nyimpen kabeh sertifikat administrator, lan ing wektu sing padha ngatur API kluster. Iki carane gampang kanggo njaluk akses admin menyang 98% saka klompok Kubernetes.

Aku mbaleni, pod iki digawe dening siji pangembang ing kluster sampeyan duwe akses kanggo nyebarke usulan-usulan menyang siji namespace cilik, iku kabeh clamped dening RBAC. Dheweke ora duwe hak. Nanging sertifikat kasebut bali.

Lan saiki babagan pod sing disiapake khusus. We mbukak ing sembarang gambar. Coba debian:jessie minangka conto.

Kita duwe bab iki:

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

Apa iku toleransi? Master ing kluster Kubernetes biasane ditandhani karo sing diarani taint. Lan inti saka "infeksi" iki yaiku yen polong ora bisa ditugasake kanggo node master. Nanging ora ana sing ngganggu kanggo nunjukake ing polong apa wae sing toleran karo "infeksi". Bagean Tolerasi mung ujar manawa sawetara simpul duwe NoSchedule, mula simpul kita toleran karo infeksi kasebut - lan ora ana masalah.

Salajengipun, kita ngomong yen ing ngisor kita ora mung sabar, nanging uga pengin target khusus master. Amarga master duwe sing paling enak sing kita butuhake - kabeh sertifikat. Mulane, kita ngomong nodeSelector - lan kita duwe label standar ing master, sing ngidini sampeyan milih saka kabeh kelenjar ing kluster persis kelenjar sing master.

Kanthi rong bagean iki dheweke mesthi bakal teka ing master. Lan dheweke bakal diidini manggon ing kana.

Nanging mung teka ing master ora cukup kanggo kita. Iki ora bakal menehi apa-apa. Dadi sabanjure kita duwe rong perkara iki:

hostNetwork: true 
hostPID: true 

Kita nemtokake manawa pod kita, sing diluncurake, bakal manggon ing ruang jeneng kernel, ing ruang jeneng jaringan, lan ing ruang jeneng PID. Sawise polong diluncurake ing master, bakal bisa ndeleng kabeh antarmuka sing nyata lan langsung saka simpul iki, ngrungokake kabeh lalu lintas lan ndeleng PID kabeh proses.

Banjur perkara cilik. Njupuk etcd lan maca apa sing arep.

Sing paling menarik yaiku fitur Kubernetes iki, sing ana ing kono kanthi standar.

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

Lan intine yaiku kita bisa ngomong ing pod sing diluncurake, sanajan tanpa hak kanggo klompok iki, kita pengin nggawe volume jinis hostPath. Iki tegese njupuk dalan saka host sing bakal diluncurake - lan njupuk minangka volume. Banjur kita nyebut jeneng kasebut: host. Kita pasang kabeh hostPath iki ing njero pod. Ing conto iki, menyang direktori / host.

Aku bakal mbaleni maneh. Kita marang polong teka master, njaluk hostNetwork lan hostPID ana - lan Gunung kabeh ROOT master nang polong iki.

Sampeyan ngerti yen ing Debian kita duwe bash mlaku, lan bash iki mlaku ing root. Yaiku, kita mung nampa oyod ing master, tanpa duwe hak ing kluster Kubernetes.

Banjur kabeh tugas kanggo pindhah menyang sub direktori /host /etc/kubernetes/pki, yen aku ora salah, njupuk kabeh sertifikat master saka kluster ana lan, miturut, dadi administrator cluster.

Yen sampeyan ndeleng kanthi cara iki, iki minangka sawetara hak paling mbebayani ing pods - preduli saka hak apa sing diduweni pangguna:
Ndandani bolongan ing kluster Kubernetes. Laporan lan transkrip saka DevOpsConf

Yen aku duwe hak kanggo mbukak pod ing sawetara namespace kluster, banjur pod iki nduweni hak iki minangka standar. Aku bisa mbukak polong ndarbeni hak istimewa, lan iki umume kabeh hak, prakteke ROOT ing simpul.

Favoritku yaiku pangguna Root. Lan Kubernetes duwe opsi Run As Non-Root iki. Iki minangka jinis perlindungan saka peretas. Apa sampeyan ngerti apa "virus Moldavia"? Yen sampeyan tiba-tiba dadi peretas lan teka ing kluster Kubernetes, mula, para pangurus sing ora apik, takon: "Tulung tandhani ing pods sing bakal sampeyan hack klusterku, mbukak minangka non-root. Yen ora, iku bakal kelakon sing mbukak proses ing pod ing ROOT, lan iku bakal gampang banget kanggo hack kula. Mangga nglindhungi dhewe saka dhewe."

Volume path host, miturut pendapatku, minangka cara paling cepet kanggo entuk asil sing dikarepake saka kluster Kubernetes.

Nanging apa sing kudu dilakoni karo kabeh iki?

Pikiran sing kudu ditindakake dening administrator normal sing nemoni Kubernetes yaiku: "Ya, aku wis ngomong, Kubernetes ora bisa digunakake. Ana bolongan ing. Lan kabeh Cube iku omong kosong. Ing kasunyatan, ana bab kayata dokumentasi, lan yen katon ana, ana bagean Kebijakan Keamanan Pod.

Iki minangka obyek yaml - kita bisa nggawe ing kluster Kubernetes - sing ngontrol aspek keamanan khusus ing katrangan saka pods. Yaiku, nyatane, ngontrol hak nggunakake hostNetwork, hostPID, jinis volume tartamtu sing ana ing pods nalika wiwitan. Kanthi bantuan Kabijakan Keamanan Pod, kabeh iki bisa diterangake.

Sing paling menarik babagan Kebijakan Keamanan Pod yaiku ing kluster Kubernetes, kabeh installer PSP ora mung diterangake kanthi cara apa wae, nanging mung dipateni kanthi standar. Kabijakan Keamanan Pod diaktifake nggunakake plugin diakoni.

Oke, ayo nyebarake Kabijakan Keamanan Pod menyang kluster, ayo ngomong yen kita duwe sawetara pod layanan ing ruang jeneng, sing mung bisa diakses dening admin. Contone, ing kabeh kasus liyane, polong duwe hak winates. Amarga umume pangembang ora perlu mbukak pod istimewa ing kluster sampeyan.

Lan kabeh katon apik karo kita. Lan kluster Kubernetes ora bisa disusupi sajrone rong menit.

Ana masalah. Paling kamungkinan, yen sampeyan duwe kluster Kubernetes, banjur ngawasi diinstal ing kluster. Aku malah bakal prédhiksi manawa kluster sampeyan wis ngawasi, bakal diarani Prometheus.

Apa sing bakal dakkandhakake bakal bener kanggo operator Prometheus lan Prometheus sing dikirim ing wangun murni. Pitakonan iku yen aku ora bisa njaluk admin menyang kluster supaya cepet, banjur iki tegese aku kudu katon luwih. Lan aku bisa nggoleki kanthi bantuan pemantauan sampeyan.

Mbokmenawa saben wong maca artikel sing padha ing Habré, lan pemantauan kasebut ana ing ruang jeneng pemantauan. Bagan helm diarani kira-kira padha kanggo kabeh wong. Aku ngiro-iro yen sampeyan nindakake helm install stable/prometheus, sampeyan bakal duwe jeneng sing padha. Lan paling kamungkinan, aku ora kudu ngira jeneng DNS ing kluster sampeyan. Amarga iku standar.

Ndandani bolongan ing kluster Kubernetes. Laporan lan transkrip saka DevOpsConf

Sabanjure kita duwe dev ns tartamtu, ing ngendi sampeyan bisa mbukak pod tartamtu. Banjur saka pod iki gampang banget kanggo nindakake kaya iki:

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

prometheus-kube-state-metrics minangka salah sawijining eksportir Prometheus sing ngumpulake metrik saka API Kubernetes dhewe. Ana akeh data ing kana, apa sing mlaku ing kluster sampeyan, apa iku, apa masalah sampeyan.

Minangka conto prasaja:

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:e29561119a52adad9edc72bfe0e7fcab308501313b09bf99df4a96 38ee634989″,container_id=»docker://7cbe7b1fea33f811fdd8f7e0e079191110268f2 853397d7daf08e72c22d3cf8b»} 1

Kanthi nggawe panjalukan curl sing gampang saka pod sing ora duwe hak istimewa, sampeyan bisa entuk informasi ing ngisor iki. Yen sampeyan ora ngerti versi Kubernetes sing sampeyan gunakake, sampeyan bakal gampang ngandhani.

Lan sing paling menarik yaiku saliyane ngakses kube-state-metrics, sampeyan bisa kanthi gampang ngakses Prometheus dhewe kanthi langsung. Sampeyan bisa ngumpulake metrik saka kono. Sampeyan malah bisa mbangun metrik saka ing kono. Malah kanthi teoritis, sampeyan bisa nggawe pitakon kasebut saka klompok ing Prometheus, sing mung bakal mateni. Lan ngawasi sampeyan bakal mandheg kerja saka kluster kabeh.

Lan ing kene ana pitakonan manawa ana pemantauan eksternal sing ngawasi pemantauan sampeyan. Aku mung entuk kesempatan kanggo operate ing kluster Kubernetes tanpa jalaran kanggo aku. Sampeyan malah ora bakal ngerti yen aku operasi ana, amarga ora ana maneh ngawasi.

Kaya karo PSP, rasane kaya masalah yaiku kabeh teknologi sing apik iki - Kubernetes, Prometheus - mung ora bisa digunakake lan kebak bolongan. Ora temenan.

Ana sing kaya ngono - Kebijakan Jaringan.

Yen sampeyan minangka admin normal, mesthine sampeyan ngerti babagan Kabijakan Jaringan yen iki mung yaml liyane, sing wis ana akeh ing kluster kasebut. Lan sawetara Kabijakan Jaringan mesthi ora dibutuhake. Lan sanajan sampeyan maca apa Kebijakan Jaringan, iku firewall yaml saka Kubernetes, ngidini sampeyan mbatesi hak akses ing antarane ruang jeneng, ing antarane pods, mula sampeyan mesthi mutusake yen firewall ing format yaml ing Kubernetes adhedhasar abstraksi sabanjure. ... Ora, ora. Iki mesthi ora perlu.

Sanajan sampeyan ora ngandhani spesialis keamanan yen nggunakake Kubernetes sampeyan bisa nggawe firewall sing gampang banget lan prasaja, lan sing rinci banget. Yen dheweke durung ngerti iki lan ora ngganggu sampeyan: "Inggih, wenehi kula, wenehi kula ..." Banjur ing kasus apa wae, sampeyan butuh Kebijakan Jaringan kanggo mblokir akses menyang sawetara panggonan layanan sing bisa ditarik saka kluster sampeyan. tanpa wewenang.

Kaya ing conto sing dakwenehake, sampeyan bisa narik metrik negara kube saka sembarang namespace ing kluster Kubernetes tanpa duwe hak kanggo nindakake. Kabijakan jaringan wis nutup akses saka kabeh ruang jeneng liyane menyang ruang jeneng pemantauan lan mung: ora ana akses, ora ana masalah. Ing kabeh grafik sing ana, loro Prometheus standar lan Prometheus sing ana ing operator, mung ana pilihan ing nilai setir kanggo ngaktifake kabijakan jaringan kanggo dheweke. Sampeyan mung kudu nguripake lan bakal bisa.

Ana tenan siji masalah kene. Dadi admin jenggot normal, sampeyan mesthine mutusake manawa kabijakan jaringan ora dibutuhake. Lan sawise maca kabeh jinis artikel babagan sumber daya kaya Habr, sampeyan mutusake manawa flanel, utamane nganggo mode host-gateway, minangka pilihan sing paling apik sing bisa sampeyan pilih.

Apa aku kudu?

Sampeyan bisa nyoba kanggo redeploy solusi jaringan sing wis ing kluster Kubernetes, nyoba kanggo ngganti karo soko liyane fungsi. Kanggo Calico padha, contone. Nanging aku arep ngomong langsung yen tugas ngganti solusi jaringan ing klompok kerja Kubernetes cukup ora pati penting. Aku ditanggulangi kaping pindho (loro kaping, Nanging, teori), nanging kita malah nuduhake carane nindakake ing Slurms. Kanggo siswa, kita nuduhake carane ngganti solusi jaringan ing kluster Kubernetes. Ing asas, sampeyan bisa nyoba kanggo mesthekake yen ora ana downtime ing kluster produksi. Nanging sampeyan mbokmenawa ora bakal sukses.

Lan masalah kasebut ditanggulangi kanthi gampang. Ana sertifikat ing kluster, lan sampeyan ngerti manawa sertifikat sampeyan bakal kadaluwarsa sajrone setaun. Ya, lan biasane solusi normal karo sertifikat ing kluster - kenapa kita kuwatir, kita bakal ngunggahake kluster anyar sing cedhak, supaya sing lawas dadi bosok, lan redeploy kabeh. Bener, yen dadi bosok, kita kudu njagong sedina, nanging ana kluster anyar.

Nalika sampeyan mundhakaken kluster anyar, ing wektu sing padha masang Calico tinimbang flanel.

Apa sing kudu ditindakake yen sertifikat sampeyan ditanggepi suwene satus taun lan sampeyan ora bakal nyebarake kluster kasebut? Ana sing Kube-RBAC-Proxy. Iki pembangunan banget kelangan, ngijini sampeyan kanggo nampilaké dhewe minangka wadhah sidecar kanggo sembarang pod ing kluster Kubernetes. Lan bener nambah wewenang kanggo pod iki liwat RBAC saka Kubernetes dhewe.

Ana siji masalah. Sadurunge, solusi Kube-RBAC-Proxy iki dibangun ing Prometheus operator. Nanging banjur ora ana. Saiki versi modern gumantung ing kasunyatan sing duwe kabijakan jaringan lan nutup nggunakake. Lan mulane kita kudu nulis ulang grafik kasebut sethithik. Ing kasunyatan, yen sampeyan pindhah menyang gudang iki, ana conto carane nggunakake iki minangka sidecars, lan denah kudu ditulis maneh minimally.

Ana masalah cilik liyane. Prometheus ora mung siji-sijine sing menehi metrik kanggo sapa wae. Kabeh komponen kluster Kubernetes uga bisa ngasilake metrik dhewe.

Nanging kaya sing wis dakkandhakake, yen sampeyan ora bisa ngakses kluster lan ngumpulake informasi, mula paling ora bisa gawe piala.

Dadi aku bakal cepet nuduhake rong cara carane kluster Kubernetes bisa rusak.

Sampeyan bakal ngguyu nalika aku pitutur marang kowe iki, iki rong kasus urip nyata.

Metode siji. Ngilangi sumber daya.

Ayo miwiti pod khusus liyane. Bakal duwe bagean kaya iki.

resources: 
    requests: 
        cpu: 4 
        memory: 4Gi 

Sing ngerti, panjalukan iku jumlah CPU lan memori sing dilindhungi undhang-undhang ing inang kanggo pods tartamtu karo panjalukan. Yen kita duwe host papat-inti ing kluster Kubernetes, lan papat pods CPU teka ana karo panjalukan, iku tegese ora pods liyane karo panjalukan bakal bisa teka ing host iki.

Yen aku mbukak pod kuwi, aku bakal mbukak printah:

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

Banjur ora ana wong liya sing bisa nyebar menyang kluster Kubernetes. Amarga kabeh simpul bakal kehabisan panjaluk. Lan kanthi mangkono aku bakal mungkasi kluster Kubernetes sampeyan. Yen aku nindakake iki ing wayah sore, Aku bisa mungkasi deployments kanggo dangu.

Yen kita ndeleng maneh ing dokumentasi Kubernetes, kita bakal weruh bab iki disebut Limit Range. Nyetel sumber daya kanggo obyek kluster. Sampeyan bisa nulis obyek Limit Range ing yaml, aplikasi menyang namespaces tartamtu - banjur ing namespace iki sampeyan bisa ngomong yen sampeyan duwe standar, sumber daya maksimum lan minimal kanggo pods.

Kanthi bantuan kaya ngono, kita bisa mbatesi pangguna ing ruang jeneng produk tartamtu saka tim kanthi kemampuan kanggo nunjukake macem-macem barang sing ora becik ing polong. Nanging sayangé, sanajan sampeyan ngandhani pangguna yen ora bisa miwiti pods kanthi panjaluk luwih saka siji CPU, ana prentah skala sing apik banget, utawa bisa nindakake skala liwat dasbor.

Lan iki ngendi cara nomer loro teka saka. Kita miwiti 11 pods. Sing sewelas milyar. Iki ora amarga aku teka karo nomer kuwi, nanging amarga aku weruh dhewe.

crita nyata. Sore aku arep mangkat saka kantor. Aku weruh klompok pangembang lungguh ing sudhut, frantically nindakake soko karo laptop sing. Aku nyedhaki wong lanang lan takon: "Apa sing kedadeyan karo sampeyan?"

Sakdurunge, kira-kira jam sanga sore, salah sijine pengembang wis siyap-siyap mulih. Lan aku mutusake: "Saiki aku bakal nyuda aplikasiku dadi siji." Aku menet siji, nanging Internet kalem mudhun sethitik. Dheweke menet sing siji maneh, menet sing siji, lan ngeklik Enter. Aku poked ing kabeh aku bisa. Banjur Internet urip - lan kabeh wiwit ukuran mudhun kanggo nomer iki.

Bener, crita iki ora kedadeyan ing Kubernetes, nalika iku Nomad. Iku rampung karo kasunyatan sing sawise jam kita nyoba kanggo mungkasi Nomad saka usaha terus-terusan kanggo skala, Nomad mangsuli dheweke ora bakal mungkasi scaling lan ora bakal nindakake tindakan liya. "Aku kesel, aku lunga." Lan dheweke nggulung munggah.

Alamiah, aku nyoba kanggo nindakake padha ing Kubernetes. Kubernetes ora seneng karo sewelas milyar pods, dheweke kandha: "Aku ora bisa. Ngluwihi penjaga mulut internal." Nanging 1 polong bisa.

Kanggo nanggepi siji milyar, Cube ora mundur. Dheweke pancen miwiti njongko. Proses luwih maju, luwih akeh wektu kanggo nggawe polong anyar. Nanging isih proses terus. Masalah mung yen aku bisa miwiti pods tanpa wates ing namespace, banjur sanajan tanpa panjalukan lan watesan, aku bisa miwiti akeh pods karo sawetara tugas sing karo bantuan saka tugas iki simpul bakal miwiti kanggo nambah munggah ing memori, ing CPU. Nalika aku mbukak akeh pods, informasi saka wong-wong mau kudu pindhah menyang panyimpenan, yaiku, etcd. Lan nalika akeh banget informasi sing teka ing kana, panyimpenan wiwit alon-alon bali - lan Kubernetes wiwit surem.

Lan masalah liyane ... Kaya sing sampeyan ngerteni, unsur kontrol Kubernetes ora dadi siji, nanging sawetara komponen. Utamane, ana manajer pengontrol, panjadwal, lan liya-liyane. Kabeh wong lanang iki bakal miwiti nindakake karya sing ora perlu, bodho ing wektu sing padha, sing suwe-suwe bakal entuk wektu luwih akeh. Manager controller bakal nggawe pods anyar. Penjadwal bakal nyoba golek simpul anyar kanggo dheweke. Sampeyan bisa uga bakal kehabisan simpul anyar ing kluster sampeyan. Kluster Kubernetes bakal mulai kerja luwih alon lan luwih alon.

Nanging aku mutusaké kanggo pindhah luwih. Kaya sing sampeyan ngerteni, ing Kubernetes ana sing diarani layanan. Ya, kanthi standar ing kluster sampeyan, kemungkinan layanan kasebut bisa digunakake kanthi nggunakake tabel IP.

Yen sampeyan mbukak siji milyar pods, contone, banjur nggunakake skrip kanggo meksa Kubernetis nggawe layanan anyar:

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

Ing kabeh simpul kluster, luwih akeh aturan iptables anyar bakal digawe kira-kira bebarengan. Kajaba iku, siji milyar aturan iptables bakal digawe kanggo saben layanan.

Aku mriksa kabeh iki ing sawetara ewu, nganti sepuluh. Lan masalahe wis ing ambang iki cukup masalah kanggo nindakake ssh menyang simpul. Amarga paket, ngliwati pirang-pirang rantai, mula ora kepenak banget.

Lan iki, uga, kabeh ditanggulangi kanthi bantuan Kubernetes. Ana obyek kuota Resource kuwi. Nyetel jumlah sumber daya lan obyek sing kasedhiya kanggo ruang jeneng ing kluster. Kita bisa nggawe obyek yaml ing saben namespace saka cluster Kubernetes. Nggunakake obyek iki, kita bisa ngomong yen kita duwe nomer tartamtu saka panjalukan lan watesan diparengake kanggo namespace iki, banjur kita bisa ngomong sing ing namespace iki bisa kanggo nggawe 10 layanan lan 10 pods. Lan pangembang siji paling ora bisa keselak ing wayah sore. Kubernetes bakal ngandhani: "Sampeyan ora bisa nggedhekake polong nganti jumlah kasebut, amarga sumber daya ngluwihi kuota." Wis, masalah wis rampung. Dokumentasi kene.

Siji titik masalah muncul ing babagan iki. Sampeyan rumangsa angel banget nggawe ruang jeneng ing Kubernetes. Kanggo nggawe, kita kudu nganggep akeh perkara.

Kuota sumber daya + Limit Range + RBAC
• Nggawe namespace
• Nggawe limitrange nang
• Nggawe kuota sumber daya nang
• Nggawe akun layanan kanggo CI
• Nggawe rolebinding kanggo CI lan pangguna
• Bukak opsional pod layanan sing dibutuhake

Mula, aku pengin njupuk kesempatan iki kanggo nuduhake perkembanganku. Ana sing diarani operator SDK. Iki minangka cara kanggo klompok Kubernetes kanggo nulis operator kasebut. Sampeyan bisa nulis statement nggunakake Ansible.

Kaping pisanan ditulis ing Ansible, banjur aku weruh yen ana operator SDK lan nulis maneh peran Ansible dadi operator. Pernyataan iki ngidini sampeyan nggawe obyek ing kluster Kubernetes sing diarani perintah. Ing printah, ngidini sampeyan njlèntrèhaké lingkungan kanggo printah iki ing yaml. Lan ing lingkungan tim, ngidini kita nggambarake manawa kita nyedhiyakake akeh sumber daya.

Siji cilik nggawe proses rumit iki luwih gampang.

Lan ing kesimpulan. Apa sing kudu dilakoni karo kabeh iki?
Pisanan. Kabijakan Keamanan Pod apik. Lan sanajan kasunyatane ora ana installer Kubernetes sing nggunakake nganti saiki, sampeyan isih kudu nggunakake ing klompok sampeyan.

Kabijakan Jaringan ora mung fitur sing ora perlu. Iki pancene dibutuhake ing kluster.

LimitRange/ResourceQuota - iku wektu kanggo nggunakake. Kita wiwit nggunakake iki wis suwe, lan aku yakin manawa kabeh wong nggunakake. Ternyata iki langka.

Saliyane apa sing dakkandhakake sajrone laporan kasebut, ana fitur sing ora duwe dokumen sing ngidini sampeyan nyerang kluster kasebut. dirilis bubar analisis ekstensif kerentanan Kubernetes.

Sawetara perkara sing sedhih lan nglarani. Contone, ing kahanan tartamtu, cubelets ing kluster Kubernetes bisa menehi isi direktori warlocks kanggo pangguna ora sah.

kene Ana instruksi babagan carane ngasilake kabeh sing dakkandhakake. Ana file kanthi conto produksi babagan ResourceQuota lan Kebijakan Keamanan Pod. Lan sampeyan bisa ndemek kabeh iki.

Matur nuwun kanggo kabeh.

Source: www.habr.com

Add a comment