Kubernetes Pod ресурстарына қалай қол жеткізуге болады

Kubernetes Pod ресурстарына қалай қол жеткізуге боладыТохад сыйлығы

Кубернетеспен жұмысты бастаған кезде контейнер ресурстарын орнатуды ұмытып кету әдеттегідей. Бұл кезде Docker кескінінің жұмыс істеуін және Kubernetes кластеріне орналастыруға болатынын қамтамасыз ету жеткілікті.

Бірақ кейінірек қолданбаны басқа қолданбалармен бірге өндіріс кластерінде орналастыру қажет. Бұл әрекетті орындау үшін, контейнерге ресурстарды бөліп, қолданбаны іске қосу және іске қосу үшін олардың жеткілікті екеніне және басқа іске қосылған қолданбаларда ақаулықтар туындамайтынына көз жеткізу керек.

команда Mail.ru сайтынан Kubernetes aaS контейнер ресурстары (CPU & MEM), сұраулар және ресурстар шектеулері туралы мақаланы аударды. Сіз бұл параметрлердің артықшылықтарын және оларды орнатпасаңыз не болатынын білесіз.

Есептеу ресурстары

Бізде келесі бірліктері бар ресурстардың екі түрі бар:

  • Орталық процессор (CPU) – ядролар;
  • Жад (MEM) – байт.

Әр контейнер үшін ресурстар көрсетілген. Келесі Pod YAML файлында сіз сұралған және шектеу ресурстарын қамтитын ресурс бөлімін көресіз:

  • Сұралған Pod ресурстары = барлық контейнерлердің сұралған ресурстарының сомасы;
  • Pod ресурсының шегі = барлық 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

Сұранылатын және шектеулі ресурстардың мысалы

өріс resources.requested спецификациядан Pod - қажетті түйінді табу үшін пайдаланылатын элементтердің бірі. Ол үшін Pod орналастыруды әлдеқашан жоспарлауға болады. Сәйкес түйінді қалай табуға болады?

Kubernetes бірнеше құрамдас бөліктерден тұрады, соның ішінде негізгі түйін немесе негізгі түйін (Kubernetes Control Plane). Негізгі түйінде бірнеше процестер бар: kube-аписервер, kube-контроллер-менеджер және kube-жоспарлаушы.

Kube-жоспарлаушы процесі жаңадан жасалған подкасттарды қарап шығуға және сұралған ресурстар санын қоса, барлық подкаст сұрауларына сәйкес келетін ықтимал жұмыс түйіндерін табуға жауап береді. Kube-жоспарлаушы тапқан түйіндер тізімі реттелген. Қондырғы ең жоғары ұпай жинаған түйінге жоспарланған.

Kubernetes Pod ресурстарына қалай қол жеткізуге боладыКүлгін қабық қайда орналастырылады?

Суретте сіз kube-жоспарлаушы жаңа күлгін Pod жоспарлауы керек екенін көре аласыз. Kubernetes кластері екі түйінді қамтиды: A және B. Көріп отырғаныңыздай, kube-жоспарлаушы A түйінінде Pod жоспарлай алмайды - қолжетімді (сұраныссыз) ресурстар күлгін Pod сұрауларына сәйкес келмейді. Осылайша, күлгін Pod сұраған 1 ГБ жад А түйініне сәйкес келмейді, өйткені қол жетімді жад 0,5 ГБ құрайды. Бірақ В түйінінде ресурстар жеткілікті. Нәтижесінде kube-жоспарлаушы күлгін Pod тағайындалған жері В түйіні деп шешеді.

Енді біз сұралған ресурстар Pod іске қосу үшін түйінді таңдауға қалай әсер ететінін білеміз. Бірақ шекті ресурстардың әсері қандай?

Ресурс шегі - бұл процессор/MEM өте алмайтын шекара. Дегенмен, CPU ресурсы икемді, сондықтан CPU шегіне жететін контейнерлер Pod шығуына себеп болмайды. Оның орнына процессорды реттеу басталады. Егер MEM пайдалану шегіне жетсе, контейнер OOM-Killer себебінен тоқтатылады және RestartPolicy параметрі рұқсат етсе, қайта іске қосылады.

Егжей-тегжейлі сұралған және максималды ресурстар

Kubernetes Pod ресурстарына қалай қол жеткізуге боладыDocker және Kubernetes арасындағы ресурс байланысы

Ресурс сұраулары мен ресурстар шектеулерінің қалай жұмыс істейтінін түсіндірудің ең жақсы жолы - Kubernetes және Docker арасындағы қарым-қатынасты енгізу. Жоғарыдағы суретте Kubernetes өрістері мен Docker іске қосу жалауларының қалай байланысты екенін көре аласыз.

Жад: сұрау және шектеу

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

Жоғарыда айтылғандай, жад байтпен өлшенеді. Негізделген Kubernetes құжаттамасы, біз жадты сан ретінде көрсете аламыз. Әдетте бұл бүтін сан, мысалы 2678 – яғни 2678 байт. Жұрнақтарды да қолдануға болады G и Gi, ең бастысы, олардың эквивалент емес екенін есте ұстаған жөн. Біріншісі ондық, екіншісі екілік. k8s құжаттамасында айтылған мысал сияқты: 128974848, 129e6, 129M, 123Mi - олар іс жүзінде эквивалентті.

Kubernetes опциясы limits.memory жалаушаға сәйкес келеді --memory Докерден. болған жағдайда request.memory Docker үшін көрсеткі жоқ, себебі Docker бұл өрісті пайдаланбайды. Сіз сұрай аласыз, бұл қажет пе? Иә керек. Жоғарыда айтқанымдай, өріс Кубернетес үшін маңызды. Ондағы ақпаратқа сүйене отырып, kube-жоспарлаушы Pod-ды жоспарлаудың қай түйінін шешеді.

Сұрау үшін жеткіліксіз жад орнатсаңыз не болады?

Егер контейнер сұралған жадтың шегіне жетсе, онда Pod түйінде жад жеткіліксіз болған кезде тоқтайтын Pod тобына орналастырылады.

Жад шегін тым төмен орнатсаңыз не болады?

Контейнер жад шегінен асып кетсе, ол OOM-Killed себебінен тоқтатылады. Мүмкін болса, әдепкі мән болатын RestartPolicy негізінде қайта іске қосылады Always.

Сұралған жадты көрсетпесеңіз не болады?

Kubernetes шекті мәнді қабылдайды және оны әдепкі мән ретінде орнатады.

Жад шегін көрсетпесеңіз не болуы мүмкін?

Контейнерде шектеулер жоқ, ол жадты қалағанша пайдалана алады. Егер ол түйіннің барлық қолжетімді жадын пайдалана бастаса, онда OOM оны өлтіреді. Содан кейін контейнер мүмкін болса, RestartPolicy негізінде қайта іске қосылады.

Жад шектеулерін көрсетпесеңіз не болады?

Бұл ең нашар жағдай сценарийі: жоспарлаушы контейнер қанша ресурстарды қажет ететінін білмейді және бұл түйінде елеулі проблемаларды тудыруы мүмкін. Бұл жағдайда аттар кеңістігінде әдепкі шектеулердің болуы жақсы болар еді (LimitRange арқылы орнатылған). Әдепкі шектеулер жоқ - Pod шектеулері жоқ, ол жадты қалағанша пайдалана алады.

Сұралған жад түйін ұсына алатындан көп болса, Pod жоспарланбайды. Мұны есте сақтау маңызды Requests.memory - ең төменгі мән емес. Бұл контейнердің үздіксіз жұмыс істеуін қамтамасыз ету үшін жеткілікті жад көлемінің сипаттамасы.

Әдетте үшін бірдей мәнді орнату ұсынылады request.memory и limit.memory. Бұл Pod іске қосу үшін жеткілікті жады бар, бірақ оны іске қосу үшін жеткіліксіз түйінде Kubernetes Pod жоспарламайтынын қамтамасыз етеді. Есіңізде болсын: Kubernetes Pod жоспарлауы тек ескеріледі requests.memoryмен limits.memory есепке алмайды.

Орталық процессор: сұрау және шектеу

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

Орталық процессормен бәрі біршама күрделірек. Кубернетес пен Докер арасындағы қарым-қатынастың суретіне оралсақ, мұны көруге болады request.cpu сәйкес келеді --cpu-shares, ал limit.cpu жалаушаға сәйкес келеді cpus Докерде.

Kubernetes сұрайтын процессор 1024-ке көбейтіледі, бұл процессор циклдерінің үлесі. 1 толық ядроны сұрағыңыз келсе, қосуыңыз керек cpu: 1жоғарыда көрсетілгендей.

Толық ядроны сұрау (пропорция = 1024) сіздің контейнеріңіз оны қабылдайды дегенді білдірмейді. Егер хост компьютеріңізде тек бір ядро ​​болса және сіз бірнеше контейнерді іске қосып жатсаңыз, онда барлық контейнерлер олардың арасында қолжетімді процессорды бөлісуі керек. Бұл қалай болады? Суретке қарайық.

Kubernetes Pod ресурстарына қалай қол жеткізуге болады
CPU сұрауы - бір ядролық жүйе

Сізде контейнерлермен жұмыс істейтін бір ядролы хост жүйесі бар деп елестетіп көрейік. Анам (Кубернетес) бәліш (CPU) пісіріп, оны балаларға (контейнерлер) бөлгісі келеді. Үш бала бүтін бәлішті қалайды (пропорция = 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% алады. Бірақ көп ядролы жүйе болса, бәрі басқаша болады.

Kubernetes Pod ресурстарына қалай қол жеткізуге болады
CPU сұрауы - көп ядролы (4) жүйе

Жоғарыдағы суретте сіз үш бала тұтас бәлішті, ал біреуі жартысын қалайтынын көресіз. Анасы төрт пирог пісіргендіктен, оның әрбір баласы қалағанынша алады. Көп ядролы жүйеде процессор ресурстары барлық қол жетімді процессор ядролары бойынша таратылады. Контейнер бір толық процессордың ядросынан азымен шектелсе, ол оны әлі де 100% пайдалана алады.

Жоғарыдағы есептеулер процессордың контейнерлер арасында қалай бөлінетінін түсіну үшін жеңілдетілген. Әрине, контейнерлердің өзінен басқа процессор ресурстарын пайдаланатын басқа да процестер бар. Бір контейнердегі процестер бос тұрғанда, басқалары оның ресурсын пайдалана алады. CPU: "200m" сәйкес келеді CPU: 0,2, бұл бір ядроның шамамен 20% білдіреді.

Енді осы туралы сөйлесейік limit.cpu. Kubernetes шектейтін процессор 100-ге көбейтіледі. Нәтиже - контейнер әр 100 мкс сайын пайдалана алатын уақыт мөлшері (cpu-period).

limit.cpu Docker жалауына сәйкес келеді --cpus. Бұл ескінің жаңа комбинациясы --cpu-period и --cpu-quota. Оны орнату арқылы біз дроссельді бастамас бұрын контейнер қанша қол жетімді CPU ресурстарын барынша пайдалана алатынын көрсетеміз:

  • кпус - комбинация cpu-period и cpu-quota. cpus = 1.5 орнатуға тең cpu-period = 100000 и cpu-quota = 150000;
  • CPU-кезеңі - кезең CPU CFS жоспарлаушысы, әдепкі 100 микросекунд;
  • cpu-квота - ішіндегі микросекундтар саны cpu-period, ол контейнермен шектелген.

Сұралған процессор жеткіліксіз болса, не болады?

Контейнер орнатылғаннан көбірек қажет болса, ол басқа процестерден процессорды ұрлайды.

Егер сіз CPU шегін тым төмен орнатсаңыз не болады?

Процессордың ресурсы реттелетін болғандықтан, дроссельдеу қосылады.

CPU сұрауын көрсетпесеңіз не болады?

Жадтағы сияқты сұрау мәні шекке тең.

CPU шегін көрсетпесеңіз не болады?

Контейнер қанша қажет болса, сонша CPU пайдаланады. Егер аттар кеңістігінде әдепкі CPU саясаты (LimitRange) анықталған болса, бұл шектеу контейнер үшін де пайдаланылады.

Сұрауды немесе CPU шегін көрсетпесеңіз не болады?

Жад сияқты, бұл ең нашар сценарий. Жоспарлаушы контейнерге қанша ресурстар қажет екенін білмейді және бұл түйінде елеулі проблемаларды тудыруы мүмкін. Бұған жол бермеу үшін аттар кеңістігіне (LimitRange) әдепкі шектеулерді орнату қажет.

Есіңізде болсын: түйіндер қамтамасыз ететіннен көбірек CPU сұрасаңыз, Pod жоспарланбайды. Requests.cpu - ең төменгі мән емес, бірақ Pod іске қосу және ақаусыз жұмыс істеу үшін жеткілікті мән. Егер қолданба күрделі есептеулерді орындамаса, ең жақсы нұсқа орнату болып табылады request.cpu <= 1 және қажетінше көп көшірмелерді іске қосыңыз.

Сұралған ресурстардың мінсіз мөлшері немесе ресурс шегі

Біз есептеу ресурстарының шектелуі туралы білдік. Енді сұраққа жауап беретін кез келді: «Менің Pod қолданбаны еш қиындықсыз іске қосу үшін қанша ресурстар қажет? Идеал сома қандай?

Өкінішке орай, бұл сұрақтарға нақты жауаптар жоқ. Қолданбаңыздың қалай жұмыс істейтінін немесе оған қанша CPU немесе жад қажет екенін білмесеңіз, ең жақсы нұсқа қолданбаға көп жад пен орталық процессорды беріп, одан кейін өнімділік сынақтарын орындау болып табылады.

Өнімділік сынақтарынан басқа, бір апта бойы бақылауда қолданбаның әрекетін бақылаңыз. Графиктер қолданбаңыз сұрағаныңыздан аз ресурстарды тұтынатынын көрсетсе, сұралған процессордың немесе жадтың көлемін азайтуға болады.

Мысал ретінде мынаны қараңыз Grafana бақылау тақтасы. Ол сұралған ресурстар немесе ресурс шегі мен ағымдағы ресурстарды пайдалану арасындағы айырмашылықты көрсетеді.

қорытынды

Ресурстарды сұрау және шектеу Kubernetes кластерін сау сақтауға көмектеседі. Тиісті шектеу конфигурациясы шығындарды азайтады және қолданбалардың әрқашан жұмыс істеуін қамтамасыз етеді.

Қысқасы, есте сақтау керек бірнеше нәрсе бар:

  1. Сұралған ресурстар – іске қосу кезінде ескерілетін конфигурация (Кубернетес қолданбаны орналастыруды жоспарлағанда). Керісінше, ресурстарды шектеу орындалу уақытында маңызды — қолданба түйінде әлдеқашан жұмыс істеп тұрған кезде.
  2. Жадпен салыстырғанда орталық процессор реттелетін ресурс болып табылады. Егер процессор жеткіліксіз болса, Pod өшірілмейді және дроссель механизмі қосылады.
  3. Сұралған ресурстар мен ресурс шегі минималды және максималды мәндер емес! Сұралған ресурстарды анықтау арқылы қолданбаның еш қиындықсыз жұмыс істейтініне көз жеткізесіз.
  4. Жад сұрауын жад шегіне тең етіп орнату жақсы тәжірибе болып табылады.
  5. Жарайды орнату сұралды CPU <=1, егер қолданба күрделі есептеулерді орындамаса.
  6. Егер сіз түйінде қолжетімді ресурстардан көбірек ресурстарды сұрасаңыз, Pod ешқашан сол түйінге жоспарланбайды.
  7. Сұралған ресурстардың/ресурс шектеулерінің дұрыс мөлшерін анықтау үшін жүктеме сынағы мен бақылауды пайдаланыңыз.

Бұл мақала ресурстарды шектеудің негізгі тұжырымдамасын түсінуге көмектеседі деп үміттенемін. Ал сіз бұл біліміңізді өз жұмысыңызда қолдана аласыз.

Сәттілік тілейміз!

Тағы не оқу керек:

  1. SRE бақылау мүмкіндігі: аттар кеңістігі және метрикалық құрылым.
  2. Kubernetes үшін 90+ пайдалы құралдар: орналастыру, басқару, бақылау, қауіпсіздік және т.б.
  3. Telegram-дағы Kubernetes айналасындағы арнамыз.

Ақпарат көзі: www.habr.com

пікір қалдыру