Чӣ тавр ба захираҳои Kubernetes Pod дастрасӣ пайдо кардан мумкин аст

Чӣ тавр ба захираҳои Kubernetes Pod дастрасӣ пайдо кардан мумкин астМукофот аз ҷониби Тоҳад

Ҳангоми оғоз кардани кор бо Kubernetes, одатан фаромӯш кардани таъсиси захираҳои контейнерӣ аст. Дар ин лаҳза, кофӣ аст, ки тасвири Docker кор кунад ва онро дар кластери Kubernetes ҷойгир кардан мумкин аст.

Аммо баъдтар барнома бояд дар як кластери истеҳсолӣ дар якҷоягӣ бо дигар замимаҳо ҷойгир карда шавад. Барои ин, шумо бояд захираҳоро барои контейнер ҷудо кунед ва боварӣ ҳосил кунед, ки онҳо барои ба кор даровардани барнома кофӣ ҳастанд ва дигар замимаҳои иҷрошаванда мушкилот нахоҳанд дошт.

гурӯҳ Kubernetes aaS аз Mail.ru мақоларо дар бораи захираҳои контейнерӣ (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). Гиреҳи усто дорои якчанд равандҳо мебошад: kube-apiserver, kube-controller-meneger ва kube-scheduler.

Раванди банақшагирии kube барои баррасии паҳлӯҳои навтаъсис ва дарёфти гиреҳҳои эҳтимолии коргарӣ, ки ба ҳама дархостҳои подкӯҳӣ, аз ҷумла шумораи захираҳои дархостшуда мувофиқат мекунанд, масъул аст. Рӯйхати гиреҳҳое, ки аз ҷониби kube-scheduler пайдо шудаанд, гурӯҳбандӣ карда мешаванд. Под дар гиреҳ бо холҳои баландтарин ба нақша гирифта шудааст.

Чӣ тавр ба захираҳои Kubernetes Pod дастрасӣ пайдо кардан мумкин астПоди арғувон дар куҷо гузошта мешавад?

Дар расм шумо мебинед, ки ҷадвали kube бояд як Pod нави арғувонро ба нақша гирад. Кластери Kubernetes дорои ду гиреҳ аст: A ва B. Тавре ки шумо мебинед, kube-нақшасоз наметавонад як Pod-ро дар гиреҳи A ба нақша гирад - захираҳои дастрас (бе дархост) ба дархостҳои Pod арғувон мувофиқат намекунанд. Ҳамин тавр, хотираи 1 ГБ, ки аз ҷониби Pod арғувон дархост шудааст, ба гиреҳи А мувофиқат намекунад, зеро хотираи дастрас 0,5 ГБ аст. Аммо гиреҳи В захираҳои кофӣ дорад. Дар натиҷа, ҷадвали кубе қарор мекунад, ки макони таъиноти Pod арғувон гиреҳи B мебошад.

Акнун мо медонем, ки захираҳои дархостшуда ба интихоби гиреҳ барои идора кардани Pod чӣ гуна таъсир мерасонанд. Аммо таъсири захираҳои ниҳоӣ чӣ гуна аст?

Маҳдудияти захираҳо сарҳадест, ки CPU/MEM убур карда наметавонад. Аммо, манбаи CPU чандир аст, аз ин рӯ контейнерҳое, ки ба ҳудуди CPU-и худ мерасанд, боиси баромадани Pod нахоҳанд шуд. Ба ҷои ин, танзими CPU оғоз мешавад. Агар ба маҳдудияти истифодаи 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 аз Docker. Дар сурати request.memory Барои Docker ягон тир мавҷуд нест, зеро Docker ин майдонро истифода намебарад. Шумо метавонед пурсед, ки оё ин ҳатто лозим аст? Ҳа лозим. Тавре ки ман қаблан гуфтам, майдон барои Кубернетес муҳим аст. Дар асоси маълумоти он, kube-нақшасоз тасмим мегирад, ки кадом гиреҳ Pod-ро ба нақша гирад.

Чӣ мешавад, агар шумо барои дархост хотираи нокифоя таъин кунед?

Агар контейнер ба ҳудуди хотираи дархостшуда расида бошад, пас Pod дар як гурӯҳи Подҳо ҷойгир карда мешавад, ки ҳангоми набудани хотира дар гиреҳ қатъ мешаванд.

Чӣ мешавад, агар шумо маҳдудияти хотираро хеле паст таъин кунед?

Агар контейнер аз маҳдудияти хотира зиёд бошад, он бо сабаби OOM-Killed қатъ карда мешавад. Ва агар имконпазир бошад, дар асоси RestartPolicy, ки арзиши пешфарз аст, аз нав оғоз мешавад Always.

Агар шумо хотираи дархостшударо муайян накунед, чӣ мешавад?

Kubernetes арзиши маҳдудро мегирад ва онро ҳамчун арзиши пешфарз муқаррар мекунад.

Агар шумо маҳдудияти хотираро муайян накунед, чӣ рӯй дода метавонад?

Контейнер ҳеҷ гуна маҳдудият надорад; он метавонад ҳар қадар хотираро, ки мехоҳад, истифода барад. Агар ӯ ба истифодаи тамоми хотираи дастраси гиреҳ шурӯъ кунад, пас OOM ӯро мекушад. Пас аз он, агар имконпазир бошад, дар асоси RestartPolicy контейнер аз нав оғоз карда мешавад.

Агар шумо маҳдудияти хотираро муайян накунед, чӣ мешавад?

Ин бадтарин сенарияи ҳолат аст: нақшасоз намедонад, ки контейнер чӣ қадар захираҳоро талаб мекунад ва ин метавонад дар гиреҳ мушкилоти ҷиддиро ба вуҷуд орад. Дар ин ҳолат, хуб мебуд, ки маҳдудиятҳои пешфарз дар фазои ном (аз ҷониби LimitRange муқаррар карда шудааст). Ягон маҳдудияти пешфарз вуҷуд надорад - Pod маҳдудият надорад, он метавонад хотираи миқдори зиёди хотираро истифода барад.

Агар хотираи дархостшуда аз гиреҳ метавонад зиёдтар бошад, Pod ба нақша гирифта намешавад. Дар хотир доштан муҳим аст Requests.memory - на арзиши ҳадди ақал. Ин тавсифи миқдори хотираи кофӣ барои нигоҳ доштани доимии контейнер мебошад.

Одатан тавсия дода мешавад, ки ҳамон арзиш барои request.memory и limit.memory. Ин кафолат медиҳад, ки Kubernetes як Pod-ро дар гиреҳе, ки хотираи кофӣ барои иҷро кардани Pod дорад, аммо барои иҷро кардани он кофӣ нест, ба нақша нагирад. Дар хотир доред: Банақшагирии Kubernetes Pod танҳо ба назар гирифта мешавад requests.memoryва limits.memory ба назар намегирад.

CPU: дархост ва маҳдудият

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

Бо CPU ҳама чиз каме мураккабтар аст. Бозгашт ба тасвири муносибати байни Кубернетес ва Докер, шумо инро мебинед request.cpu мувофиқат мекунад --cpu-shares, дар ҳоле ки limit.cpu ба байрақ мувофиқат мекунад cpus дар Docker.

CPU, ки Kubernetes дархост мекунад, ба 1024, таносуби давраҳои CPU зарб карда мешавад. Агар шумо хоҳед, ки 1 ядрои пурраро дархост кунед, шумо бояд илова кунед cpu: 1чунон ки дар боло нишон дода шудааст.

Дархости ядрои пурра (таносуб = 1024) маънои онро надорад, ки контейнери шумо онро қабул мекунад. Агар мошини мизбони шумо танҳо як ядро ​​дошта бошад ва шумо зиёда аз як контейнерро кор карда истода бошед, пас ҳама контейнерҳо бояд CPU-и дастрасро байни онҳо мубодила кунанд. Ин чӣ гуна рӯй медиҳад? Биёед ба расм нигоҳ кунем.

Чӣ тавр ба захираҳои 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) Системаи

Дар тасвири боло шумо мебинед, ки се кӯдак як пирожни пурра мехоҳанд ва як нафар нисфи онро мехоҳад. Азбаски модар чор пирожни пухтааст, ҳар як фарзандаш ҳар қадар, ки хоҳанд, мегиранд. Дар системаи бисёраслӣ, захираҳои протсессор дар тамоми ядроҳои протсессори мавҷуда тақсим карда мешаванд. Агар контейнер бо камтар аз як ядрои мукаммали CPU маҳдуд бошад, он метавонад онро то 100% истифода барад.

Ҳисобҳои дар боло овардашуда барои фаҳмидани он, ки CPU дар байни контейнерҳо чӣ гуна тақсим карда мешавад, содда карда шудаанд. Албатта, ба ғайр аз худи контейнерҳо, равандҳои дигаре мавҷуданд, ки захираҳои CPU-ро низ истифода мебаранд. Вақте ки равандҳо дар як контейнер бекоранд, дигарон метавонанд захираи онро истифода баранд. CPU: "200m" мувофиқат мекунад CPU: 0,2, ки тақрибан 20% як ядроро дорад.

Акнун биёед дар бораи он сӯҳбат кунем limit.cpu. CPU, ки Kubernetes маҳдуд мекунад, ба 100 зарб карда мешавад. Дар натиҷа миқдори вақтест, ки контейнер ҳар 100 мкс истифода бурда метавонад (cpu-period).

limit.cpu ба парчами Docker мувофиқат мекунад --cpus. Ин комбинатсияи нави кӯҳна аст --cpu-period и --cpu-quota. Бо гузоштани он, мо нишон медиҳем, ки чӣ қадар захираҳои мавҷудаи CPU, ки контейнер метавонад пеш аз саршавии фишор ба ҳадди аксар истифода барад:

  • 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-ро муайян накунед, чӣ мешавад?

Мисли хотира, арзиши дархост ба маҳдудият баробар аст.

Агар шумо маҳдудияти CPU-ро муайян накунед, чӣ мешавад?

Контейнер ҳамон қадар CPU истифода хоҳад кард. Агар сиёсати пешфарзии CPU (LimitRange) дар фазои ном муайян карда шуда бошад, пас ин маҳдудият барои контейнер низ истифода мешавад.

Агар шумо дархост ё маҳдудияти CPU-ро муайян накунед, чӣ мешавад?

Мисли хотира, ин сенарияи бадтарин аст. Банақшагир намедонад, ки ба контейнери шумо чанд захира лозим аст ва ин метавонад дар гиреҳ мушкилоти ҷиддиро ба вуҷуд орад. Барои пешгирӣ кардани ин, шумо бояд маҳдудиятҳои пешфарзро барои фазои номҳо муқаррар кунед (LimitRange).

Дар хотир доред: агар шумо аз CPU зиёдтар аз гиреҳҳо талаб кунед, Pod ба нақша гирифта намешавад. Requests.cpu - на арзиши ҳадди ақал, балки арзиши кофӣ барои оғоз кардани Pod ва бе нокомӣ кор кардан. Агар барнома ҳисобҳои мураккабро иҷро накунад, беҳтарин вариант насб кардан аст request.cpu <= 1 ва ба қадри зарурӣ нусхаҳои зиёдеро оғоз кунед.

Ҳаҷми беҳтарини захираҳои дархостшуда ё маҳдудияти захираҳо

Мо дар бораи маҳдудияти захираҳои ҳисоббарорӣ фаҳмидем. Ҳоло вақти он расидааст, ки ба савол ҷавоб диҳем: "Барои бе ягон мушкилот кор кардани барнома Pod ман чанд захираро талаб мекунад? Маблағи идеалӣ чист?

Мутаассифона, ба ин саволҳо ҷавоби дақиқ вуҷуд надорад. Агар шумо намедонед, ки барномаи шумо чӣ гуна кор мекунад ё чӣ қадар CPU ё хотираи он ба он ниёз дорад, беҳтарин вариант ин аст, ки ба барнома хотираи зиёд ва CPU диҳад ва сипас санҷишҳои иҷроишро иҷро кунед.

Илова ба санҷишҳои самаранокӣ, рафтори барномаро дар мониторинг барои як ҳафта назорат кунед. Агар графикҳо нишон диҳанд, ки барномаи шумо нисбат ба дархосткардаи шумо захираҳои камтарро истеъмол мекунад, шумо метавонед миқдори CPU ё хотираи дархостшударо кам кунед.

Ҳамчун мисол инро бубинед Панели дастгоҳи Grafana. Он фарқияти байни захираҳои дархостшуда ё маҳдудияти захираҳо ва истифодаи ҷории захираҳоро нишон медиҳад.

хулоса

Дархост ва маҳдуд кардани захираҳо ба солим нигоҳ доштани кластери Kubernetes кӯмак мекунад. Конфигуратсияи дурусти маҳдудият хароҷотро кам мекунад ва ҳама вақт кор кардани барномаҳоро нигоҳ медорад.

Хулоса, чанд чизро бояд дар хотир дошт:

  1. Захираҳои дархостшуда конфигуратсияҳое мебошанд, ки дар вақти оғозёбӣ ба назар гирифта мешаванд (вақте ки Kubernetes ба нақша гирифтааст, ки барномаро ҷойгир кунад). Баръакс, маҳдуд кардани захираҳо дар вақти кор муҳим аст - вақте ки барнома аллакай дар гиреҳ кор мекунад.
  2. Дар муқоиса бо хотира, CPU як манбаи танзимшаванда аст. Агар CPU нокифоя бошад, Pod-и шумо хомӯш намешавад ва механизми тропикӣ фаъол мешавад.
  3. Захираҳо ва маҳдудияти захираҳои дархостшуда арзишҳои ҳадди ақал ва ҳадди аксар нестанд! Бо муайян кардани захираҳои дархостшуда, шумо кафолат медиҳед, ки барнома бе мушкилот кор мекунад.
  4. Таҷрибаи хуб ин муқаррар кардани дархости хотира ба маҳдудияти хотира аст.
  5. Хуб насб талаб карда шуд CPU <=1, агар барнома хисобхои мураккабро ичро накунад.
  6. Агар шумо захираҳои бештареро талаб кунед, ки дар гиреҳ мавҷуд аст, Pod ҳеҷ гоҳ ба он гиреҳ ба нақша гирифта намешавад.
  7. Барои муайян кардани миқдори дурусти захираҳои дархостшуда/маҳдудияти захираҳо, санҷиш ва мониторинги сарборӣ истифода баред.

Ман умедворам, ки ин мақола ба шумо дар фаҳмидани мафҳуми асосии маҳдудияти захираҳо кӯмак мекунад. Ва шумо метавонед ин донишро дар кори худ истифода баред.

Барори кор

Боз чӣ хондан лозим аст:

  1. Мушоҳидаи SRE: Фазои номҳо ва сохтори метрӣ.
  2. 90+ Воситаҳои муфид барои Kubernetes: Ҷойгиркунӣ, идоракунӣ, мониторинг, амният ва ғайра.
  3. Канали мо дар атрофи Kubernetes дар Telegram.

Манбаъ: will.com

Илова Эзоҳ