ProHoster > Блог > Administrasi > Kubernetes: kenapa penting banget kanggo nyetel manajemen sumber daya sistem?
Kubernetes: kenapa penting banget kanggo nyetel manajemen sumber daya sistem?
Minangka aturan, ana tansah perlu kanggo nyedhiyani blumbang darmabakti sumber daya kanggo aplikasi kanggo operasi bener lan stabil. Nanging kepiye yen sawetara aplikasi mlaku kanthi daya sing padha? Kepiye carane nyedhiyakake saben sumber daya sing dibutuhake? Kepiye sampeyan bisa mbatesi konsumsi sumber daya? Kepiye cara nyebarake beban ing antarane simpul kanthi bener? Kepiye cara mesthekake mekanisme skala horisontal bisa digunakake yen beban aplikasi mundhak?
Sampeyan kudu miwiti karo apa jinis utama sumber daya ana ing sistem - iki, mesthi, wektu prosesor lan RAM. Ing k8s manifests jinis sumber daya iki diukur ing unit ing ngisor iki:
CPU - ing inti
RAM - ing bita
Kajaba iku, kanggo saben sumber bisa nyetel rong jinis syarat - njaluk и watesan. Panyuwunan - njlèntrèhaké syarat minimal kanggo sumber daya gratis saka simpul kanggo mbukak wadhah (lan pod minangka kabèh), nalika watesan nyetel watesan hard ing sumber kasedhiya kanggo wadhah.
Penting kanggo ngerti manawa manifest ora kudu nemtokake kanthi jelas loro jinis kasebut, nanging prilaku bakal kaya ing ngisor iki:
Yen mung watesan sumber daya sing ditemtokake sacara eksplisit, mula panjaluk sumber daya iki kanthi otomatis njupuk nilai sing padha karo watesan (sampeyan bisa verifikasi iki kanthi nelpon njlèntrèhaké entitas). Sing. nyatane, wadhah bakal diwatesi kanggo jumlah sing padha sumber daya mbutuhake kanggo mbukak.
Yen mung panjalukan sing ditemtokake kanthi jelas kanggo sumber daya, mula ora ana watesan ndhuwur sing disetel ing sumber iki - i.e. wadhah diwatesi mung dening sumber daya saka simpul dhewe.
Sampeyan uga bisa ngatur manajemen sumber daya ora mung ing tingkat wadhah tartamtu, nanging uga ing tingkat namespace nggunakake entitas ing ngisor iki:
LimitRange — njlèntrèhaké kabijakan watesan ing tingkat wadhah / pod ing ns lan dibutuhake kanggo njlèntrèhaké watesan standar ing wadhah / pod, uga nyegah nggawe wadhah / pods (utawa kosok balene), mbatesi jumlahe. lan nemtokake prabédan bisa ing nilai ing watesan lan panjalukan
Sumber DayaKuota — njlèntrèhaké kabijakan watesan ing umum kanggo kabeh wadhah ing ns lan digunakake, minangka aturan, kanggo mbatesi sumber daya ing antarane lingkungan (migunani nalika lingkungan ora diwatesi kanthi ketat ing tingkat simpul)
Ing ngisor iki minangka conto manifes sing nyetel watesan sumber daya:
Sing. ing kasus iki, kanggo mbukak wadhah karo nginx, sampeyan kudu paling 1G free RAM lan 0.2 CPU ing simpul, nalika paling wadhah bisa nganggo 0.2 CPU lan kabeh RAM kasedhiya ing simpul.
Sing. jumlah kabeh kontaner request ing standar ns ora bisa ngluwihi 300m kanggo CPU lan 1G kanggo OP, lan jumlah kabeh watesan 700m kanggo CPU lan 2G kanggo OP.
Sing. ing namespace standar kanggo kabeh kontaner, request bakal disetel kanggo 100m kanggo CPU lan 1G kanggo OP, watesan - 1 CPU lan 2G. Ing wektu sing padha, watesan uga disetel ing nilai sing bisa dijaluk / watesan kanggo CPU (50m < x < 2) lan RAM (500M < x < 4G).
Sing. kanggo saben pod ing ns standar bakal ana watesan 4 vCPU lan 1G.
Saiki aku arep menehi pitutur marang kowe apa keuntungan nyetel watesan iki bisa menehi kita.
Mekanisme imbangan beban antarane simpul
Sing ngerti, komponen k8s tanggung jawab kanggo distribusi pods antarane kelenjar, kayata jadwal, sing dianggo miturut algoritma tartamtu. Algoritma iki ngliwati rong tahap nalika milih simpul optimal kanggo diluncurake:
nyaring
wiwit
Sing. miturut kabijakan sing diterangake, node wiwitane dipilih sing bisa diluncurake pod adhedhasar set predikat (kalebu mriksa apa simpul duwe sumber daya sing cukup kanggo mbukak pod - PodFitsResources), banjur kanggo saben simpul kasebut, miturut prioritas poin dianugerahi (kalebu, luwih akeh sumber daya gratis sing diduweni simpul, luwih akeh poin sing ditugasake - LeastResourceAllocation / LeastRequestedPriority / BalancedResourceAllocation) lan pod diluncurake ing simpul kanthi poin paling akeh (yen sawetara simpul marem kondisi iki bebarengan, banjur dipilih kanthi acak).
Ing wektu sing padha, sampeyan kudu ngerti manawa panjadwal, nalika ngevaluasi sumber daya sing kasedhiya saka simpul, dipandu dening data sing disimpen ing etcd - i.e. kanggo jumlah dijaluk / sumber watesan saben polong mlaku ing simpul iki, nanging ora kanggo konsumsi sumber nyata. Informasi iki bisa dipikolehi saka output printah kubectl describe node $NODE, contone:
Ing kene kita ndeleng kabeh pod sing mlaku ing simpul tartamtu, uga sumber daya sing dijaluk saben pod. Lan ing kene kaya apa log panjadwal nalika pod cronjob-cron-events-1573793820-xt6q9 diluncurake (informasi iki bakal katon ing log panjadwal nalika sampeyan nyetel level logging kaping 10 ing argumen perintah wiwitan -v=10):
log
I1115 07:57:21.637791 1 scheduling_queue.go:908] About to try and schedule pod nxs-stage/cronjob-cron-events-1573793820-xt6q9
I1115 07:57:21.637804 1 scheduler.go:453] Attempting to schedule pod: nxs-stage/cronjob-cron-events-1573793820-xt6q9
I1115 07:57:21.638285 1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s5 is allowed, Node is running only 16 out of 110 Pods.
I1115 07:57:21.638300 1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s6 is allowed, Node is running only 20 out of 110 Pods.
I1115 07:57:21.638322 1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s3 is allowed, Node is running only 20 out of 110 Pods.
I1115 07:57:21.638322 1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s4 is allowed, Node is running only 17 out of 110 Pods.
I1115 07:57:21.638334 1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s10 is allowed, Node is running only 16 out of 110 Pods.
I1115 07:57:21.638365 1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s12 is allowed, Node is running only 9 out of 110 Pods.
I1115 07:57:21.638334 1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s11 is allowed, Node is running only 11 out of 110 Pods.
I1115 07:57:21.638385 1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s1 is allowed, Node is running only 19 out of 110 Pods.
I1115 07:57:21.638402 1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s2 is allowed, Node is running only 21 out of 110 Pods.
I1115 07:57:21.638383 1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s9 is allowed, Node is running only 16 out of 110 Pods.
I1115 07:57:21.638335 1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s8 is allowed, Node is running only 18 out of 110 Pods.
I1115 07:57:21.638408 1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s13 is allowed, Node is running only 8 out of 110 Pods.
I1115 07:57:21.638478 1 predicates.go:1369] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s10 is allowed, existing pods anti-affinity terms satisfied.
I1115 07:57:21.638505 1 predicates.go:1369] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s8 is allowed, existing pods anti-affinity terms satisfied.
I1115 07:57:21.638577 1 predicates.go:1369] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s9 is allowed, existing pods anti-affinity terms satisfied.
I1115 07:57:21.638583 1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s7 is allowed, Node is running only 25 out of 110 Pods.
I1115 07:57:21.638932 1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s10: BalancedResourceAllocation, capacity 39900 millicores 66620178432 memory bytes, total request 2343 millicores 9640186880 memory bytes, score 9
I1115 07:57:21.638946 1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s10: LeastResourceAllocation, capacity 39900 millicores 66620178432 memory bytes, total request 2343 millicores 9640186880 memory bytes, score 8
I1115 07:57:21.638961 1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s9: BalancedResourceAllocation, capacity 39900 millicores 66620170240 memory bytes, total request 4107 millicores 11307422720 memory bytes, score 9
I1115 07:57:21.638971 1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s8: BalancedResourceAllocation, capacity 39900 millicores 66620178432 memory bytes, total request 5847 millicores 24333637120 memory bytes, score 7
I1115 07:57:21.638975 1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s9: LeastResourceAllocation, capacity 39900 millicores 66620170240 memory bytes, total request 4107 millicores 11307422720 memory bytes, score 8
I1115 07:57:21.638990 1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s8: LeastResourceAllocation, capacity 39900 millicores 66620178432 memory bytes, total request 5847 millicores 24333637120 memory bytes, score 7
I1115 07:57:21.639022 1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s10: TaintTolerationPriority, Score: (10)
I1115 07:57:21.639030 1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s8: TaintTolerationPriority, Score: (10)
I1115 07:57:21.639034 1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s9: TaintTolerationPriority, Score: (10)
I1115 07:57:21.639041 1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s10: NodeAffinityPriority, Score: (0)
I1115 07:57:21.639053 1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s8: NodeAffinityPriority, Score: (0)
I1115 07:57:21.639059 1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s9: NodeAffinityPriority, Score: (0)
I1115 07:57:21.639061 1 interpod_affinity.go:237] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s10: InterPodAffinityPriority, Score: (0)
I1115 07:57:21.639063 1 selector_spreading.go:146] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s10: SelectorSpreadPriority, Score: (10)
I1115 07:57:21.639073 1 interpod_affinity.go:237] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s8: InterPodAffinityPriority, Score: (0)
I1115 07:57:21.639077 1 selector_spreading.go:146] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s8: SelectorSpreadPriority, Score: (10)
I1115 07:57:21.639085 1 interpod_affinity.go:237] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s9: InterPodAffinityPriority, Score: (0)
I1115 07:57:21.639088 1 selector_spreading.go:146] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s9: SelectorSpreadPriority, Score: (10)
I1115 07:57:21.639103 1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s10: SelectorSpreadPriority, Score: (10)
I1115 07:57:21.639109 1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s8: SelectorSpreadPriority, Score: (10)
I1115 07:57:21.639114 1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s9: SelectorSpreadPriority, Score: (10)
I1115 07:57:21.639127 1 generic_scheduler.go:781] Host nxs-k8s-s10 => Score 100037
I1115 07:57:21.639150 1 generic_scheduler.go:781] Host nxs-k8s-s8 => Score 100034
I1115 07:57:21.639154 1 generic_scheduler.go:781] Host nxs-k8s-s9 => Score 100037
I1115 07:57:21.639267 1 scheduler_binder.go:269] AssumePodVolumes for pod "nxs-stage/cronjob-cron-events-1573793820-xt6q9", node "nxs-k8s-s10"
I1115 07:57:21.639286 1 scheduler_binder.go:279] AssumePodVolumes for pod "nxs-stage/cronjob-cron-events-1573793820-xt6q9", node "nxs-k8s-s10": all PVCs bound and nothing to do
I1115 07:57:21.639333 1 factory.go:733] Attempting to bind cronjob-cron-events-1573793820-xt6q9 to nxs-k8s-s10
Kene kita waca sing pisanan panjadwal nyaring lan ngasilake dhaptar 3 kelenjar sing bisa dibukak (nxs-k8s-s8, nxs-k8s-s9, nxs-k8s-s10). Banjur ngetung skor adhedhasar sawetara paramèter (kalebu BalancedResourceAllocation, LeastResourceAllocation) kanggo saben kelenjar iki kanggo nemtokake simpul paling cocok. Pungkasane, polong dijadwalake ing simpul kanthi jumlah titik paling dhuwur (ing kene loro simpul bebarengan duwe jumlah poin sing padha 100037, mula dipilih kanthi acak - nxs-k8s-s10).
kesimpulan: yen simpul mbukak pods sing ora watesan sing disetel, banjur kanggo k8s (saka sudut pandang saka konsumsi sumber) iki bakal padha karo kaya-kaya ora ana pods ing simpul iki ing kabeh. Mulane, yen sampeyan, kanthi kondisional, duwe polong kanthi proses rakus (contone, wowza) lan ora ana watesan sing disetel, mula kahanan bisa uga muncul nalika polong iki bener-bener mangan kabeh sumber daya simpul kasebut, nanging kanggo k8s simpul iki. dianggep unloaded lan bakal dianugerahi nomer padha TCTerms nalika peringkat (tepatan ing TCTerms pambiji sumber kasedhiya) minangka simpul sing ora duwe polong bisa digunakake, kang pungkasanipun bisa mimpin kanggo distribusi ora rata saka mbukak antarane kelenjar.
Pengusiran Pod
Kaya sing sampeyan ngerteni, saben pod diwenehi salah siji saka 3 kelas QoS:
dijamin - ditugasake nalika saben wadhah ing pod panjalukan lan watesan ditemtokake kanggo memori lan CPU, lan nilai kasebut kudu cocog
bledosan - paling ora siji wadhah ing pod duwe panjalukan lan watesan, kanthi panyuwunan < watesan
paling gaweyan - nalika ora siji wadhah ing polong sumber daya winates
Ing wektu sing padha, nalika simpul ngalami kekurangan sumber daya (disk, memori), kubelet wiwit pangkat lan ngusir polong miturut algoritma tartamtu sing njupuk prioritas polong lan kelas QoS. Contone, yen kita ngomong babagan RAM, banjur adhedhasar kelas QoS, poin dianugerahi miturut prinsip ing ngisor iki:
Sing. karo prioritas padha, kubelet pisanan bakal ngusir pods karo paling efforts kelas QoS saka simpul.
kesimpulan: yen sampeyan pengin nyuda kemungkinan polong sing dikarepake diusir saka simpul yen ana kekurangan sumber daya, banjur bebarengan karo prioritas, sampeyan uga kudu ngurus nyetel panyuwunan / watesan kasebut.
Mekanisme autoscaling horisontal saka pod aplikasi (HPA)
Nalika tugas kanggo nambah lan nyuda jumlah pods kanthi otomatis gumantung saka panggunaan sumber daya (sistem - CPU / RAM utawa pangguna - rps), entitas k8s kayata HPA (Horizontal Pod Autoscaler). Algoritma kasebut minangka nderek:
Wacan saiki saka sumber sing diamati ditemtokake (currentMetricValue)
Nilai sing dikarepake kanggo sumber daya ditemtokake (desiredMetricValue), sing kanggo sumber daya sistem disetel nggunakake panyuwunan
Jumlah replika saiki ditemtokake (Replika saiki)
Rumus ing ngisor iki ngitung jumlah replika sing dikarepake (Replika sing dikarepake)
wantedReplicas = [Replika saiki * (currentMetricValue / desiredMetricValue )]
Ing kasus iki, skala ora bakal kedadeyan nalika koefisien (currentMetricValue / desiredMetricValue) cedhak karo 1 (ing kasus iki, kita bisa nyetel kesalahan sing diidini dhewe; kanthi standar yaiku 0.1).
Ayo goleki cara kerjane hpa nggunakake conto aplikasi tes aplikasi (diterangake minangka Deployment), ing ngendi perlu ngganti jumlah replika gumantung saka konsumsi CPU:
Sing. kita weruh yen pod aplikasi wiwitane diluncurake ing rong kedadeyan, sing saben ngemot rong wadhah nginx lan nginx-eksportir, sing saben-saben wis ditemtokake. njaluk kanggo CPU.
Sing. Kita nggawe hpa sing bakal ngawasi tes aplikasi Deployment lan nyetel jumlah pod karo aplikasi adhedhasar indikator cpu (kita ngarepake yen pod kudu nganggo 30% saka CPU sing dijaluk), kanthi jumlah replika sing ana. kisaran 2-10.
Saiki, ayo goleki mekanisme operasi hpa yen kita ngetrapake beban ing salah sawijining perapian:
# kubectl top pod
NAME CPU(cores) MEMORY(bytes)
app-test-78559f8f44-pgs58 101m 243Mi
app-test-78559f8f44-cj4jz 4m 240Mi
Ing total kita duwe ing ngisor iki:
Nilai sing dikarepake (desiredMetricValue) - miturut setelan hpa, kita duwe 30%
Nilai saiki (currentMetricValue) - kanggo pitungan, controller-manager ngetung nilai rata-rata konsumsi sumber daya ing%, i.e. conditionally nindakake ing ngisor iki:
Nampa nilai mutlak metrik pod saka server metrik, i.e. 101m lan 4m
Ngetung nilai absolut rata-rata, i.e. (101m + 4m) / 2 = 53m
Entuk nilai mutlak kanggo konsumsi sumber daya sing dikarepake (kanggo iki, panjaluk kabeh wadhah diringkes) 60m + 30m = 90m
Ngetung persentasi rata-rata saka konsumsi CPU relatif kanggo pod request, i.e. 53m / 90m * 100% = 59%
Saiki kita duwe kabeh sing perlu kanggo nemtokake manawa kita kudu ngganti jumlah replika, kanggo nindakake iki, kita ngetung koefisien:
ratio = 59% / 30% = 1.96
Sing. jumlah replika kudu ditambah ~2 kaping lan gunggunge [2 * 1.96] = 4.
Kesimpulan: Kaya sing sampeyan ngerteni, supaya mekanisme iki bisa digunakake, syarat sing dibutuhake yaiku anané panjaluk kanggo kabeh wadhah ing pod sing diamati.
Mekanisme autoscaling horisontal saka node (Cluster Autoscaler)
Kanggo netralake pengaruh negatif ing sistem sajrone beban mundhak, ora cukup duwe hpa sing dikonfigurasi. Contone, miturut setelan ing manajer pengontrol hpa, mutusake manawa jumlah replika kudu ditambah kaping 2, nanging simpul ora duwe sumber daya gratis kanggo mbukak jumlah pod kasebut (yaiku simpul ora bisa nyedhiyakake sumber daya sing dijaluk menyang pod requests) lan pods iki ngalih menyang negara Pending.
Ing kasus iki, yen panyedhiya duwe IaaS/PaaS sing cocog (contone, GKE/GCE, AKS, EKS, lsp.), alat kaya Node Autoscaler. Ngidini sampeyan nyetel jumlah maksimal lan minimal simpul ing kluster lan kanthi otomatis nyetel jumlah simpul saiki (kanthi nelpon API panyedhiya maya kanggo pesen / mbusak simpul) nalika ana kekurangan sumber daya ing kluster lan pods. ora bisa dijadwal (ana ing negara Pending).
Kesimpulan: Kanggo bisa autoscale kelenjar, iku perlu kanggo nyetel panjalukan ing kontaner pod supaya k8s bener bisa netepke mbukak ing kelenjar lan patut laporan sing ora ana sumber daya ing kluster kanggo miwiti pod sabanjuré.
kesimpulan
Perlu dicathet yen nyetel watesan sumber daya wadah ora dadi syarat supaya aplikasi bisa sukses, nanging luwih becik ditindakake amarga alasan ing ngisor iki:
Kanggo operasi luwih akurat saka panjadwal ing syarat-syarat mbukak wawas antarane k8s kelenjar
Kanggo nyuda kemungkinan kedadeyan "pengusiran pod".
Kanggo autoscaling horisontal polong aplikasi (HPA) bisa digunakake
Kanggo autoscaling horisontal saka node (Cluster Autoscaling) kanggo panyedhiya maya