Kubernetes Pod Resurslarına necə daxil olmaq olar

Kubernetes Pod Resurslarına necə daxil olmaq olarTohad tərəfindən mükafat

Kubernetes ilə işə başladıqda, konteyner resurslarının qurulmasını unutmaq adi haldır. Bu nöqtədə, Docker təsvirinin işləməsini və Kubernetes klasterinə yerləşdirilə biləcəyini təmin etmək kifayətdir.

Lakin daha sonra proqram digər tətbiqlərlə birlikdə istehsal klasterində yerləşdirilməlidir. Bunu etmək üçün konteyner üçün resurslar ayırmalı və proqramın işə salınması üçün onların kifayət qədər olduğuna və digər işləyən proqramların problem yaşamayacağına əmin olmalısınız.

Komanda Mail.ru-dan Kubernetes aaS konteyner resursları (CPU və MEM), sorğular və resurs məhdudiyyətləri haqqında məqaləni tərcümə etdi. Siz bu parametrlərin üstünlüklərini və onları qurmasanız nə olacağını öyrənəcəksiniz.

Hesablama resursları

Aşağıdakı vahidlərlə iki növ resursumuz var:

  • Mərkəzi prosessor (CPU) - nüvələr;
  • Yaddaş (MEM) - bayt.

Resurslar hər bir konteyner üçün müəyyən edilir. Aşağıdakı Pod YAML faylında siz tələb olunan və məhdudlaşdıran resursları ehtiva edən resurs bölməsini görəcəksiniz:

  • Requested Pod Resources = bütün konteynerlərin tələb olunan resurslarının cəmi;
  • Pod Resurs Limiti = Bütün Pod Resurs Limitlərinin cəmi.

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

Tələb olunan və Məhdud Resursların Nümunəsi

Sahə resources.requested spesifikasiyadan Pod istədiyiniz nodu tapmaq üçün istifadə olunan elementlərdən biridir. Artıq bunun üçün Pod yerləşdirməsini planlaşdıra bilərsiniz. Uyğun qovşağı necə tapmaq olar?

Kubernetes master node və ya master node (Kubernetes Control Plane) daxil olmaqla bir neçə komponentdən ibarətdir. Master node bir neçə prosesə malikdir: kube-apiserver, kube-nəzarətçi-meneceri və kube-planlaşdırıcı.

Kube-planlaşdırıcı prosesi yeni yaradılmış podları nəzərdən keçirmək və bütün pod sorğularına, o cümlədən tələb olunan resursların sayına uyğun gələn mümkün işçi qovşaqlarını tapmaq üçün məsuliyyət daşıyır. Kube-planlaşdırıcı tərəfindən tapılan qovşaqların siyahısı sıralanır. Pod ən yüksək bal toplayan qovşaqda planlaşdırılıb.

Kubernetes Pod Resurslarına necə daxil olmaq olarBənövşəyi Pod harada yerləşdiriləcək?

Şəkildə görə bilərsiniz ki, kube planlaşdırıcı yeni bənövşəyi Pod planlaşdırmalıdır. Kubernetes klasterində iki qovşaq var: A və B. Gördüyünüz kimi, kube planlaşdırıcı A qovşağında Pod planlaşdıra bilməz - mövcud (tələb olunmayan) resurslar bənövşəyi Pod-un sorğularına uyğun gəlmir. Beləliklə, bənövşəyi Pod tərəfindən tələb olunan 1 GB yaddaş, mövcud yaddaş 0,5 GB olduğu üçün A qovşağına uyğun gəlməyəcək. Lakin B node kifayət qədər resursa malikdir. Nəticədə kube-planlaşdırıcı bənövşəyi podun təyinatının B node olduğuna qərar verir.

İndi biz tələb olunan resursların Pod-u işə salmaq üçün node seçiminə necə təsir etdiyini bilirik. Bəs marjinal resursların təsiri nədir?

Resurs limiti CPU/MEM-in keçə bilməyəcəyi sərhəddir. Bununla belə, CPU resursu çevikdir, ona görə də CPU limitlərinə çatan konteynerlər Pod-un çıxmasına səbəb olmayacaq. Bunun əvəzinə CPU tənzimləməsi başlayacaq. MEM istifadə limitinə çatarsanız, konteyner OOM-Killer səbəbiylə dayandırılacaq və RestartPolicy ayarı tərəfindən icazə verildiyi təqdirdə yenidən işə salınacaq.

Təfərrüatlı şəkildə tələb olunan və maksimum resurslar

Kubernetes Pod Resurslarına necə daxil olmaq olarDocker və Kubernetes arasında resurs əlaqəsi

Resurs sorğularının və resurs məhdudiyyətlərinin necə işlədiyini izah etməyin ən yaxşı yolu Kubernetes və Docker arasındakı əlaqəni təqdim etməkdir. Yuxarıdakı şəkildə siz Kubernetes sahələrinin və Docker başlanğıc bayraqlarının necə əlaqəli olduğunu görə bilərsiniz.

Yaddaş: tələb və məhdudiyyət

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

Yuxarıda qeyd edildiyi kimi, yaddaş baytla ölçülür. Əsasən Kubernetes sənədləri, yaddaşı ədəd kimi təyin edə bilərik. Adətən tam ədəddir, məsələn 2678 - yəni 2678 bayt. Siz şəkilçilərdən də istifadə edə bilərsiniz G и Gi, əsas şey onların ekvivalent olmadığını xatırlamaqdır. Birincisi onluq, ikincisi isə ikilikdir. K8s sənədlərində qeyd olunan nümunə kimi: 128974848, 129e6, 129M, 123Mi - onlar praktiki olaraq ekvivalentdirlər.

Kubernetes seçimi limits.memory bayrağa uyğun gəlir --memory Docker-dən. halda request.memory Docker üçün heç bir ox yoxdur, çünki Docker bu sahədən istifadə etmir. Soruşa bilərsiniz ki, buna ehtiyac varmı? Bəli lazımdır. Daha əvvəl dediyim kimi, sahə Kubernetes üçün vacibdir. Ondan əldə edilən məlumatlara əsasən kube-planlaşdırıcı Pod-u planlaşdırmaq üçün hansı qovşağı qərar verir.

Sorğu üçün kifayət qədər yaddaş təyin etsəniz nə olar?

Konteyner tələb olunan yaddaşın hüdudlarına çatmışdırsa, Pod qovşaqda kifayət qədər yaddaş olmadıqda dayanan Podlar qrupuna yerləşdirilir.

Yaddaş limitini çox aşağı təyin etsəniz nə olar?

Konteyner yaddaş limitini keçərsə, OOM-Killed səbəbiylə dayandırılacaq. Mümkünsə, standart dəyərin olduğu RestartPolicy əsasında yenidən başlayacaq Always.

Tələb olunan yaddaşı göstərməsəniz nə olar?

Kubernetes limit dəyərini götürəcək və onu defolt dəyər kimi təyin edəcək.

Yaddaş limitini təyin etməsəniz nə baş verə bilər?

Konteynerin heç bir məhdudiyyəti yoxdur, o, istədiyi qədər yaddaşdan istifadə edə bilər. O, qovşağın bütün mövcud yaddaşından istifadə etməyə başlasa, OOM onu öldürəcək. Konteyner, mümkünsə, RestartPolicy əsasında yenidən işə salınacaq.

Yaddaş məhdudiyyətlərini təyin etməsəniz nə olar?

Bu, ən pis vəziyyət ssenarisidir: planlaşdırıcı konteynerin nə qədər resurs tələb etdiyini bilmir və bu, qovşaqda ciddi problemlər yarada bilər. Bu halda, ad məkanında standart məhdudiyyətlərin olması yaxşı olardı (LimitRange tərəfindən təyin olunur). Defolt məhdudiyyətlər yoxdur - Pod-un heç bir məhdudiyyəti yoxdur, o, istədiyi qədər yaddaşdan istifadə edə bilər.

Əgər tələb olunan yaddaş qovşağın təklif edə biləcəyindən çox olarsa, Pod planlaşdırılmayacaq. Bunu yadda saxlamaq vacibdir Requests.memory - minimum dəyər deyil. Bu, konteynerin davamlı işləməsini təmin etmək üçün kifayət qədər yaddaş həcminin təsviridir.

Adətən eyni dəyəri təyin etmək tövsiyə olunur request.memory и limit.memory. Bu, Kubernetesin Pod-u işə salmaq üçün kifayət qədər yaddaşı olan, lakin onu işə salmaq üçün kifayət etməyən bir qovşaqda Pod planlaşdırmamasını təmin edir. Unutmayın: Kubernetes Pod planlaşdırması yalnız nəzərə alınır requests.memorylimits.memory nəzərə almır.

CPU: sorğu və limit

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

CPU ilə hər şey bir az daha mürəkkəbdir. Kubernetes və Docker arasındakı əlaqənin şəklinə qayıdaraq, bunu görə bilərsiniz request.cpu uyğun gəlir --cpu-shares, Halbuki limit.cpu bayrağa uyğun gəlir cpus Docker-də.

Kubernetes-in tələb etdiyi CPU, CPU dövrlərinin nisbəti olan 1024-ə vurulur. 1 tam nüvə tələb etmək istəyirsinizsə, əlavə etməlisiniz cpu: 1yuxarıda göstərildiyi kimi.

Tam kernel tələb etmək (proporsiya = 1024) konteynerinizin onu alacağı demək deyil. Əgər host maşınınızın yalnız bir nüvəsi varsa və siz birdən çox konteyner işlədirsinizsə, onda bütün konteynerlər mövcud CPU-nu öz aralarında paylaşmalıdırlar. Bu necə baş verir? Şəkilə baxaq.

Kubernetes Pod Resurslarına necə daxil olmaq olar
CPU Sorğu - Tək nüvəli sistem

Təsəvvür edək ki, konteynerlərlə işləyən tək nüvəli host sisteminiz var. Ana (Kubernetes) bir pasta (CPU) bişirdi və onu uşaqlar (konteynerlər) arasında bölmək istəyir. Üç uşaq bütöv bir pasta istəyir (nisbət = 1024), başqa bir uşaq yarım tort istəyir (512). Ana ədalətli olmaq istəyir və sadə hesablama aparır.

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

Hesablamaya əsasən, üç uşaq bütün nüvəni deyil, nüvənin 28% -ni alacaq. Dördüncü uşaq tam nüvənin yarısını deyil, 14%-ni alacaq. Ancaq çox nüvəli bir sisteminiz varsa, hər şey fərqli olacaq.

Kubernetes Pod Resurslarına necə daxil olmaq olar
CPU Sorğu - Çox Nüvəli (4) Sistem

Yuxarıdakı şəkildə üç uşağın bütöv bir pasta, birinin isə yarısını istədiyini görə bilərsiniz. Ana dörd piroq bişirdiyinə görə, hər övladı istədiyi qədər alacaq. Çoxnüvəli sistemdə prosessor resursları bütün mövcud prosessor nüvələri arasında paylanır. Bir konteyner birdən az tam CPU nüvəsi ilə məhdudlaşırsa, o, hələ də 100% istifadə edə bilər.

Yuxarıdakı hesablamalar CPU-nun konteynerlər arasında necə paylandığını başa düşmək üçün sadələşdirilmişdir. Əlbəttə ki, konteynerlərin özündən başqa, CPU resurslarından istifadə edən digər proseslər də var. Bir konteynerdəki proseslər boş olduqda, digərləri onun resursundan istifadə edə bilər. CPU: "200m" uyğun gəlir CPU: 0,2, bu bir nüvənin təxminən 20%-i deməkdir.

İndi bu barədə danışaq limit.cpu. Kubernetes-in məhdudlaşdırdığı CPU 100-ə vurulur. Nəticə konteynerin hər 100 µs-dən bir istifadə edə biləcəyi vaxtdır (cpu-period).

limit.cpu Docker bayrağına uyğun gəlir --cpus. Bu köhnənin yeni birləşməsidir --cpu-period и --cpu-quota. Onu təyin etməklə, tənzimləmə başlamazdan əvvəl konteynerin maksimum istifadə edə biləcəyi nə qədər CPU resursunu göstəririk:

  • CPU - birləşmə cpu-period и cpu-quota. cpus = 1.5 təyinatına bərabərdir cpu-period = 100000 и cpu-quota = 150000;
  • CPU-dövrü - dövr CPU CFS planlayıcısı, standart 100 mikrosaniyə;
  • cpu-kvota - daxilindəki mikrosaniyələrin sayı cpu-period, konteyner ilə məhdudlaşır.

Yetərsiz tələb olunan CPU quraşdırsanız nə olacaq?

Konteynerə quraşdırıldığından daha çox ehtiyac varsa, o, digər proseslərdən CPU oğurlayacaq.

CPU limitini çox aşağı təyin etsəniz nə olar?

CPU resursu tənzimlənən olduğundan, tənzimləmə aktivləşəcək.

CPU sorğusu göstərməsəniz nə olar?

Yaddaşda olduğu kimi, sorğu dəyəri limitə bərabərdir.

CPU limitini təyin etməsəniz nə olar?

Konteyner lazım olduğu qədər CPU istifadə edəcək. Əgər ad məkanında defolt CPU siyasəti (LimitRange) müəyyən edilibsə, bu limit konteyner üçün də istifadə olunur.

İstək və ya CPU limitini təyin etməsəniz nə olar?

Yaddaşda olduğu kimi, bu da ən pis ssenaridir. Planlaşdırıcı konteynerinizin nə qədər resursa ehtiyac duyduğunu bilmir və bu, qovşaqda ciddi problemlər yarada bilər. Bunun qarşısını almaq üçün ad boşluqları üçün standart məhdudiyyətlər təyin etməlisiniz (LimitRange).

Unutmayın: qovşaqların təmin edə biləcəyindən daha çox CPU tələb etsəniz, Pod planlaşdırılmayacaq. Requests.cpu - minimum dəyər deyil, Pod-u işə salmaq və nasazlıq olmadan işləmək üçün kifayət qədər dəyər. Tətbiq mürəkkəb hesablamalar aparmırsa, ən yaxşı seçim quraşdırmaqdır request.cpu <= 1 və lazım olduğu qədər çox replika işə salın.

Tələb olunan resursların ideal miqdarı və ya resurs limiti

Biz hesablama resurslarının məhdudlaşdırılması haqqında öyrəndik. İndi suala cavab verməyin vaxtıdır: “Mənim Pod proqramım problemsiz işləmək üçün nə qədər resurs tələb edir? İdeal məbləğ nədir?

Təəssüf ki, bu suallara dəqiq cavablar yoxdur. Tətbiqinizin necə işlədiyini və ya ona nə qədər CPU və ya yaddaş lazım olduğunu bilmirsinizsə, ən yaxşı seçim proqrama çoxlu yaddaş və CPU vermək və daha sonra performans testlərini həyata keçirməkdir.

Performans testlərinə əlavə olaraq, bir həftə ərzində monitorinqdə tətbiqin davranışını izləyin. Qrafiklər tətbiqinizin tələb etdiyinizdən daha az resurs istehlak etdiyini göstərirsə, siz tələb olunan CPU və ya yaddaşın miqdarını azalda bilərsiniz.

Buna misal olaraq baxın Grafana idarə paneli. O, tələb olunan resurslar və ya resurs limiti ilə cari resurs istifadəsi arasındakı fərqi göstərir.

Nəticə

Resurs tələb etmək və məhdudlaşdırmaq Kubernetes klasterinizi sağlam saxlamağa kömək edir. Düzgün limit konfiqurasiyası xərcləri minimuma endirir və proqramların hər zaman işləməsini təmin edir.

Bir sözlə, yadda saxlamaq lazım olan bir neçə şey var:

  1. Tələb olunan resurslar başlanğıc zamanı nəzərə alınan konfiqurasiyadır (Kubernetes tətbiqi yerləşdirməyi planlaşdırdıqda). Bunun əksinə olaraq, resursların məhdudlaşdırılması icra zamanı vacibdir - proqram artıq node üzərində işləyərkən.
  2. Yaddaşla müqayisədə CPU tənzimlənən bir resursdur. Kifayət qədər CPU yoxdursa, Podunuz bağlanmayacaq və tənzimləmə mexanizmi işə düşəcək.
  3. Tələb olunan resurslar və resurs limiti minimum və maksimum dəyərlər deyil! Tələb olunan resursları müəyyən etməklə siz proqramın problemsiz işləməsini təmin edirsiniz.
  4. Yaxşı təcrübə yaddaş tələbini yaddaş limitinə bərabər təyin etməkdir.
  5. Tamam quraşdırma tələb olundu CPU <=1, əgər proqram mürəkkəb hesablamalar aparmırsa.
  6. Bir qovşaqda mövcud olandan daha çox resurs tələb etsəniz, Pod heç vaxt həmin node üçün planlaşdırılmayacaq.
  7. Tələb olunan resursların/resurs limitlərinin düzgün miqdarını müəyyən etmək üçün yük testindən və monitorinqindən istifadə edin.

Ümid edirəm ki, bu məqalə resurs məhdudiyyətinin əsas konsepsiyasını anlamağa kömək edir. Və bu bilikləri işinizdə tətbiq edə biləcəksiniz.

Good Luck!

Başqa nə oxumaq lazımdır:

  1. SRE Müşahidə Olunması: Ad məkanları və Metrik Struktur.
  2. Kubernetes üçün 90+ Faydalı Alətlər: Yerləşdirmə, İdarəetmə, Monitorinq, Təhlükəsizlik və s.
  3. Telegram-da Kubernetes ətrafında kanalımız.

Mənbə: www.habr.com

Добавить комментарий