Containerlar biz aksini belirtmediฤimiz sรผrece varsayฤฑlan olarak, รผzerinde รงalฤฑลtฤฑklarฤฑ hostun CPU ve Memory kaynaklarฤฑna sฤฑnฤฑrsฤฑz ลekilde eriลirler. Yani biz 8 GB memory sahip bir sistem รผzerinde container รงalฤฑลtฤฑrdฤฑฤฤฑmฤฑz zaman, bu container iรงerisindeki uygulama 8 GB memory 'nin tamamฤฑnฤฑ kullanabilir. Keza aynฤฑ ลekilde, tรผm CPU รงekirdeklerini de kullanabilir.
Bu durum รถzellikle kubernetes gibi yรผzlerce container รงalฤฑลtฤฑrdฤฑฤฤฑmฤฑz daฤฤฑtฤฑk yapฤฑlarda, bizim iรงin sorun oluลturur. Eฤer bir pod koลtuฤu hostun รผzerindeki tรผm kaynaklarฤฑ tรผketiyorsa, bu diฤer podlarฤฑn iลlerini dรผzgรผn yapmayacaฤฤฑ anlamฤฑna gelir. Bu nedenle, bu podlarฤฑn iรงerisinde รงalฤฑลan, containerlarฤฑn ne kadar cpu ve memory kullanabileceklerini kฤฑsฤฑtlamamฤฑz gerekmektedir. Pod tanฤฑmlarฤฑmฤฑzda, kullanabileceฤimiz request ve limit opsiyonlarฤฑ bize bu imkanฤฑ verir.
Cpu kaynaฤฤฑ, CPU birimleri olarak รถlรงรผlรผr. Kubernetes de bir CPU ลuna eลdeฤerdir;
AWS vCPU
GCP Core
Azure vCore
Hyperthread Bare-Metal
Kesirli deฤerlere izin verilir. 0.5 CPU talep eden, bir container 1 CPU talep eden, bir container 'ฤฑn, yarฤฑsฤฑ kadar CPU alฤฑr. Mili alamฤฑnda M son ekini kullanabiliriz.
รrneฤin, 100m CPU, 100Milicpu ve 0.1 CPU aynฤฑdฤฑr. 1M'den daha fazla ince hassasiyete izin verilmez. CPU her zaman, mutlak bir miktar olarak talep edilir. Asla gรถreli olarak talep edilmez.
Misal;
1 CPU core kullanmak iรงin,
cpu:"1" = cpu="1000" = cpu:"1000m"
1 CPU 'nun %10nu kullanmasฤฑ iรงin,
cpu:"0.1" = cpu:"100" = cpu:"100m"
Kubernetes de CPU kฤฑsฤฑtlamalarฤฑ ลu ลekilde ayarlanฤฑr;
Her worker node'un belirli CPU kaynaklarฤฑ mevcuttur. Bu kaynaklar cloud รผstรผnde yada sanal olarak รงalลan stemlerde vCPU olarak, bare-metal sunucularda hyper thread olarak adlandฤฑrฤฑlฤฑr.
Biz bir pod tanฤฑmฤฑna cpu:1 tanฤฑmฤฑ eklersek, O pod 'un รงalฤฑลtฤฑฤฤฑ node รผstรผnde core'lardan, sadece 1 tanesini kullanacaฤฤฑ anlamฤฑna gelir. Baลka bir yazฤฑm ลekli daha vardฤฑr. Her core 1000ms yani 1000mili cpu'luk gรผรง demektir. Biz eฤer cpu:100m yaparsak, pod รงalฤฑลtฤฑฤฤฑ host รผstรผnde 1 core'un 10'da 1' gรผcรผne eriลebilir anlamฤฑna gelecektir. Yani, cpu:1 ile cpu:1000m aynฤฑ ลeydir. Keza 0.1 cpu ile cpu:100m de aynฤฑdฤฑr.
Memory tanฤฑmฤฑ daha kolaydฤฑr;
Cluster da mevcut durumda kullanฤฑlabilir bellek varsa, bir container belirlenen bellek isteฤini aลabilir. Ancak bir container bellek sฤฑnฤฑrฤฑndan fazlasฤฑnฤฑ kullanmasฤฑna izin verilmez. Bir container sฤฑnฤฑrฤฑndan daha fazla bellek ayฤฑrฤฑrsa, container sonlandฤฑrma iรงin aday olur. Container limitinin รถtesinde, bellek tรผketmeye devam ederse, container sonlandฤฑrฤฑlฤฑr. Sonlandฤฑrฤฑlmฤฑล container yeniden baลlatฤฑlabiliyorsa, diฤer herhangi bir runtime hatasฤฑ tรผrรผnde, olduฤu gibi kubelet onu yeniden baลlatฤฑr.
Containerฤฑn kullanabileceฤi maksimum memory 'i, byte cinsinden tanฤฑmlayabiliriz. รrneฤin, memory:64m dersek, bu containerฤฑn, en fazla 64megabyte memory kullanmasฤฑna izin verdiฤimiz anlamฤฑna gelir.
Buradaki m: megabyte g:gigabyte k:kilobyte kฤฑsaltmasฤฑdฤฑr. Bunlarฤฑn yerine memory hesaplamasฤฑnda kullanฤฑlan 2nin katlarฤฑnฤฑ kullanan gรถsterim ลekli olan, kibibyte,mebibyte,gibibyte tanฤฑmlarฤฑda desteklenir.
CPU ve Memory kฤฑsฤฑtlama tanฤฑmlarฤฑnฤฑ, iki ayrฤฑ bรถlรผmde tanฤฑmlayabiliyoruz. Bunlar, request ve limit parametreleri.
Request altฤฑnda tanฤฑmladฤฑฤฤฑmฤฑz deฤerler ลu anlama geliyor, Kubernetes bu pod'u oluลturmaya baลladฤฑฤฤฑ zaman, scheduler bu podun oluลturacaฤฤฑ node seรงecek. Bu seรงme aลamasฤฑnda kubernetese ลunu diyoruz, Bu podu en az 64megabyte memory, 250m milicpu yani รงeyrek cpu core'un eriลilebilir olduฤu bir node รผzerinde oluลtur. Kฤฑsacasฤฑ request kฤฑsmฤฑ bu podun oluลturulabilmesi iรงin, minimum ne kadarlฤฑk boล kaynaฤฤฑn olmasฤฑ gerektiฤini belirtiyor. Scheduler node seรงiminde bu parametreleri de gรถz รถnรผne alacak ve en az bu kadarlฤฑk kaynaฤฤฑn boล olduฤu bir node seรงecek. Eฤer boลta 64mbyte memory ve 250m cpu sahip(รงeyrek cpu), bir node bulamazsa, bu pod oluลturulmayacak.
Limit kฤฑsmฤฑ ise, tahmin edebileceฤiniz รผzere, bu containerฤฑn en fazla kullanabileceฤi sistem kaynaฤฤฑnฤฑ belirtiyor. Yukarฤฑdaki รถrnekte ลunu diyoruz,
Bu pod iรงerisinde oluลturulan container, en falza 256megabyte memory kullanabilsin, en รงok da yarฤฑm cpu (0.5) core 'na eriลebilsin. Gรถrdรผฤรผnรผz gibi cpu kฤฑsmฤฑnฤฑ istersek "0.5" yada "1" gibi belirtebiliyor, yada "250m" gibi milicpu halinde yazabiliyoruz. Yani buradaki "0.5" yerine "500m" de yazsak aynฤฑ olurdu.
Bu podu oluลturduฤumuz da ลu olacak, รncelikle scheduler รผstรผnde en az 64megabyte memory ve รงeyrek cpu core kaynaฤฤฑnฤฑn boลta olduฤu bir node bulacak, ve bu pod o node รผzerinde oluลturulacak. Pod oluลturulacak ve container รงalฤฑลmaya baลlayacak. Bu container ise, en fazla yarฤฑm cpu (0.5) core 'unun gรผcรผne denk gelecek ลekilde bir CPU kullanabilecek ve sistemden en fazla 256mbyte allocate edecek.
Bu Container eฤer yarฤฑm core 'dan fazla CPU kaynaฤฤฑna eriลmek isterse ne olacak?
Bu durum mรผmkรผn olmayacak, CPU da belirlediฤimiz Limit neyse, bu container en fazla o kadar CPU kaynaฤฤฑna eriลebilecek.
Memory kฤฑsmฤฑnda belirlediฤimiz deฤer, bu containerฤฑn maksimum kullanabileceฤi memory deฤeridir. Fakat container bu deฤere geldiฤi zaman, daha fazlasฤฑnฤฑ kullanamaz diye bir durum sรถz konusu deฤildir. Memory allocation CPU gibi รงalฤฑลmฤฑyor. teknik olarak farklฤฑ ลeyler.
Bu nedenle, bu container iรงerisindeki uygulama sistemden daha fazla ram talebinde bulunabiliyor. Sistem varsayฤฑlan olarak bunu engelleme ลansฤฑna sahip deฤil. ฤฐลte bu nedenle, eฤer container memory limitine geldiฤinde daha fazla memory allocate edilmesi iรงin bir mekanizma olmadฤฑฤฤฑndan, bu duruma geldiฤinde OOMKilled (out off memory) kill durumuna geรงerek restart ediliyor. Eฤer uygulamamฤฑz burada belirttiฤimiz, memory kฤฑsฤฑtฤฑndan daha รงok memory talep ederse pod restart edilecek. Bu nedenle, bu kฤฑsฤฑtlarฤฑ uygulamamฤฑzฤฑn davranฤฑลฤฑna gรถre belirlememizin davranฤฑลฤฑna gรถre belirlememiz gerekiyor.
Kubernetes node'lar รผstรผnde cpu ve memory kullanฤฑmฤฑnฤฑn kontrol edilmesi.
Kubernetes pod'lar รผstรผnde cpu ve memory kullanฤฑmฤฑnฤฑn kontrol edilmesi.
Last updated