Bii o ṣe le fipamọ sori awọn idiyele awọsanma nigba ṣiṣẹ pẹlu Kubernetes? Ko si ojutu ti o tọ nikan, ṣugbọn nkan yii ṣe apejuwe awọn irinṣẹ pupọ ti o le ṣe iranlọwọ fun ọ lati ṣakoso awọn orisun rẹ ni imunadoko ati dinku awọn idiyele iṣiro awọsanma rẹ.
Mo kọ nkan yii pẹlu Kubernetes fun AWS ni lokan, ṣugbọn yoo kan (fere) ni ọna kanna si awọn olupese awọsanma miiran. Mo ro pe awọn iṣupọ rẹ ti ni atunto adaṣe adaṣe tẹlẹ (iṣupọ-autoscaler). Yiyọ awọn orisun kuro ati iwọn imuṣiṣẹ rẹ yoo ṣafipamọ owo nikan ti o ba tun dinku ọkọ oju-omi kekere ti awọn apa oṣiṣẹ (awọn iṣẹlẹ EC2).
Ṣiṣẹ ni agbegbe ti o yara-yara jẹ nla. A fẹ awọn ajo tekinoloji onikiakia. Ifijiṣẹ sọfitiwia yiyara tun tumọ si awọn imuṣiṣẹ PR diẹ sii, awọn agbegbe awotẹlẹ, awọn apẹẹrẹ, ati awọn solusan atupale. Ohun gbogbo ti wa ni ransogun lori Kubernetes. Tani o ni akoko lati sọ di mimọ awọn imuṣiṣẹ idanwo pẹlu ọwọ? O rọrun lati gbagbe nipa piparẹ idanwo-ọsẹ kan. Iwe-owo awọsanma yoo pari soke nitori nkan ti a gbagbe lati pa:
(Henning Jacobs:
Zhiza:
(awọn agbasọ ọrọ) Corey Quinn:
Adaparọ: akọọlẹ AWS rẹ jẹ iṣẹ ti nọmba awọn olumulo ti o ni.
Otitọ: Dimegilio AWS rẹ jẹ iṣẹ ti nọmba awọn onimọ-ẹrọ ti o ni.
Ivan Kurnosov (ni idahun):
Otitọ gidi: Dimegilio AWS rẹ jẹ iṣẹ ti nọmba awọn ohun ti o gbagbe lati mu / paarẹ.)
Kubernetes Olutọju (kube-janitor) ṣe iranlọwọ lati sọ iṣupọ rẹ di mimọ. Iṣeto ni janitor jẹ rọ fun lilo agbaye ati agbegbe:
Awọn ofin iṣupọ le ṣalaye akoko-si-aye to pọ julọ (TTL) fun awọn imuṣiṣẹ PR/idanwo.
Awọn orisun ẹnikọọkan le ṣe alaye pẹlu janitor/ttl, fun apẹẹrẹ lati yọ iwasoke/afọwọkọ kuro laifọwọyi lẹhin awọn ọjọ 7.
Awọn ofin gbogbogbo jẹ asọye ninu faili YAML. Ọna rẹ ti kọja nipasẹ paramita naa --rules-file ni kube-janitor. Eyi jẹ ofin apẹẹrẹ lati yọ gbogbo awọn aaye orukọ kuro pẹlu -pr- ni orukọ lẹhin ọjọ meji:
Apẹẹrẹ atẹle n ṣe ilana lilo aami ohun elo lori Imuṣiṣẹ ati awọn adarọ-ese StatefulSet fun gbogbo Awọn imuṣiṣẹ tuntun/StatefulSet ni 2020, ṣugbọn ni akoko kanna ngbanilaaye ṣiṣe awọn idanwo laisi aami yii fun ọsẹ kan:
- id: require-application-label
# удалить deployments и statefulsets без метки "application"
resources:
- deployments
- statefulsets
# см. http://jmespath.org/specification.html
jmespath: "!(spec.template.metadata.labels.application) && metadata.creationTimestamp > '2020-01-01'"
ttl: 7d
Ṣiṣe demo ti o ni opin akoko fun ọgbọn išẹju 30 lori iṣupọ kan ti nṣiṣẹ kube-janitor:
kubectl run nginx-demo --image=nginx
kubectl annotate deploy nginx-demo janitor/ttl=30m
Orisun miiran ti awọn idiyele ti n pọ si jẹ awọn iwọn itẹramọṣẹ (AWS EBS). Piparẹ Kubernetes StatefulSet kan ko ṣe paarẹ awọn ipele itẹramọṣẹ rẹ (PVC - PersistentVolumeClaim). Awọn iwọn EBS ti a ko lo le ni irọrun ja si awọn idiyele ti awọn ọgọọgọrun dọla fun oṣu kan. Kubernetes Janitor ni ẹya kan lati nu awọn PVC ti ko lo. Fun apẹẹrẹ, ofin yii yoo yọ gbogbo awọn PVCs ti a ko gbe nipasẹ module kan ati pe ko ṣe itọkasi nipasẹ StatefulSet tabi CronJob:
# удалить все PVC, которые не смонтированы и на которые не ссылаются StatefulSets
- id: remove-unused-pvcs
resources:
- persistentvolumeclaims
jmespath: "_context.pvc_is_not_mounted && _context.pvc_is_not_referenced"
ttl: 24h
Kubernetes Janitor le ṣe iranlọwọ fun ọ lati jẹ ki iṣupọ rẹ mọ ki o ṣe idiwọ awọn idiyele iširo awọsanma lati kojọpọ laiyara. Fun imuṣiṣẹ ati awọn ilana iṣeto ni, tẹle README kube-janitor.
Din igbelosoke lakoko awọn wakati ti kii ṣiṣẹ
Idanwo ati awọn ọna ṣiṣe ni igbagbogbo nilo lati ṣiṣẹ nikan lakoko awọn wakati iṣowo. Diẹ ninu awọn ohun elo iṣelọpọ, gẹgẹbi awọn ọfiisi ẹhin/awọn irinṣẹ alabojuto, tun nilo wiwa lopin nikan ati pe o le jẹ alaabo ni alẹ kan.
Kubernetes Downscaler (kube-downscaler) ngbanilaaye awọn olumulo ati awọn oniṣẹ lati ṣe iwọn eto naa lakoko awọn wakati ti kii ṣiṣẹ. Awọn imuṣiṣẹ ati StatefulSets le ṣe iwọn si awọn ẹda asan. CronJobs le daduro. Kubernetes Downscaler ti wa ni tunto fun odidi iṣupọ kan, ọkan tabi diẹ sii awọn aaye orukọ, tabi awọn orisun kọọkan. O le ṣeto boya “akoko aisimi” tabi, ni idakeji, “akoko iṣẹ”. Fun apẹẹrẹ, lati dinku igbelowọn bi o ti ṣee ṣe lakoko awọn alẹ ati awọn ipari ose:
image: hjacobs/kube-downscaler:20.4.3
args:
- --interval=30
# не отключать компоненты инфраструктуры
- --exclude-namespaces=kube-system,infra
# не отключать kube-downscaler, а также оставить Postgres Operator, чтобы исключенными БД можно было управлять
- --exclude-deployments=kube-downscaler,postgres-operator
- --default-uptime=Mon-Fri 08:00-20:00 Europe/Berlin
- --include-resources=deployments,statefulsets,stacks,cronjobs
- --deployment-time-annotation=deployment-time
Eyi ni aworan kan fun iwọn awọn apa oṣiṣẹ iṣupọ ni awọn ipari ose:
Gbigbọn isalẹ lati ~ 13 si awọn apa oṣiṣẹ 4 dajudaju ṣe iyatọ ti o ṣe akiyesi ninu owo AWS rẹ.
Ṣugbọn kini ti MO ba nilo lati ṣiṣẹ lakoko iṣupọ “akoko downtime”? Awọn imuṣiṣẹ kan le yọkuro patapata lati iwọn iwọn nipa fifi isale isalẹ/iyasọtọ: asọye otitọ. Awọn imuṣiṣẹ le jẹ yọkuro fun igba diẹ nipa lilo isale/iyasọtọ-titi ti asọye pẹlu aami akoko pipe ni ọna kika YYYY-MM-DD HH:MM (UTC). Ti o ba jẹ dandan, gbogbo iṣupọ le jẹ iwọn-pada sẹhin nipa gbigbe podu pẹlu asọye downscaler/force-uptime, fun apẹẹrẹ, nipa ifilọlẹ nginx òfo:
kubectl run scale-up --image=nginx
kubectl annotate deploy scale-up janitor/ttl=1h # удалить развертывание через час
kubectl annotate pod $(kubectl get pod -l run=scale-up -o jsonpath="{.items[0].metadata.name}") downscaler/force-uptime=true
Ọpọlọpọ awọn ohun elo / awọn iṣẹ ṣe pẹlu ilana ikojọpọ ti o ni agbara: nigbakan awọn modulu wọn ko ṣiṣẹ, ati nigba miiran wọn ṣiṣẹ ni kikun agbara. Ṣiṣẹda ọkọ oju-omi titobi ti awọn adarọ-ese lati koju pẹlu fifuye tente oke ti o pọju kii ṣe ọrọ-aje. Kubernetes ṣe atilẹyin igbelowọn aifọwọyi petele kọja awọn orisun kan HorizontalPodAutoscaler (HPA). Lilo Sipiyu nigbagbogbo jẹ atọka to dara fun iwọn:
Zalando ti ṣẹda paati kan lati sopọ ni irọrun awọn metiriki aṣa fun iwọn: Kube Metrics Adapter (kube-metrics-adapter) jẹ ohun ti nmu badọgba awọn metiriki jeneriki fun Kubernetes ti o le gba ati ṣe iranṣẹ aṣa ati awọn metiriki ita fun autoscaling petele ti awọn adarọ-ese. O ṣe atilẹyin igbelowọn ti o da lori awọn metiriki Prometheus, awọn ila SQS, ati awọn eto miiran. Fun apẹẹrẹ, lati ṣe iwọn imuṣiṣẹ rẹ si metiriki aṣa ti o jẹ aṣoju nipasẹ ohun elo funrararẹ bi JSON ni / awọn metiriki lo:
Iṣatunṣe autoscaling petele pẹlu HPA yẹ ki o jẹ ọkan ninu awọn iṣe aifọwọyi lati mu ilọsiwaju ṣiṣẹ fun awọn iṣẹ alaini orilẹ-ede. Spotify ni igbejade pẹlu iriri wọn ati awọn iṣeduro fun HPA: iwọn rẹ deployments, ko rẹ apamọwọ.
Din awọn oluşewadi overbooking
Awọn ẹru iṣẹ Kubernetes pinnu awọn iwulo Sipiyu/iranti nipasẹ “awọn ibeere orisun.” Awọn orisun Sipiyu jẹ iwọn ni awọn ohun kohun foju tabi diẹ sii ni igbagbogbo ni “millicores”, fun apẹẹrẹ 500m tumọ si 50% vCPU. Awọn orisun iranti jẹ iwọn ni awọn baiti, ati pe awọn suffixes ti o wọpọ le ṣee lo, bii 500Mi, eyiti o tumọ si 500 megabyte. Awọn ibeere orisun “titiipa” agbara lori awọn apa oṣiṣẹ, afipamo pe adarọ ese kan pẹlu ibeere Sipiyu 1000m kan lori ipade kan pẹlu awọn vCPU 4 yoo fi awọn vCPU 3 nikan wa si awọn adarọ-ese miiran. [1]
Slack (ibi ipamọ ti o pọ ju) jẹ iyatọ laarin awọn orisun ti a beere ati lilo gangan. Fun apẹẹrẹ, adarọ-ese kan ti o beere fun 2 GiB ti iranti ṣugbọn ti o nlo 200 MiB nikan ni ~ 1,8 GiB ti iranti “afikun”. Afikun owo. Ẹnikan le ṣe iṣiro aijọju pe 1 GiB ti iye owo iranti laiṣe ~ $10 fun oṣu kan. [2]
Kubernetes Resource Iroyin (kube-resource-report) ṣe afihan awọn ifiṣura pupọ ati pe o le ṣe iranlọwọ fun ọ lati pinnu agbara ifowopamọ:
Kubernetes Resource Iroyin fihan iye ti o ṣajọpọ nipasẹ ohun elo ati aṣẹ. Eyi n gba ọ laaye lati wa awọn aaye nibiti awọn ibeere orisun le dinku. Ijabọ HTML ti ipilẹṣẹ nikan n pese aworan ti lilo awọn orisun. O yẹ ki o wo Sipiyu/lilo iranti ni akoko pupọ lati pinnu awọn ibeere orisun to pe. Eyi ni aworan apẹrẹ Grafana kan fun iṣẹ “aṣoju” Sipiyu-eru: gbogbo awọn adarọ-ese nlo ni pataki kere ju awọn ohun kohun Sipiyu 3 ti o beere:
Idinku ibeere Sipiyu lati 3000m si ~ 400m n ṣe idasilẹ awọn orisun fun awọn ẹru iṣẹ miiran ati gba iṣupọ lati kere si.
“Apapọ lilo Sipiyu ti awọn iṣẹlẹ EC2 nigbagbogbo n gbe ni iwọn ipin-nọmba ẹyọkan,” Kọ Corey Quinn. Lakoko fun EC2 iṣiro iwọn to tọ le jẹ ipinnu buburuYiyipada diẹ ninu awọn ibeere orisun orisun Kubernetes ni faili YAML rọrun ati pe o le mu awọn ifowopamọ nla wa.
Ṣugbọn ṣe a fẹ gaan eniyan ni iyipada awọn iye ni awọn faili YAML? Rara, awọn ẹrọ le ṣe dara julọ! Kubernetes Inaro podu Autoscaler (VPA) ṣe bẹ: ṣe deede awọn ibeere orisun ati awọn ihamọ ni ibamu si iṣẹ ṣiṣe. Eyi ni aworan apẹẹrẹ ti awọn ibeere Sipiyu Prometheus (laini buluu tinrin) ti a ṣe deede nipasẹ VPA lori akoko:
goldicks lati Fairwind jẹ ọpa ti o ṣẹda VPA kan fun imuṣiṣẹ kọọkan ni aaye orukọ ati lẹhinna ṣafihan iṣeduro VPA kan lori dasibodu rẹ. O le ṣe iranlọwọ fun awọn olupilẹṣẹ ṣeto awọn ibeere Sipiyu/iranti to pe fun awọn ohun elo wọn:
Ni ikẹhin ṣugbọn kii kere ju, awọn idiyele AWS EC2 le dinku nipasẹ lilo awọn iṣẹlẹ Aami bi awọn apa oṣiṣẹ Kubernetes [3]. Awọn iṣẹlẹ iranran wa ni ẹdinwo ti o to 90% ni akawe si awọn idiyele Ibeere. Ṣiṣe Kubernetes lori EC2 Spot jẹ apapo ti o dara: o nilo lati pato ọpọlọpọ awọn oriṣi apẹẹrẹ fun wiwa ti o ga julọ, afipamo pe o le gba ipade ti o tobi ju fun iye owo kanna tabi kekere, ati pe agbara ti o pọ si le ṣee lo nipasẹ awọn iṣẹ-ṣiṣe Kubernetes ti a fi sinu apoti.
Bawo ni lati ṣiṣẹ Kubernetes lori EC2 Spot? Awọn aṣayan pupọ lo wa: lo iṣẹ ẹnikẹta bi SpotInst (eyiti a pe ni “Spot” ni bayi, maṣe beere lọwọ mi kilode), tabi nirọrun ṣafikun Spot AutoScalingGroup (ASG) si iṣupọ rẹ. Fun apẹẹrẹ, eyi ni snippet CloudFormation fun Aami ASG “iṣapeye agbara” pẹlu awọn iru apẹẹrẹ pupọ:
Kini awọn iṣe rẹ ti o dara julọ fun fifipamọ awọn idiyele awọsanma lori Kubernetes? Jọwọ jẹ ki mi mọ ni Twitter (@try_except_).
[1] Ni otitọ, o kere ju awọn vCPU 3 yoo wa ni lilo bi ilojade oju ipade ti dinku nipasẹ awọn orisun eto ti a fi pamọ. Kubernetes ṣe iyatọ laarin agbara ipade ti ara ati awọn orisun “ti a pese” (Node Allocatable).
[2] Apẹẹrẹ iṣiro: apẹẹrẹ m5.large kan pẹlu 8 GiB ti iranti jẹ ~ $84 fun oṣu kan (eu-central-1, On-Demand), i.e. ìdènà 1/8 node jẹ isunmọ ~ $ 10 fun oṣu.
[3] Ọpọlọpọ awọn ọna diẹ sii wa lati dinku owo-owo EC2 rẹ, gẹgẹbi Awọn iṣẹlẹ ti a fipamọ, Eto Ifowopamọ, ati bẹbẹ lọ - Emi kii yoo bo awọn akọle wọnyẹn nibi, ṣugbọn o yẹ ki o wo wọn ni pato!