Ki jan yo jwenn aksè nan resous Kubernetes Pod

Ki jan yo jwenn aksè nan resous Kubernetes PodRekonpans la pa Tohad

Lè w kòmanse ak Kubernetes, li komen pou w bliye mete resous veso yo. Nan pwen sa a, li ase asire ke imaj la Docker travay epi yo ka deplwaye nan gwoup la Kubernetes.

Men, pita aplikasyon an bezwen deplwaye nan yon gwoup pwodiksyon ansanm ak lòt aplikasyon. Pou fè sa, ou bezwen asiyen resous pou veso a epi asire w ke gen ase nan yo jwenn aplikasyon an moute ak kouri, epi ke lòt aplikasyon kouri pa pral fè eksperyans pwoblèm.

Ekip Kubernetes aaS soti nan Mail.ru tradui yon atik sou resous veso (CPU & MEM), demann ak limit resous yo. Ou pral aprann benefis ki genyen nan paramèt sa yo ak sa k ap pase si ou pa mete yo.

Resous enfòmatik

Nou gen de kalite resous ak inite sa yo:

  • Inite pwosesis santral (CPU) - nwayo;
  • Memwa (MEM) - bytes.

Resous yo espesifye pou chak veso. Nan dosye Pod YAML sa a, ou pral wè yon seksyon resous ki gen resous yo mande yo ak limite:

  • Requested Pod Resources = sòm resous yo mande pou tout veso yo;
  • Limit Resous Pod = Sòm tout Limit Resous Pod.

apiVersion: v1
kind: Pod
metadata:
  name: backend-pod-name
  labels:
    application: backend
spec:
  containers:
    — name: main-container
      image: my-backend
      tag: v1
      ports:
      — containerPort: 8080
      resources:
        requests:
          cpu: 0.2 # REQUESTED CPU: 200m cores
          memory: "1Gi" # REQUESTED MEM: 1Gi
        limits:
          cpu: 1 # MAX CPU USAGE: 1 core
          memory: "1Gi" # MAX MEM USAGE:  1Gi
    — name: other-container
      image: other-app
      tag: v1
      ports:
      — containerPort: 8000
      resources:
        requests:
          cpu: "200m" # REQUESTED CPU: 200m cores
          memory: "0.5Gi" # REQUESTED MEM: 0.5Gi
        limits:
          cpu: 1 # MAX CPU USAGE: 1 core
          memory: "1Gi" # MAX MEM USAGE:  1Gi

Egzanp Resous Mande ak Limite

Jaden resources.requested soti nan spesifikasyon Pod la se youn nan eleman yo ki itilize yo jwenn ne a vle. Ou ka deja planifye deplwaman Pod pou li. Ki jan ou fè jwenn yon ne apwopriye?

Kubernetes konsiste de plizyè konpozan, ki gen ladan yon ne mèt oswa yon ne mèt (Kubernetes Control Plane). Ne mèt la gen plizyè pwosesis: kube-apiserver, kube-controller-manager ak kube-scheduler.

Pwosesis kube-scheduler la responsab pou revize gous ki fèk kreye epi jwenn nœuds travayè posib ki matche ak tout demann gous yo, ki gen ladan kantite resous yo mande yo. Lis nœuds yo jwenn pa kube-scheduler klase. Se gous la pwograme sou ne ki gen pi gwo nòt yo.

Ki jan yo jwenn aksè nan resous Kubernetes PodKi kote yo pral mete Pod la koulè wouj violèt?

Nan foto a ou ka wè ke kube-scheduler ta dwe planifye yon nouvo Pod koulè wouj violèt. Gwoup Kubernetes la gen de nœuds: A ak B. Kòm ou ka wè, kube-scheduler pa ka pwograme yon Pod sou ne A - resous ki disponib (ki pa mande) yo pa matche ak demann yo nan Pod la koulè wouj violèt. Se konsa, 1 GB memwa ki mande pa Pod la koulè wouj violèt pa pral anfòm sou ne A, paske memwa ki disponib la se 0,5 GB. Men, ne B gen ase resous. Kòm yon rezilta, kube-scheduler deside ke destinasyon Pod la koulè wouj violèt se ne B.

Koulye a, nou konnen ki jan resous yo mande yo afekte chwa nan ne pou kouri Pod la. Men, ki enpak resous majinal yo?

Limit resous la se yon fwontyè ke CPU/MEM pa ka travèse. Sepandan, resous CPU a fleksib, kidonk resipyan ki rive nan limit CPU yo pa pral lakòz Pod la sòti. Olye de sa, CPU throttling ap kòmanse. Si yo rive nan limit itilizasyon MEM, veso a pral sispann akòz OOM-Killer epi rekòmanse si anviwònman RestartPolicy pèmèt li.

Mande ak maksimòm resous an detay

Ki jan yo jwenn aksè nan resous Kubernetes PodKominikasyon resous ant Docker ak Kubernetes

Pi bon fason pou eksplike kijan demann resous ak limit resous travay se prezante relasyon ki genyen ant Kubernetes ak Docker. Nan imaj ki anwo a ou ka wè ki jan jaden Kubernetes yo ak drapo demaraj Docker yo gen rapò.

Memwa: demann ak limit

containers:
...
 resources:
   requests:
     memory: "0.5Gi"
   limits:
     memory: "1Gi"

Kòm mansyone pi wo a, memwa mezire an byte. Baze sou Dokiman Kubernetes, nou ka presize memwa kòm yon nimewo. Anjeneral li se yon nonb antye relatif, pou egzanp 2678 - sa vle di, 2678 bytes. Ou ka sèvi ak sifiks tou G и Gi, Bagay pwensipal lan se sonje ke yo pa ekivalan. Premye a se desimal ak dezyèm lan se binè. Tankou egzanp ki mansyone nan dokiman k8s la: 128974848, 129e6, 129M, 123Mi - yo pratikman ekivalan.

Opsyon Kubernetes limits.memory matche ak drapo a --memory soti nan Docker. Nan ka request.memory Pa gen okenn flèch pou Docker paske Docker pa sèvi ak jaden sa a. Ou ka mande, èske sa a menm nesesè? Wi bezwen. Kòm mwen te di anvan, jaden an enpòtan pou Kubernetes. Ki baze sou enfòmasyon ki soti nan li, kube-scheduler deside sou ki nod pou planifye Pod la.

Kisa k ap pase si ou mete memwa ensifizan pou yon demann?

Si veso a rive nan limit memwa yo mande a, Lè sa a, Pod la mete nan yon gwoup Pods ki sispann lè pa gen ase memwa nan ne la.

Kisa k ap pase si ou mete limit memwa a twò ba?

Si veso a depase limit memwa a, li pral sispann akòz OOM-Killed. Epi yo pral rekòmanse si sa posib ki baze sou RestartPolicy kote valè default la ye Always.

Kisa k ap pase si ou pa presize memwa yo mande a?

Kubernetes pral pran valè limit la epi mete l kòm valè default.

Kisa ki ka rive si ou pa presize yon limit memwa?

Veso a pa gen okenn restriksyon; li ka itilize otan memwa jan li vle. Si li kòmanse sèvi ak tout memwa ki disponib nan ne la, Lè sa a, OOM pral touye l '. Lè sa a, veso a pral rekòmanse si sa posib dapre RestartPolicy.

Kisa k ap pase si ou pa presize limit memwa?

Sa a se senaryo ki pi mal la: orè a pa konnen konbyen resous veso a mande, e sa ka lakòz pwoblèm grav sou ne la. Nan ka sa a, li ta bon pou gen limit default sou espas non an (tabli pa LimitRange). Pa gen limit default - Pod la pa gen limit, li ka itilize otan memwa jan li vle.

Si memwa yo mande a pi plis pase node a ka ofri, Pod la p ap pwograme. Li enpòtan pou w sonje sa Requests.memory - pa valè minimòm lan. Sa a se yon deskripsyon kantite memwa ase pou kenbe veso a kouri kontinyèlman.

Li anjeneral rekòmande yo mete menm valè a pou request.memory и limit.memory. Sa asire ke Kubernetes pa pral pwograme yon Pod sou yon ne ki gen ase memwa pou kouri Pod la men ki pa ase pou kouri li. Kenbe nan tèt ou: Kubernetes Pod planifikasyon sèlman pran an kont requests.memoryAk limits.memory pa pran an kont.

CPU: demann ak limit

containers:
...
 resources:
   requests:
     cpu: 1
   limits:
     cpu: "1200m"

Avèk yon CPU tout bagay se yon ti kras pi konplike. Retounen nan foto a nan relasyon ki genyen ant Kubernetes ak Docker, ou ka wè sa request.cpu Korespondan --cpu-shares, tandiske limit.cpu matche ak drapo a cpus nan Docker.

CPU ke Kubernetes mande yo miltipliye pa 1024, pwopòsyon sik CPU yo. Si ou vle mande 1 nwayo konplè, ou dwe ajoute cpu: 1jan yo montre pi wo a.

Mande yon nwayo konplè (pwopòsyon = 1024) pa vle di veso ou a pral resevwa li. Si machin lame ou a gen yon sèl nwayo epi w ap kouri plis pase yon veso, Lè sa a, tout veso yo dwe pataje CPU ki disponib nan mitan yo. Ki jan sa rive? Ann gade foto a.

Ki jan yo jwenn aksè nan resous Kubernetes Pod
Demann CPU - Sistèm debaz sèl

Ann imajine ke ou gen yon sistèm lame yon sèl-nwayo kouri kontenè. Manman (Kubernetes) kwit yon tat (CPU) epi li vle divize li ant timoun (resipyan). Twa timoun vle yon tat antye (pwopòsyon = 1024), yon lòt timoun vle mwatye yon tat (512). Manman an vle jis e li fè yon kalkil senp.

# Сколько пирогов хотят дети?
# 3 ребенка хотят по целому пирогу и еще один хочет половину пирога
cakesNumberKidsWant = (3 * 1) + (1 * 0.5) = 3.5
# Выражение получается так:
3 (ребенка/контейнера) * 1 (целый пирог/полное ядро) + 1 (ребенок/контейнер) * 0.5 (половина пирога/половина ядра)
# Сколько пирогов испечено?
availableCakesNumber = 1
# Сколько пирога (максимально) дети реально могут получить?
newMaxRequest = 1 / 3.5 =~ 28%

Dapre kalkil la, twa timoun yo pral resevwa 28% nan nwayo a, epi yo pa nwayo a tout antye. Katriyèm pitit la ap resevwa 14% nan nwayo a plen, pa mwatye. Men, bagay yo pral diferan si ou gen yon sistèm milti-nwayo.

Ki jan yo jwenn aksè nan resous Kubernetes Pod
Demann CPU - Multi-Nwayo (4) Sistèm

Nan imaj ki anwo a ou ka wè ke twa timoun vle yon tat antye, ak youn vle mwatye. Depi manman an te kwit kat pi, chak pitit li yo pral jwenn otan yo vle. Nan yon sistèm milti-nwayo, resous processeur yo distribye atravè tout nwayo processeur ki disponib. Si yon veso limite a mwens pase yon nwayo plen CPU, li ka toujou sèvi ak li nan 100%.

Kalkil ki anwo yo senplifye pou konprann kijan CPU distribye nan mitan resipyan yo. Natirèlman, san konte resipyan yo tèt yo, gen lòt pwosesis ki sèvi ak resous CPU tou. Lè pwosesis nan yon sèl veso yo san fè anyen konsa, lòt moun ka itilize resous li yo. CPU: "200m" Korespondan CPU: 0,2, ki vle di apeprè 20% nan yon nwayo.

Koulye a, ann pale sou limit.cpu. CPU ke Kubernetes limite a miltipliye pa 100. Rezilta a se kantite tan veso a ka itilize chak 100 µs (cpu-period).

limit.cpu matche ak drapo Docker la --cpus. Sa a se yon nouvo konbinezon de ansyen --cpu-period и --cpu-quota. Lè nou fikse li, nou endike konbyen resous CPU ki disponib veso a ka itilize maksimòm anvan throttling kòmanse:

  • CPU - konbinezon cpu-period и cpu-quota. cpus = 1.5 ekivalan a anviwònman cpu-period = 100000 и cpu-quota = 150000;
  • CPU-peryòd - peryòd CPU CFS orè, default 100 mikrosgond;
  • CPU-quota - kantite mikrosgond andedan cpu-period, ki limite pa veso a.

Kisa k ap pase si ou enstale CPU mande ensifizan?

Si veso a bezwen plis pase li te enstale, li pral vòlè CPU nan lòt pwosesis.

Kisa k ap pase si ou mete limit CPU a twò ba?

Depi resous CPU a se reglabl, throttling ap vire sou.

Kisa k ap pase si ou pa presize yon demann CPU?

Menm jan ak memwa, valè demann lan egal a limit la.

Kisa k ap pase si ou pa presize yon limit CPU?

Veso a pral sèvi ak CPU anpil jan li bezwen. Si yo defini yon règleman CPU default (LimitRange) nan espas non an, Lè sa a, limit sa a yo itilize tou pou veso a.

Kisa k ap pase si ou pa presize yon demann oswa yon limit CPU?

Menm jan ak memwa, sa a se senaryo ki pi mal la. Planifikatè a pa konnen konbyen resous veso ou bezwen, e sa ka lakòz pwoblèm grav sou nod la. Pou evite sa a, ou bezwen mete limit default pou espas non (LimitRange).

Sonje byen: si w mande plis CPU pase nœuds yo ka bay, Pod la p ap pwograme. Requests.cpu - pa valè minimòm lan, men yon valè ase pou kòmanse Pod la ak travay san echèk. Si aplikasyon an pa fè kalkil konplèks, opsyon ki pi bon se enstale request.cpu <= 1 epi lanse anpil kopi jan sa nesesè.

Ideyal kantite resous yo mande oswa limit resous yo

Nou te aprann sou limit resous enfòmatik yo. Kounye a li lè pou reponn kesyon an: “Konbyen resous Pod mwen an bezwen pou kouri aplikasyon an san pwoblèm? Ki kantite ideyal la?

Malerezman, pa gen repons klè pou kesyon sa yo. Si ou pa konnen ki jan aplikasyon w lan ap travay oswa ki kantite CPU oswa memwa li bezwen, opsyon ki pi bon se bay aplikasyon an anpil memwa ak CPU epi fè tès pèfòmans.

Anplis tès pèfòmans, kontwole konpòtman aplikasyon an nan siveyans pou yon semèn. Si graf yo endike ke aplikasyon w lan ap konsome mwens resous pase sa w te mande a, ou ka diminye kantite CPU oswa memwa yo mande a.

Kòm yon egzanp wè sa a Grafana tablodbò. Li montre diferans ki genyen ant resous yo mande yo oswa limit resous yo ak itilizasyon resous aktyèl la.

Konklizyon

Mande ak limite resous ede kenbe gwoup Kubernetes ou an sante. Konfigirasyon limit apwopriye minimize depans yo epi kenbe aplikasyon yo kouri tout tan.

Nan ti bout tan, gen kèk bagay ou dwe sonje:

  1. Resous yo mande yo se yon konfigirasyon ki pran an kont nan tan demaraj (lè Kubernetes planifye pou òganize aplikasyon an). Kontrèman, limite resous enpòtan nan ègzekutabl-lè aplikasyon an deja ap kouri sou ne la.
  2. Konpare ak memwa, CPU a se yon resous reglemante. Si pa gen ase CPU, Pod ou a pa pral fèmen epi mekanis nan throttling pral limen.
  3. Resous yo mande yo ak limit resous yo pa valè minimòm ak maksimòm! Lè w defini resous yo mande yo, ou asire aplikasyon an ap kouri san pwoblèm.
  4. Yon bon pratik se mete demann lan memwa egal a limit memwa a.
  5. Oke enstale yo mande CPU <=1, si aplikasyon an pa fè kalkil konplèks.
  6. Si w mande plis resous pase sa ki disponib sou yon nœud, Pod la p ap janm pwograme nan nœud sa a.
  7. Pou detèmine kantite lajan ki kòrèk la nan resous yo mande yo / limit resous, itilize tès chaj ak siveyans.

Mwen espere ke atik sa a ede w konprann konsèp debaz limitasyon resous yo. Epi w ap kapab aplike konesans sa a nan travay ou.

Good Luck!

Ki lòt bagay pou li:

  1. Obsèvabilite SRE: Espas non ak estrikti metrik.
  2. 90+ Zouti itil pou Kubernetes: Deplwaman, Jesyon, Siveyans, Sekirite ak plis ankò.
  3. Chanèl nou an alantou Kubernetes nan Telegram.

Sous: www.habr.com

Add nouvo kòmantè