Како приступити ресурсима Кубернетес Под

Како приступити ресурсима Кубернетес ПодНаграда од Тохада

Када почињете са Кубернетес-ом, уобичајено је да заборавите на подешавање ресурса контејнера. У овом тренутку, довољно је осигурати да Доцкер слика ради и да се може применити на Кубернетес кластер.

Али касније апликација треба да се примени у производном кластеру заједно са другим апликацијама. Да бисте то урадили, потребно је да доделите ресурсе за контејнер и да се уверите да их има довољно да се апликација покрене и да друге покренуте апликације неће имати проблема.

Тим Кубернетес ааС са Маил.ру превео је чланак о ресурсима контејнера (ЦПУ & МЕМ), захтевима и ограничењима ресурса. Научићете које су предности ових подешавања и шта се дешава ако их не подесите.

Рачунарски ресурси

Имамо две врсте ресурса са следећим јединицама:

  • Централна процесорска јединица (ЦПУ) - језгра;
  • Меморија (МЕМ) - бајтови.

Ресурси су наведени за сваки контејнер. У следећој Под ИАМЛ датотеци видећете одељак ресурса који садржи тражене и ограничене ресурсе:

  • Захтевани ресурси под = збир захтеваних ресурса свих контејнера;
  • Ограничење ресурса под = збир свих ограничења ресурса под.

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

Пример захтеваних и ограничених ресурса

Поље resources.requested из спецификације Под је један од елемената који се користи за проналажење жељеног чвора. Већ можете планирати имплементацију Пода за то. Како пронаћи одговарајући чвор?

Кубернетес се састоји од неколико компоненти, укључујући главни чвор или главни чвор (Кубернетес Цонтрол Плане). Главни чвор има неколико процеса: кубе-аписервер, кубе-цонтроллер-манагер и кубе-сцхедулер.

Процес кубе-сцхедулер-а одговоран је за преглед новокреираних подова и проналажење могућих радних чворова који одговарају свим захтевима под, укључујући број захтеваних ресурса. Листа чворова које је пронашао кубе-сцхедулер је рангирана. Под је заказан на чвору са највишим резултатима.

Како приступити ресурсима Кубернетес ПодГде ће бити постављена љубичаста махуна?

На слици можете видети да кубе-сцхедулер треба да закаже нови љубичасти Под. Кубернетес кластер садржи два чвора: А и Б. Као што видите, кубе-сцхедулер не може да закаже Под на чвору А – доступни (незатражени) ресурси се не поклапају са захтевима љубичастог Пода. Дакле, 1 ГБ меморије коју захтева љубичаста Под неће стати на чвор А, пошто је расположива меморија 0,5 ГБ. Али чвор Б има довољно ресурса. Као резултат тога, кубе-сцхедулер одлучује да је одредиште љубичастог Под-а чвор Б.

Сада знамо како тражени ресурси утичу на избор чвора за покретање Пода. Али какав је утицај маргиналних ресурса?

Ограничење ресурса је граница коју ЦПУ/МЕМ не може да пређе. Међутим, ресурс ЦПУ-а је флексибилан, тако да контејнери који достигну своја ЦПУ ограничења неће проузроковати излазак Под-а. Уместо тога, почеће пригушивање ЦПУ-а. Ако се достигне ограничење употребе МЕМ-а, контејнер ће бити заустављен због ООМ-Киллер-а и поново покренут ако то дозвољава поставка РестартПолици.

Детаљно о ​​траженим и максималним ресурсима

Како приступити ресурсима Кубернетес ПодКомуникација ресурса између Доцкер-а и Кубернетес-а

Најбољи начин да се објасни како функционишу захтеви за ресурсе и ограничења ресурса је да се уведе однос између Кубернетес-а и Доцкер-а. На горњој слици можете видети како су Кубернетес поља и Доцкер стартуп заставице повезане.

Меморија: захтев и ограничење

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

Као што је горе поменуто, меморија се мери у бајтовима. На бази Кубернетес документација, можемо одредити меморију као број. Обично је то цео број, на пример 2678 - односно 2678 бајтова. Можете користити и суфиксе G и Gi, главна ствар је запамтити да они нису еквивалентни. Први је децимални, а други бинарни. Као пример поменут у к8с документацији: 128974848, 129e6, 129M, 123Mi - они су практично еквивалентни.

Кубернетес опција limits.memory одговара застави --memory из Доцкера. У случају request.memory Не постоји стрелица за Доцкер јер Доцкер не користи ово поље. Можете питати, да ли је ово уопште потребно? Да треба. Као што сам већ рекао, поље је важно за Кубернетес. На основу информација из њега, кубе-сцхедулер одлучује који чвор ће заказати Под.

Шта се дешава ако подесите недовољно меморије за захтев?

Ако је контејнер достигао границе тражене меморије, онда се Под се ставља у групу Подова који се заустављају када нема довољно меморије у чвору.

Шта се дешава ако поставите прениско ограничење меморије?

Ако контејнер премаши ограничење меморије, биће прекинут због ООМ-Киллед-а. И поново ће се покренути ако је могуће на основу РестартПолици где је подразумевана вредност Always.

Шта се дешава ако не наведете тражену меморију?

Кубернетес ће узети граничну вредност и поставити је као подразумевану вредност.

Шта се може догодити ако не наведете ограничење меморије?

Контејнер нема ограничења; може да користи меморију колико жели. Ако почне да користи сву доступну меморију чвора, онда ће га ООМ убити. Контејнер ће тада бити поново покренут ако је могуће на основу РестартПолици.

Шта се дешава ако не наведете ограничења меморије?

Ово је најгори сценарио: планер не зна колико ресурса је потребно контејнеру, а то може изазвати озбиљне проблеме на чвору. У овом случају, било би лепо имати подразумевана ограничења за именски простор (подешена од стране ЛимитРанге). Нема подразумеваних ограничења - Под нема ограничења, може да користи меморију колико жели.

Ако је тражена меморија више него што чвор може да понуди, Под неће бити заказан. Важно је то запамтити Requests.memory - није минимална вредност. Ово је опис количине меморије довољне да контејнер ради непрекидно.

Обично се препоручује да поставите исту вредност за request.memory и limit.memory. Ово осигурава да Кубернетес неће заказати Под на чвору који има довољно меморије да покрене Под, али не довољно да га покрене. Имајте на уму: Кубернетес Под планирање узима само у обзир requests.memoryИ limits.memory не узима у обзир.

ЦПУ: захтев и ограничење

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

Са ЦПУ-ом је све мало компликованије. Ако се вратимо на слику односа између Кубернетеса и Доцкера, то можете видети request.cpu одговара --cpu-shares, док limit.cpu одговара застави cpus у Доцкеру.

ЦПУ који Кубернетес захтева се множи са 1024, пропорцијом ЦПУ циклуса. Ако желите да затражите 1 пуно језгро, морате додати cpu: 1као што је горе приказано.

Захтевање пуног кернела (пропорција = 1024) не значи да ће га ваш контејнер примити. Ако ваша хост машина има само једно језгро и користите више од једног контејнера, онда сви контејнери морају да деле расположиви ЦПУ између њих. Како се ово дешава? Хајде да погледамо слику.

Како приступити ресурсима Кубернетес Под
ЦПУ захтев – систем са једним језгром

Замислимо да имате хост систем са једним језгром који покреће контејнере. Мама (Кубернетес) је испекла питу (ЦПУ) и жели да је подели између деце (контејнери). Троје деце жели целу питу (пропорција = 1024), друго дете жели пола пите (512). Мама жели да буде фер и прави једноставну калкулацију.

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

На основу прорачуна, троје деце ће добити 28% језгра, а не цело језгро. Четврто дете ће добити 14% пуног кернела, а не половину. Али ствари ће бити другачије ако имате систем са више језгара.

Како приступити ресурсима Кубернетес Под
ЦПУ захтев - систем са више језгара (4).

На слици изнад можете видети да троје деце жели целу питу, а једно половину. Пошто је мама испекла четири пите, свако њено дете ће добити колико жели. У систему са више језгара, ресурси процесора су распоређени на сва доступна процесорска језгра. Ако је контејнер ограничен на мање од једног пуног ЦПУ језгра, и даље га може користити 100%.

Горње калкулације су поједностављене да би се разумело како је ЦПУ распоређен међу контејнерима. Наравно, поред самих контејнера, постоје и други процеси који такође користе ЦПУ ресурсе. Када процеси у једном контејнеру мирују, други могу да користе његов ресурс. CPU: "200m" одговара CPU: 0,2, што значи приближно 20% једног језгра.

Хајде сада да причамо о limit.cpu. ЦПУ који Кубернетес ограничава се множи са 100. Резултат је количина времена коју контејнер може да користи сваких 100 µс (cpu-period).

limit.cpu одговара Доцкер заставици --cpus. Ово је нова комбинација старог --cpu-period и --cpu-quota. Постављањем означавамо колико расположивих ЦПУ ресурса контејнер може максимално да користи пре него што пригушивање почне:

  • цпус - комбинација cpu-period и cpu-quota. cpus = 1.5 еквивалентно поставци cpu-period = 100000 и cpu-quota = 150000;
  • ЦПУ-период - раздобље ЦПУ ЦФС планер, подразумевано 100 микросекунди;
  • процесорска квота - број микросекунди унутра cpu-period, који је омеђен контејнером.

Шта се дешава ако инсталирате недовољно траженог ЦПУ-а?

Ако контејнеру треба више него што је инсталирао, он ће украсти ЦПУ од других процеса.

Шта се дешава ако поставите прениско ограничење ЦПУ-а?

Пошто је ЦПУ ресурс подесив, пригушивање ће се укључити.

Шта се дешава ако не наведете ЦПУ захтев?

Као и код меморије, вредност захтева је једнака ограничењу.

Шта се дешава ако не наведете ограничење ЦПУ-а?

Контејнер ће користити онолико ЦПУ-а колико му је потребно. Ако је подразумевана ЦПУ политика (ЛимитРанге) дефинисана у именском простору, онда се ово ограничење користи и за контејнер.

Шта се дешава ако не наведете ни захтев ни ЦПУ ограничење?

Као и код сећања, ово је најгори сценарио. Планер не зна колико ресурса је потребно вашем контејнеру, а то може изазвати озбиљне проблеме на чвору. Да бисте ово избегли, морате да поставите подразумевана ограничења за просторе имена (ЛимитРанге).

Запамтите: ако захтевате више ЦПУ-а него што чворови могу да обезбеде, Под неће бити заказан. Requests.cpu - не минимална вредност, већ вредност довољна да покрене Под и ради без кварова. Ако апликација не обавља сложене прорачуне, најбоља опција је инсталирање request.cpu <= 1 и лансирати онолико реплика колико је потребно.

Идеална количина тражених ресурса или ограничење ресурса

Научили смо о ограничености рачунарских ресурса. Сада је време да одговорите на питање: „Колико ресурса је потребно мом Под-у да покрене апликацију без икаквих проблема? Која је идеална количина?

Нажалост, на ова питања нема јасних одговора. Ако не знате како ваша апликација функционише или колико јој је ЦПУ-а или меморије потребно, најбоља опција је да апликацији дате много меморије и ЦПУ-а, а затим покренете тестове перформанси.

Поред тестова перформанси, пратите понашање апликације у праћењу недељу дана. Ако графикони показују да ваша апликација троши мање ресурса него што сте тражили, можете смањити тражену количину ЦПУ-а или меморије.

Као пример погледајте ово Графана инструмент табла. Приказује разлику између захтеваних ресурса или ограничења ресурса и тренутне употребе ресурса.

Закључак

Захтевање и ограничавање ресурса помаже да ваш Кубернетес кластер буде здрав. Правилна конфигурација ограничења минимизира трошкове и омогућава да апликације раде у сваком тренутку.

Укратко, треба имати на уму неколико ствари:

  1. Захтевани ресурси су конфигурација која се узима у обзир приликом покретања (када Кубернетес планира да хостује апликацију). Насупрот томе, ограничавање ресурса је важно током времена извршавања—када је апликација већ покренута на чвору.
  2. У поређењу са меморијом, ЦПУ је регулисан ресурс. Ако нема довољно ЦПУ-а, ваш Под се неће искључити и механизам за пригушивање ће се укључити.
  3. Тражени ресурси и ограничење ресурса нису минималне и максималне вредности! Дефинисањем тражених ресурса осигуравате да ће апликација радити без проблема.
  4. Добра пракса је да се захтев за меморију постави једнак ограничењу меморије.
  5. Захтевана је ок инсталација CPU <=1, ако апликација не обавља сложене прорачуне.
  6. Ако затражите више ресурса него што је доступно на чвору, Под никада неће бити заказан за тај чвор.
  7. Да бисте одредили тачну количину захтеваних ресурса/ограничења ресурса, користите тестирање оптерећења и праћење.

Надам се да ће вам овај чланак помоћи да разумете основни концепт ограничења ресурса. И ово знање ћете моћи да примените у свом раду.

Срећно!

Шта још читати:

  1. СРЕ Уочљивост: простори имена и метричка структура.
  2. 90+ корисних алата за Кубернетес: постављање, управљање, надгледање, безбедност и још много тога.
  3. Наш канал Око Кубернетеса у Телеграму.

Извор: ввв.хабр.цом

Додај коментар