{"id":94262,"date":"2020-09-14T19:42:34","date_gmt":"2020-09-14T17:42:34","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/kak-poluchit-dostup-k-resursam-kubernetes-pod"},"modified":"2020-09-14T19:42:34","modified_gmt":"2020-09-14T17:42:34","slug":"kak-poluchit-dostup-k-resursam-kubernetes-pod","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/kak-poluchit-dostup-k-resursam-kubernetes-pod","title":{"rendered":"Jak uzyska\u0107 dost\u0119p do zasob\u00f3w Kubernetes Pod","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Jak uzyska\u0107 dost\u0119p do zasob\u00f3w Kubernetes Pod\" src=\"\/wp-content\/uploads\/2020\/09\/3d6760d512ef456daad121f7d1ddbcf8.jpg\" style=\"display:block;margin: 0 auto;\" \/><noindex><a rel=\"nofollow\" href=\"https:\/\/www.deviantart.com\/tohad\/art\/The-Reward-549720998\"><i>Nagroda od Tohad<\/i><\/a><\/noindex><\/p>\n<p>Na pocz\u0105tku pracy z Kubernetes cz\u0119sto zapomina si\u0119 o konfiguracji zasob\u00f3w kontener\u00f3w. Na tym etapie wystarczy upewni\u0107 si\u0119, \u017ce obraz Docker dzia\u0142a i mo\u017cna go wdro\u017cy\u0107 w klastrze Kubernetes.<\/p>\n<p>Jednak p\u00f3\u017aniej aplikacja musi by\u0107 wdro\u017cona w produkcyjnym klastrze wraz z innymi aplikacjami. W tym celu nale\u017cy przydzieli\u0107 zasoby dla kontenera i upewni\u0107 si\u0119, \u017ce s\u0105 wystarczaj\u0105ce do uruchomienia i dzia\u0142ania aplikacji, a tak\u017ce aby nie wyst\u0105pi\u0142y problemy z innymi uruchomionymi aplikacjami.<\/p>\n<p>Zesp\u00f3\u0142 <noindex><a rel=\"nofollow\" href=\"https:\/\/mcs.mail.ru\/\">Kubernetes aaS od Mail.ru<\/a><\/noindex> przet\u0142umaczy\u0142a artyku\u0142 o zasobach kontener\u00f3w (CPU i MEM), zapytaniach i ograniczeniach zasob\u00f3w. Dowiesz si\u0119, jakie korzy\u015bci daj\u0105 te konfiguracje i co si\u0119 stanie, je\u015bli ich nie ustawisz.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Zasoby obliczeniowe<\/h2>\n<p>\nMamy dwa typy zasob\u00f3w z nast\u0119puj\u0105cymi jednostkami:<\/p>\n<ul>\n<li>Procesor centralny (CPU) \u2014 rdzenie;<\/li>\n<li>Pami\u0119\u0107 (MEM) \u2014 bajty.<\/li>\n<\/ul>\n<p>\nZasoby s\u0105 okre\u015blane dla ka\u017cdego kontenera. W nast\u0119puj\u0105cym pliku YAML Pod zobaczysz sekcj\u0119 zasob\u00f3w, kt\u00f3ra zawiera \u017c\u0105dane i maksymalne zasoby:<\/p>\n<ul>\n<li>\u017b\u0105dane zasoby Pod = suma \u017c\u0105danych zasob\u00f3w wszystkich kontener\u00f3w;<\/li>\n<li>Maksymalne zasoby Pod = suma maksymalnych zasob\u00f3w wszystkich kontener\u00f3w.<\/li>\n<\/ul>\n<p><\/p>\n<pre><code class=\"plaintext\">apiVersion: v1\nkind: Pod\nmetadata:\n  name: backend-pod-name\n  labels:\n    application: backend\nspec:\n  containers:\n    - name: main-container\n      image: my-backend\n      tag: v1\n      ports:\n      - containerPort: 8080\n      resources:\n        requests:\n          cpu: 0.2 # \u017b\u0104DANY CPU: 200m rdzeni\n          memory: \"1Gi\" # \u017b\u0104DANA PAMI\u0118\u0106: 1Gi\n        limits:\n          cpu: 1 # MAKSYMALNE U\u017bYCIE CPU: 1 rdze\u0144\n          memory: \"1Gi\" # MAKSYMALNE U\u017bYCIE PAMI\u0118CI:  1Gi\n    - name: other-container\n      image: other-app\n      tag: v1\n      ports:\n      - containerPort: 8000\n      resources:\n        requests:\n          cpu: \"200m\" # \u017b\u0104DANY CPU: 200m rdzeni\n          memory: \"0.5Gi\" # \u017b\u0104DANA PAMI\u0118\u0106: 0.5Gi\n        limits:\n          cpu: 1 # MAKSYMALNE U\u017bYCIE CPU: 1 rdze\u0144\n          memory: \"1Gi\" # MAKSYMALNE U\u017bYCIE PAMI\u0118CI:  1Gi<\/code><\/pre>\n<p>Przyk\u0142ad \u017c\u0105danych i maksymalnych zasob\u00f3w<\/p>\n<p>Pole <code>resources.requested<\/code> z specyfikacji Pod \u2014 jeden z element\u00f3w, kt\u00f3ry jest u\u017cywany do wyszukiwania odpowiedniego w\u0119z\u0142a. Ju\u017c na nim mo\u017cna zaplanowa\u0107 wdro\u017cenie Pod. Jak wi\u0119c szuka si\u0119 odpowiedniego w\u0119z\u0142a?<\/p>\n<p>Kubernetes sk\u0142ada si\u0119 z kilku komponent\u00f3w, w tym zawiera g\u0142\u00f3wny w\u0119ze\u0142 lub master node (Kubernetes Control Plane). W master node znajduje si\u0119 kilka proces\u00f3w: kube-apiserver, kube-controller-manager i kube-scheduler. <\/p>\n<p>Proces kube-scheduler odpowiada za przegl\u0105danie nowo utworzonych modu\u0142\u00f3w i wyszukiwanie mo\u017cliwych w\u0119z\u0142\u00f3w roboczych, kt\u00f3re spe\u0142niaj\u0105 wszystkie wymagania modu\u0142\u00f3w, w tym dotycz\u0105ce liczby \u017c\u0105danych zasob\u00f3w. Lista w\u0119z\u0142\u00f3w znalezionych przez kube-scheduler jest rankingurowana. Pod jest planowany na w\u0119\u017ale z najwy\u017cszymi wynikami.<\/p>\n<p><img decoding=\"async\" alt=\"Jak uzyska\u0107 dost\u0119p do zasob\u00f3w Kubernetes Pod\" src=\"\/wp-content\/uploads\/2020\/09\/b489991a3cbbd5359c99701886d488e5.jpg\" style=\"display:block;margin: 0 auto;\" \/>Gdzie zostanie umieszczony fioletowy Pod?<\/p>\n<p>Na obrazku wida\u0107, \u017ce kube-scheduler musi zaplanowa\u0107 nowy fioletowy Pod. Klaster Kubernetes zawiera dwa w\u0119z\u0142y: A i B. Jak mo\u017cna zauwa\u017cy\u0107, kube-scheduler nie mo\u017ce zaplanowa\u0107 Pod na w\u0119ze\u0142 A \u2014 dost\u0119pne (niewykorzystane) zasoby nie odpowiadaj\u0105 wymaganiom fioletowego Pod. Tak wi\u0119c, wymagane przez fioletowy Pod 1 GB pami\u0119ci nie zmie\u015bci si\u0119 na w\u0119\u017ale A, poniewa\u017c dost\u0119pny poziom pami\u0119ci wynosi 0,5 GB. Jednak w\u0119ze\u0142 B ma wystarczaj\u0105ce zasoby. W rezultacie kube-scheduler decyduje, \u017ce celem fioletowego Pod jest w\u0119ze\u0142 B.<\/p>\n<p>Teraz wiemy, jak wymagane zasoby wp\u0142ywaj\u0105 na wyb\u00f3r w\u0119z\u0142a do uruchomienia Pod. Ale jak wp\u0142ywaj\u0105 ograniczenia zasob\u00f3w?<\/p>\n<p>Ograniczenia zasob\u00f3w to granica, kt\u00f3rej CPU\/MEM nie mog\u0105 przekracza\u0107. Niemniej jednak zas\u00f3b CPU jest elastyczny, dlatego kontenery, kt\u00f3re osi\u0105gn\u0119\u0142y ograniczenia CPU, nie spowoduj\u0105 zako\u0144czenia pracy Pod. Zamiast tego uruchomi si\u0119 ograniczenie CPU. Je\u015bli jednak osi\u0105gni\u0119ty zostanie limit u\u017cycia MEM, kontener zostanie zatrzymany przez OOM-Killer i uruchomiony ponownie, je\u015bli jest to dozwolone przez ustawienia RestartPolicy.<\/p>\n<h2>Wymagane i ograniczone zasoby w szczeg\u00f3\u0142ach<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Jak uzyska\u0107 dost\u0119p do zasob\u00f3w Kubernetes Pod\" src=\"\/wp-content\/uploads\/2020\/09\/22e672100940e8895ae42a56a681111f.jpg\" style=\"display:block;margin: 0 auto;\" \/>Zwi\u0105zek zasob\u00f3w mi\u0119dzy Dockerem a Kubernetesem<\/p>\n<p>Najlepszym sposobem wyja\u015bnienia, jak dzia\u0142aj\u0105 wymagane i ograniczone zasoby, jest przedstawienie zwi\u0105zku mi\u0119dzy Kubernetesem a Dockerem. Na powy\u017cszym rysunku mo\u017cna zobaczy\u0107, jak zwi\u0105zane s\u0105 pola Kubernetes i flagi uruchamiania Dockera.<\/p>\n<h2>Pami\u0119\u0107: \u017c\u0105danie i ograniczenie<\/h2>\n<p><\/p>\n<pre><code class=\"plaintext\">containers:\n...\n resources:\n   requests:\n     memory: \"0.5Gi\"\n   limits:\n     memory: \"1Gi\"\n<\/code><\/pre>\n<p>\nJak wspomniano powy\u017cej, pami\u0119\u0107 jest mierzona w bajtach. Opieraj\u0105c si\u0119 na <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/configuration\/manage-resources-containers\/#meaning-of-memory\">dokumentacji Kubernetes<\/a><\/noindex>, mo\u017cemy okre\u015bli\u0107 pami\u0119\u0107 jako liczb\u0119. Zwykle jest to liczba ca\u0142kowita, na przyk\u0142ad 2678 \u2014 czyli 2678 bajt\u00f3w. Mo\u017cna r\u00f3wnie\u017c u\u017cy\u0107 sufiks\u00f3w <code>G<\/code> i <code>Gi<\/code>, wa\u017cne jest, aby pami\u0119ta\u0107, \u017ce nie s\u0105 one r\u00f3wnoznaczne. Pierwszy \u2014 dziesi\u0119tny, a drugi \u2014 binarny. Na przyk\u0142ad, jak wspomniano w dokumentacji k8s: <code>128974848<\/code>, <code>129e6<\/code>, <code>129M<\/code>, <code>123Mi<\/code> \u2014 s\u0105 one praktycznie ekwiwalentne.<\/p>\n<p>Parametr Kubernetes <code>limits.memory<\/code> odpowiada fladze <code>--memory<\/code> z Dockera. W przypadku <code>request.memory<\/code> strza\u0142ka dla Dockera jest nieobecna, poniewa\u017c Docker nie u\u017cywa tego pola. Mo\u017cesz zapyta\u0107, czy jest to w og\u00f3le potrzebne? Tak, jest potrzebne. Jak ju\u017c wspomnia\u0142em, pole ma znaczenie dla Kubernetes. Na podstawie informacji z niego kube-scheduler decyduje, na kt\u00f3rym w\u0119\u017ale zaplanowa\u0107 Pod.<\/p>\n<p><strong>Co si\u0119 stanie, je\u015bli ustawi si\u0119 zbyt ma\u0142o pami\u0119ci dla \u017c\u0105dania?<\/strong><\/p>\n<p>Je\u015bli kontener osi\u0105gnie granice wymaganej pami\u0119ci, Pod jest umieszczany w grupie Pod, kt\u00f3re zostaj\u0105 zatrzymane w przypadku braku pami\u0119ci w w\u0119\u017ale.<\/p>\n<p><strong>Co si\u0119 stanie, je\u015bli ustalisz zbyt nisk\u0105 warto\u015b\u0107 limitu pami\u0119ci?<\/strong><\/p>\n<p>Je\u015bli kontener przekroczy limit pami\u0119ci, zostanie zako\u0144czony z powodu OOM-Killed. Zostanie uruchomiony ponownie, je\u015bli to mo\u017cliwe na podstawie RestartPolicy, gdzie domy\u015bln\u0105 warto\u015bci\u0105 jest <code>Zawsze<\/code>.<\/p>\n<p><strong>Co si\u0119 stanie, je\u015bli nie podasz wymaganej pami\u0119ci?<\/strong><\/p>\n<p>Kubernetes we\u017amie warto\u015b\u0107 limitu i ustawi j\u0105 jako domy\u015bln\u0105.<\/p>\n<p><strong>Co mo\u017ce si\u0119 sta\u0107, je\u015bli nie okre\u015blisz limitu pami\u0119ci?<\/strong><\/p>\n<p>Kontener nie ma ogranicze\u0144, mo\u017ce u\u017cywa\u0107 tyle pami\u0119ci, ile chce. Je\u015bli zacznie korzysta\u0107 z ca\u0142ej dost\u0119pnej pami\u0119ci w\u0119z\u0142a, zostanie zabity przez OOM. Nast\u0119pnie kontener zostanie uruchomiony ponownie, je\u015bli to mo\u017cliwe na podstawie RestartPolicy.<\/p>\n<p><strong>Co si\u0119 stanie, je\u015bli nie podasz limit\u00f3w pami\u0119ci?<\/strong><\/p>\n<p>To najgorszy scenariusz: planer nie wie, ile zasob\u00f3w potrzebuje kontener, co mo\u017ce spowodowa\u0107 powa\u017cne problemy na w\u0119\u017ale. W takim przypadku dobrze by\u0142oby mie\u0107 domy\u015blne ograniczenia w przestrzeni nazw (ustawiane przez LimitRange). Domy\u015blnie nie ma ogranicze\u0144 \u2014 Pod nie ma ogranicze\u0144, mo\u017ce u\u017cywa\u0107 tyle pami\u0119ci, ile chce.<\/p>\n<p>Je\u015bli wymagane pami\u0119ci jest wi\u0119cej, ni\u017c mo\u017ce zaoferowa\u0107 w\u0119ze\u0142, Pod nie zostanie zaplanowany. Wa\u017cne jest, aby pami\u0119ta\u0107, \u017ce <code>Requests.memory<\/code> nie jest minimaln\u0105 warto\u015bci\u0105. To opis ilo\u015bci pami\u0119ci wystarczaj\u0105cej do ci\u0105g\u0142ej pracy kontenera. <\/p>\n<p>Zazwyczaj zaleca si\u0119 ustawienie tej samej warto\u015bci dla <code>request.memory<\/code> i <code>limit.memory<\/code>. Dzi\u0119ki temu Kubernetes nie zaplanuje Pod na w\u0119\u017ale, kt\u00f3ry ma wystarczaj\u0105co pami\u0119ci, aby uruchomi\u0107 Pod, ale nie wystarczaj\u0105co na jego dzia\u0142anie. Nale\u017cy pami\u0119ta\u0107, \u017ce przy planowaniu Pod Kubernetes bierze pod uwag\u0119 tylko <code>requests.memory<\/code>, a <code>limits.memory<\/code> nie uwzgl\u0119dnia.<\/p>\n<h2>CPU: zapytanie i limit<\/h2>\n<p><\/p>\n<pre><code class=\"plaintext\">containers:\n...\n resources:\n   requests:\n     cpu: 1\n   limits:\n     cpu: \"1200m\"\n<\/code><\/pre>\n<p>\nZ CPU sprawy s\u0105 nieco bardziej skomplikowane. Wracaj\u0105c do obrazka ilustruj\u0105cego powi\u0105zanie mi\u0119dzy Kubernetes a Docker, mo\u017cna zauwa\u017cy\u0107, \u017ce <code>request.cpu<\/code> -the node, and the other \u2014 <code>--cpu-shares<\/code>, podczas gdy <code>limit.cpu<\/code> odpowiada fladze <code>cpus<\/code> w Dockerze.<\/p>\n<p>CPU, kt\u00f3re \u017c\u0105da Kubernetes, jest mno\u017cone przez 1024 \u2014 proporcj\u0119 cykli CPU. Je\u015bli chcesz za\u017c\u0105da\u0107 1 pe\u0142nego rdzenia, musisz doda\u0107 <code>cpu: 1<\/code>, jak pokazano powy\u017cej. <\/p>\n<p>\u017b\u0105danie pe\u0142nego rdzenia (proporcja = 1024) nie oznacza, \u017ce kontener go otrzyma. Je\u015bli tw\u00f3j komputer gospodarza ma tylko jeden rdze\u0144, a ty u\u017cywasz wi\u0119cej ni\u017c jednego kontenera, wszystkie kontenery musz\u0105 wsp\u00f3lnie korzysta\u0107 z dost\u0119pnego CPU. Jak to dzia\u0142a? Przyjrzyjmy si\u0119 obrazkowi.<\/p>\n<p><img decoding=\"async\" alt=\"Jak uzyska\u0107 dost\u0119p do zasob\u00f3w Kubernetes Pod\" src=\"\/wp-content\/uploads\/2020\/09\/7f4b20642708ef3a7e773d7900161267.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u017b\u0105danie CPU \u2014 system z jednym rdzeniem<\/p>\n<p>Wyobra\u017amy sobie, \u017ce masz system hosta z jednym rdzeniem, na kt\u00f3rym dzia\u0142aj\u0105 kontenery. Mama (Kubernetes) upiek\u0142a ciasto (CPU) i chce podzieli\u0107 je mi\u0119dzy dzieci (kontenery). Troje dzieci chce po ca\u0142ym cie\u015bcie (proporcja = 1024), a jedno dziecko chce po\u0142ow\u0119 ciasta (512). Mama chce by\u0107 sprawiedliwa i przeprowadza proste obliczenie.<\/p>\n<pre><code class=\"plaintext\"># \u0421\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0438\u0440\u043e\u0433\u043e\u0432 \u0445\u043e\u0442\u044f\u0442 \u0434\u0435\u0442\u0438?\n# 3 \u0440\u0435\u0431\u0435\u043d\u043a\u0430 \u0445\u043e\u0442\u044f\u0442 \u043f\u043e \u0446\u0435\u043b\u043e\u043c\u0443 \u043f\u0438\u0440\u043e\u0433\u0443 \u0438 \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u043f\u0438\u0440\u043e\u0433\u0430\ncakesNumberKidsWant = (3 * 1) + (1 * 0.5) = 3.5\n# \u0412\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a:\n3 (\u0440\u0435\u0431\u0435\u043d\u043a\u0430\/\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430) * 1 (\u0446\u0435\u043b\u044b\u0439 \u043f\u0438\u0440\u043e\u0433\/\u043f\u043e\u043b\u043d\u043e\u0435 \u044f\u0434\u0440\u043e) + 1 (\u0440\u0435\u0431\u0435\u043d\u043e\u043a\/\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440) * 0.5 (\u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u043f\u0438\u0440\u043e\u0433\u0430\/\u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u044f\u0434\u0440\u0430)\n# \u0421\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0438\u0440\u043e\u0433\u043e\u0432 \u0438\u0441\u043f\u0435\u0447\u0435\u043d\u043e?\navailableCakesNumber = 1\n# \u0421\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0438\u0440\u043e\u0433\u0430 (\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e) \u0434\u0435\u0442\u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c?\nnewMaxRequest = 1 \/ 3.5 =~ 28%<\/code><\/pre>\n<p>\nNa podstawie oblicze\u0144 troje dzieci dostanie po 28% rdzenia, a nie po ca\u0142ym rdzeniu. Czwarte dziecko dostanie 14% pe\u0142nego rdzenia, a nie po\u0142ow\u0119. Ale wszystko b\u0119dzie inaczej, je\u015bli masz system wielordzeniowy.<\/p>\n<p><img decoding=\"async\" alt=\"Jak uzyska\u0107 dost\u0119p do zasob\u00f3w Kubernetes Pod\" src=\"\/wp-content\/uploads\/2020\/09\/7bf71d97add9adcf7cf0260941526590.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u017b\u0105danie CPU \u2014 system wielordzeniowy (4)<\/p>\n<p>Na powy\u017cszym obrazku wida\u0107, \u017ce troje dzieci chce po ca\u0142ym cie\u015bcie, a jedno \u2014 po\u0142ow\u0119. Poniewa\u017c mama upiek\u0142a cztery ciasta, ka\u017cde z jej dzieci dostanie tyle, ile chce. W systemie wielordzeniowym zasoby procesora s\u0105 rozdzielane pomi\u0119dzy wszystkie dost\u0119pne rdzenie procesora. Je\u015bli kontener jest ograniczony do mniej ni\u017c jedno pe\u0142ne rdze\u0144 CPU, to i tak mo\u017ce go u\u017cywa\u0107 w 100%. <\/p>\n<p>Przytoczone wy\u017cej obliczenia s\u0105 uproszczone, aby zrozumie\u0107, jak CPU jest rozdzielane mi\u0119dzy kontenery. Oczywi\u015bcie, opr\u00f3cz samych kontener\u00f3w, s\u0105 tak\u017ce inne procesy, kt\u00f3re korzystaj\u0105 z zasob\u00f3w CPU. Gdy procesy w jednym kontenerze s\u0105 bezczynne, inne mog\u0105 korzysta\u0107 z jego zasob\u00f3w. <code>CPU: \"200m\"<\/code> -the node, and the other \u2014 <code>CPU: 0,2<\/code>, co oznacza oko\u0142o 20% jednego rdzenia.<\/p>\n<p>Teraz porozmawiajmy o <code>limit.cpu<\/code>. CPU, kt\u00f3re ogranicza Kubernetes, mno\u017cy si\u0119 przez 100. Wynik to ilo\u015b\u0107 czasu, jak\u0105 kontener mo\u017ce u\u017cywa\u0107 co 100 \u00b5s (<code>cpu-period<\/code>). <\/p>\n<p><code>limit.cpu<\/code> odpowiednio do flagi Dockera <code>--cpus<\/code>. To nowa kombinacja starych <code>--cpu-period<\/code> i <code>--cpu-quota<\/code>. Ustawiaj\u0105c to, okre\u015blamy, ile dost\u0119pnych zasob\u00f3w CPU kontener mo\u017ce maksymalnie wykorzysta\u0107 zanim zacznie si\u0119 throttling:<\/p>\n<ul>\n<li><strong>cpus<\/strong> \u2014 kombinacja <code>cpu-period<\/code> i <code>cpu-quota. cpus = 1.5<\/code> jest r\u00f3wnowa\u017cna ustawieniu <code>cpu-period = 100000<\/code> i <code>cpu-quota = 150000<\/code>;<\/li>\n<li><strong>cpu-period<\/strong> \u2014 okres <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Completely_Fair_Scheduler\">planisty CPU CFS<\/a><\/noindex>, domy\u015blnie 100 mikrosekund;<\/li>\n<li><strong>cpu-quota<\/strong> \u2014 liczba mikrosekund w <code>cpu-period<\/code>, kt\u00f3re ogranicza kontener.<\/li>\n<\/ul>\n<p>\n<strong>Co si\u0119 stanie, je\u015bli ustawimy zbyt ma\u0142e \u017c\u0105danie CPU?<\/strong><\/p>\n<p>Je\u015bli kontener potrzebuje wi\u0119cej, ni\u017c jest ustawione, to odbierze CPU innym procesom.<\/p>\n<p><strong>Co si\u0119 stanie, je\u015bli ustawimy zbyt niski limit CPU?<\/strong><\/p>\n<p>Poniewa\u017c zas\u00f3b CPU jest regulowany, to w\u0142\u0105czy si\u0119 throttling.<\/p>\n<p><strong>Co si\u0119 stanie, je\u015bli nie wska\u017aesz \u017c\u0105dania CPU?<\/strong><\/p>\n<p>Podobnie jak w przypadku pami\u0119ci, warto\u015b\u0107 \u017c\u0105dania odpowiada limitowi.<\/p>\n<p><strong>Co si\u0119 stanie, je\u015bli nie okre\u015bl\u0119 limitu CPU?<\/strong><\/p>\n<p>Kontener wykorzysta tyle CPU, ile potrzebuje. Je\u015bli w przestrzeni nazw zdefiniowana jest polityka CPU domy\u015blnego (LimitRange), to ten limit b\u0119dzie stosowany r\u00f3wnie\u017c do kontenera.<\/p>\n<p><strong>Co si\u0119 wydarzy, je\u015bli nie okre\u015bl\u0119 ani \u017c\u0105dania, ani limitu CPU?<\/strong><\/p>\n<p>Podobnie jak w przypadku pami\u0119ci, to najgorszy scenariusz. Planista nie wie, ile zasob\u00f3w potrzebuje Tw\u00f3j kontener, co mo\u017ce spowodowa\u0107 powa\u017cne problemy na w\u0119\u017ale. Aby tego unikn\u0105\u0107, nale\u017cy ustawi\u0107 domy\u015blne ograniczenia dla przestrzeni nazw (LimitRange).<\/p>\n<p>Pami\u0119taj: je\u015bli za\u017c\u0105daj\u0105 wi\u0119cej CPU, ni\u017c mog\u0105 zapewni\u0107 w\u0119z\u0142y, Pod nie zostanie zaplanowany. <code>Requests.cpu<\/code> \u2014 to nie minimalna warto\u015b\u0107, ale warto\u015b\u0107 wystarczaj\u0105ca do uruchomienia Pod i pracy bez zak\u0142\u00f3ce\u0144. Je\u015bli aplikacja nie wykonuje skomplikowanych oblicze\u0144, najlepiej ustawi\u0107 <code>request.cpu &lt;= 1<\/code> i uruchomi\u0107 tyle replik, ile to konieczne.<\/p>\n<h2>Idealna ilo\u015b\u0107 \u017c\u0105danych zasob\u00f3w lub limitu zasob\u00f3w<\/h2>\n<p>\nDowiedzieli\u015bmy si\u0119 o ograniczeniu zasob\u00f3w obliczeniowych. Teraz czas odpowiedzie\u0107 na pytanie: \u201eIle zasob\u00f3w potrzebuje m\u00f3j Pod do bezproblemowego dzia\u0142ania aplikacji? Jakie ilo\u015bci s\u0105 idealne?\u201d. <\/p>\n<p>Niestety, na te pytania nie ma jednoznacznych odpowiedzi. Je\u015bli nie wiesz, jak dzia\u0142a Twoja aplikacja, ile CPU lub pami\u0119ci potrzebuje, najlepiej zapewni\u0107 aplikacji du\u017co pami\u0119ci i CPU, a nast\u0119pnie przeprowadzi\u0107 testy wydajno\u015bci.<\/p>\n<p>Opr\u00f3cz test\u00f3w wydajno\u015bci, przez tydzie\u0144 obserwuj zachowanie aplikacji w monitoringu. Je\u015bli z wykres\u00f3w wynika, \u017ce Twoja aplikacja zu\u017cywa mniej zasob\u00f3w, ni\u017c \u017c\u0105da\u0142e\u015b, mo\u017cna zmniejszy\u0107 ilo\u015b\u0107 za\u017c\u0105danych CPU lub pami\u0119ci.<\/p>\n<p>Na przyk\u0142ad zapoznaj si\u0119 z tym <noindex><a rel=\"nofollow\" href=\"https:\/\/grafana.com\/grafana\/dashboards\/7187\">dashboardem Grafana<\/a><\/noindex>. Wy\u015bwietla on r\u00f3\u017cnic\u0119 mi\u0119dzy \u017c\u0105danymi zasobami lub limitem zasob\u00f3w a aktualnym zu\u017cyciem zasob\u00f3w.<\/p>\n<h2>Podsumowanie<\/h2>\n<p>\n\u017b\u0105dania i ograniczenia zasob\u00f3w pomagaj\u0105 utrzyma\u0107 sprawno\u015b\u0107 klastra Kubernetes. Odpowiednia konfiguracja limit\u00f3w minimalizuje koszty i nieprzerwanie utrzymuje aplikacje w dzia\u0142aniu.<\/p>\n<p>Kr\u00f3tko m\u00f3wi\u0105c, nale\u017cy pami\u0119ta\u0107 o kilku kwestiach:<\/p>\n<ol>\n<li>Wymagane zasoby to konfiguracja, kt\u00f3ra jest brana pod uwag\u0119 podczas uruchamiania (gdy Kubernetes planuje rozmieszczenie aplikacji). Z kolei limit zasob\u00f3w ma znaczenie w trakcie dzia\u0142ania \u2014 gdy aplikacja ju\u017c dzia\u0142a na w\u0119\u017ale.<\/li>\n<li>W por\u00f3wnaniu do pami\u0119ci, CPU to zas\u00f3b regulowany. W przypadku niedoboru CPU Tw\u00f3j Pod nie zako\u0144czy pracy, uruchomi si\u0119 mechanizm ograniczania.<\/li>\n<li>Wymagane zasoby i limit zasob\u00f3w to nie minimalne i maksymalne warto\u015bci! Ustalaj\u0105c wymagane zasoby, gwarantujesz, \u017ce aplikacja b\u0119dzie dzia\u0142a\u0107 bez problem\u00f3w.<\/li>\n<li>Dobr\u0105 praktyk\u0105 jest ustawienie zapotrzebowania na pami\u0119\u0107 r\u00f3wnego limitowi pami\u0119ci.<\/li>\n<li>Dobrze jest ustawi\u0107 zapotrzebowane <code>CPU &lt;=1<\/code>, je\u015bli aplikacja nie wykonuje skomplikowanych oblicze\u0144.<\/li>\n<li>Je\u015bli za\u017c\u0105dzasz wi\u0119cej zasob\u00f3w, ni\u017c jest dost\u0119pne na w\u0119\u017ale, Pod nigdy nie zostanie zaplanowany na ten w\u0119ze\u0142.<\/li>\n<li>Aby okre\u015bli\u0107 odpowiedni\u0105 ilo\u015b\u0107 wymaganych zasob\u00f3w\/limit\u00f3w zasob\u00f3w, korzystaj z testowania obci\u0105\u017cenia i monitorowania.<\/li>\n<\/ol>\n<p>\nMam nadziej\u0119, \u017ce ten artyku\u0142 pomo\u017ce Ci zrozumie\u0107 podstawow\u0105 koncepcj\u0119 limit\u00f3w zasob\u00f3w. I b\u0119dziesz m\u00f3g\u0142 zastosowa\u0107 t\u0119 wiedz\u0119 w swojej pracy.<\/p>\n<p>Powodzenia!<\/p>\n<p><strong>Co jeszcze przeczyta\u0107:<\/strong><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/500504\/\">Obserwowalno\u015b\u0107 SRE: przestrzenie nazw i struktura metryk<\/a><\/noindex>.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/mcs.mail.ru\/blog\/poleznye-instrumenty-dlya-kubernetes\">90+ przydatnych narz\u0119dzi dla Kubernetes: wdro\u017cenie, zarz\u0105dzanie, monitorowanie, bezpiecze\u0144stwo i nie tylko<\/a><\/noindex>.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/tele.click\/k8s_mail\">Nasz kana\u0142 Wok\u00f3\u0142 Kubernetes na Telegramie<\/a><\/noindex>.<\/li>\n<\/ol>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/516014\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>The Reward by Tohad \u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Kubernetes \u043e\u0431\u044b\u0447\u043d\u043e \u0437\u0430\u0431\u044b\u0432\u0430\u044e\u0442 \u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432. \u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043e\u0431\u0440\u0430\u0437 Docker \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Kubernetes. \u041d\u043e \u043f\u043e\u0437\u0434\u043d\u0435\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0438 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0438\u0445 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":94263,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-94262","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/kak-poluchit-dostup-k-resursam-kubernetes-pod\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c Kubernetes Pod | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/kak-poluchit-dostup-k-resursam-kubernetes-pod\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-09-14T17:42:34+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-09-14T17:42:34+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Jak uzyska\u0107 dost\u0119p do zasob\u00f3w Kubernetes Pod | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/kak-poluchit-dostup-k-resursam-kubernetes-pod","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c Kubernetes Pod | ProHoster","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/kak-poluchit-dostup-k-resursam-kubernetes-pod","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-09-14T17:42:34+00:00","article:modified_time":"2020-09-14T17:42:34+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"94262","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 11:30:27","updated":"2022-10-02 18:20:09","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/94262","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=94262"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/94262\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/94263"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=94262"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=94262"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=94262"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}