Kubernetes Pod resurslariga qanday kirish mumkin

Kubernetes Pod resurslariga qanday kirish mumkinTohadning mukofoti

Kubernetes bilan ishlashni boshlaganingizda, konteyner resurslarini sozlashni unutish odatiy holdir. Shu nuqtada, Docker tasvirining ishlashini va Kubernetes klasteriga joylashtirilishini ta'minlash kifoya.

Ammo keyinchalik dastur boshqa ilovalar bilan birga ishlab chiqarish klasterida joylashtirilishi kerak. Buni amalga oshirish uchun siz konteyner uchun resurslarni ajratishingiz va dasturni ishga tushirish uchun ularning etarliligi va boshqa ishlayotgan ilovalar muammoga duch kelmasligiga ishonch hosil qilishingiz kerak.

komanda Mail.ru dan Kubernetes aaS konteyner resurslari (CPU & MEM), so'rovlar va resurs cheklovlari haqidagi maqolani tarjima qildi. Siz ushbu sozlamalarning afzalliklari va ularni o'rnatmasangiz nima bo'lishini bilib olasiz.

Hisoblash resurslari

Bizda quyidagi birliklarga ega ikki turdagi resurslar mavjud:

  • Markaziy protsessor (CPU) - yadrolar;
  • Xotira (MEM) - baytlar.

Resurslar har bir konteyner uchun ko'rsatilgan. Quyidagi Pod YAML faylida siz so'ralgan va cheklangan resurslarni o'z ichiga olgan resurs bo'limini ko'rasiz:

  • So'ralgan pod resurslari = barcha konteynerlarning so'ralgan resurslari yig'indisi;
  • Pod Resurs chegarasi = Barcha Pod Resurs Limitlari yig'indisi.

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

So'ralgan va cheklangan resurslarga misol

dala resources.requested spetsifikatsiyadan Pod - kerakli tugunni topish uchun ishlatiladigan elementlardan biri. Buning uchun Podni joylashtirishni allaqachon rejalashtirishingiz mumkin. Qanday qilib mos keladigan tugunni topasiz?

Kubernetes bir nechta komponentlardan iborat, jumladan, asosiy tugun yoki asosiy tugun (Kubernetes Control Plane). Asosiy tugun bir nechta jarayonlarga ega: kube-apiserver, kube-kontroller-menejer va kube-rejalashtiruvchi.

Kube rejalashtirish jarayoni yangi yaratilgan podslarni ko'rib chiqish va barcha pod so'rovlariga, shu jumladan so'ralgan resurslar soniga mos keladigan ishchi tugunlarni topish uchun javobgardir. Kube-scheduler tomonidan topilgan tugunlar ro'yxati tartiblangan. Pod eng yuqori ballga ega bo'lgan tugunga rejalashtirilgan.

Kubernetes Pod resurslariga qanday kirish mumkinBinafsharang Pod qayerga joylashtiriladi?

Rasmda siz kube-rejalashtiruvchi yangi binafsha rangli podni rejalashtirishi kerakligini ko'rishingiz mumkin. Kubernetes klasteri ikkita tugunni o'z ichiga oladi: A va B. Ko'rib turganingizdek, kube rejalashtiruvchisi A tugunida podni rejalashtira olmaydi - mavjud (so'ralmagan) resurslar binafsha rangli podning so'rovlariga mos kelmaydi. Shunday qilib, binafsha rangli Pod tomonidan talab qilingan 1 GB xotira A tuguniga to'g'ri kelmaydi, chunki mavjud xotira 0,5 GB. Ammo B tugunida yetarli resurslar mavjud. Natijada kube rejalashtiruvchisi binafsha rangli podning maqsadi B tugunidir, deb qaror qiladi.

Endi biz so'ralgan resurslar Podni ishga tushirish uchun tugunni tanlashga qanday ta'sir qilishini bilamiz. Ammo marjinal resurslarning ta'siri qanday?

Resurs chegarasi - bu CPU/MEM kesib o'tolmaydigan chegara. Biroq, CPU resursi moslashuvchan, shuning uchun protsessor chegaralariga etgan konteynerlar Podning chiqishiga olib kelmaydi. Buning o'rniga, protsessorni cheklash boshlanadi. Agar MEMdan foydalanish chegarasiga yetsa, konteyner OOM-Killer tufayli to‘xtatiladi va agar RestartPolicy sozlamalari ruxsat bergan bo‘lsa, qayta ishga tushiriladi.

Batafsil so'ralgan va maksimal resurslar

Kubernetes Pod resurslariga qanday kirish mumkinDocker va Kubernetes o'rtasidagi manba aloqasi

Resurs so'rovlari va resurs cheklovlari qanday ishlashini tushuntirishning eng yaxshi usuli Kubernetes va Docker o'rtasidagi munosabatlarni joriy qilishdir. Yuqoridagi rasmda siz Kubernetes maydonlari va Docker ishga tushirish bayroqlari qanday bog'liqligini ko'rishingiz mumkin.

Xotira: so'rov va cheklash

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

Yuqorida aytib o'tilganidek, xotira baytlarda o'lchanadi. Asoslangan Kubernetes hujjatlari, biz xotirani raqam sifatida belgilashimiz mumkin. Odatda bu butun son, masalan 2678 - ya'ni 2678 bayt. Qo'shimchalardan ham foydalanish mumkin G и Gi, asosiysi, ular ekvivalent emasligini unutmaslikdir. Birinchisi o'nlik, ikkinchisi esa ikkilik. K8s hujjatlarida keltirilgan misol kabi: 128974848, 129e6, 129M, 123Mi - ular amalda tengdir.

Kubernetes varianti limits.memory bayroqqa mos keladi --memory Dockerdan. bo'lsa request.memory Docker uchun o'q yo'q, chunki Docker bu maydondan foydalanmaydi. Siz so'rashingiz mumkin, bu kerakmi? Ha kerak. Yuqorida aytganimdek, Kubernetes uchun maydon muhim. Undan olingan ma'lumotlarga asoslanib, kube rejalashtiruvchisi Podni qaysi tugunni rejalashtirishni hal qiladi.

Agar so'rov uchun xotira yetarli bo'lmasa nima bo'ladi?

Agar konteyner so'ralgan xotira chegarasiga yetgan bo'lsa, u holda Pod tugunda xotira etarli bo'lmaganda to'xtab turadigan Podlar guruhiga joylashtiriladi.

Xotira chegarasini juda past qilib qo'ysangiz nima bo'ladi?

Agar konteyner xotira chegarasidan oshsa, u OOM-Killed tufayli tugatiladi. Va agar iloji bo'lsa, standart qiymat bo'lgan RestartPolicy asosida qayta ishga tushadi Always.

Agar so'ralgan xotirani ko'rsatmasangiz nima bo'ladi?

Kubernetes chegara qiymatini oladi va uni standart qiymat sifatida o'rnatadi.

Xotira chegarasini belgilamasangiz nima bo'lishi mumkin?

Konteynerda hech qanday cheklovlar yo'q, u xohlagancha xotiradan foydalanishi mumkin. Agar u tugunning barcha mavjud xotirasidan foydalanishni boshlasa, OOM uni o'ldiradi. Keyin, iloji bo'lsa, RestartPolicy asosida konteyner qayta ishga tushiriladi.

Xotira chegaralarini belgilamasangiz nima bo'ladi?

Bu eng yomon stsenariy: rejalashtiruvchi konteyner qancha resurslarni talab qilishini bilmaydi va bu tugunda jiddiy muammolarni keltirib chiqarishi mumkin. Bunday holda, nomlar maydonida standart cheklovlarga ega bo'lish yaxshi bo'lar edi (LimitRange tomonidan o'rnatiladi). Standart cheklovlar yo'q - Podda cheklovlar yo'q, u xohlagancha xotiradan foydalanishi mumkin.

Agar so'ralgan xotira tugun taklif qilishi mumkin bo'lganidan ko'p bo'lsa, Pod rejalashtirilmaydi. Buni yodda tutish muhim Requests.memory - minimal qiymat emas. Bu konteynerning uzluksiz ishlashini ta'minlash uchun etarli bo'lgan xotira hajmining tavsifidir.

Odatda bir xil qiymatni o'rnatish tavsiya etiladi request.memory и limit.memory. Bu Kubernetes Podni ishga tushirish uchun yetarli xotiraga ega, lekin uni ishga tushirish uchun yetarli bo'lmagan tugunga Podni rejalashtirmasligini ta'minlaydi. Yodda tuting: Kubernetes Pod rejalashtirish faqat hisobga olinadi requests.memoryva limits.memory hisobga olmaydi.

CPU: so'rov va chegara

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

CPU bilan hamma narsa biroz murakkabroq. Kubernetes va Docker o'rtasidagi munosabatlar rasmiga qaytsak, buni ko'rishingiz mumkin request.cpu mos keladi --cpu-shares, unda qanday limit.cpu bayroqqa mos keladi cpus Docker-da.

Kubernetes so'ragan protsessor 1024 ga ko'paytiriladi, protsessor davrlarining nisbati. Agar siz 1 ta toʻliq yadro talab qilmoqchi boʻlsangiz, qoʻshishingiz kerak cpu: 1yuqorida ko'rsatilganidek.

To'liq yadroni so'rash (proporsiya = 1024) sizning konteyneringiz uni oladi degani emas. Agar sizning asosiy kompyuteringizda faqat bitta yadro bo'lsa va siz bir nechta konteynerda ishlayotgan bo'lsangiz, barcha konteynerlar mavjud protsessorni ular o'rtasida bo'lishishi kerak. Bu qanday sodir bo'ladi? Keling, rasmga qaraylik.

Kubernetes Pod resurslariga qanday kirish mumkin
CPU so'rovi - yagona yadroli tizim

Tasavvur qilaylik, sizda konteynerlar bilan ishlaydigan bitta yadroli xost tizimi mavjud. Onam (Kubernetes) pirog (CPU) pishirdi va uni bolalar (konteynerlar) o'rtasida taqsimlamoqchi. Uchta bola butun pirogni xohlaydi (proporsiya = 1024), boshqa bola yarim pirogni xohlaydi (512). Onam adolatli bo'lishni xohlaydi va oddiy hisob-kitob qiladi.

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

Hisob-kitoblarga ko'ra, uchta bola butun yadroni emas, balki yadroning 28 foizini oladi. To'rtinchi bola to'liq yadroning yarmini emas, balki 14 foizini oladi. Ammo ko'p yadroli tizimga ega bo'lsangiz, hamma narsa boshqacha bo'ladi.

Kubernetes Pod resurslariga qanday kirish mumkin
CPU so'rovi - Ko'p yadroli (4) tizim

Yuqoridagi rasmda siz uchta bola butun pirogni, biri esa yarmini xohlayotganini ko'rishingiz mumkin. Onam to'rtta pirog pishirganligi sababli, uning har bir farzandi xohlagancha oladi. Ko'p yadroli tizimda protsessor resurslari barcha mavjud protsessor yadrolari bo'ylab taqsimlanadi. Agar konteyner bittadan kam to'liq CPU yadrosi bilan cheklangan bo'lsa, u hali ham 100% dan foydalanishi mumkin.

Yuqoridagi hisob-kitoblar CPU konteynerlar orasida qanday taqsimlanganligini tushunish uchun soddalashtirilgan. Albatta, konteynerlarning o'zidan tashqari, CPU resurslaridan foydalanadigan boshqa jarayonlar ham mavjud. Bitta konteynerdagi jarayonlar ishlamay qolganda, boshqalar uning resursidan foydalanishi mumkin. CPU: "200m" mos keladi CPU: 0,2, bu bitta yadroning taxminan 20% ni bildiradi.

Endi gaplashaylik limit.cpu. Kubernetes chegaralagan protsessor 100 ga ko'paytiriladi. Natijada konteyner har 100 mksda foydalanishi mumkin bo'lgan vaqt miqdori (cpu-period).

limit.cpu Docker bayrog'iga mos keladi --cpus. Bu eskilarning yangi kombinatsiyasi --cpu-period и --cpu-quota. Uni o'rnatish orqali biz siqilish boshlanishidan oldin konteyner qancha mavjud protsessor resurslaridan maksimal darajada foydalanishi mumkinligini ko'rsatamiz:

  • CPU - kombinatsiya cpu-period и cpu-quota. cpus = 1.5 sozlashga teng cpu-period = 100000 и cpu-quota = 150000;
  • CPU davri - davr CPU CFS rejalashtiruvchisi, standart 100 mikrosoniya;
  • CPU-kvota - ichidagi mikrosoniyalar soni cpu-period, konteyner bilan chegaralangan.

Agar so'ralgan protsessor yetarli bo'lmasa nima bo'ladi?

Agar konteyner o'rnatilganidan ko'proq narsani talab qilsa, u boshqa jarayonlardan protsessorni o'g'irlaydi.

Agar protsessor chegarasini juda past qilib qo'ysangiz nima bo'ladi?

CPU resursi sozlanishi bo'lgani uchun tejamkorlik yoqiladi.

Agar CPU so'rovini ko'rsatmasangiz nima bo'ladi?

Xotirada bo'lgani kabi, so'rov qiymati chegaraga teng.

Agar CPU chegarasini belgilamasangiz nima bo'ladi?

Konteyner kerakli darajada CPU ishlatadi. Agar nomlar maydonida standart protsessor siyosati (LimitRange) aniqlangan bo'lsa, bu chegara konteyner uchun ham qo'llaniladi.

Agar so'rov yoki CPU chegarasini ko'rsatmasangiz nima bo'ladi?

Xotirada bo'lgani kabi, bu eng yomon stsenariy. Rejalashtiruvchi sizning konteyneringizga qancha resurslar kerakligini bilmaydi va bu tugunda jiddiy muammolarni keltirib chiqarishi mumkin. Bunga yo'l qo'ymaslik uchun nomlar bo'shliqlari uchun standart chegaralarni o'rnatishingiz kerak (LimitRange).

Esingizda bo'lsin: agar siz tugunlar berishi mumkin bo'lganidan ko'proq CPU talab qilsangiz, Pod rejalashtirilmaydi. Requests.cpu - minimal qiymat emas, balki Podni ishga tushirish va nosozliklarsiz ishlash uchun etarli qiymat. Agar dastur murakkab hisob-kitoblarni amalga oshirmasa, eng yaxshi variant o'rnatishdir request.cpu <= 1 va kerak bo'lganda ko'plab replikalarni ishga tushiring.

So'ralgan resurslarning ideal miqdori yoki resurs chegarasi

Biz hisoblash resurslarining cheklanishi haqida bilib oldik. Endi savolga javob berish vaqti keldi: “Mening Pod dasturni muammosiz ishga tushirish uchun qancha resurslarni talab qiladi? Ideal miqdor qancha?

Afsuski, bu savollarga aniq javoblar yo'q. Agar ilovangiz qanday ishlashini yoki unga qancha protsessor yoki xotira kerakligini bilmasangiz, eng yaxshi variant dasturga koʻp xotira va protsessor berish va keyin ishlash testlarini oʻtkazishdir.

Ishlash testlariga qo'shimcha ravishda, bir hafta davomida monitoringda ilovaning xatti-harakatlarini kuzatib boring. Grafiklar ilovangiz siz so'ragandan kamroq resurslarni iste'mol qilayotganini ko'rsatsa, siz so'ralgan protsessor yoki xotira hajmini kamaytirishingiz mumkin.

Bunga misol sifatida qarang Grafana asboblar paneli. U so'ralgan resurslar yoki resurs chegarasi va joriy resurslardan foydalanish o'rtasidagi farqni ko'rsatadi.

xulosa

Resurslarni so‘rash va cheklash Kubernetes klasteringizni sog‘lom saqlashga yordam beradi. To'g'ri chegara konfiguratsiyasi xarajatlarni kamaytiradi va ilovalarning doimo ishlashini ta'minlaydi.

Muxtasar qilib aytganda, yodda tutish kerak bo'lgan bir nechta narsa bor:

  1. So'ralgan resurslar - bu ishga tushirish vaqtida (Kubernetes ilovani joylashtirishni rejalashtirayotganda) hisobga olinadigan konfiguratsiya. Bundan farqli o'laroq, resurslarni cheklash ish vaqtida muhim ahamiyatga ega - dastur allaqachon tugun ustida ishlayotgan bo'lsa.
  2. Xotira bilan solishtirganda, CPU tartibga solinadigan resursdir. Agar protsessor yetarli bo'lmasa, sizning Pod o'chmaydi va tejamkorlik mexanizmi yoqiladi.
  3. So'ralgan resurslar va resurs chegarasi minimal va maksimal qiymatlar emas! So'ralgan resurslarni belgilash orqali siz dastur muammosiz ishlashini ta'minlaysiz.
  4. Xotira so'rovini xotira chegarasiga tenglashtirish yaxshi amaliyotdir.
  5. OK oʻrnatish soʻraldi CPU <=1, agar dastur murakkab hisob-kitoblarni amalga oshirmasa.
  6. Agar siz tugunda mavjud bo'lganidan ko'proq resurslarni so'rasangiz, Pod hech qachon ushbu tugunga rejalashtirilmaydi.
  7. So'ralgan resurslar/resurs chegaralarining to'g'ri miqdorini aniqlash uchun yuk sinovi va monitoringidan foydalaning.

Umid qilamanki, ushbu maqola sizga resurslarni cheklashning asosiy tushunchasini tushunishga yordam beradi. Va bu bilimlarni o'z ishingizda qo'llay olasiz.

Omad tilaymiz!

Yana nimani o'qish kerak:

  1. SRE kuzatilishi: nomlar maydoni va metrik tuzilma.
  2. Kubernetes uchun 90+ foydali vositalar: joylashtirish, boshqarish, monitoring, xavfsizlik va boshqalar.
  3. Telegramdagi Kubernetes atrofidagi kanalimiz.

Manba: www.habr.com

a Izoh qo'shish