Nèf Konsèy pèfòmans Kubernetes

Nèf Konsèy pèfòmans Kubernetes

Bonjou tout moun! Non mwen se Oleg Sidorenkov, mwen travay nan DomClick kòm tèt ekip enfrastrikti. Nou te itilize Kubik nan pwodiksyon pou plis pase twa ane, e pandan tan sa a nou te fè eksperyans anpil diferan moman enteresan ak li. Jodi a mwen pral di w ki jan, ak bon apwòch la, ou ka peze menm plis pèfòmans soti nan vaniy Kubernetes pou gwoup ou a. Pare fiks ale!

Nou tout konnen trè byen ke Kubernetes se yon sistèm sous ouvè évolutive pou òkestrasyon veso; byen, oswa 5 binè ki travay majik pa jere sik lavi mikwosèvis ou yo nan yon anviwònman sèvè. Anplis de sa, li se yon zouti san patipri fleksib ki ka reyini tankou Lego pou personnalisation maksimòm pou travay diferan.

Ak tout bagay sanble ap byen: jete sèvè nan gwoup la tankou bwa dife nan yon bwat dife, epi ou pa pral konnen okenn lapenn. Men, si ou se pou anviwònman an, ou pral panse: "Ki jan mwen ka kenbe dife a boule ak rezèv forè a?" Nan lòt mo, ki jan yo jwenn fason yo amelyore enfrastrikti ak diminye depans yo.

1. Siveye ekip ak resous aplikasyon yo

Nèf Konsèy pèfòmans Kubernetes

Youn nan metòd ki pi komen, men efikas se entwodiksyon demann / limit. Divize aplikasyon yo pa espas non, ak espas non pa ekip devlopman. Anvan deplwaman, mete valè aplikasyon yo pou konsomasyon tan processeur, memwa, ak depo efemèr.

resources:
   requests:
     memory: 2Gi
     cpu: 250m
   limits:
     memory: 4Gi
     cpu: 500m

Atravè eksperyans, nou te rive nan konklizyon an: ou pa ta dwe gonfle demann soti nan limit yo pa plis pase de fwa. Se volim nan gwoup la kalkile ki baze sou demann, epi si ou bay aplikasyon yo yon diferans nan resous, pou egzanp, 5-10 fwa, Lè sa a, imajine sa ki pral rive nan ne ou a lè li plen ak gous epi toudenkou resevwa chaj. Pa gen anyen ki bon. Nan yon minimòm, throttling, ak nan yon maksimòm, ou pral di orevwa nan travayè a epi jwenn yon chaj siklik sou nœuds ki rete yo apre gous yo kòmanse deplase.

Anplis de sa, avèk èd la limitranges Nan kòmansman an, ou ka mete valè resous pou veso a - minimòm, maksimòm ak default:

➜  ~ kubectl describe limitranges --namespace ops
Name:       limit-range
Namespace:  ops
Type        Resource           Min   Max   Default Request  Default Limit  Max Limit/Request Ratio
----        --------           ---   ---   ---------------  -------------  -----------------------
Container   cpu                50m   10    100m             100m           2
Container   ephemeral-storage  12Mi  8Gi   128Mi            4Gi            -
Container   memory             64Mi  40Gi  128Mi            128Mi          2

Pa bliye limite resous namespace pou yon ekip pa ka pran tout resous gwoup la:

➜  ~ kubectl describe resourcequotas --namespace ops
Name:                   resource-quota
Namespace:              ops
Resource                Used          Hard
--------                ----          ----
limits.cpu              77250m        80
limits.memory           124814367488  150Gi
pods                    31            45
requests.cpu            53850m        80
requests.memory         75613234944   150Gi
services                26            50
services.loadbalancers  0             0
services.nodeports      0             0

Kòm ka wè nan deskripsyon an resourcequotas, Si ekip ops la vle deplwaye gous ki pral konsome yon lòt 10 CPU, pwogramè a pa pral pèmèt sa a epi li pral voye yon erè:

Error creating: pods "nginx-proxy-9967d8d78-nh4fs" is forbidden: exceeded quota: resource-quota, requested: limits.cpu=5,requests.cpu=5, used: limits.cpu=77250m,requests.cpu=53850m, limited: limits.cpu=10,requests.cpu=10

Pou rezoud yon pwoblèm konsa, ou ka ekri yon zouti, pou egzanp, tankou sa a, kapab sere ak komèt eta a nan resous kòmand.

2. Chwazi pi bon depo dosye a

Nèf Konsèy pèfòmans Kubernetes

Isit la mwen ta renmen manyen sijè a nan komèsan ki pèsistan ak subsistèm nan disk nan nœuds travayè Kubernetes. Mwen espere ke pa gen moun ki sèvi ak "Kib la" sou yon HDD nan pwodiksyon, men pafwa yon SSD regilye pa ase ankò. Nou te rankontre yon pwoblèm kote mòso bwa yo te touye disk la akòz operasyon I/O, epi pa gen anpil solisyon:

  • Sèvi ak SSD segondè-pèfòmans oswa chanje nan NVMe (si ou jere pyès ki nan konpitè pwòp ou a).

  • Diminye nivo antre.

  • Fè balans "entelijan" nan gous ki vyole disk la (podAntiAffinity).

Ekran ki pi wo a montre sa k ap pase anba nginx-ingress-controller sou disk la lè access_logs logging pèmèt (~12 mil mòso bwa / sec). Kondisyon sa a, nan kou, ka mennen nan degradasyon nan tout aplikasyon sou ne sa a.

Kòm pou PV, malè, mwen pa te eseye tout bagay opinyon Komèsan ki pèsistan. Sèvi ak pi bon opsyon ki kostim ou. Istorikman, li te rive nan peyi nou an ke yon ti pati nan sèvis mande pou komèsan RWX, ak yon bon bout tan de sa yo te kòmanse sèvi ak depo NFS pou travay sa a. Bon mache ak... ase. Natirèlman, li menm ak mwen te manje kaka - benediksyon pou ou, men nou te aprann melodi li soti, epi tèt mwen pa fè mal ankò. Men, si sa posib, ale nan depo objè S3.

3. Kolekte imaj optimisé

Nèf Konsèy pèfòmans Kubernetes

Li pi bon pou itilize imaj ki optimize pou veso pou Kubernetes ka pran yo pi vit epi egzekite yo pi efikas. 

Optimize vle di ke imaj yo:

  • genyen sèlman yon aplikasyon oswa fè yon sèl fonksyon;

  • ti nan gwosè, paske gwo imaj yo transmèt pi mal sou rezo a;

  • gen pwen final sante ak preparasyon ki pèmèt Kubernetes pran aksyon nan evènman an nan D ';

  • sèvi ak sistèm operasyon veso-zanmitay (tankou Alpine oswa CoreOS), ki pi rezistan a erè konfigirasyon;

  • sèvi ak bati plizyè etap pou ou ka sèlman deplwaye aplikasyon konpile epi pa sous ki akonpaye yo.

Gen anpil zouti ak sèvis ki pèmèt ou tcheke ak optimize imaj sou vole. Li enpòtan pou toujou kenbe yo ajou epi teste pou sekirite. Kòm yon rezilta ou jwenn:

  1. Redwi chaj rezo sou tout gwoup la.

  2. Diminye tan demaraj veso a.

  3. Pi piti gwosè tout rejis Docker ou a.

4. Sèvi ak DNS kachèt

Nèf Konsèy pèfòmans Kubernetes

Si nou pale de gwo chaj, Lè sa a, lavi se trè move san yo pa ajiste sistèm DNS gwoup la. Yon fwa sou yon tan, devlopè Kubernetes yo te sipòte solisyon kube-dns yo. Li te tou aplike isit la, men lojisyèl sa a pa te patikilyèman branche epi li pa t 'pwodwi pèfòmans ki nesesè yo, byenke li te sanble yo dwe yon travay ki senp. Lè sa a, coredns te parèt, ke nou chanje a epi ki pa te gen okenn lapenn; li pita te vin sèvis DNS default nan K8s. Nan kèk pwen, nou te grandi a 40 mil rps nan sistèm nan DNS, ak solisyon sa a tou te vin ensifizan. Men, pa chans, Nodelocaldns te soti, aka node lokal kachèt, aka NodeLocal DNSCache.

Poukisa nou itilize sa a? Gen yon ensèk nan nwayo Linux la ki, lè plizyè apèl atravè conntrack NAT sou UDP, mennen nan yon kondisyon ras pou antre nan tab conntrack, ak yon pati nan trafik la nan NAT pèdi (chak vwayaj atravè Sèvis la se NAT). Nodelocaldns rezoud pwoblèm sa a lè li debarase m de NAT ak amelyore koneksyon an nan TCP nan DNS en, osi byen ke lokalman kachèt demann DNS en (ki gen ladan yon kachèt negatif kout 5 segonn).

5. Echèl gous orizontal ak vètikal otomatikman

Nèf Konsèy pèfòmans Kubernetes

Èske ou ka di ak konfyans ke tout mikwosèvis ou yo pare pou yon ogmantasyon de a twa fwa nan chaj? Ki jan yo byen asiyen resous nan aplikasyon ou yo? Kenbe yon koup nan gous kouri pi lwen pase kantite travay la ka redondants, men kenbe yo tounen nan do kouri risk pou yo D 'nan yon ogmantasyon toudenkou nan trafik nan sèvis la. Sèvis tankou Orizontal Pod Autoscaler и Vètikal Pod Autoscaler.

VPA pèmèt ou otomatikman ogmante demann/limit resipyan ou yo nan gous la depann sou itilizasyon aktyèl la. Ki jan li ka itil? Si ou gen gous ki pa ka monte orizontal pou kèk rezon (ki pa totalman fyab), Lè sa a, ou ka eseye konfye chanjman nan resous li yo nan VPA. Karakteristik li se yon sistèm rekòmandasyon ki baze sou done istorik ak aktyèl ki soti nan sèvè metrik la, kidonk si ou pa vle chanje otomatikman demann/limit yo, ou ka tou senpleman kontwole resous yo rekòmande pou resipyan ou yo epi optimize anviwònman yo pou konsève pou CPU ak memwa nan gwoup la.

Nèf Konsèy pèfòmans KubernetesImaj yo pran nan https://levelup.gitconnected.com/kubernetes-autoscaling-101-cluster-autoscaler-horizontal-pod-autoscaler-and-vertical-pod-2a441d9ad231

Planifikatè a nan Kubernetes toujou baze sou demann. Kèlkeswa valè ou mete la, pwogramè a ap chèche yon ne apwopriye ki baze sou li. Valè limit yo nesesè pou cubelet la konprann ki lè pou gaz oswa touye gous la. Epi depi sèlman paramèt enpòtan an se valè demann yo, VPA ap ​​travay avèk li. Chak fwa ou echèl yon aplikasyon vètikal, ou defini kisa demann yo ta dwe. Ki sa ki pral rive nan limit yo lè sa a? Paramèt sa a pral egalman pwopòsyonèlman.

Pou egzanp, isit la se anviwònman gous abityèl yo:

resources:
   requests:
     memory: 250Mi
     cpu: 200m
   limits:
     memory: 500Mi
     cpu: 350m

Motè rekòmandasyon an detèmine aplikasyon w lan mande pou 300m CPU ak 500Mi pou kouri byen. Ou pral jwenn paramèt sa yo:

resources:
   requests:
     memory: 500Mi
     cpu: 300m
   limits:
     memory: 1000Mi
     cpu: 525m

Kòm mansyone pi wo a, sa a se dekale pwopòsyonèl ki baze sou rapò demann/limit nan manifest la:

  • CPU: 200m → 300m: rapò 1:1.75;

  • Memwa: 250Mi → 500Mi: rapò 1:2.

Kòm concerne HPA, Lè sa a, mekanis nan operasyon se pi transparan. Paramèt tankou CPU ak memwa yo limite, epi si mwayèn tout kopi yo depase papòt la, aplikasyon an ap echèl pa +1 sub jiskaske valè a tonbe pi ba pase papòt la oswa jiskaske kantite maksimòm kopi yo rive.

Nèf Konsèy pèfòmans KubernetesImaj yo pran nan https://levelup.gitconnected.com/kubernetes-autoscaling-101-cluster-autoscaler-horizontal-pod-autoscaler-and-vertical-pod-2a441d9ad231

Anplis de mezi abityèl yo tankou CPU ak memwa, ou ka fikse papòt sou mezi koutim ou soti nan Prometheus epi travay avèk yo si ou panse ke se endikasyon ki pi egzak sou lè pou echèl aplikasyon w lan. Yon fwa aplikasyon an estabilize anba papòt metrik espesifye a, HPA pral kòmanse diminye gous yo jiska kantite minimòm kopi oswa jiskaske chaj la satisfè papòt espesifye a.

6. Pa bliye sou Node Affinity ak Pod Affinity

Nèf Konsèy pèfòmans Kubernetes

Se pa tout nœuds yo kouri sou menm pyès ki nan konpitè, epi se pa tout gous ki bezwen kouri aplikasyon pou kalkile entansif. Kubernetes pèmèt ou mete espesyalizasyon nan nœuds ak gous lè l sèvi avèk Node afinite и Pod afinite.

Si ou gen nœuds ki apwopriye pou operasyon entansif kalkile, Lè sa a, pou efikasite maksimòm li pi bon pou mare aplikasyon yo nan nœuds korespondan yo. Pou fè sa sèvi ak nodeSelector ak yon etikèt ne.

Ann di ou gen de nœuds: youn ak CPUType=HIGHFREQ ak yon gwo kantite nwayo vit, yon lòt ak MemoryType=HIGHMEMORY plis memwa ak pi vit pèfòmans. Fason ki pi fasil la se bay deplwaman nan yon ne HIGHFREQpa ajoute nan seksyon an spec seleksyon sa a:

…
nodeSelector:
	CPUType: HIGHFREQ

Yon fason ki pi chè ak espesifik pou fè sa se sèvi ak nodeAffinity nan jaden affinity seksyon spec. Gen de opsyon:

  • requiredDuringSchedulingIgnoredDuringExecution: anviwònman difisil (pwogramè a pral deplwaye gous sèlman sou nœuds espesifik (e okenn lòt kote));

  • preferredDuringSchedulingIgnoredDuringExecution: anviwònman mou (pwogramè a pral eseye deplwaye nan nœuds espesifik, epi si sa echwe, li pral eseye deplwaye nan pwochen ne ki disponib).

Ou ka presize yon sentaks espesifik pou jere etikèt ne, tankou In, NotIn, Exists, DoesNotExist, Gt oswa Lt. Sepandan, sonje ke metòd konplèks nan lis long nan etikèt yo pral ralanti pran desizyon nan sitiyasyon kritik. Nan lòt mo, kenbe li senp.

Kòm mansyone pi wo a, Kubernetes pèmèt ou mete afinite nan gous aktyèl yo. Sa vle di, ou ka fè sèten gous travay ansanm ak lòt gous nan menm zòn disponiblite a (ki enpòtan pou nyaj) oswa nœuds.

В podAffinity jaden yo affinity seksyon spec jaden yo menm ki disponib tankou nan ka a nan nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution и preferredDuringSchedulingIgnoredDuringExecution. Sèl diferans se sa matchExpressions pral mare gous yo nan yon ne ki deja kouri yon gous ak etikèt sa a.

Kubernetes ofri tou yon jaden podAntiAffinity, ki, okontrè, pa mare gous la nan yon ne ak gous espesifik.

Konsènan ekspresyon nodeAffinity Yo ka bay menm konsèy la: eseye kenbe règ yo senp ak lojik, pa eseye surcharge spesifikasyon gous la ak yon seri règ konplèks. Li trè fasil pou kreye yon règ ki pa pral matche ak kondisyon yo nan gwoup la, kreye chaj nesesè sou orè a ak diminye pèfòmans jeneral.

7. Taints & Tolerans

Gen yon lòt fason pou jere pwogramè a. Si ou gen yon gwo gwoup ak dè santèn de nœuds ak dè milye de mikwosèvis, Lè sa a, li trè difisil pou pa pèmèt sèten gous yo dwe anime sou sèten nœuds.

Mekanis nan taints-entèdi règ-ede ak sa a. Pou egzanp, nan sèten senaryo ou ka entèdi sèten nœuds kouri gous. Pou aplike tach nan yon ne espesifik ou bezwen sèvi ak opsyon an taint nan kubectl. Espesifye kle a ak valè ak Lè sa a taint tankou NoSchedule oswa NoExecute:

$ kubectl taint nodes node10 node-role.kubernetes.io/ingress=true:NoSchedule

Li se tou vo sonje ke mekanis nan taint sipòte twa efè prensipal: NoSchedule, NoExecute и PreferNoSchedule.

  • NoSchedule vle di ke pou kounye a pa pral gen okenn antre korespondan nan spesifikasyon gous la tolerations, li pa pral kapab deplwaye sou ne a (nan egzanp sa a node10).

  • PreferNoSchedule - vèsyon senplifye NoSchedule. Nan ka sa a, pwogramè a pral eseye pa asiyen gous ki pa gen yon antre matche tolerations pou chak ne, men sa a se pa yon limitasyon difisil. Si pa gen okenn resous nan gwoup la, Lè sa a, gous yo ap kòmanse deplwaye sou ne sa a.

  • NoExecute - efè sa a deklannche evakyasyon imedya nan gous ki pa gen yon antre korespondan tolerations.

Enteresan, konpòtman sa a ka anile lè l sèvi avèk mekanis nan tolerans. Sa a se pratik lè gen yon ne "entèdi" epi ou sèlman bezwen mete sèvis enfrastrikti sou li. Ki jan fè li? Pèmèt sèlman sa yo gous pou ki gen yon tolerans apwopriye.

Men ki jan spesifikasyon gous la ta sanble:

spec:
   tolerations:
     - key: "node-role.kubernetes.io/ingress"
        operator: "Equal"
        value: "true"
        effect: "NoSchedule"

Sa pa vle di ke pwochen redeplwaye a pral tonbe sou ne patikilye sa a, sa a se pa mekanis Node Affinity la ak nodeSelector. Men, lè w konbine plizyè karakteristik, ou ka reyalize anviwònman pwogramasyon trè fleksib.

8. Mete priyorite pou deplwaman pod

Jis paske ou gen gous asiyen nan nœuds sa pa vle di ke tout gous yo dwe trete ak menm priyorite. Pou egzanp, ou ka vle deplwaye kèk gous anvan lòt moun.

Kubernetes ofri diferan fason pou configure Pod Priyorite ak Preemption. Anviwònman an konsiste de plizyè pati: objè PriorityClass ak deskripsyon jaden yo priorityClassName nan spesifikasyon gous la. Ann gade yon egzanp:

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority
value: 99999
globalDefault: false
description: "This priority class should be used for very important pods only"

Nou kreye PriorityClass, ba li yon non, deskripsyon ak valè. Pi wo a value, pi gwo priyorite a. Valè a ka nenpòt nonb antye relatif 32-bit mwens pase oswa egal a 1. Valè ki pi wo yo rezève pou gous sistèm misyon kritik ki jeneralman pa ka preempted. Deplasman pral fèt sèlman si yon gous ki gen gwo priyorite pa gen okenn kote pou vire, Lè sa a, kèk nan gous yo ki soti nan yon ne sèten yo pral evakye. Si mekanis sa a twò rijid pou ou, ou ka ajoute opsyon an preemptionPolicy: Never, ak Lè sa a, pa pral gen okenn preemption, gous la pral kanpe an premye nan keu la epi tann pou orè a jwenn resous gratis pou li.

Apre sa, nou kreye yon gous kote nou endike non an priorityClassName:

apiVersion: v1
kind: Pod
metadata:
  name: static-web
  labels:
    role: myrole
 spec:
  containers:
    - name: web
      image: nginx
      ports:
        - name: web
          containerPort: 80
          protocol: TCP
  priorityClassName: high-priority
          

Ou ka kreye otan klas priyorite jan ou vle, byenke li rekòmande pou pa kite sa a (di, limite tèt ou a priyorite ba, mwayen ak segondè).

Kidonk, si sa nesesè, ou ka ogmante efikasite nan deplwaye sèvis kritik tankou nginx-ingress-controller, coredns, elatriye.

9. Optimize gwoup ETCD la

Nèf Konsèy pèfòmans Kubernetes

ETCD ka rele sèvo a nan tout gwoup la. Li trè enpòtan pou kenbe operasyon an nan baz done sa a nan yon nivo segondè, depi vitès la nan operasyon nan Cube depann sou li. Yon estanda san patipri, ak an menm tan an, bon solisyon ta dwe kenbe gwoup la ETCD sou nœuds yo mèt yo nan lòd yo gen yon reta minimòm nan kube-apiserver la. Si ou pa ka fè sa, Lè sa a, mete ETCD a pi pre ke posib, ak bon Pleasant ant patisipan yo. Epitou peye atansyon sou konbyen nœuds soti nan ETCD ka tonbe san yo pa mal nan gwoup la

Nèf Konsèy pèfòmans Kubernetes

Kenbe nan tèt ou ke ogmante kantite manm nan yon gwoup ka ogmante tolerans fay nan depans lan nan pèfòmans, tout bagay ta dwe nan modération.

Si nou pale sou konfigirasyon sèvis la, gen kèk rekòmandasyon:

  1. Gen bon pyès ki nan konpitè, ki baze sou gwosè gwoup la (ou ka li isit la).

  2. Ajiste kèk paramèt si ou gaye yon gwoup ant yon pè DC oswa rezo w ak disk kite anpil bagay yo vle (ou ka li isit la).

Konklizyon

Atik sa a dekri pwen ekip nou an ap eseye respekte. Sa a se pa yon deskripsyon etap pa etap nan aksyon, men opsyon ki ka itil pou optimize gwoup anlè. Li klè ke chak gwoup inik nan pwòp fason li yo, ak solisyon konfigirasyon yo ka varye anpil, kidonk li ta enteresan jwenn fidbak ou sou fason ou kontwole gwoup Kubernetes ou a ak fason ou amelyore pèfòmans li. Pataje eksperyans ou nan kòmantè yo, li pral enteresan yo konnen.

Sous: www.habr.com