10 Erè komen lè w ap itilize Kubernetes

Remak. trad.: Otè yo nan atik sa a se enjenyè ki soti nan yon ti konpayi Tchekoslovaki, pipetail. Yo jere yo mete ansanm yon lis bèl bagay nan [pafwa ordinèr, men yo toujou] trè ijan pwoblèm ak move konsepsyon ki gen rapò ak operasyon an nan grap Kubernetes.

10 Erè komen lè w ap itilize Kubernetes

Pandan ane yo nan itilize Kubernetes, nou te travay ak yon gwo kantite grap (tou de jere ak san jere - sou GCP, AWS ak Azure). Apre yon tan, nou te kòmanse remake ke kèk erè yo te toujou ap repete. Sepandan, pa gen okenn wont nan sa a: nou te fè pifò nan yo nou menm!

Atik la gen erè ki pi komen ak tou mansyone ki jan yo korije yo.

1. Resous: demann ak limit

Atik sa a definitivman merite atansyon ki pi pre ak premye plas sou lis la.

CPU demann anjeneral swa pa espesifye ditou oswa gen yon valè ki ba anpil (pou mete anpil gous sou chak ne ke posib). Kidonk, nœuds yo vin twò chaje. Pandan tan gwo chaj, pouvwa pwosesis ne a konplètman itilize epi yon kantite travay patikilye resevwa sèlman sa li "mande" pa CPU throttling. Sa a mennen nan ogmante latansi aplikasyon, timeout, ak lòt konsekans dezagreyab. (Li plis sou sa nan lòt tradiksyon resan nou an: "Limit CPU ak throttling agresif nan Kubernetes"- environ. trad.)

BestEffort (ekstrèmeman pa gen okenn rekòmande):

resources: {}

Ekstrèmman ba CPU demann (ekstrèmeman pa gen okenn rekòmande):

   resources:
      Requests:
        cpu: "1m"

Nan lòt men an, prezans nan yon limit CPU ka mennen nan sote san rezon nan sik revèy pa gous, menm si processeur a ne pa konplètman chaje. Ankò, sa ka mennen nan ogmante reta. Konfli ap kontinye alantou paramèt la CPU CFS kota nan kernel Linux ak CPU throttling depann sou limit yo mete, osi byen ke enfimite kota CFS la... Ay, limit CPU ka lakòz plis pwoblèm pase yo ka rezoud. Ou ka jwenn plis enfòmasyon sou lyen ki anba a.

Seleksyon twòp (surkomisyon) pwoblèm memwa ka mennen nan pi gwo pwoblèm. Rive nan limit CPU a enplike nan sote sik revèy, pandan y ap rive nan limit memwa a enplike touye gous la. Èske w te janm obsève OOMkill? Wi, se egzakteman sa n ap pale.

Èske ou vle minimize chans pou sa rive? Pa sou-allocation memwa epi sèvi ak Garanti QoS (Quality of Service) lè w mete demann memwa a nan limit la (tankou nan egzanp ki anba a). Li plis sou sa nan Prezantasyon Henning Jacobs (Enjenyè dirijan nan Zalando).

Eklatman (pi gwo chans pou jwenn OOMkilled):

   resources:
      requests:
        memory: "128Mi"
        cpu: "500m"
      limits:
        memory: "256Mi"
        cpu: 2

Garanti:

   resources:
      requests:
        memory: "128Mi"
        cpu: 2
      limits:
        memory: "128Mi"
        cpu: 2

Ki sa ki pral potansyèlman ede lè mete resous yo?

Avèk metrik-sèvè ou ka wè aktyèl konsomasyon resous CPU ak itilizasyon memwa pa gous (ak resipyan andedan yo). Gen plis chans, ou deja itilize li. Jis kouri kòmandman sa yo:

kubectl top pods
kubectl top pods --containers
kubectl top nodes

Sepandan, yo montre sèlman itilizasyon aktyèl la. Li ka ba ou yon lide ki graj sou lòd la nan grandè, men finalman w ap bezwen istwa chanjman nan metrik sou tan (pou reponn kesyon tankou: "Ki sa ki te chaj CPU pik la?", "Ki sa ki te chaj la yè maten?", elatriye). Pou sa ou ka itilize Prometheus, DataDog ak lòt zouti. Yo tou senpleman jwenn mezi nan metrics-server epi estoke yo, epi itilizatè a ka rechèch yo epi trase yo kòmsadwa.

VerticalPodAutoscaler pèmèt otomatize pwosesis sa a. Li swiv CPU ak istwa itilizasyon memwa epi li etabli nouvo demann ak limit ki baze sou enfòmasyon sa a.

Sèvi ak pouvwa informatique avèk efikasite se pa yon travay fasil. Se tankou jwe Tetris tout tan. Si w ap peye twòp pou pouvwa kalkile ak konsomasyon mwayèn ki ba (di ~ 10%), nou rekòmande gade nan pwodwi ki baze sou AWS Fargate oswa Virtual Kubelet. Yo bati sou yon modèl bòdwo san sèvè/peman pou chak itilizasyon, ki ka vin pi bon mache nan kondisyon sa yo.

2. Liveness ak preparasyon sond

Pa defo, chèk lavi ak preparasyon yo pa pèmèt nan Kubernetes. Epi pafwa yo bliye limen yo...

Men, ki lòt fason ou ka kòmanse yon rekòmanse sèvis nan ka ta gen yon erè fatal? Ak ki jan balans chaj la konnen ke yon gous pare pou aksepte trafik? Oswa ke li ka okipe plis trafik?

Tès sa yo souvan konfonn youn ak lòt:

  • Lavi — chèk "sivivabilite", ki rekòmanse gous la si li echwe;
  • Preparasyon pou — tcheke preparasyon pou, si li echwe, li dekonekte gous la nan sèvis Kubernetes la (sa a ka tcheke lè l sèvi avèk kubectl get endpoints) ak trafik pa rive nan li jiskaske pwochen chèk la fini avèk siksè.

Tou de chèk sa yo FÈ PANDAN TOUT SIK LAVI POD LA. Li enpòtan anpil.

Yon miskonsepsyon komen se ke sond preparasyon yo sèlman kouri nan demaraj pou balans lan ka konnen ke gous la pare (Ready) epi yo ka kòmanse trete trafik. Sepandan, sa a se sèlman youn nan opsyon yo pou itilize yo.

Yon lòt se posiblite pou chèche konnen ke trafik la sou gous la twòp ak surcharge li (oswa gous la fè kalkil ki gen anpil resous). Nan ka sa a, tcheke preparasyon an ede redwi chaj la sou gous la epi "fre" li. Fini avèk siksè nan yon chèk preparasyon nan lavni an pèmèt ogmante chaj la sou gous la ankò. Nan ka sa a (si tès preparasyon an echwe), echèk tès la vivan ta trè kontr. Poukisa rekòmanse yon gous ki an sante epi k ap travay di?

Se poutèt sa, nan kèk ka, pa gen chèk nan tout pi bon pase pèmèt yo ak paramèt mal configuré. Jan sa di pi wo a, si chèk lavi kopi chèk preparasyon, Lè sa a, ou nan gwo pwoblèm. Opsyon posib se konfigirasyon tès preparasyon pou sèlmanAk lavi danjere kite sou kote.

Tou de kalite chèk pa ta dwe echwe lè depandans komen echwe, otreman sa ap mennen nan yon kaskad (tankou lavalas) echèk nan tout gous. Nan yon lòt sans, pa fè tèt ou mal.

3. LoadBalancer pou chak sèvis HTTP

Gen plis chans, ou gen sèvis HTTP nan gwoup ou a ke ou ta renmen voye bay mond lan deyò.

Si ou louvri sèvis la kòm type: LoadBalancer, kontwolè li yo (ki depann sou founisè sèvis la) pral bay ak negosye yon LoadBalancer ekstèn (pa nesesèman kouri sou L7, men pito menm sou L4), e sa ka afekte pri a (adrès ekstèn estatik IPv4, pouvwa informatique, bòdwo pou chak segonn). ) akòz nesesite pou kreye yon gwo kantite resous sa yo.

Nan ka sa a, li se pi plis lojik yo sèvi ak yon sèl balans chaj ekstèn, ouvèti sèvis kòm type: NodePort. Oswa pi bon toujou, elaji yon bagay tankou nginx-ingress-controller (Oswa traefik), ki moun ki pral sèl la NodePort pwen final ki asosye ak balanse chaj ekstèn lan epi yo pral wout trafik nan gwoup la lè l sèvi avèk pénétrer-Kubernetes resous yo.

Lòt (mikwo) sèvis andedan gwoup ki kominike youn ak lòt ka "kominike" lè l sèvi avèk sèvis tankou ClusterIP ak yon mekanis dekouvèt sèvis entegre atravè DNS. Jis pa sèvi ak DNS/IP piblik yo, paske sa ka afekte latansi ak ogmante pri sèvis nwaj yo.

4. Autoscaling yon gwoup san yo pa pran an kont karakteristik li yo

Lè w ajoute nœuds ak retire yo nan yon gwoup, ou pa ta dwe konte sou kèk mezi debaz tankou itilizasyon CPU sou nœuds sa yo. Planifikasyon pod dwe pran an kont anpil restriksyon yo, tankou gous / ne afinite, taints ak tolerans, demann resous, QoS, elatriye. Sèvi ak yon autoscaler ekstèn ki pa pran nuans sa yo an kont ka mennen nan pwoblèm.

Imajine ke yo ta dwe pwograme yon gous sèten, men tout pouvwa CPU ki disponib yo mande / demonte ak gous la vin bloke nan yon eta Pending. Autoscaler ekstèn wè chaj aktyèl CPU mwayèn (pa youn ki mande a) epi li pa kòmanse ekspansyon (echèl) - pa ajoute yon lòt ne. Kòm yon rezilta, gous sa a pa pral pwograme.

Nan ka sa a, ranvèse dekale (echèl nan) — retire yon ne nan yon gwoup se toujou pi difisil pou aplike. Imajine ke ou gen yon gous eta (ak depo ki pèsistan konekte). Komèsan ki pèsistan anjeneral fè pati zòn disponiblite espesifik epi yo pa repwodui nan rejyon an. Kidonk, si yon autoscaler ekstèn efase yon nod ki gen gous sa a, pwogramè a p ap kapab pwograme gous sa a sou yon lòt nod, paske sa ka fèt sèlman nan zòn disponiblite kote depo ki pèsistan an ye. Pod yo pral kole nan eta a Pending.

Trè popilè nan kominote Kubernetes la cluster-autoscaler. Li kouri sou yon gwoup, sipòte API ki soti nan gwo founisè nwaj yo, pran an kont tout restriksyon epi li ka echèl nan ka ki anwo yo. Li kapab tou ogmante pandan l ap kenbe tout limit fikse yo, kidonk ekonomize lajan (ki otreman ta depanse sou kapasite yo pa itilize).

5. Neglije kapasite IAM/RBAC

Pran prekosyon nou ak itilizatè IAM ak sekrè ki pèsistan pou machin ak aplikasyon yo. Òganize aksè tanporè lè l sèvi avèk wòl ak kont sèvis (kont sèvis).

Nou souvan rankontre lefèt ke kle aksè (ak sekrè) yo difisil nan konfigirasyon aplikasyon an, osi byen ke neglije wotasyon an nan sekrè malgre gen aksè a Cloud IAM. Sèvi ak wòl IAM ak kont sèvis olye pou itilizatè yo kote sa apwopriye.

10 Erè komen lè w ap itilize Kubernetes

Bliye sou kube2iam epi ale tou dwat nan wòl IAM pou kont sèvis (jan sa dekri nan nòt ki gen menm non an Štěpán Vraný):

apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/my-app-role
  name: my-serviceaccount
  namespace: default

Yon sèl annotation. Pa sa difisil, dwa?

Epitou, pa bay privilèj kont sèvis ak pwofil egzanp admin и cluster-adminsi yo pa bezwen li. Sa a se yon ti kras pi difisil aplike, espesyalman nan RBAC K8s, men definitivman vo efò a.

6. pa konte sou otomatik anti-affinité pou gous

Imajine ke ou gen twa kopi kèk deplwaman sou yon ne. Ne a tonbe, ak ansanm ak li tout kopi yo. Sitiyasyon dezagreyab, pa vre? Men, poukisa tout kopi yo te sou menm ne? Èske Kubernetes pa sipoze bay disponiblite segondè (HA)?!

Malerezman, pwogramasyon Kubernetes, sou pwòp inisyativ li, pa konfòme yo ak règ egzistans separe. (anti-afinite) pou gous. Yo dwe deklare klèman:

// опущено для краткости
      labels:
        app: zk
// опущено для краткости
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: "app"
                    operator: In
                    values:
                    - zk
              topologyKey: "kubernetes.io/hostname"

Se tout. Koulye a, gous yo pral pwograme sou nœuds diferan (kondisyon sa a tcheke sèlman pandan orè, men se pa pandan operasyon yo - pakonsekan requiredDuringSchedulingIgnoredDuringExecution).

Isit la nou ap pale de podAntiAffinity sou diferan nœuds: topologyKey: "kubernetes.io/hostname", - epi yo pa sou diferan zòn disponiblite. Pou aplike yon HA plen véritable, w ap oblije fouye pi fon nan sijè sa a.

7. Inyore PodDisruptionBudgets

Imajine ke ou gen yon chaj pwodiksyon sou yon gwoup Kubernetes. Tanzantan, nœuds ak gwoup la tèt li dwe mete ajou (oswa dekomisyone). PodDisruptionBudget (PDB) se yon bagay tankou yon akò garanti sèvis ant administratè gwoup ak itilizatè yo.

PDB pèmèt ou evite entèripsyon sèvis ki te koze pa yon mank de nœuds:

apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: zk-pdb
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app: zookeeper

Nan egzanp sa a, ou menm, antanke itilizatè gwoup la, di administratè yo: "Hey, mwen gen yon sèvis zookeeper, e kèlkeswa sa ou fè, mwen ta renmen genyen omwen 2 kopi sèvis sa a toujou disponib."

Ou ka li plis sou sa isit la.

8. Plizyè itilizatè oswa anviwònman nan yon gwoup komen

Espas non Kubernetes (espas non) pa bay izolasyon fò.

Yon move konsepsyon komen se ke si ou deplwaye yon chaj ki pa prod nan yon espas non ak yon chaj prod nan yon lòt, Lè sa a, yo pa pral enfliyanse youn lòt nan okenn fason... Sepandan, yon sèten nivo izolasyon ka reyalize lè l sèvi avèk demann resous/limitasyon, mete kota, ak fikse priyoriteKlas. Gen kèk izolasyon "fizik" nan plan done yo bay pa afinite, tolerans, tach (oswa nodeselectors), men separasyon sa a se byen. difisil aplike.

Moun ki bezwen konbine tou de kalite chaj travay nan menm gwoup la pral gen fè fas ak konpleksite. Si pa gen okenn bezwen sa yo, epi ou kapab peye gen youn yon lòt gwoup (di, nan yon nwaj piblik), Lè sa a, li pi bon fè sa. Sa a pral reyalize yon nivo pi wo nan izolasyon.

9. externalTrafficPolicy: Cluster

Trè souvan nou wè ke tout trafik andedan gwoup la vini atravè yon sèvis tankou NodePort, pou ki règleman defo a fikse. externalTrafficPolicy: Cluster... Sa vle di sa NodePort ouvri sou chak ne nan gwoup la, epi ou ka itilize nenpòt nan yo pou kominike avèk sèvis ou vle a (ansanm gous).

10 Erè komen lè w ap itilize Kubernetes

An menm tan an, gous reyèl ki asosye ak sèvis NodePort mansyone anwo a yo anjeneral disponib sèlman sou yon sèten sou-ansanm nan nœuds sa yo. Nan lòt mo, si mwen konekte ak yon ne ki pa gen gous ki nesesè yo, li pral voye trafik nan yon lòt ne, ajoute yon hop ak ogmante latansi (si nœuds yo sitiye nan diferan zòn disponiblite/sant done, latansi a ka byen wo; anplis, depans trafik soti yo ap ogmante).

Nan lòt men an, si yon sèten sèvis Kubernetes gen yon seri politik externalTrafficPolicy: Local, Lè sa a, NodePort ouvè sèlman sou nœuds sa yo kote gous ki nesesè yo aktyèlman ap kouri. Lè w ap itilize yon balans chaj ekstèn ki tcheke eta a (tcheke sante) pwen final (ki jan li fè AWS ELB), Li pral voye trafik sèlman nan nœuds ki nesesè yo, ki pral gen yon efè benefik sou reta, bezwen enfòmatik, bòdwo sòti (ak bon sans dikte menm bagay la).

Gen yon gwo chans ke w ap deja itilize yon bagay tankou traefik oswa nginx-ingress-controller kòm yon pwen final NodePort (oswa LoadBalancer, ki itilize tou NodePort) pou wout trafik HTTP antre, epi mete opsyon sa a ka siyifikativman redwi latansi pou demann sa yo.

В piblikasyon sa a Ou ka aprann plis sou Politik Trafik ekstèn, avantaj ak dezavantaj li yo.

10. Pa mare ak grap epi pa abize avyon kontwòl la

Anvan sa, li te òdinè pou rele sèvè pa pwòp non: Anton, HAL9000 ak Colossus... Jodi a yo te ranplase pa idantifyan ki te pwodwi owaza. Sepandan, abitid la rete, e kounye a, non pwòp yo ale nan grap.

Yon istwa tipik (ki baze sou evènman reyèl): li tout te kòmanse ak yon prèv konsèp, kidonk gwoup la te gen yon non fyè. tès… Ane pase epi li toujou itilize nan pwodiksyon, epi tout moun pè manyen li.

Pa gen anyen ki amizan sou grap yo tounen bèt kay, kidonk nou rekòmande pou retire yo detanzantan pandan y ap pratike rekiperasyon dezas (sa ap ede jeni dezòd - approx. trad.). Anplis de sa, li pa ta fè mal nan travay sou kouch kontwòl la (avyon kontwòl). Lè w pè manyen li se pa yon bon siy. elatriye. mouri? Mesye, ou vrèman nan pwoblèm!

Nan lòt men an, ou pa ta dwe jwenn pote ale ak manipile li. Ak tan kouch kontwòl la ka vin dousman. Gen plis chans, sa a se akòz yon gwo kantite objè yo te kreye san yo pa wotasyon yo (yon sitiyasyon komen lè w ap itilize Helm ak anviwònman default, ki se poukisa eta li yo nan configmaps / sekrè pa mete ajou - kòm yon rezilta, dè milye de objè akimile nan kouch kontwòl la) oswa ak koreksyon konstan nan objè kube-api (pou dekale otomatik, pou CI/CD, pou siveyans, mòso bwa evènman, contrôleur, elatriye).

Anplis de sa, nou rekòmande tcheke akò SLA/SLO yo ak founisè Kubernetes jere a epi peye atansyon sou garanti yo. Vandè a ka garanti kontwòl disponiblite kouch (oswa konpozan li yo), men se pa reta p99 demann ou voye ba li. Nan lòt mo, ou ka antre kubectl get nodes, epi resevwa yon repons sèlman apre 10 minit, epi sa a pa pral yon vyolasyon kondisyon ki nan akò sèvis la.

11. Bonis: lè l sèvi avèk dènye tag la

Men, sa a se deja yon klasik. Dènyèman nou te rankontre teknik sa a mwens souvan, paske anpil moun, ki te aprann nan eksperyans anmè, te sispann itilize tag la. :latest e li te kòmanse pinning vèsyon. Houra!

ECR kenbe imuabilite nan tags imaj; Nou rekòmande ke ou familyarize tèt ou ak karakteristik remakab sa a.

Rezime

Pa atann tout bagay travay lannwit lan: Kubernetes se pa yon Miracles. Move aplikasyon ap rete konsa menm nan Kubernetes (epi li pral pwobableman vin pi mal). Neglijans ap mennen nan konpleksite twòp, travay ralanti ak estrès nan kouch kontwòl la. Anplis de sa, ou riske rete san yon estrateji rekiperasyon dezas. Pa atann Kubernetes bay izolasyon ak disponiblite segondè soti nan bwat la. Pase kèk tan fè aplikasyon w lan vrèman nwaj natif natal.

Ou ka fè konesans ak eksperyans yo san siksè nan divès ekip nan koleksyon istwa sa a pa Henning Jacobs.

Moun ki vle ajoute nan lis erè yo bay nan atik sa a ka kontakte nou sou Twitter (@MarekBartik, @MstrsObserver).

PS soti nan tradiktè

Li tou sou blog nou an:

Sous: www.habr.com

Add nouvo kòmantè