{"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\/hr\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes","title":{"rendered":"Devet savjeta za pove\u0107anje performansi Kubernetes-a","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Devet savjeta za pove\u0107anje performansi Kubernetes-a\" src=\"\/wp-content\/uploads\/2020\/10\/92dc510aa9d785a31d310816b18bf854.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Pozdrav svima! Moje ime je Oleg Sidorenko, radim u tvrtki DomClick kao voditelj infrastrukturnog tima. Ve\u0107 vi\u0161e od tri godine koristimo \"Kubik\" u produkciji, i tokom tog vremenskog razdoblja do\u017eivjeli smo mnoge zanimljive trenutke. Danas \u0107u vam ispri\u010dati kako uz pravi pristup mo\u017eete iz \"vanilnog\" Kubernetesa izvu\u0107i jo\u0161 ve\u0107u u\u010dinak za svoj klaster. Spremni, pozor, krenimo! <\/p>\n<p>Svi dobro znate da je Kubernetes skalabilni sustav s otvorenim kodom za orkestraciju kontejnera; ili, ili 5 binarnih datoteka koje \u010dine \u010daroliju upravljaju\u0107i \u017eivotnim ciklusom va\u0161ih mikroservisa u poslu\u017eiteljskoj okolini. Osim toga, to je prili\u010dno fleksibilan alat koji se mo\u017ee sastaviti poput Lego kockica za maksimalnu prilagodbu razli\u010ditim zadacima.<\/p>\n<p>I kao da je sve u redu: bacajte servere u klaster, poput drva u pe\u0107, i ne brinite. No, ako ste za ekologiju, zapitat \u0107ete se: \"Kako mogu odr\u017eavati vatru u pe\u0107i, a istovremeno \u0161tititi \u0161umu?\" Drugim rije\u010dima, kako prona\u0107i na\u010dine za pobolj\u0161anje infrastrukture i smanjenje tro\u0161kova.<\/p>\n<h2>1. Pratite resurse timova i aplikacija<\/h2>\n<p><img decoding=\"async\" alt=\"Devet savjeta za pove\u0107anje performansi Kubernetes-a\" src=\"\/wp-content\/uploads\/2020\/10\/91e2e60b47ee985b024532c8b685230c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Jedna od najbanalnijih, ali najdjelotvornijih metoda je uvo\u0111enje requests\/limits. Podijelite aplikacije po namespace-ima, a namespace-e po timovima razvoja. Zadajte aplikaciji vrijednosti potro\u0161nje procesorskog vremena, memorije i efemernog prostora za pohranu prije nego \u0161to je implementirate.<\/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>Iskustvom smo do\u0161li do zaklju\u010dka: ne bi trebalo napuhavati zahtjeve od limita vi\u0161e od dva puta. Volumen klastera se izra\u010dunava na temelju zahtjeva, i ako zadate aplikacijama razliku u resursima, na primjer, 5-10 puta, zamislite \u0161to \u0107e se dogoditi s va\u0161om nodom kada se napuni podovima i iznenada dobije optere\u0107enje. Ni\u0161ta dobro. U najmanju ruku, throttling, a u najboljem slu\u010daju, oprostit \u0107ete se od radnika i dobiti cikli\u010dko optere\u0107enje na ostalim nodama nakon \u0161to podovi po\u010dnu preseljenje.<\/p>\n<p>Osim toga, putem <code>limitranges<\/code> na po\u010detku mo\u017eete zada\u0107i za kontejner vrijednosti resursa \u2014 minimalne, maksimalne i prema zadanim postavkama:<\/p>\n<pre><code>\u279c  ~ kubectl describe limitranges --namespace ops\nName:       limit-range\nNamespace:  ops\nType        Resource           Min   Max   Default Request  Default Limit  Max Limit\/Request Ratio\n----        --------           ---   ---   ---------------  -------------  -----------------------\nContainer   cpu                50m   10    100m             100m           2\nContainer   ephemeral-storage  12Mi  8Gi   128Mi            4Gi            -\nContainer   memory             64Mi  40Gi  128Mi            128Mi          2<\/code><\/pre>\n<p>Ne zaboravite ograni\u010diti resurse prostora imena kako jedna ekipa ne bi mogla uzeti sve resurse klastera:<\/p>\n<pre><code>\u279c  ~ kubectl describe resourcequotas --namespace ops\nName:                   resource-quota\nNamespace:              ops\nResource                Used          Hard\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>Kao \u0161to se mo\u017ee vidjeti iz opisa <code>resourcequotas<\/code>, ako ekipa ops \u017eeli postaviti podove koji \u0107e tro\u0161iti jo\u0161 10 cpu, planer ne\u0107e dopustiti to i prikazat \u0107e pogre\u0161ku:<\/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>Za rje\u0161avanje takvog problema mogu\u0107e je napisati alat, na primjer, kao <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pauljamm\/team-operator\">ovaj<\/a><\/noindex>, koji mo\u017ee skladi\u0161titi i komitirati stanje resursa ekipa.<\/p>\n<h2>2. Odaberite optimalnu pohranu datoteka<\/h2>\n<p><img decoding=\"async\" alt=\"Devet savjeta za pove\u0107anje performansi Kubernetes-a\" src=\"\/wp-content\/uploads\/2020\/10\/c7f8bdbf5490acc9061695a6d608015e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Ovdje bih \u017eelio dotaknuti temu trajnih volumena i diskovnog sustava radnih \u010dvorova Kubernetes-a. Nadam se da nitko ne koristi \"KUB\" na HDD-u u produkciji, ali ponekad \u010dak i obi\u010dni SSD postaje nedovoljan. Na\u0161li smo se pred problemom da su dnevni\u010dki zapisi uni\u0161tavali disk zbog operacija ulaz\/izlaz, a opcija rje\u0161enja nije mnogo: <\/p>\n<ul>\n<li>\n<p>Upotrijebite visoko performantne SSD-e ili pre\u0111ite na NVMe (ako sami rukujete svojim hardverom).<\/p>\n<\/li>\n<li>\n<p>Smanjite razinu dnevni\u010dkog zapisa.<\/p>\n<\/li>\n<li>\n<p>U\u010dinite \"pametan\" balans podova koji optere\u0107uju disk (<code>podAntiAffinity<\/code>).<\/p>\n<\/li>\n<\/ul>\n<p>Screens above shows what happens to the nginx-ingress-controller with the disk when access_logs logging is enabled (~12k logs\/sec.). This state can surely lead to degradation of all applications on that node.<\/p>\n<p>\u0160to se ti\u010de PV, na\u017ealost, nisam isprobao sve <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/storage\/persistent-volumes\/#types-of-persistent-volumes\">vrste<\/a><\/noindex> Trajni volumeni. Iskoristite najbolju opciju koja vam odgovara. Povijesno gledano, manji dio usluga zahtijeva RWX volumene, a davno je za tu namjenu po\u010dela koristiti NFS pohranu. Jeftino je i... dovoljno. Naravno, imali smo lo\u0161a iskustva s njim \u2014 ali smo nau\u010dili kako ga optimizirati i vi\u0161e nas ne boli glava. Ako je mogu\u0107e, pre\u0111ite na objektno pohranjivanje S3.<\/p>\n<h2>3. Prikupite optimizirane slike<\/h2>\n<p><img decoding=\"async\" alt=\"Devet savjeta za pove\u0107anje performansi Kubernetes-a\" src=\"\/wp-content\/uploads\/2020\/10\/c25ce405d1eb4c01f031e18b0bfa4836.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Najbolje je koristiti slike optimizirane za kontejnere, kako bi Kubernetes mogao br\u017ee pristupiti njima i u\u010dinkovitije ih izvoditi.&nbsp;<\/p>\n<p>Optimiziranost zna\u010di da slike:<\/p>\n<ul>\n<li>\n<p>sadr\u017ee samo jednu aplikaciju ili obavljaju samo jednu funkciju;<\/p>\n<\/li>\n<li>\n<p>imaju mali volumen, jer velike slike lo\u0161ije prolaze kroz mre\u017eu;<\/p>\n<\/li>\n<li>\n<p>imaju to\u010dke za provjeru ispravnosti i spremnosti, pomo\u0107u kojih Kubernetes mo\u017ee poduzeti mjere u slu\u010daju zastoja;<\/p>\n<\/li>\n<li>\n<p>koriste operacijske sustave prijateljske prema kontejnerima (poput Alpine ili CoreOS), koji su otporniji na gre\u0161ke u konfiguraciji;<\/p>\n<\/li>\n<li>\n<p>koriste vi\u0161estepene gradnje, tako da mo\u017eete implementirati samo kompilirane aplikacije, a ne pripadaju\u0107e izvorne kodove.<\/p>\n<\/li>\n<\/ul>\n<p>Postoji mnogo alata i usluga koje omogu\u0107uju provjeru i optimizaciju slika u trenutku. Va\u017eno je uvijek odr\u017eavati ih a\u017euriranima i sigurnima. Na kraju dobijate: <\/p>\n<ol>\n<li>\n<p>Smanjenje mre\u017enog optere\u0107enja na cijelom klasteru.<\/p>\n<\/li>\n<li>\n<p>Smanjenje vremena pokretanja kontejnera.<\/p>\n<\/li>\n<li>\n<p>Manji volumen va\u0161e Docker registracije.<\/p>\n<\/li>\n<\/ol>\n<h2>4. Koristite DNS ke\u0161<\/h2>\n<p><img decoding=\"async\" alt=\"Devet savjeta za pove\u0107anje performansi Kubernetes-a\" src=\"\/wp-content\/uploads\/2020\/10\/9f4384462a77dc528d7911c56f684f2d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u0160to se ti\u010de visokih optere\u0107enja, bez optimiziranja DNS sustava klastera \u017eivjeti je prili\u010dno te\u0161ko. Davno su developeri Kubernetes-a podr\u017eali svoje rje\u0161enje kube-dns. Uvedeno je i kod nas, ali taj softver nije bio posebno optimiziran i nije pru\u017eao potrebne performanse, iako se \u010dinilo da je zadatak jednostavan. Zatim se pojavio coredns, na koji smo pre\u0161li i nismo imali problema, a kasnije je postao zadan DNS servis u K8s. U nekom trenutku dostigli smo 40 tisu\u0107a rps prema DNS sustavu, i ovo rje\u0161enje tako\u0111er je postalo nedovoljno. No, sretnim slu\u010dajem, iza\u0161ao je Nodelocaldns, tako\u0111er poznat kao node local cache, tako\u0111er <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/tasks\/administer-cluster\/nodelocaldns\/\">NodeLocal DNSCache<\/a><\/noindex>.<\/p>\n<p>Za\u0161to to koristimo? U Linux kernelu postoji gre\u0161ka koja, pri vi\u0161estrukim pozivima putem conntrack NAT-a po UDP-u, dovodi do stanja utrke za zapis u conntrack tablice, i dio prometa kroz NAT se gubi (svaki poziv putem Service-a je NAT). Nodelocaldns rje\u0161ava ovaj problem uklanjanjem NAT-a i nadogradnjom veze na TCP za uzlazne DNS-ove, kao i lokalnim ke\u0161iranjem DNS upita za uzlazne DNS-ove (uklju\u010duju\u0107i kratki negativni ke\u0161 od 5 sekundi).<\/p>\n<h2>5. Automatski skalirajte podove horizontalno i vertikalno<\/h2>\n<p><img decoding=\"async\" alt=\"Devet savjeta za pove\u0107anje performansi Kubernetes-a\" src=\"\/wp-content\/uploads\/2020\/10\/3804a14685a55160fa7d9f3226eab1fa.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Mo\u017eete li s povjerenjem re\u0107i da su svi va\u0161i mikroservisi spremni za dvostruko ili trostruko pove\u0107anje optere\u0107enja? Kako ispravno dodijeliti resurse svojim aplikacijama? Dr\u017eanje nekoliko podova aktivnim iznad radnog optere\u0107enja mo\u017ee se pokazati suvi\u0161nim, a dr\u017eanje na rubu zna\u010di da riskirate izprazniti zbog iznenadnog porasta prometa na uslugu. Zlatna sredina poma\u017ee posti\u0107i \u010darobna usluga kao \u0161to su <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\">Vertical Pod Autoscaler<\/a><\/noindex>. <\/p>\n<p><strong>VPA<\/strong> omogu\u0107uje automatsko pove\u0107avanje requests\/limits va\u0161ih kontejnera u podu ovisno o stvarnoj potro\u0161nji. Kako mo\u017ee biti koristan? Ako imate podove koje iz nekog razloga ne mo\u017eete horizontalno skalirati (\u0161to nije potpuno pouzdano), mo\u017eete poku\u0161ati prepustiti promjenu njegovih resursa VPA-u. Njegova funkcija le\u017ei u sustavu preporuka temeljenom na povijesnim i trenutnim podacima iz metric-servera, tako da, ako ne \u017eelite automatski mijenjati requests\/limits, jednostavno mo\u017eete pratiti preporu\u010dene resurse za va\u0161e kontejnere i optimizirati postavke radi u\u0161tede CPU-a i memorije u klasteru. <\/p>\n<p><img decoding=\"async\" alt=\"Devet savjeta za pove\u0107anje performansi Kubernetes-a\" src=\"\/wp-content\/uploads\/2020\/10\/3965950aa3315faa4bb3e3ff5bd61955.png\" style=\"display:block;margin: 0 auto;\" \/>Slika preuzeta s https:\/\/levelup.gitconnected.com\/kubernetes-autoscaling-101-cluster-autoscaler-horizontal-pod-autoscaler-and-vertical-pod-2a441d9ad231<\/p>\n<p>Planer u Kubernetesu uvijek se temelji na requests. Koju god vrijednost tamo stavili, planer \u0107e tra\u017eiti odgovaraju\u0107i \u010dvor na osnovu nje. Vrijednosti limits su potrebne kubeletu kako bi razumio kada treba ograni\u010diti ili ubiti pod. I budu\u0107i da je jedini va\u017ean parametar \u2014 vrijednost requests, VPA \u0107e raditi s njom. Svaki put kada postavljate vertikalno skaliranje aplikacije, definirate kakve bi trebale biti requests. A \u0161to \u0107e onda biti s limits? Ova \u0107e se vrijednost tako\u0111er proporcionalno skalirati.<\/p>\n<p>Na primjer, evo uobi\u010dajenih postavki poda:<\/p>\n<pre><code>resursi:\n   zahtjevi:\n     memorija: 250Mi\n     cpu: 200m\n   ograni\u010denja:\n     memorija: 500Mi\n     cpu: 350m<\/code><\/pre>\n<p>Mehanizam preporuka utvr\u0111uje da va\u0161oj aplikaciji za normalan rad treba 300m CPU i 500Mi. Dobit \u0107ete takve postavke:<\/p>\n<pre><code>resursi:\n   zahtjevi:\n     memorija: 500Mi\n     cpu: 300m\n   ograni\u010denja:\n     memorija: 1000Mi\n     cpu: 525m<\/code><\/pre>\n<p>Kao \u0161to je ranije spomenuto, ovo je proporcionalno skaliranje na temelju omjera zahtjeva\/ograni\u010denja u manifestu:<\/p>\n<ul>\n<li>\n<p>CPU: 200m \u2192 300m: omjer 1:1.75;<\/p>\n<\/li>\n<li>\n<p>Memorija: 250Mi \u2192 500Mi: omjer 1:2.<\/p>\n<\/li>\n<\/ul>\n<p>\u0160to se ti\u010de <strong>HPA<\/strong>, ovdje je mehanizam rada jasniji. Postavljaju se pragovni vrijednosti metrika, primjerice, procesora i memorije, i ako je prosje\u010dna vrijednost svih replika iznad praga, aplikacija se skalira za +1 pod sve dok vrijednost ne padne ispod praga, ili dok se ne postigne maksimalan broj replika.<\/p>\n<p><img decoding=\"async\" alt=\"Devet savjeta za pove\u0107anje performansi Kubernetes-a\" src=\"\/wp-content\/uploads\/2020\/10\/f7a3fa28177d66be925867e38f5bbed6.png\" style=\"display:block;margin: 0 auto;\" \/>Slika preuzeta s https:\/\/levelup.gitconnected.com\/kubernetes-autoscaling-101-cluster-autoscaler-horizontal-pod-autoscaler-and-vertical-pod-2a441d9ad231<\/p>\n<p>Osim uobi\u010dajenih metrika, poput procesora i memorije, mo\u017eete postaviti pragove na svojim prilago\u0111enim metrikama iz Prometheusa i raditi s njima ako smatrate da je to najto\u010dnije odre\u0111ivanje kada treba skalirati va\u0161u aplikaciju. Nakon \u0161to se aplikacija stabilizira ispod zadane granice metrike, HPA \u0107e po\u010deti skalirati pode za dolje do minimalnog broja replika ili dok optere\u0107enje ne odgovara zadanom pragu.<\/p>\n<h2>6. Ne zaboravite na Node Affinity i Pod Affinity<\/h2>\n<p><img decoding=\"async\" alt=\"Devet savjeta za pove\u0107anje performansi Kubernetes-a\" src=\"\/wp-content\/uploads\/2020\/10\/e718191d9e8ff25fd3b2d65cba9b3b73.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Ne rade svi \u010dvorovi na istom hardveru, a ne trebaju svim podovima izvr\u0161avati aplikacije koje zahtijevaju intenzivne prora\u010dune. Kubernetes omogu\u0107ava postavljanje specijalizacije \u010dvorova i podova putem <strong>Node Affinity<\/strong> i <strong>Pod Affinity<\/strong>.<\/p>\n<p>Ako imate \u010dvorove pogodne za operacije s intenzivnim prora\u010dunima, za maksimalnu u\u010dinkovitost je najbolje vezati aplikacije za odgovaraju\u0107e \u010dvorove. Za to koristite <code>nodeSelector<\/code> s oznakom \u010dvora.<\/p>\n<p>Pretpostavimo, imate dva \u010dvora: jedan s <code>CPUType=HIGHFREQ<\/code> i velikim brojem brzih jezgri, drugi s <code>MemoryType=HIGHMEMORY<\/code> velikim brojem memorije i boljim performansama. Najjednostavnije je dodijeliti raspore\u0111ivanje poda \u010dvoru <code>HIGHFREQ<\/code>, dodaju\u0107i u odjeljak <code>spec<\/code> takav selektor:<\/p>\n<pre><code>\u2026\nnodeSelector:\n\tCPUType: HIGHFREQ<\/code><\/pre>\n<p>Skuplji i specifi\u010dniji na\u010din da to postignete je upotreba <code>nodeAffinity<\/code> u polju <code>affinity<\/code> odjeljka <code>spec<\/code>. Ima dva opcije:<\/p>\n<ul>\n<li>\n<p><code>requiredDuringSchedulingIgnoredDuringExecution<\/code>: stroga konfiguracija (planer \u0107e raspore\u0111ivati pode samo na odre\u0111enim \u010dvorovima (i nigdje drugo));<\/p>\n<\/li>\n<li>\n<p><code>preferredDuringSchedulingIgnoredDuringExecution<\/code>: mekana konfiguracija (planer \u0107e poku\u0161ati rasporediti na odre\u0111enim \u010dvorovima, a ako to ne uspije, poku\u0161at \u0107e rasporediti na sljede\u0107em dostupnom \u010dvoru).<\/p>\n<\/li>\n<\/ul>\n<p>Mo\u017eete odrediti odre\u0111enu sintaksu za upravljanje oznakama \u010dvorova, kao \u0161to su <code>U<\/code>, <code>Nije u<\/code>, <code>Postoji<\/code>, <code>Ne postoji<\/code>, <code>Ve\u0107e<\/code> ili <code>Manje<\/code>. Me\u0111utim, imajte na umu da slo\u017eene metode u dugim popisima oznaka usporavaju dono\u0161enje odluka u kriti\u010dnim situacijama. Drugim rije\u010dima, ne komplicirajte.<\/p>\n<p>Kao \u0161to je ve\u0107 spomenuto, Kubernetes omogu\u0107ava odre\u0111ivanje vezivanja trenutnih podova. To zna\u010di da mo\u017eete osigurati da odre\u0111eni podovi rade zajedno s drugim podovima u istoj zoni dostupnosti (relevantno za oblak) ili \u010dvorovima.<\/p>\n<p>U <code>podAffinity<\/code> polja <code>affinity<\/code> odjeljka <code>spec<\/code> dostupna su ista polja kao u slu\u010daju <code>nodeAffinity<\/code>: <code>requiredDuringSchedulingIgnoredDuringExecution<\/code><strong> <\/strong>i <code>preferredDuringSchedulingIgnoredDuringExecution<\/code>. Jedina razlika je u tome \u0161to <code>matchExpressions<\/code> ve\u017ee podove na \u010dvoru na kojem ve\u0107 radi pod s tom oznakom.<\/p>\n<p>Osim toga, Kubernetes nudi polje <code>podAntiAffinity<\/code>, koje, s druge strane, ne ve\u017ee pod na \u010dvor s odre\u0111enim podovima.<\/p>\n<p>\u0160to se ti\u010de izraza <code>nodeAffinity<\/code> mo\u017ee se dati isti savjet: nastojte odr\u017eati jednostavnost i logi\u010dnost pravila, nemojte poku\u0161avati preopteretiti specifikaciju podova slo\u017eenim skupom pravila. Lako je stvoriti pravilo koje ne\u0107e odgovarati uvjetima klastera, stvaraju\u0107i dodatno optere\u0107enje na planer i smanjuju\u0107i ukupnu u\u010dinkovitost.<\/p>\n<h2>7. Taints &amp; Tolerans<\/h2>\n<p>Postoji jo\u0161 jedan na\u010din upravljanja planerom. Ako imate veliki klaster s stotinama \u010dvorova i tisu\u0107ama mikroslu\u017ebi, vrlo je te\u0161ko ne dopustiti odre\u0111enim podovima da budu raspore\u0111eni na odre\u0111enim \u010dvorovima.<\/p>\n<p>U tome poma\u017ee mehanizam taints \u2014 zabrana pravila. Na primjer, u odre\u0111enim scenarijima mo\u017eete zabraniti odre\u0111enim \u010dvorovima da na sebi pokre\u0107u podove. Da biste primijenili taint na odre\u0111eni \u010dvor, trebate koristiti opciju <code>taint<\/code> u kubectl. Odredite klju\u010d i vrijednost, a zatim taint poput <code>NoSchedule<\/code> ili <code>NoExecute<\/code>:<\/p>\n<pre><code>$ kubectl taint nodes node10 node-role.kubernetes.io\/ingress=true:NoSchedule<\/code><\/pre>\n<p>Tako\u0111er valja napomenuti da mehanizam taint podr\u017eava tri osnovna efekta: <code>NoSchedule<\/code>, <code>NoExecute<\/code> i <code>PreferNoSchedule<\/code><strong>. <\/strong><\/p>\n<ul>\n<li>\n<p><code>NoSchedule<\/code><strong> <\/strong>zna\u010di da dok u specifikaciji poda ne bude odgovaraju\u0107i unos <code>tolerations<\/code>, ne mo\u017ee biti raspore\u0111en na \u010dvoru (u ovom primjeru <code>node10<\/code>).<\/p>\n<\/li>\n<li>\n<p><code>PreferNoSchedule <\/code>\u2014 pojednostavljena verzija <code>NoSchedule<\/code>. U ovom slu\u010daju planer \u0107e poku\u0161ati ne raspore\u0111ivati podove koji nemaju odgovaraju\u0107i unos <code>tolerations<\/code> na \u010dvor, ali to nije stroga ograni\u010denja. Ako u klasteru ne bude resursa, podovi \u0107e po\u010deti raspore\u0111ivati na tom \u010dvoru.<\/p>\n<\/li>\n<li>\n<p><code>NoExecute<\/code><strong> <\/strong>\u2014 ova pojava pokre\u0107e trenuta\u010dnu evakuaciju podova koji nemaju odgovaraju\u0107i zapis <code>tolerations<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>Zanimljivo je da se ovo pona\u0161anje mo\u017ee poni\u0161titi pomo\u0107u mehanizma tolerancija. To je korisno kada postoji \"zabranjeni\" \u010dvor i kada \u017eelite postaviti samo infrastrukturne usluge na njemu. Kako to u\u010diniti? Dopustiti samo one podove za koje postoje odgovaraju\u0107e tolerancije.<\/p>\n<p>Evo kako \u0107e izgledati specifikacija poda:<\/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 ne zna\u010di da \u0107e sljede\u0107i redeploy poda nu\u017eno zavr\u0161iti na ovom \u010dvoru, to nije mehanizam Node Affinity i <code>nodeSelector<\/code>. No kombiniranjem nekoliko zna\u010dajki, mo\u017eete posti\u0107i vrlo fleksibilno pode\u0161avanje planera.<\/p>\n<h2>8. Postavite prioritet deploymenta podova<\/h2>\n<p>To \u0161to ste postavili vezu podova na \u010dvorove ne zna\u010di da \u0107e svi podovi biti obra\u0111eni s istim prioritetom. Na primjer, mo\u017eda \u0107ete htjeti deployati neke podove prije drugih.<\/p>\n<p>Kubernetes nudi razli\u010dite na\u010dine za pode\u0161avanje prioriteta podova (Pod Priority and Preemption). Pode\u0161avanje se sastoji od nekoliko dijelova: objekta <code>PriorityClass<\/code><strong> <\/strong>i opisa polja <code>priorityClassName<\/code><strong> <\/strong>u specifikaciji poda. Pogledajmo primjer:<\/p>\n<pre><code>apiVersion: scheduling.k8s.io\\\/v1\nkind: PriorityClass\nmetadata:\n  name: high-priority\nvalue: 99999\nglobalDefault: false\ndescription: \"Ova klasa prioriteta bi trebala koristiti samo za vrlo va\u017ene podove\"<\/code><\/pre>\n<p>Stvaramo <code>PriorityClass<\/code>, postavljamo mu ime, opis i vrijednost.<strong> <\/strong>\u0160to je ve\u0107i <code>value<\/code>, to je ve\u0107i prioritet. Vrijednost mo\u017ee biti bilo koji 32-bitni cijeli broj, manji ili jednak 1 000 000 000. Vi\u0161e vrijednosti su rezervirane za kriti\u010dno va\u017ene sistemske podove koji se obi\u010dno ne mogu izbaciti.<strong> <\/strong>Izbacivanje \u0107e se odvijati samo ako visoko prioritetnom podu nije dostupno mjesto za deployment, tada \u0107e neki podovi s odre\u0111enog \u010dvora biti evakuirani. Ako vam je ovaj mehanizam previ\u0161e rigorozan, mo\u017eete dodati opciju <code>preemptionPolicy: Never<\/code>, i tada ne\u0107e biti izbacivanja, pod \u0107e biti prvi u redu i \u010dekati kada planer prona\u0111e slobodne resurse za njega.<\/p>\n<p>Zatim stvaramo pod u kojem navodimo ime <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\u017eete stvoriti neograni\u010den broj prioritetskih klasa, iako se preporu\u010duje da se ne pretjeruje (na primjer, ograni\u010dite se na nisku, srednju i visoku prioritet). <\/p>\n<p>Na taj na\u010din \u0107ete, ako bude potrebno, mo\u0107i pove\u0107ati u\u010dinkovitost postavljanja kriti\u010dnih usluga kao \u0161to su nginx-ingress-controller, coredns itd.<\/p>\n<h2>9. Optimizirajte ETCD klaster<\/h2>\n<p><img decoding=\"async\" alt=\"Devet savjeta za pove\u0107anje performansi Kubernetes-a\" src=\"\/wp-content\/uploads\/2020\/10\/f5917adfa943c789b6c784f43305851b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>ETCD se mo\u017ee nazvati mozgom cijelog klastera. Veoma je va\u017eno odr\u017eavati ovu bazu podataka na visokom nivou, jer od nje zavisi brzina operacija u 'Kubu'. Standardno, a u isto vrijeme odli\u010dno rje\u0161enje bilo bi dr\u017eati ETCD klaster na majstor nodovima kako bi se osigurala minimalna ka\u0161njenja do kube-apiservera. Ako to nije mogu\u0107e, postavite ETCD \u0161to bli\u017ee, uz dobru propusnost izme\u0111u sudionika. Tako\u0111er obratite pa\u017enju na to koliko noda iz ETCD mo\u017ee ispasti bez \u0161tete za klaster.<\/p>\n<p><img decoding=\"async\" alt=\"Devet savjeta za pove\u0107anje performansi Kubernetes-a\" src=\"\/wp-content\/uploads\/2020\/10\/cdd2c32eefed253c6ff774899c367ccc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Imajte na umu da prekomjerno pove\u0107anje broja sudionika u klasteru mo\u017ee pove\u0107ati otpornost na gre\u0161ke na ra\u010dun performansi, sve treba biti u razumu.<\/p>\n<p>Kada je rije\u010d o konfiguraciji usluge, preporuka je malo:<\/p>\n<ol>\n<li>\n<p>Imajte dobru opremu, uzimaju\u0107i u obzir veli\u010dinu klastera (mo\u017eete pro\u010ditati <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/etcd-io\/etcd\/blob\/master\/Documentation\/op-guide\/hardware.md\">ovdje<\/a><\/noindex>).<\/p>\n<\/li>\n<li>\n<p>Podesite nekoliko parametara ako ste rasporedili klaster izme\u0111u nekoliko DC-ova ili ako va\u0161a mre\u017ea i diskovi ostavljaju mnogo \u017eeljenog (mo\u017eete pro\u010ditati <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/etcd-io\/etcd\/blob\/master\/Documentation\/tuning.md\">ovdje<\/a><\/noindex>).<\/p>\n<\/li>\n<\/ol>\n<h2>Zaklju\u010dak<\/h2>\n<p>U ovom \u010dlanku opisana su pravila koja na\u0161a ekipa nastoji slijediti. Ovo nije korak-po-korak opis radnji, ve\u0107 mogu\u0107nosti koje mogu pomo\u0107i u optimizaciji operativnih tro\u0161kova klastera. Jasno je da je svaki klaster jedinstven, a rje\u0161enja za konfiguraciju mogu se zna\u010dajno razlikovati, pa bi bilo zanimljivo dobiti povratne informacije od vas: kako pratite svoj Kubernetes klaster, \u010dime pobolj\u0161avate njegov rad. Podijelite svoje iskustvo u komentarima, bit \u0107e zanimljivo \u010duti ga. <\/p>\n<p>Izvor: <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.4 - 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\/hr\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"hr_HR\" \/>\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\/hr\/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\udd47Devet savjeta za pobolj\u0161anje performansi Kubernetes | ProHoster","description":"Pozdrav svima!","canonical_url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","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\/hr\/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\/hr\/wp-json\/wp\/v2\/posts\/97982","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=97982"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/97982\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media\/97983"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=97982"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=97982"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=97982"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}