Чун қоида, ҳамеша зарурати таъмини захираҳои ҷудошуда ба барнома барои кори дуруст ва устувори он вуҷуд дорад. Аммо чӣ мешавад, агар якчанд барнома бо як қудрат кор кунанд? Хар кадоми онхоро бо минимуми ресурсхои зарурй чй тавр таъмин кардан мумкин аст? Чӣ тавр шумо метавонед истеъмоли захираҳоро маҳдуд кунед? Чӣ тавр дуруст тақсим кардани сарборӣ дар байни гиреҳҳо? Чӣ тавр таъмин кардани кори механизми миқёси уфуқӣ ҳангоми зиёд шудани сарбории барнома?
Шумо бояд аз он оғоз кунед, ки кадом намудҳои асосии захираҳо дар система мавҷуданд - ин, албатта, вақти протсессор ва RAM мебошад. Дар зуҳури k8s ин намуди захираҳо дар воҳидҳои зерин чен карда мешаванд:
- CPU - дар ядроҳо
- RAM - дар байт
Ғайр аз он, барои ҳар як захира ду намуди талаботро муқаррар кардан мумкин аст - дархостҳо и маҳдудиятҳо. Дархостҳо - талаботҳои ҳадди ақалро барои захираҳои ройгони гиреҳ барои идора кардани контейнер тавсиф мекунад (ва дар маҷмӯъ pod), дар ҳоле ки маҳдудиятҳо маҳдудияти сахти захираҳои барои контейнерро муқаррар мекунад.
Фаҳмидани он муҳим аст, ки манифест набояд ҳарду намудро ба таври возеҳ муайян кунад, аммо рафтор чунин хоҳад буд:
- Агар танҳо маҳдудиятҳои манбаъ ба таври возеҳ нишон дода шуда бошанд, пас дархостҳо барои ин манбаъ ба таври худкор арзиши баробар ба маҳдудиятҳо мегиранд (шумо метавонед инро тавассути занг задан ба объектҳои тавсифшуда тафтиш кунед). Онхое. дар асл, контейнер бо ҳамон миқдори захираҳое, ки барои кор кардан лозим аст, маҳдуд карда мешавад.
- Агар танҳо дархостҳо ба таври возеҳ барои манба нишон дода шуда бошанд, пас дар ин манбаъ маҳдудиятҳои болоӣ муқаррар карда намешаванд - яъне. контейнер танҳо бо захираҳои худи гиреҳ маҳдуд аст.
Идоракунии захираҳоро на танҳо дар сатҳи контейнери мушаххас, балки дар сатҳи фазои номҳо бо истифода аз объектҳои зерин низ танзим кардан мумкин аст:
- Маҳдудият — сиёсати маҳдудкуниро дар сатҳи контейнер/под дар ns тавсиф мекунад ва барои тавсифи маҳдудиятҳои пешфарз дар контейнер/под, инчунин пешгирии эҷоди контейнер/подҳои баръало фарбеҳ (ё баръакс), маҳдуд кардани шумораи онҳо зарур аст. ва фарқияти эҳтимолии арзишҳоро дар маҳдудиятҳо ва дархостҳо муайян кунед
- Квотаҳои захиравӣ — сиёсати маҳдудкуниро дар маҷмӯъ барои ҳама контейнерҳо дар ns тавсиф кунед ва чун қоида, барои ҷудо кардани захираҳо дар байни муҳитҳо истифода мешавад (вақте ки муҳитҳо дар сатҳи гиреҳ ба таври қатъӣ ҷудо карда нашудаанд, муфид аст)
Дар зер намунаҳои манифестҳо мавҷуданд, ки маҳдудиятҳои захираҳоро муқаррар мекунанд:
-
Дар сатҳи мушаххаси контейнер:
containers: - name: app-nginx image: nginx resources: requests: memory: 1Gi limits: cpu: 200m
Онхое. дар ин ҳолат, барои кор кардани контейнер бо nginx, ба шумо ҳадди аққал 1G RAM-и ройгон ва 0.2 CPU дар гиреҳ лозим аст, дар ҳоле ки ҳадди аксар контейнер метавонад 0.2 CPU ва ҳама RAM-и дастрасро дар гиреҳ истеъмол кунад.
-
Дар сатҳи бутуни ns:
apiVersion: v1 kind: ResourceQuota metadata: name: nxs-test spec: hard: requests.cpu: 300m requests.memory: 1Gi limits.cpu: 700m limits.memory: 2Gi
Онхое. маблағи ҳамаи контейнерҳои дархост дар ns пешфарз наметавонад аз 300m барои CPU ва 1G барои OP зиёд бошад ва маблағи ҳамаи маҳдудият 700m барои CPU ва 2G барои OP аст.
-
Маҳдудиятҳои пешфарз барои контейнерҳо дар ns:
apiVersion: v1 kind: LimitRange metadata: name: nxs-limit-per-container spec: limits: - type: Container defaultRequest: cpu: 100m memory: 1Gi default: cpu: 1 memory: 2Gi min: cpu: 50m memory: 500Mi max: cpu: 2 memory: 4Gi
Онхое. дар фазои номи пешфарз барои ҳама контейнерҳо, дархост ба 100м барои CPU ва 1G барои OP муқаррар карда мешавад, маҳдудият - 1 CPU ва 2G. Дар айни замон, маҳдудият инчунин дар арзишҳои имконпазир дар дархост/лимити CPU (50m <x<2) ва RAM (500M <x <4G) муқаррар карда мешавад.
-
Маҳдудиятҳои сатҳи pod:
apiVersion: v1 kind: LimitRange metadata: name: nxs-limit-pod spec: limits: - type: Pod max: cpu: 4 memory: 1Gi
Онхое. барои ҳар як pod дар ns пешфарз маҳдудияти 4 vCPU ва 1G хоҳад буд.
Ҳоло ман мехоҳам ба шумо бигӯям, ки муқаррар кардани ин маҳдудиятҳо ба мо чӣ бартарият дода метавонад.
Механизми мувозинати сарборӣ байни гиреҳҳо
Тавре ки шумо медонед, ҷузъҳои k8s барои тақсимоти поддонҳо дар байни гиреҳҳо, ба монанди планкаш, ки аз руи алгоритми муайян кор мекунад. Ин алгоритм ҳангоми интихоби гиреҳи оптималии оғозёбӣ аз ду марҳила мегузарад:
- полиши
- Ранг
Онхое. мувофиқи сиёсати тавсифшуда, гиреҳҳо дар аввал интихоб карда мешаванд, ки дар онҳо подкастро дар асоси маҷмӯа оғоз кардан мумкин аст предикатхо (аз ҷумла тафтиш кардани он, ки оё гиреҳ дорои захираҳои кофӣ барои кор кардани pod - PodFitsResources) ва сипас барои ҳар як аз ин гиреҳҳо, мувофиқи афзалиятҳо холҳо дода мешаванд (аз он ҷумла, гиреҳ ҳар қадар захираҳои озод дошта бошад, ҳамон қадар ба он холҳо дода мешавад - LeastResourceAllocation/LeastRequestedPriority/BalancedResourceAllocation) ва подкаст дар гиреҳе, ки холҳои зиёд дорад (агар якчанд гиреҳ якбора ин шартро қонеъ гардонад) оғоз мешавад. як тасодуфӣ интихоб карда мешавад).
Дар айни замон, шумо бояд фаҳмед, ки нақшакаш ҳангоми арзёбии захираҳои мавҷудаи гиреҳ маълумотеро, ки дар etcd нигоҳ дошта мешавад, роҳнамоӣ мекунад - яъне. барои маблағи дархостшуда/маҳдудии манбаи ҳар як подкӯҳе, ки дар ин гиреҳ кор мекунад, аммо на барои истеъмоли воқеии захираҳо. Ин маълумотро аз баромади фармон гирифтан мумкин аст kubectl describe node $NODE
, масалан:
# kubectl describe nodes nxs-k8s-s1
..
Non-terminated Pods: (9 in total)
Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits AGE
--------- ---- ------------ ---------- --------------- ------------- ---
ingress-nginx nginx-ingress-controller-754b85bf44-qkt2t 0 (0%) 0 (0%) 0 (0%) 0 (0%) 233d
kube-system kube-flannel-26bl4 150m (0%) 300m (1%) 64M (0%) 500M (1%) 233d
kube-system kube-proxy-exporter-cb629 0 (0%) 0 (0%) 0 (0%) 0 (0%) 233d
kube-system kube-proxy-x9fsc 0 (0%) 0 (0%) 0 (0%) 0 (0%) 233d
kube-system nginx-proxy-k8s-worker-s1 25m (0%) 300m (1%) 32M (0%) 512M (1%) 233d
nxs-monitoring alertmanager-main-1 100m (0%) 100m (0%) 425Mi (1%) 25Mi (0%) 233d
nxs-logging filebeat-lmsmp 100m (0%) 0 (0%) 100Mi (0%) 200Mi (0%) 233d
nxs-monitoring node-exporter-v4gdq 112m (0%) 122m (0%) 200Mi (0%) 220Mi (0%) 233d
Allocated resources:
(Total limits may be over 100 percent, i.e., overcommitted.)
Resource Requests Limits
-------- -------- ------
cpu 487m (3%) 822m (5%)
memory 15856217600 (2%) 749976320 (3%)
ephemeral-storage 0 (0%) 0 (0%)
Дар ин ҷо мо мебинем, ки ҳамаи подкҳо дар гиреҳи мушаххас кор мекунанд ва инчунин захираҳое, ки ҳар як подк дархост мекунад. Ва ин аст, ки гузоришҳои нақшакаш ҳангоми ба кор андохтани pod cronjob-cron-events-1573793820-xt6q9 чӣ гуна ба назар мерасанд (ин маълумот дар сабти банақшагир ҳангоми муқаррар кардани сатҳи 10-уми сабти ном дар аргументҳои фармони оғозёбӣ -v=10 пайдо мешавад):
сабт
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
Дар ин ҷо мо мебинем, ки нақшасоз дар аввал рӯйхати 3 гиреҳро филтр мекунад ва тавлид мекунад, ки дар онҳо онро оғоз кардан мумкин аст (nxs-k8s-s8, nxs-k8s-s9, nxs-k8s-s10). Сипас он холҳоро дар асоси якчанд параметрҳо (аз ҷумла BalancedResourceAllocation, LeastResourceAllocation) барои ҳар яке аз ин гиреҳҳо бо мақсади муайян кардани гиреҳи мувофиқтарин ҳисоб мекунад. Дар ниҳоят, поддон дар гиреҳ бо шумораи бештари нуқтаҳо ба нақша гирифта шудааст (дар ин ҷо ду гиреҳ якбора шумораи якхелаи нуқтаҳои 100037 доранд, бинобар ин як тасодуфӣ интихоб карда мешавад - nxs-k8s-s10).
хулоса: агар гиреҳ подкҳоро иҷро кунад, ки барои онҳо ҳеҷ гуна маҳдудият муқаррар карда нашудааст, пас барои k8s (аз нуқтаи назари истеъмоли захираҳо) ин ба он баробар хоҳад буд, ки гӯё дар ин гиреҳ чунин подкҳо умуман вуҷуд надоштанд. Аз ин рӯ, агар шумо, шартан, як паҳлӯи дорои раванди пурхӯрӣ (масалан, wowza) дошта бошед ва барои он ҳеҷ гуна маҳдудият муқаррар карда нашуда бошад, пас вазъият метавонад ба миён ояд, ки ин поддон воқеан тамоми захираҳои гиреҳро хӯрд, аммо барои k8s ин гиреҳ холӣ ҳисобида мешавад ва ба он ҳангоми рейтинг (махз аз рӯи холҳои баҳодиҳии захираҳои мавҷуда) ҳамчун гиреҳе, ки қуттиҳои корӣ надоранд, ҳамон миқдор хол дода мешавад, ки дар ниҳоят метавонад ба тақсимоти нобаробари сарборӣ дар байни гиреҳҳо оварда расонад.
ихроҷи Под
Тавре ки шумо медонед, ба ҳар як pod яке аз 3 синфи QoS таъин карда мешавад:
- кафолат дода шудааст - вақте таъин карда мешавад, ки барои ҳар як контейнер дар подкаст дархост ва маҳдудият барои хотира ва CPU муайян карда мешавад ва ин арзишҳо бояд мувофиқат кунанд
- тарканда — акаллан як контейнер дар подшох дархост ва лимит дорад, бо дархост < лимити
- беҳтарин кӯшишҳои — вакте ки ягон контейнер дар подшох захираи махдуд нест
Ҳамзамон, вақте ки гиреҳ норасоии захираҳоро (диск, хотира) эҳсос мекунад, kubelet ба гурӯҳбандӣ ва хориҷ кардани поддонҳо мувофиқи алгоритми мушаххасе оғоз мекунад, ки афзалияти подк ва синфи QoS-и онро ба назар мегирад. Масалан, агар мо дар бораи RAM сухан ронем, пас дар асоси синфи QoS, холҳо мувофиқи принсипи зерин дода мешаванд:
- Кафолат дода мешавад: -998
- Беҳтарин кӯшиш: 1000
- Таркибшаванда: дақ (макс (2, 1000 - (1000 * memoryRequestBytes) / machineMemoryCapacityBytes), 999)
Онхое. бо ҳамон афзалият, кубелет аввал бо кӯшиши беҳтарин синфи QoS аз гиреҳ қубурҳоро хориҷ мекунад.
хулоса: агар шумо хоҳед, ки эҳтимолияти аз гиреҳ хориҷ шудани pod-и дилхоҳро дар сурати набудани захираҳо дар он кам кунед, пас дар баробари афзалият, шумо бояд дар бораи муқаррар кардани дархост/лимити он низ ғамхорӣ кунед.
Механизми автоматизатсияи уфуқии қуттиҳои барнома (HPA)
Ҳангоме ки вазифа вобаста ба истифодаи захираҳо (система - CPU/RAM ё корбар - rps) ба таври худкор зиёд ва кам кардани шумораи подкҳо аст, ба монанди объекти k8s, ба монанди HPA (Уфуқӣ Pod Autoscaler). Алгоритми он чунин аст:
- Хонишҳои ҷории манбаи мушоҳидашуда муайян карда мешаванд (currentMetricValue)
- Арзишҳои дилхоҳ барои захира муайян карда мешаванд (desiredMetricValue), ки барои захираҳои система бо истифода аз дархост муқаррар карда мешаванд
- Шумораи ҷории репликаҳо муайян карда мешавад (currentReplicas)
- Формулаи зерин шумораи дилхоҳи такрорҳоро ҳисоб мекунад (desiredReplicas)
wantdReplicas = [CurrentReplicas * (currentMetricValue / desiredMetricValue)]
Дар ин ҳолат, вақте ки коэффитсиент (currentMetricValue / desiredMetricValue) ба 1 наздик аст, миқёскунӣ рух намедиҳад (дар ин ҳолат мо метавонем хатои иҷозатдодашударо худамон муқаррар кунем; бо нобаёнӣ он 0.1 аст).
Биёед бубинем, ки hpa бо истифода аз мисоли барномаи санҷиши барнома (бо истинод тавсиф шудааст) чӣ гуна кор мекунад, ки дар он ҷо вобаста ба истеъмоли CPU шумораи репликаҳоро тағир додан лозим аст:
-
Манифести ариза
kind: Deployment apiVersion: apps/v1beta2 metadata: name: app-test spec: selector: matchLabels: app: app-test replicas: 2 template: metadata: labels: app: app-test spec: containers: - name: nginx image: registry.nixys.ru/generic-images/nginx imagePullPolicy: Always resources: requests: cpu: 60m ports: - name: http containerPort: 80 - name: nginx-exporter image: nginx/nginx-prometheus-exporter resources: requests: cpu: 30m ports: - name: nginx-exporter containerPort: 9113 args: - -nginx.scrape-uri - http://127.0.0.1:80/nginx-status
Онхое. мо мебинем, ки подшипникҳои барнома дар аввал дар ду маврид оғоз мешаванд, ки ҳар яки онҳо ду контейнери nginx ва nginx-exporter доранд, ки барои ҳар кадоми онҳо як контейнер муайян карда шудааст. дархостҳо барои CPU.
-
Манифести HPA
apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: app-test-hpa spec: maxReplicas: 10 minReplicas: 2 scaleTargetRef: apiVersion: extensions/v1beta1 kind: Deployment name: app-test metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 30
Онхое. Мо hpa-ро офаридаем, ки санҷиши барномаи Deployment-ро назорат мекунад ва шумораи подкҳоро бо барнома дар асоси нишондиҳандаи cpu танзим мекунад (мо интизорем, ки pod бояд 30% CPU-и дархосткардаашро истеъмол кунад), бо шумораи репликаҳо дар диапазони 2-10.
Акнун биёед механизми кори hpa-ро дида бароем, агар ба яке аз оташдонҳо бор гузорем:
# kubectl top pod NAME CPU(cores) MEMORY(bytes) app-test-78559f8f44-pgs58 101m 243Mi app-test-78559f8f44-cj4jz 4m 240Mi
Дар маҷмӯъ мо инҳоро дорем:
- Арзиши дилхоҳ (desiredMetricValue) - мувофиқи танзимоти hpa, мо 30% дорем
- Арзиши ҷорӣ (currentMetricValue) - барои ҳисоб, контроллер-менеҷер арзиши миёнаи истеъмоли захираҳоро бо % ҳисоб мекунад, яъне. шартан зеринро иҷро мекунад:
- Аз сервери метрикӣ арзишҳои мутлақи ченакҳои подшоиро мегирад, яъне. 101м ва 4м
- Қимати миёнаи мутлақро ҳисоб мекунад, яъне. (101м + 4м) / 2 = 53м
- Арзиши мутлақи истеъмоли захираҳои дилхоҳро мегирад (барои ин дархостҳои ҳама контейнерҳо ҷамъбаст карда мешаванд) 60м + 30м = 90м
- Ҳисоб кардани фоизи миёнаи истеъмоли CPU нисбат ба pod дархост, яъне. 53м / 90м * 100% = 59%
Ҳоло мо ҳама чизро дорем, то муайян кунем, ки оё мо бояд шумораи репликаҳоро тағир диҳем; барои ин, мо коэффисиентро ҳисоб мекунем:
ratio = 59% / 30% = 1.96
Онхое. шумораи репликаҳо бояд ~ 2 маротиба зиёд карда шаванд ва ба [2 * 1.96] = 4 баробар шаванд.
Хулоса: Тавре ки шумо мебинед, барои кор кардани ин механизм, шарти зарурӣ мавҷудияти дархостҳо барои ҳама контейнерҳо дар паҳлӯи мушоҳидашуда мебошад.
Механизми автоматизатсияи уфуқии гиреҳҳо (Cluster Autoscaler)
Барои безарар кардани таъсири манфӣ ба система ҳангоми афзоиши сарборӣ, доштани hpa танзимшуда кофӣ нест. Масалан, мувофиқи танзимот дар менеҷери контроллери hpa, он қарор мекунад, ки шумораи репликаҳоро 2 маротиба зиёд кардан лозим аст, аммо гиреҳҳо барои иҷро кардани чунин шумораи подкҳо захираҳои ройгон надоранд (яъне гиреҳ наметавонад захираҳои дархостшуда ба поди дархостҳо) ва ин подкладҳо ба ҳолати интизорӣ мегузаранд.
Дар ин ҳолат, агар провайдер дорои IaaS/PaaS мувофиқ бошад (масалан, GKE/GCE, AKS, EKS ва ғайра), асбобе монанди Autoscaler гиреҳ. Он ба шумо имкон медиҳад, ки шумораи ҳадди аксар ва ҳадди ақали гиреҳҳоро дар кластер муқаррар кунед ва ба таври худкор шумораи ҷории гиреҳҳоро танзим кунед (тавассути занг ба провайдери абрии API барои фармоиш/нест кардани гиреҳ) ҳангоми набудани захираҳо дар кластер ва поддонҳо ба нақша гирифтан мумкин нест (дар ҳолати интизорӣ ҳастанд).
Хулоса: Барои қобилияти автоматии гиреҳҳо, зарур аст, ки дархостҳоро дар контейнерҳои подкӣ насб кунед, то k8s сарбориро ба гиреҳҳо дуруст арзёбӣ кунанд ва мувофиқан гузориш диҳанд, ки дар кластер захираҳо барои оғоз кардани паҳлӯи навбатӣ вуҷуд надоранд.
хулоса
Бояд қайд кард, ки муқаррар кардани маҳдудияти захираҳои контейнерӣ барои бомуваффақият кор кардани барнома шарт нест, аммо бо сабабҳои зерин ин корро кардан беҳтар аст:
- Барои кори дақиқтари нақшакаш дар робита бо мувозинати сарбории байни гиреҳҳои k8s
- Барои кам кардани эҳтимолияти ба амал омадани ҳодисаи "кӯчонидан"
- Барои ба кор даровардани автоматии уфуқӣ қуттиҳои барнома (HPA).
- Барои автоматизатсияи уфуқии гиреҳҳо (Cluster Autoscaling) барои провайдерҳои абр
Инчунин мақолаҳои дигарро дар блоги мо хонед:
Tekton Pipeline - қубурҳои модарии Кубернетес Сохтани модулҳои динамикӣ барои Nginx Муҳоҷират аз ClickHouse бе иҷозат ба ClickHouse бо иҷозат ба чӣ оварда расонд? Фаҳмидани бастаи контекстӣ дар Голанг Се ҳиллаи оддӣ барои кам кардани тасвирҳои Docker Нусхаи захиравии шумораи зиёди лоиҳаҳои веби гетерогенӣ
Манбаъ: will.com