{"id":97982,"date":"2020-10-23T14:42:15","date_gmt":"2020-10-23T12:42:15","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes"},"modified":"2020-11-18T00:58:47","modified_gmt":"2020-11-17T22:58:47","slug":"devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes","title":{"rendered":"Dziewi\u0119\u0107 wskaz\u00f3wek dotycz\u0105cych zwi\u0119kszenia wydajno\u015bci Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Dziewi\u0119\u0107 wskaz\u00f3wek dotycz\u0105cych zwi\u0119kszenia wydajno\u015bci Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/92dc510aa9d785a31d310816b18bf854.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Cze\u015b\u0107 wszystkim! Nazywam si\u0119 Oleg Sidorenkov, pracuj\u0119 w firmie DomKlik jako kierownik zespo\u0142u infrastruktury. U\u017cywamy 'Kubika' w produkcji ju\u017c od ponad trzech lat, i przez ten czas do\u015bwiadczyli\u015bmy wielu r\u00f3\u017cnych interesuj\u0105cych moment\u00f3w. Dzi\u015b opowiem Wam, jak przy odpowiednim podej\u015bciu mo\u017cna wydoby\u0107 jeszcze wi\u0119cej wydajno\u015bci z 'waniliowego' Kubernetes dla Waszego klastra. Gotowi, startujemy! <\/p>\n<p>Wszyscy doskonale wiecie, \u017ce Kubernetes to skalowalny system z otwartym kodem do orkiestracji kontenerami; no c\u00f3\u017c, albo 5 binarek, kt\u00f3re dokonuj\u0105 magii, zarz\u0105dzaj\u0105c cyklem \u017cycia Waszych mikrous\u0142ug w \u015brodowisku serwerowym. Ponadto to do\u015b\u0107 elastyczne narz\u0119dzie, kt\u00f3re mo\u017cna sk\u0142ada\u0107 jak klocki Lego, aby maksymalnie dostosowa\u0107 je do r\u00f3\u017cnych zada\u0144.<\/p>\n<p>I wydaje si\u0119, \u017ce wszystko jest w porz\u0105dku: wrzucaj serwery do klastra, jak drewno do pieca, i nie martw si\u0119 o nic. Ale je\u015bli dbasz o ekologi\u0119, to zaczniesz si\u0119 zastanawia\u0107: 'Jak mog\u0119 podtrzyma\u0107 ogie\u0144 w piecu i jednocze\u015bnie oszcz\u0119dzi\u0107 las?'. Innymi s\u0142owy, jak znale\u017a\u0107 sposoby na popraw\u0119 infrastruktury i obni\u017cenie koszt\u00f3w.<\/p>\n<h2>1. Monitoruj zasoby zespo\u0142\u00f3w i aplikacji<\/h2>\n<p><img decoding=\"async\" alt=\"Dziewi\u0119\u0107 wskaz\u00f3wek dotycz\u0105cych zwi\u0119kszenia wydajno\u015bci Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/91e2e60b47ee985b024532c8b685230c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Jedna z najprostszych, ale skutecznych metod to wprowadzenie requests\/limits. Podziel aplikacje na namespace'y, a namespace'y na zespo\u0142y deweloperskie. Ustawiaj aplikacji przed wdro\u017ceniem warto\u015bci dotycz\u0105ce zu\u017cycia czasu procesora, pami\u0119ci, efemerycznego przechowywania.<\/p>\n<pre><code>resources:\n   requests:\n     memory: 2Gi\n     cpu: 250m\n   limits:\n     memory: 4Gi\n     cpu: 500m<\/code><\/pre>\n<p>Metod\u0105 pr\u00f3b i b\u0142\u0119d\u00f3w doszli\u015bmy do wniosku, \u017ce nie warto przeszacowywa\u0107 requests w stosunku do limits wi\u0119cej ni\u017c dwukrotnie. Obj\u0119to\u015b\u0107 klastra oblicza si\u0119 na podstawie requests, a je\u015bli zadasz aplikacjom r\u00f3\u017cnic\u0119 w zasobach, na przyk\u0142ad 5-10 razy, to wyobra\u017a sobie, co stanie si\u0119 z Twoj\u0105 w\u0119z\u0142em, gdy zostanie zape\u0142niona podami i nagle otrzyma obci\u0105\u017cenie. Nic dobrego. Co najmniej throttling, a w najgorszym przypadku po\u017cegnasz si\u0119 z workerem i dostaniesz cykliczne obci\u0105\u017cenie innych w\u0119z\u0142\u00f3w po tym, jak pody zaczn\u0105 si\u0119 przemieszcza\u0107.<\/p>\n<p>Ponadto, za pomoc\u0105 <code>limitranges<\/code> mo\u017cesz na pocz\u0105tku ustawi\u0107 dla kontenera warto\u015bci dotycz\u0105ce zasob\u00f3w \u2014 minimalne, maksymalne i domy\u015blne:<\/p>\n<pre><code>\u279c  ~ kubectl describe limitranges --namespace ops\nNazwa:       limit-range\nNamespace:  ops\nTyp         Zas\u00f3b           Min   Max   Domy\u015blny Zas\u00f3b     Domy\u015blny Limit  Max Limit\/Request Ratio\n----        --------         ---   ---   ----------------  -------------  -----------------------\nKontener   cpu              50m   10    100m             100m           2\nKontener   ephemeral-storage  12Mi  8Gi   128Mi            4Gi            -\nKontener   pami\u0119\u0107           64Mi  40Gi  128Mi            128Mi          2<\/code><\/pre>\n<p>Nie zapomnij ograniczy\u0107 zasob\u00f3w namespace, aby jedna dru\u017cyna nie zabra\u0142a wszystkich zasob\u00f3w klastra:<\/p>\n<pre><code>\u279c  ~ kubectl describe resourcequotas --namespace ops\nNazwa:                   resource-quota\nNamespace:              ops\nZas\u00f3b                   U\u017cywane        Maksymalne\n--------                ----          ----\nlimits.cpu              77250m        80\nlimits.memory           124814367488  150Gi\npods                    31            45\nrequests.cpu            53850m        80\nrequests.memory         75613234944   150Gi\nservices                26            50\nservices.loadbalancers  0             0\nservices.nodeports      0             0<\/code><\/pre>\n<p>Jak wida\u0107 na opisie <code>resourcequotas<\/code>, je\u015bli dru\u017cyna ops chcia\u0142aby wdro\u017cy\u0107 pody, kt\u00f3re b\u0119d\u0105 zu\u017cywa\u0107 dodatkowe 10 cpu, to scheduler nie pozwoli na to i zg\u0142osi b\u0142\u0105d:<\/p>\n<pre><code>Error creating: pods \"nginx-proxy-9967d8d78-nh4fs\" is forbidden: exceeded quota: resource-quota, requested: limits.cpu=5, requests.cpu=5, used: limits.cpu=77250m, requests.cpu=53850m, limited: limits.cpu=10, requests.cpu=10<\/code><\/pre>\n<p>Aby rozwi\u0105za\u0107 taki problem, mo\u017cna napisa\u0107 narz\u0119dzie, na przyk\u0142ad takie jak <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pauljamm\/team-operator\">ten<\/a><\/noindex>, kt\u00f3re potrafi przechowywa\u0107 i commitowa\u0107 stan zasob\u00f3w dru\u017cyn.<\/p>\n<h2>2. Wybierz optymalne przechowywanie plik\u00f3w<\/h2>\n<p><img decoding=\"async\" alt=\"Dziewi\u0119\u0107 wskaz\u00f3wek dotycz\u0105cych zwi\u0119kszenia wydajno\u015bci Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/c7f8bdbf5490acc9061695a6d608015e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Tutaj chcia\u0142bym poruszy\u0107 temat trwa\u0142ych wolumen\u00f3w i systemu dyskowego worker nod Kubernetes. Mam nadziej\u0119, \u017ce nikt nie u\u017cywa \u201eKuba\u201d na HDD w produkcji, ale czasem nawet zwyk\u0142y SSD ju\u017c jest niewystarczaj\u0105cy. Spotkali\u015bmy si\u0119 z problemem, \u017ce logi zabi\u0142y dysk z powodu operacji wej\u015bcia\/wyj\u015bcia, a tutaj opcji rozwi\u0105zania nie jest zbyt wiele: <\/p>\n<ul>\n<li>\n<p>U\u017cycie wysokowydajnych SSD lub przej\u015bcie na NVMe (je\u015bli sam zarz\u0105dzasz swoim sprz\u0119tem).<\/p>\n<\/li>\n<li>\n<p>Zmniejszenie poziomu logowania.<\/p>\n<\/li>\n<li>\n<p>Wykonywanie \u201einteligentnej\u201d balansacji pod\u00f3w, kt\u00f3re obci\u0105\u017caj\u0105 dysk (<code>podAntiAffinity<\/code>).<\/p>\n<\/li>\n<\/ul>\n<p>Zrzut ekranu powy\u017cej pokazuje, co dzieje si\u0119 z dyskiem podczas dzia\u0142ania nginx-ingress-controller, gdy w\u0142\u0105czone jest logowanie access_logs (~12 tys. log\u00f3w\/sekun\u0119). Taki stan, oczywi\u015bcie, mo\u017ce prowadzi\u0107 do degradowania wszystkich aplikacji na tej nodzie.<\/p>\n<p>Je\u015bli chodzi o PV, niestety nie wypr\u00f3bowa\u0142em wszystkich <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/storage\/persistent-volumes\/#types-of-persistent-volumes\">rodzaj\u00f3w<\/a><\/noindex> Wolumeny trwa\u0142e. U\u017cyj najlepszego rozwi\u0105zania, kt\u00f3re odpowiada Twoim potrzebom. Historycznie ma\u0142a cz\u0119\u015b\u0107 us\u0142ug wymaga wolumen\u00f3w RWX, wi\u0119c do tego celu od dawna wykorzystujemy magazyn NFS. Tani i\u2026 wystarczaj\u0105cy. Oczywi\u015bcie, wiele si\u0119 z nim naobserwowali\u015bmy \u2014 ufff, ale nauczyli\u015bmy si\u0119 go optymalizowa\u0107, wi\u0119c ju\u017c nie musimy si\u0119 martwi\u0107. A je\u015bli to mo\u017cliwe, przejd\u017a na obiektowe przechowywanie S3.<\/p>\n<h2>3. Tw\u00f3rz zoptymalizowane obrazy<\/h2>\n<p><img decoding=\"async\" alt=\"Dziewi\u0119\u0107 wskaz\u00f3wek dotycz\u0105cych zwi\u0119kszenia wydajno\u015bci Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/c25ce405d1eb4c01f031e18b0bfa4836.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Najlepiej jest u\u017cywa\u0107 zoptymalizowanych obraz\u00f3w dla kontener\u00f3w, aby Kubernetes m\u00f3g\u0142 szybciej je pobiera\u0107 i efektywniej realizowa\u0107 ich zadania.&nbsp;<\/p>\n<p>Zoptymalizowanie oznacza, \u017ce obrazy:<\/p>\n<ul>\n<li>\n<p>zawieraj\u0105 tylko jedn\u0105 aplikacj\u0119 lub realizuj\u0105 tylko jedn\u0105 funkcj\u0119;<\/p>\n<\/li>\n<li>\n<p>s\u0105 ma\u0142ych rozmiar\u00f3w, poniewa\u017c wi\u0119ksze obrazy gorzej przechodz\u0105 przez sie\u0107;<\/p>\n<\/li>\n<li>\n<p>maj\u0105 punkty ko\u0144cowe do sprawdzania gotowo\u015bci i stanu, dzi\u0119ki kt\u00f3rym Kubernetes mo\u017ce podj\u0105\u0107 dzia\u0142anie w przypadku awarii;<\/p>\n<\/li>\n<li>\n<p>u\u017cywaj\u0105 przyjaznych dla kontener\u00f3w system\u00f3w operacyjnych (jak Alpine czy CoreOS), kt\u00f3re s\u0105 bardziej odporne na b\u0142\u0119dy konfiguracji;<\/p>\n<\/li>\n<li>\n<p>u\u017cywaj\u0105 wieloetapowych kompilacji, aby wdra\u017ca\u0107 tylko skompilowane aplikacje, a nie zwi\u0105zane z nimi \u017ar\u00f3d\u0142a.<\/p>\n<\/li>\n<\/ul>\n<p>Istnieje wiele narz\u0119dzi i us\u0142ug, kt\u00f3re pozwalaj\u0105 sprawdza\u0107 i optymalizowa\u0107 obrazy na \u017cywo. Wa\u017cne jest, aby zawsze je aktualizowa\u0107 oraz weryfikowa\u0107 pod k\u0105tem bezpiecze\u0144stwa. W rezultacie uzyskujesz: <\/p>\n<ol>\n<li>\n<p>Zmniejszenie obci\u0105\u017cenia sieci dla ca\u0142ego klastra.<\/p>\n<\/li>\n<li>\n<p>Skr\u00f3cenie czasu uruchamiania kontenera.<\/p>\n<\/li>\n<li>\n<p>Mniejszy rozmiar ca\u0142ego rejestru Docker.<\/p>\n<\/li>\n<\/ol>\n<h2>4. U\u017cyj pami\u0119ci podr\u0119cznej DNS<\/h2>\n<p><img decoding=\"async\" alt=\"Dziewi\u0119\u0107 wskaz\u00f3wek dotycz\u0105cych zwi\u0119kszenia wydajno\u015bci Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/9f4384462a77dc528d7911c56f684f2d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>M\u00f3wi\u0105c o du\u017cych obci\u0105\u017ceniach, bez dostrojenia systemu DNS klastra \u017cycie jest do\u015b\u0107 nieprzyjemne. Dawno temu programi\u015bci Kubernetes wspierali swoje rozwi\u0105zanie kube-dns. Zosta\u0142o ono wdro\u017cone u nas, ale ten program nie by\u0142 szczeg\u00f3lnie dostrajany i nie osi\u0105ga\u0142 potrzebnej wydajno\u015bci, mimo \u017ce zadanie wydawa\u0142o si\u0119 proste. Potem pojawi\u0142 si\u0119 coredns, na kt\u00f3ry przeszli\u015bmy i nie mieli\u015bmy problem\u00f3w, p\u00f3\u017aniej sta\u0142 si\u0119 domy\u015blnym serwisem DNS w K8s. W pewnym momencie osi\u0105gn\u0119li\u015bmy 40 tys. rps do systemu DNS i to rozwi\u0105zanie r\u00f3wnie\u017c sta\u0142o si\u0119 niewystarczaj\u0105ce. Na szcz\u0119\u015bcie pojawi\u0142 si\u0119 Nodelocaldns, znany tak\u017ce jako lokalna pami\u0119\u0107 podr\u0119czna, <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/tasks\/administer-cluster\/nodelocaldns\/\">NodeLocal DNSCache<\/a><\/noindex>.<\/p>\n<p>Dlaczego to stosujemy? W j\u0105drze Linuxa istnieje b\u0142\u0105d, kt\u00f3ry przy wielokrotnych odwo\u0142aniach przez conntrack NAT po UDP prowadzi do stanu wy\u015bcigu przy zapisie do tabel conntrack, przez co cz\u0119\u015b\u0107 ruchu przez NAT jest tracona (ka\u017cde wywo\u0142anie przez us\u0142ug\u0119 to NAT). Nodelocaldns rozwi\u0105zuje ten problem poprzez wyeliminowanie NAT i aktualizacj\u0119 po\u0142\u0105czenia do TCP z upstreamowymi DNS, a tak\u017ce lokalne buforowanie zapyta\u0144 DNS do upstream\u00f3w (w tym kr\u00f3tka, 5-sekundowa negatywna pami\u0119\u0107 podr\u0119czna).<\/p>\n<h2>5. Automatyczne poziome i pionowe skalowanie pod\u00f3w<\/h2>\n<p><img decoding=\"async\" alt=\"Dziewi\u0119\u0107 wskaz\u00f3wek dotycz\u0105cych zwi\u0119kszenia wydajno\u015bci Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/3804a14685a55160fa7d9f3226eab1fa.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Czy mo\u017cesz z pewno\u015bci\u0105 powiedzie\u0107, \u017ce wszystkie twoje mikrous\u0142ugi s\u0105 gotowe na dwukrotny lub trzykrotny wzrost obci\u0105\u017cenia? Jak prawid\u0142owo przydziela\u0107 zasoby swoim aplikacjom? Utrzymywanie kilku pod\u00f3w uruchomionych ponad robocze obci\u0105\u017cenie mo\u017ce okaza\u0107 si\u0119 nadmiarowe, a zbyt ciasne skompresowanie mo\u017ce prowadzi\u0107 do przestoj\u00f3w przy nag\u0142ym wzro\u015bcie ruchu w serwisie. Z\u0142ot\u0105 \u015bredni\u0105 pomagaj\u0105 osi\u0105gn\u0105\u0107 takie us\u0142ugi jak <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/tasks\/run-application\/horizontal-pod-autoscale\/\">Horizontal Pod Autoscaler<\/a><\/noindex> i <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes\/autoscaler\/tree\/master\/vertical-pod-autoscaler\">Autoskaler pionowy pod\u00f3w<\/a><\/noindex>. <\/p>\n<p><strong>VPA<\/strong> pozwala automatycznie zwi\u0119ksza\u0107 requests\/limits twoich kontener\u00f3w w podzie w zale\u017cno\u015bci od rzeczywistego u\u017cycia. Jak mo\u017ce by\u0107 przydatne? Je\u015bli masz pady, kt\u00f3re nie mog\u0105 by\u0107 z jakiego\u015b powodu skalowane poziomo (co nie jest ca\u0142kowicie niezawodne), to mo\u017cesz spr\u00f3bowa\u0107 powierzy\u0107 zmian\u0119 jego zasob\u00f3w VPA. Jego cech\u0105 jest system rekomendacji oparty na danych historycznych i bie\u017c\u0105cych z metric-server, wi\u0119c je\u015bli nie chcesz automatycznie zmienia\u0107 requests\/limits, mo\u017cesz po prostu \u015bledzi\u0107 zalecane zasoby dla swoich kontener\u00f3w i optymalizowa\u0107 ustawienia, aby zaoszcz\u0119dzi\u0107 CPU i pami\u0119\u0107 w klastrze. <\/p>\n<p><img decoding=\"async\" alt=\"Dziewi\u0119\u0107 wskaz\u00f3wek dotycz\u0105cych zwi\u0119kszenia wydajno\u015bci Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/3965950aa3315faa4bb3e3ff5bd61955.png\" style=\"display:block;margin: 0 auto;\" \/>Obraz pochodzi z https:\/\/levelup.gitconnected.com\/kubernetes-autoscaling-101-cluster-autoscaler-horizontal-pod-autoscaler-and-vertical-pod-2a441d9ad231<\/p>\n<p>Planer w Kubernetes zawsze opiera si\u0119 na requests. Jak\u0105kolwiek warto\u015b\u0107 tam wprowadzisz, planer b\u0119dzie szuka\u0142 odpowiedniego w\u0119z\u0142a na jej podstawie. Warto\u015bci limits s\u0105 potrzebne kubeletowi, aby zrozumie\u0107, kiedy throttling lub zabijanie poda jest konieczne. Poniewa\u017c jedynym wa\u017cnym parametrem jest warto\u015b\u0107 requests, VPA b\u0119dzie pracowa\u0107 z tym. Za ka\u017cdym razem, gdy ustalasz pionowe skalowanie aplikacji, okre\u015blasz, jakie powinny by\u0107 requests. A co z limits? Ten parametr r\u00f3wnie\u017c b\u0119dzie proporcjonalnie skalowany.<\/p>\n<p>Na przyk\u0142ad oto typowe ustawienia poda:<\/p>\n<pre><code>zasoby:\n   \u017c\u0105dania:\n     pami\u0119\u0107: 250Mi\n     cpu: 200m\n   limity:\n     pami\u0119\u0107: 500Mi\n     cpu: 350m<\/code><\/pre>\n<p>Mechanizm rekomendacji okre\u015bla, \u017ce Twoja aplikacja do prawid\u0142owego dzia\u0142ania potrzebuje 300m CPU i 500Mi. Otrzymasz takie ustawienia:<\/p>\n<pre><code>zasoby:\n   \u017c\u0105dania:\n     pami\u0119\u0107: 500Mi\n     cpu: 300m\n   limity:\n     pami\u0119\u0107: 1000Mi\n     cpu: 525m<\/code><\/pre>\n<p>Jak wspomniano wcze\u015bniej, jest to proporcjonalne skalowanie na podstawie stosunku requests\/limits w manife\u015bcie:<\/p>\n<ul>\n<li>\n<p>CPU: 200m \u2192 300m: stosunek 1:1.75;<\/p>\n<\/li>\n<li>\n<p>Pami\u0119\u0107: 250Mi \u2192 500Mi: stosunek 1:2.<\/p>\n<\/li>\n<\/ul>\n<p>Je\u015bli chodzi o <strong>HPA<\/strong>, tutaj mechanizm dzia\u0142ania jest bardziej przejrzysty. Ustala si\u0119 progi warto\u015bci metryk, takich jak CPU i pami\u0119\u0107, a je\u015bli \u015brednia warto\u015b\u0107 dla wszystkich replik przekracza pr\u00f3g, to aplikacja jest skalowana o +1 pod do momentu, gdy warto\u015b\u0107 znowu spadnie poni\u017cej progu, lub do osi\u0105gni\u0119cia maksymalnej liczby replik.<\/p>\n<p><img decoding=\"async\" alt=\"Dziewi\u0119\u0107 wskaz\u00f3wek dotycz\u0105cych zwi\u0119kszenia wydajno\u015bci Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/f7a3fa28177d66be925867e38f5bbed6.png\" style=\"display:block;margin: 0 auto;\" \/>Obraz pochodzi z https:\/\/levelup.gitconnected.com\/kubernetes-autoscaling-101-cluster-autoscaler-horizontal-pod-autoscaler-and-vertical-pod-2a441d9ad231<\/p>\n<p>Opr\u00f3cz standardowych metryk, takich jak CPU i pami\u0119\u0107, mo\u017cesz ustawi\u0107 progi na swoich niestandardowych metrykach z Prometheus i pracowa\u0107 z nimi, je\u015bli uwa\u017casz, \u017ce jest to najdok\u0142adniejsze okre\u015blenie, kiedy nale\u017cy skalowa\u0107 swoj\u0105 aplikacj\u0119. Po ustabilizowaniu si\u0119 aplikacji poni\u017cej zadanej warto\u015bci metryki, HPA zacznie skalowa\u0107 pody w d\u00f3\u0142 do minimalnej liczby replik lub do momentu, gdy obci\u0105\u017cenie b\u0119dzie spe\u0142nia\u0107 dany pr\u00f3g.<\/p>\n<h2>6. Nie zapominaj o Node Affinity i Pod Affinity<\/h2>\n<p><img decoding=\"async\" alt=\"Dziewi\u0119\u0107 wskaz\u00f3wek dotycz\u0105cych zwi\u0119kszenia wydajno\u015bci Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/e718191d9e8ff25fd3b2d65cba9b3b73.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Nie wszystkie w\u0119z\u0142y dzia\u0142aj\u0105 na takim samym sprz\u0119cie, nie wszystkie pody potrzebuj\u0105 uruchamia\u0107 aplikacje wymagaj\u0105ce intensywnych oblicze\u0144. Kubernetes pozwala na okre\u015blenie specjalizacji w\u0119z\u0142\u00f3w i pod\u00f3w za pomoc\u0105 <strong>Node Affinity<\/strong> i <strong>Pod Affinity<\/strong>.<\/p>\n<p>Je\u017celi masz w\u0119z\u0142y odpowiednie do operacji z intensywnymi obliczeniami, najlepiej jest powi\u0105za\u0107 aplikacje z odpowiednimi w\u0119z\u0142ami. W tym celu u\u017cyj <code>nodeSelector<\/code> z etykiet\u0105 w\u0119z\u0142a.<\/p>\n<p>Za\u0142\u00f3\u017cmy, \u017ce masz dwa w\u0119z\u0142y: jeden z <code>CPUType=HIGHFREQ<\/code> i du\u017c\u0105 liczb\u0105 szybkich rdzeni, drugi z <code>MemoryType=HIGHMEMORY<\/code> du\u017c\u0105 ilo\u015bci\u0105 pami\u0119ci i wy\u017cszej wydajno\u015bci. Najpro\u015bciej jest przypisa\u0107 wdro\u017cenie poda do w\u0119z\u0142a <code>HIGHFREQ<\/code>, dodaj\u0105c w sekcji <code>spec<\/code> taki selektor:<\/p>\n<pre><code>\u2026\nnodeSelector:\n\tCPUType: HIGHFREQ<\/code><\/pre>\n<p>Bardziej kosztowny i specyficzny spos\u00f3b, aby to zrobi\u0107, to u\u017cycie <code>nodeAffinity<\/code> w polu <code>affinity<\/code> sekcji <code>spec<\/code>. Istniej\u0105 dwie opcje:<\/p>\n<ul>\n<li>\n<p><code>requiredDuringSchedulingIgnoredDuringExecution<\/code>: sztywna konfiguracja (planista b\u0119dzie wdra\u017ca\u0142 pody tylko na konkretnych w\u0119z\u0142ach (i nigdzie wi\u0119cej));<\/p>\n<\/li>\n<li>\n<p><code>preferredDuringSchedulingIgnoredDuringExecution<\/code>: \u0142agodna konfiguracja (planista spr\u00f3buje wdro\u017cy\u0107 na konkretnych w\u0119z\u0142ach, a je\u015bli si\u0119 nie uda, spr\u00f3buje wdro\u017cy\u0107 na nast\u0119pnym dost\u0119pnym w\u0119\u017ale).<\/p>\n<\/li>\n<\/ul>\n<p>Mo\u017cesz zdefiniowa\u0107 okre\u015blon\u0105 sk\u0142adni\u0119 do zarz\u0105dzania etykietami w\u0119z\u0142\u00f3w, na przyk\u0142ad, <code>In<\/code>, <code>NotIn<\/code>, <code>Exists<\/code>, <code>DoesNotExist<\/code>, <code>Gt<\/code> lub <code>Lt<\/code>. Jednak pami\u0119taj, \u017ce z\u0142o\u017cone metody w d\u0142ugich listach etykiet zwolni\u0105 podejmowanie decyzji w krytycznych sytuacjach. Innymi s\u0142owy, nie komplikuj.<\/p>\n<p>Jak wspomniano wcze\u015bniej, Kubernetes pozwala zdefiniowa\u0107 powi\u0105zania bie\u017c\u0105cych pod\u00f3w. To znaczy, \u017ce mo\u017cesz sprawi\u0107, aby okre\u015blone pody dzia\u0142a\u0142y razem z innymi podami w tej samej strefie dost\u0119pno\u015bci (dotyczy chmur) lub w\u0119z\u0142ach.<\/p>\n<p>W <code>podAffinity<\/code> pola <code>affinity<\/code> sekcji <code>spec<\/code> s\u0105 dost\u0119pne te same pola, co w przypadku <code>nodeAffinity<\/code>: <code>requiredDuringSchedulingIgnoredDuringExecution<\/code><strong> <\/strong>i <code>preferredDuringSchedulingIgnoredDuringExecution<\/code>. Jedyn\u0105 r\u00f3\u017cnic\u0105 jest to, \u017ce <code>matchExpressions<\/code> powi\u0105\u017ce pody z w\u0119z\u0142em, na kt\u00f3rym ju\u017c dzia\u0142a pod z tak\u0105 etykiet\u0105.<\/p>\n<p>Kubernetes oferuje r\u00f3wnie\u017c pole <code>podAntiAffinity<\/code>, kt\u00f3re, przeciwnie, nie powi\u0105zuje poda z w\u0119z\u0142em z okre\u015blonymi podami.<\/p>\n<p>Je\u015bli chodzi o wyra\u017cenia <code>nodeAffinity<\/code> mo\u017cna da\u0107 t\u0119 sam\u0105 rad\u0119: staraj si\u0119 zachowa\u0107 prostot\u0119 i logiczno\u015b\u0107 zasad, nie pr\u00f3buj przeci\u0105\u017ca\u0107 specyfikacji pod\u00f3w z\u0142o\u017conym zestawem zasad. Bardzo \u0142atwo stworzy\u0107 zasad\u0119, kt\u00f3ra nie b\u0119dzie spe\u0142nia\u0107 warunk\u00f3w klastra, co stworzy dodatkowe obci\u0105\u017cenie dla planisty i obni\u017cy og\u00f3ln\u0105 wydajno\u015b\u0107.<\/p>\n<h2>7. Taints &amp; Tolerations<\/h2>\n<p>Jest jeszcze jeden spos\u00f3b zarz\u0105dzania planist\u0105. Je\u015bli masz du\u017cy klaster z setkami w\u0119z\u0142\u00f3w i tysi\u0105cami mikrous\u0142ug, bardzo trudno jest nie pozwala\u0107 okre\u015blonym podom na umieszczanie si\u0119 na okre\u015blonych w\u0119z\u0142ach.<\/p>\n<p>Pomaga w tym mechanizm taints \u2014 zasad zakazuj\u0105cych. Na przyk\u0142ad mo\u017cna w okre\u015blonych scenariuszach zabroni\u0107 okre\u015blonym w\u0119z\u0142om uruchamia\u0107 pody na sobie. Aby zastosowa\u0107 taint do konkretnego w\u0119z\u0142a, musisz u\u017cy\u0107 opcji <code>taint<\/code> w kubectl. Podaj klucz i warto\u015b\u0107, a nast\u0119pnie taint na przyk\u0142ad <code>NoSchedule<\/code> lub <code>NoExecute<\/code>:<\/p>\n<pre><code>$ kubectl taint nodes node10 node-role.kubernetes.io\/ingress=true:NoSchedule<\/code><\/pre>\n<p>Warto r\u00f3wnie\u017c zauwa\u017cy\u0107, \u017ce mechanizm taint obs\u0142uguje trzy g\u0142\u00f3wne efekty: <code>NoSchedule<\/code>, <code>NoExecute<\/code> i <code>PreferNoSchedule<\/code><strong>. <\/strong><\/p>\n<ul>\n<li>\n<p><code>NoSchedule<\/code><strong> <\/strong>oznacza, \u017ce dop\u00f3ki w specyfikacji poda nie b\u0119dzie odpowiedniego wpisu <code>tolerations<\/code>, nie b\u0119dzie m\u00f3g\u0142 zosta\u0107 wdro\u017cony na w\u0119\u017ale (w tym przyk\u0142adzie <code>node10<\/code>).<\/p>\n<\/li>\n<li>\n<p><code>PreferNoSchedule <\/code>\u2014 uproszczona wersja <code>NoSchedule<\/code>. W tym przypadku planista spr\u00f3buje nie rozdziela\u0107 pod\u00f3w, kt\u00f3re nie maj\u0105 odpowiedniego wpisu <code>tolerations<\/code> na w\u0119ze\u0142, ale to nie jest sztywne ograniczenie. Je\u015bli w klastrze nie b\u0119dzie zasob\u00f3w, pody zaczn\u0105 si\u0119 wdra\u017ca\u0107 na tym w\u0119\u017ale.<\/p>\n<\/li>\n<li>\n<p><code>NoExecute<\/code><strong> <\/strong>\u2014 ten efekt powoduje natychmiastow\u0105 ewakuacj\u0119 pod\u00f3w, kt\u00f3re nie maj\u0105 odpowiedniego wpisu <code>tolerations<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>Ciekawostk\u0105 jest to, \u017ce takie zachowanie mo\u017cna cofn\u0105\u0107 za pomoc\u0105 mechanizmu tolerancji. Jest to przydatne, gdy istnieje \"zabroniony\" w\u0119ze\u0142, a trzeba na nim umie\u015bci\u0107 tylko us\u0142ugi infrastrukturalne. Jak to zrobi\u0107? Zezwoli\u0107 tylko tym podom, dla kt\u00f3rych istnieje odpowiednia tolerancja.<\/p>\n<p>Oto jak b\u0119dzie wygl\u0105da\u0107 specyfikacja podu:<\/p>\n<pre><code>spec:\n   tolerations:\n     - key: \"node-role.kubernetes.io\/ingress\"\n        operator: \"Equal\"\n        value: \"true\"\n        effect: \"NoSchedule\"<\/code><\/pre>\n<p>To nie oznacza, \u017ce przy nast\u0119pnym redeploy'u pod trafi dok\u0142adnie na ten w\u0119ze\u0142, to nie jest mechanizm Node Affinity i <code>nodeSelector<\/code>. Ale \u0142\u0105cz\u0105c kilka funkcji, mo\u017cna osi\u0105gn\u0105\u0107 bardzo elastyczne dostosowanie harmonogramu.<\/p>\n<h2>8. Skonfiguruj priorytet wdra\u017cania pod\u00f3w<\/h2>\n<p>To, \u017ce skonfigurowa\u0142e\u015b powi\u0105zanie pod\u00f3w z w\u0119z\u0142ami, nie oznacza, \u017ce wszystkie pody musz\u0105 by\u0107 realizowane z takim samym priorytetem. Na przyk\u0142ad, mo\u017cesz chcie\u0107 wdra\u017ca\u0107 niekt\u00f3re pody wcze\u015bniej ni\u017c inne.<\/p>\n<p>Kubernetes oferuje r\u00f3\u017cne sposoby konfiguracji priorytet\u00f3w pod\u00f3w (Pod Priority and Preemption). Konfiguracja sk\u0142ada si\u0119 z kilku cz\u0119\u015bci: obiektu <code>PriorityClass<\/code><strong> <\/strong>oraz opisu pola <code>priorityClassName<\/code><strong> <\/strong>w specyfikacji podu. Rozwa\u017cmy przyk\u0142ad:<\/p>\n<pre><code>apiVersion: scheduling.k8s.io\/v1\nkind: PriorityClass\nmetadata:\n  name: high-priority\nvalue: 99999\nglobalDefault: false\ndescription: \"Ta klasa priorytetowa powinna by\u0107 u\u017cywana tylko dla bardzo wa\u017cnych pod\u00f3w\"<\/code><\/pre>\n<p>Tworzymy <code>PriorityClass<\/code>, nadaj\u0105c mu nazw\u0119, opis i warto\u015b\u0107.<strong> <\/strong>Im wy\u017cszy <code>value<\/code>, tym wy\u017cszy priorytet. Warto\u015b\u0107 mo\u017ce by\u0107 dowoln\u0105 32-bitow\u0105 liczb\u0105 ca\u0142kowit\u0105, mniejsz\u0105 lub r\u00f3wn\u0105 1 000 000 000. Wy\u017csze warto\u015bci s\u0105 zarezerwowane dla krytycznych pod\u00f3w systemowych, kt\u00f3re zazwyczaj nie mog\u0105 by\u0107 wypychane.<strong> <\/strong>Wypieranie b\u0119dzie si\u0119 odbywa\u0107 tylko wtedy, gdy wysokopriorytetowy pod nie b\u0119dzie mia\u0142 gdzie si\u0119 wdro\u017cy\u0107, wtedy cz\u0119\u015b\u0107 pod\u00f3w z danego w\u0119z\u0142a zostanie ewakuowana. Je\u015bli ten mechanizm jest dla Ciebie zbyt rygorystyczny, mo\u017cesz doda\u0107 opcj\u0119 <code>preemptionPolicy: Never<\/code>, a wtedy wypierania nie b\u0119dzie, pod ustawi si\u0119 na pierwszym miejscu w kolejce i poczeka, a\u017c harmonogram znajdzie dla niego wolne zasoby.<\/p>\n<p>Nast\u0119pnie tworzymy pod, w kt\u00f3rym wskazujemy nazw\u0119 <code>priorityClassName<\/code>:<\/p>\n<pre><code>apiVersion: v1\nkind: Pod\nmetadata:\n  name: static-web\n  labels:\n    role: myrole\n spec:\n  containers:\n    - name: web\n      image: nginx\n      ports:\n        - name: web\n          containerPort: 80\n          protocol: TCP\n  priorityClassName: high-priority\n          <\/code><\/pre>\n<p>Mo\u017cna tworzy\u0107 dowoln\u0105 liczb\u0119 klas priorytet\u00f3w, chocia\u017c zaleca si\u0119 nie przesadza\u0107 (na przyk\u0142ad, ograniczy\u0107 si\u0119 do niskiego, \u015bredniego i wysokiego priorytetu). <\/p>\n<p>W ten spos\u00f3b, w razie potrzeby, b\u0119dziesz m\u00f3g\u0142 zwi\u0119kszy\u0107 efektywno\u015b\u0107 wdra\u017cania krytycznych us\u0142ug, takich jak nginx-ingress-controller, coredns itp.<\/p>\n<h2>9. Optymalizuj klaster ETCD<\/h2>\n<p><img decoding=\"async\" alt=\"Dziewi\u0119\u0107 wskaz\u00f3wek dotycz\u0105cych zwi\u0119kszenia wydajno\u015bci Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/f5917adfa943c789b6c784f43305851b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>ETCD mo\u017cna nazwa\u0107 m\u00f3zgiem ca\u0142ego klastra. Wa\u017cne jest, aby utrzyma\u0107 t\u0119 baz\u0119 danych na wysokim poziomie, poniewa\u017c to od niej zale\u017cy pr\u0119dko\u015b\u0107 operacji w \u201eKube\u201d. Standardowym, a zarazem dobrym rozwi\u0105zaniem jest utrzymanie klastra ETCD na w\u0119z\u0142ach master, aby mie\u0107 minimalne op\u00f3\u017anienie do kube-apiserver. Je\u015bli nie jest to mo\u017cliwe, umieszczaj ETCD tak blisko, jak to mo\u017cliwe, maj\u0105c dobr\u0105 przepustowo\u015b\u0107 mi\u0119dzy uczestnikami. Zwracaj tak\u017ce uwag\u0119 na to, ile w\u0119z\u0142\u00f3w ETCD mo\u017ce wypa\u015b\u0107 bez szkody dla klastra.<\/p>\n<p><img decoding=\"async\" alt=\"Dziewi\u0119\u0107 wskaz\u00f3wek dotycz\u0105cych zwi\u0119kszenia wydajno\u015bci Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/cdd2c32eefed253c6ff774899c367ccc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Pami\u0119taj, \u017ce nadmierne zwi\u0119kszenie liczby uczestnik\u00f3w w klastrze mo\u017ce poprawi\u0107 odporno\u015b\u0107 na awarie kosztem wydajno\u015bci, wszystko powinno by\u0107 w umiarze.<\/p>\n<p>Je\u015bli chodzi o konfiguracj\u0119 us\u0142ugi, to jest niewiele zalece\u0144:<\/p>\n<ol>\n<li>\n<p>Mie\u0107 dobre podzespo\u0142y, w zale\u017cno\u015bci od rozmiaru klastra (mo\u017cna poczyta\u0107) <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/etcd-io\/etcd\/blob\/master\/Documentation\/op-guide\/hardware.md\">tutaj<\/a><\/noindex>).<\/p>\n<\/li>\n<li>\n<p>Dostosowa\u0107 kilka parametr\u00f3w, je\u015bli roz\u0142o\u017cono klaster mi\u0119dzy paroma centrami danych lub Twoja sie\u0107 i dyski pozostawiaj\u0105 wiele do \u017cyczenia (mo\u017cna poczyta\u0107) <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/etcd-io\/etcd\/blob\/master\/Documentation\/tuning.md\">tutaj<\/a><\/noindex>).<\/p>\n<\/li>\n<\/ol>\n<h2>Podsumowanie<\/h2>\n<p>W tym artykule opisano punkty, kt\u00f3re nasz zesp\u00f3\u0142 stara si\u0119 przestrzega\u0107. Nie jest to krok po kroku opis dzia\u0142a\u0144, lecz opcje, kt\u00f3re mog\u0105 si\u0119 przyda\u0107 do optymalizacji koszt\u00f3w zwi\u0105zanych z klastrem. Jasne jest, \u017ce ka\u017cdy klaster jest unikalny, a rozwi\u0105zania do konfiguracji mog\u0105 si\u0119 znacznie r\u00f3\u017cni\u0107, dlatego by\u0142oby interesuj\u0105ce uzyska\u0107 od Ciebie informacje zwrotne: jak monitorujesz sw\u00f3j klaster Kubernetes, czym poprawiasz jego dzia\u0142anie. Dziel si\u0119 swoim do\u015bwiadczeniem w komentarzach, ch\u0119tnie je poznamy. <\/p>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/domclick\/blog\/520968\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041e\u043b\u0435\u0433 \u0421\u0438\u0434\u043e\u0440\u0435\u043d\u043a\u043e\u0432, \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0414\u043e\u043c\u041a\u043b\u0438\u043a \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u041c\u044b \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0438\u0440\u0443\u0435\u043c \u00ab\u041a\u0443\u0431\u0438\u043a\u00bb \u0432 \u043f\u0440\u043e\u0434\u0435 \u0443\u0436\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0442\u0440\u0451\u0445 \u043b\u0435\u0442, \u0438 \u0437\u0430 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u0436\u0438\u043b\u0438 \u0441 \u043d\u0438\u043c \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u043f\u043e\u0432\u0435\u0434\u0430\u044e \u0432\u0430\u043c, \u043a\u0430\u043a \u043f\u0440\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0436\u0430\u0442\u044c \u0438\u0437 \u00ab\u0432\u0430\u043d\u0438\u043b\u044c\u043d\u043e\u0433\u043e\u00bb Kubernetes \u0435\u0449\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. Ready steady [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":97983,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-97982","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=\"description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442!\" \/>\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\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes\" \/>\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\u0414\u0435\u0432\u044f\u0442\u044c \u0441\u043e\u0432\u0435\u0442\u043e\u0432 \u043f\u043e \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 Kubernetes | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442!\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes\" \/>\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-10-23T12:42:15+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-11-17T22:58:47+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\udd47 dziewi\u0119\u0107 porad dotycz\u0105cych zwi\u0119kszenia wydajno\u015bci Kubernetes | ProHoster","description":"Cze\u015b\u0107 wszystkim!","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes","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\u0414\u0435\u0432\u044f\u0442\u044c \u0441\u043e\u0432\u0435\u0442\u043e\u0432 \u043f\u043e \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 Kubernetes | ProHoster","og:description":"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442!","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes","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-10-23T12:42:15+00:00","article:modified_time":"2020-11-17T22:58:47+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"97982","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 10:08:27","updated":"2022-09-30 17:30:03","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\/97982","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=97982"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/97982\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/97983"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=97982"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=97982"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=97982"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}