{"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\/nl\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes","title":{"rendered":"Negen tips voor het verbeteren van de prestaties van Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Negen tips voor het verbeteren van de prestaties van Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/92dc510aa9d785a31d310816b18bf854.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Hallo allemaal! Mijn naam is Oleg Sidorenkov, ik werk bij het bedrijf DomClick als teamleider van de infrastructuur. We hebben 'Cube' al meer dan drie jaar in productie en in die tijd hebben we veel interessante momenten meegemaakt. Vandaag zal ik jullie vertellen hoe je met de juiste aanpak nog meer prestaties uit 'vanilla' Kubernetes kunt halen voor je cluster. Klaar, set, go! <\/p>\n<p>Jullie weten allemaal goed dat Kubernetes een schaalbaar open-source systeem is voor het orkestreren van containers; of beter gezegd, vijf binaries die magie verrichten door de levenscyclus van jullie microservices in een serveromgeving te beheren. Bovendien is het een vrij flexibele tool die, net als een Lego-bouwer, kan worden samengesteld voor maximale aanpassing aan verschillende taken.<\/p>\n<p>En het lijkt allemaal goed: gooi servers in de cluster zoals brandhout in de kachel en je hebt geen zorgen. Maar als je voor ecologie bent, dan ga je nadenken: 'Hoe kan ik het vuur in de kachel ondersteunen en ook het bos sparen?'. Met andere woorden, hoe vind je manieren om de infrastructuur te verbeteren en de kosten te verlagen.<\/p>\n<h2>1. Houd de middelen van teams en applicaties in de gaten<\/h2>\n<p><img decoding=\"async\" alt=\"Negen tips voor het verbeteren van de prestaties van Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/91e2e60b47ee985b024532c8b685230c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Een van de meest alledaagse, maar effectieve methoden is het invoeren van requests\/limits. Verdeel applicaties over namespaces en namespaces over ontwikkelingsteams. Stel de waarden voor CPU-tijd, geheugen en tijdelijke opslag in voor de applicatie voordat je deze uitrolt.<\/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>Via ervaring hebben we geconcludeerd: het heeft geen zin om requests meer dan twee keer de limits te laten zijn. De omvang van de cluster wordt berekend op basis van requests, en als je applicaties met een verschil in middelen opzet, bijvoorbeeld 5-10 keer, stel je je voor wat er met je node gebeurt wanneer deze vol raakt met pods en plotseling een belasting krijgt. Niets goeds. Op zijn minst throttling, en op zijn ergst zeg je vaarwel tegen de worker en krijg je cyclusbelasting op de andere nodes nadat de pods beginnen te migreren.<\/p>\n<p>Bovendien kunt u met behulp van <code>limitranges<\/code> je kunt aan het begin waarden voor middelen voor de container instellen \u2014 minimaal, maximaal en standaard:<\/p>\n<pre><code>\u279c  ~ kubectl beschrijf limietranges --namespace ops\nNaam:       limiet-bereik\nNamespace:  ops\nType        Resource           Min   Max   Standaard Verzoek  Standaard Limiet  Max Limiet\/Bericht Verhouding\n----        --------           ---   ---   -------------------  ----------------  -----------------------\nContainer   cpu                50m   10    100m             100m           2\nContainer   ephemeral-storage  12Mi  8Gi   128Mi            4Gi            -\nContainer   geheugen           64Mi  40Gi  128Mi            128Mi          2<\/code><\/pre>\n<p>Vergeet niet de resources van de namespace te beperken, zodat \u00e9\u00e9n team niet alle resources van het cluster kan opvorderen:<\/p>\n<pre><code>\u279c  ~ kubectl beschrijf resourcequota's --namespace ops\nNaam:                   resource-quota\nNamespace:              ops\nResource                Gebruikt       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>Zoals te zien in de beschrijving <code>resourcequota's<\/code>, als het ops-team pods wil implementeren die nog eens 10 cpu gaan verbruiken, dan zal de scheduler dit niet toestaan en een foutmelding geven:<\/p>\n<pre><code>Fout bij het maken: pods \"nginx-proxy-9967d8d78-nh4fs\" is verboden: quota overschreden: resource-quota, aangevraagd: limits.cpu=5, requests.cpu=5, gebruikt: limits.cpu=77250m, requests.cpu=53850m, beperkt: limits.cpu=10, requests.cpu=10<\/code><\/pre>\n<p>Om een dergelijke taak op te lossen, kan je een tool schrijven, bijvoorbeeld zoals <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pauljamm\/team-operator\">deze<\/a><\/noindex>, dat in staat is om de status van de resources van teams op te slaan en te committen.<\/p>\n<h2>2. Kies een optimale opslagoplossing<\/h2>\n<p><img decoding=\"async\" alt=\"Negen tips voor het verbeteren van de prestaties van Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/c7f8bdbf5490acc9061695a6d608015e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Hier wil ik het thema van persistente volumes en het schijfsysteem van Kubernetes worker nodes aansnijden. Ik hoop dat niemand in productie \"Kube\" op HDD gebruikt, maar soms is zelfs een gewone SSD niet genoeg meer. We zijn geconfronteerd met een probleem waarbij logs de schijf verwoestten door invoer- en uitvoerbewerkingen, en de oplossingen zijn hier beperkt: <\/p>\n<ul>\n<li>\n<p>Gebruik hoge-prestatie SSD's of schakel over naar NVMe (indien je zelf over je hardware beschikt).<\/p>\n<\/li>\n<li>\n<p>Verminder het logniveau.<\/p>\n<\/li>\n<li>\n<p>Voer \"slimme\" balans van pods uit die de schijf zwaar belasten (<code>podAntiAffinity<\/code>).<\/p>\n<\/li>\n<\/ul>\n<p>De screenshot hierboven toont wat er met de schijf gebeurt onder de nginx-ingress-controller wanneer logging van access_logs is ingeschakeld (~12 duizend logs\/sec). Een dergelijke staat kan uiteraard leiden tot degradatie van alle applicaties op deze node.<\/p>\n<p>Wat betreft PV, ik heb helaas niet alle <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/storage\/persistent-volumes\/#types-of-persistent-volumes\">typen geprobeerd<\/a><\/noindex> Persistente volumes. Gebruik de beste optie die bij u past. Historisch gezien hebben we een kleine hoeveelheid diensten die behoefte hebben aan RWX-volumes, en al lang daarvoor gebruikten we een NFS-opslag voor deze taak. Goedkoop en... voldoende. Natuurlijk hebben we er genoeg van gekregen \u2014 maar we hebben geleerd het te optimaliseren, en nu hebben we er geen hoofdpijn meer van. En als het mogelijk is, stap over naar objectopslag S3.<\/p>\n<h2>3. Verzamel geoptimaliseerde afbeeldingen<\/h2>\n<p><img decoding=\"async\" alt=\"Negen tips voor het verbeteren van de prestaties van Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/c25ce405d1eb4c01f031e18b0bfa4836.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Het is het beste om geoptimaliseerde containerafbeeldingen te gebruiken, zodat Kubernetes ze sneller kan ophalen en effici\u00ebnter kan uitvoeren.&nbsp;<\/p>\n<p>Geoptimaliseerd betekent dat de afbeeldingen:<\/p>\n<ul>\n<li>\n<p>slechts \u00e9\u00e9n applicatie bevatten of slechts \u00e9\u00e9n functie uitvoeren;<\/p>\n<\/li>\n<li>\n<p>klein van formaat zijn, omdat grote afbeeldingen slechter door het netwerk worden verzonden;<\/p>\n<\/li>\n<li>\n<p>eindpunten hebben voor gezondheid- en gereedtests, waarmee Kubernetes acties kan ondernemen in het geval van uitvaltijd;<\/p>\n<\/li>\n<li>\n<p>container-vriendelijke besturingssystemen gebruiken (zoals Alpine of CoreOS), die beter bestand zijn tegen configuratiefouten;<\/p>\n<\/li>\n<li>\n<p>multi-stage builds gebruiken, zodat je alleen gecompileerde applicaties hoeft te implementeren en niet de bijbehorende bronbestanden.<\/p>\n<\/li>\n<\/ul>\n<p>Er zijn veel tools en services beschikbaar die in realtime kunnen controleren en optimaliseren van afbeeldingen. Het is belangrijk om ze altijd up-to-date en beveiligd te houden. Uiteindelijk krijg je: <\/p>\n<ol>\n<li>\n<p>Vermindering van de netwerklast op het hele cluster.<\/p>\n<\/li>\n<li>\n<p>Vermindering van de opstarttijd van de container.<\/p>\n<\/li>\n<li>\n<p>Een kleiner volume van je hele Docker registry.<\/p>\n<\/li>\n<\/ol>\n<h2>4. Gebruik DNS-cache<\/h2>\n<p><img decoding=\"async\" alt=\"Negen tips voor het verbeteren van de prestaties van Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/9f4384462a77dc528d7911c56f684f2d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Als het gaat om hoge belasting, is het leven zonder optimalisatie van het DNS-systeem van het cluster behoorlijk slecht. Lang geleden ondersteunden Kubernetes-ontwikkelaars hun oplossing kube-dns. Dit werd ook bij ons ge\u00efmplementeerd, maar deze software werd nauwelijks getuned en leverde niet de vereiste prestaties, ook al leek de taak eenvoudig. Vervolgens kwam coredns, waar we naar overstapten en we ervaren geen problemen meer, uiteindelijk werd het de standaard DNS-service in K8s. Op een bepaald moment kwamen we aan 40.000 rps naar het DNS-systeem, en deze oplossing was ook niet genoeg. Maar, bij een gelukkige samenloop van omstandigheden, kwam Nodelocaldns uit, ook bekend als node local cache, ook wel <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/tasks\/administer-cluster\/nodelocaldns\/\">NodeLocal DNSCache<\/a><\/noindex>.<\/p>\n<p>Waarom gebruiken we dit? Er is een bug in de Linux-kern die bij meerdere verzoeken via conntrack NAT over UDP leidt tot een race-conditie bij het schrijven naar conntrack-tabellen, waardoor een deel van het verkeer via NAT verloren gaat (elke toegang via Service is NAT). Nodelocaldns lost dit probleem op door NAT te vermijden en de verbinding te upgraden naar TCP voor upstream DNS, evenals het lokaal cachen van DNS-verzoeken naar upstream (inclusief een korte negatieve cache van 5 seconden).<\/p>\n<h2>5. Schaal pods automatisch horizontaal en verticaal<\/h2>\n<p><img decoding=\"async\" alt=\"Negen tips voor het verbeteren van de prestaties van Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/3804a14685a55160fa7d9f3226eab1fa.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Kun je met zekerheid zeggen dat al je microservices klaar zijn voor een twee- tot drievoudige toename in belasting? Hoe beheer je de resources voor je applicaties op de juiste manier? Het draaiende houden van een paar pods boven de werkbelasting kan overbodig blijken te zijn, terwijl het houden van de capaciteit op zijn maximale kan leiden tot downtime door een plotselinge toename van het verkeer naar de service. De gouden middenweg kan worden bereikt door middelen zoals <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/tasks\/run-application\/horizontal-pod-autoscale\/\">Horizontal Pod Autoscaler<\/a><\/noindex> en <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> die automatisch de requests\/limits van je containers in de pod aanpast op basis van het werkelijke gebruik. Hoe kan dit nuttig zijn? Als je pods hebt die om een of andere reden niet horizontaal kunnen worden geschaald (wat niet echt betrouwbaar is), kun je overwegen om VPA het aanpassen van zijn resources te laten doen. Het kenmerk is het aanbevelingssysteem op basis van historische en actuele gegevens van de metric-server, dus als je niet automatisch requests\/limits wilt wijzigen, kun je gewoon de aanbevolen resources voor je containers volgen en de instellingen optimaliseren om CPU en geheugen in de cluster te besparen. <\/p>\n<p><img decoding=\"async\" alt=\"Negen tips voor het verbeteren van de prestaties van Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/3965950aa3315faa4bb3e3ff5bd61955.png\" style=\"display:block;margin: 0 auto;\" \/>Afbeelding afkomstig van https:\/\/levelup.gitconnected.com\/kubernetes-autoscaling-101-cluster-autoscaler-horizontal-pod-autoscaler-and-vertical-pod-2a441d9ad231<\/p>\n<p>De scheduler in Kubernetes is altijd gebaseerd op requests. Welke waarde je daar ook invoert, de scheduler zoekt een geschikte node op basis daarvan. Limits zijn nodig voor de kubelet om te begrijpen wanneer deze moet throttlen of pods moet be\u00ebindigen. En aangezien de enige belangrijke parameter de waarde van de requests is, werkt de VPA hiermee. Elke keer dat je verticaal schaling instelt voor een applicatie, geef je aan wat de requests moeten zijn. En wat gebeurt er dan met de limits? Deze parameter zal ook proportioneel worden geschaald.<\/p>\n<p>Bijvoorbeeld, hier zijn de gebruikelijke instellingen voor een pod:<\/p>\n<pre><code>resources:\n   requests:\n     memory: 250Mi\n     cpu: 200m\n   limits:\n     memory: 500Mi\n     cpu: 350m<\/code><\/pre>\n<p>Het aanbevelingssysteem bepaalt dat uw toepassing voor normaal functioneren 300m CPU en 500Mi vereist. U krijgt de volgende configuratie:<\/p>\n<pre><code>resources:\n   requests:\n     memory: 500Mi\n     cpu: 300m\n   limits:\n     memory: 1000Mi\n     cpu: 525m<\/code><\/pre>\n<p>Zoals eerder vermeld, is dit een proportionele schaalvergroting op basis van de verhouding van requests\/limits in het manifest:<\/p>\n<ul>\n<li>\n<p>CPU: 200m \u2192 300m: verhouding 1:1.75;<\/p>\n<\/li>\n<li>\n<p>Geheugen: 250Mi \u2192 500Mi: verhouding 1:2.<\/p>\n<\/li>\n<\/ul>\n<p>Wat betreft <strong>HPA<\/strong>, dan is het mechanisme hier transparanter. Drempelwaarden voor metrics, zoals CPU en geheugen, worden ingesteld, en als de gemiddelde waarde van alle replica's de drempel overschrijdt, wordt de applicatie met +1 pod vergroot totdat de waarde onder de drempel valt of het maximale aantal replica's is bereikt.<\/p>\n<p><img decoding=\"async\" alt=\"Negen tips voor het verbeteren van de prestaties van Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/f7a3fa28177d66be925867e38f5bbed6.png\" style=\"display:block;margin: 0 auto;\" \/>Afbeelding afkomstig van https:\/\/levelup.gitconnected.com\/kubernetes-autoscaling-101-cluster-autoscaler-horizontal-pod-autoscaler-and-vertical-pod-2a441d9ad231<\/p>\n<p>Naast reguliere metrics, zoals CPU en geheugen, kunt u drempelwaarden instellen op uw aangepaste metrics vanuit Prometheus en hiermee werken, als u dit de meest nauwkeurige manier vindt om te bepalen wanneer uw applicatie moet schalen. Zodra de applicatie zich stabiliseert onder de opgegeven drempelwaarde, zal HPA de pods naar beneden schalen tot het minimale aantal replica's of tot de toestand waarin de belasting aan de opgegeven drempel voldoet.<\/p>\n<h2>6. Vergeet Node Affinity en Pod Affinity niet<\/h2>\n<p><img decoding=\"async\" alt=\"Negen tips voor het verbeteren van de prestaties van Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/e718191d9e8ff25fd3b2d65cba9b3b73.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Niet alle nodes draaien op dezelfde hardware, en niet alle pods hoeven toepassingen uit te voeren die intensieve berekeningen vereisen. Kubernetes stelt u in staat om specialisaties voor nodes en pods in te stellen met behulp van <strong>Node Affinity<\/strong> en <strong>Pod Affinity<\/strong>.<\/p>\n<p>Als u nodes hebt die geschikt zijn voor intensieve rekentaken, is het beter om toepassingen aan de juiste nodes te koppelen voor maximale effici\u00ebntie. Gebruik daarvoor <code>nodeSelector<\/code> met het label van de node.<\/p>\n<p>Stel dat u twee nodes heeft: de ene met <code>CPUType=HIGHFREQ<\/code> en een groot aantal snelle cores, de andere met <code>MemoryType=HIGHMEMORY<\/code> een grote hoeveelheid geheugen en hogere prestaties. Het is het eenvoudigst om de pod-distributie aan de node <code>HIGHFREQ<\/code>te koppelen door de volgende selector toe te voegen in de sectie <code>spec<\/code> :<\/p>\n<pre><code>\u2026\nnodeSelector:\n\tCPUType: HIGHFREQ<\/code><\/pre>\n<p>Een meer kostbare en specifieke manier om dit te doen, is door gebruik te maken van <code>nodeAffinity<\/code> in het veld <code>affinity<\/code> de sectie <code>spec<\/code>. Er zijn twee opties:<\/p>\n<ul>\n<li>\n<p><code>requiredDuringSchedulingIgnoredDuringExecution<\/code>: harde configuratie (de planner zal pods alleen op specifieke nodes implementeren (en nergens anders));<\/p>\n<\/li>\n<li>\n<p><code>preferredDuringSchedulingIgnoredDuringExecution<\/code>: zachte configuratie (de planner zal proberen te deploegen op specifieke knooppunten, en als dat niet lukt, probeert hij het op het volgende beschikbare knooppunt).<\/p>\n<\/li>\n<\/ul>\n<p>Je kunt een specifieke syntaxis voor het beheren van knooppuntlabels opgeven, bijvoorbeeld, <code>In<\/code>, <code>NotIn<\/code>, <code>Bestaat<\/code>, <code>BestaatNiet<\/code>, <code>Gt<\/code> of <code>Lt<\/code>. Vergeet echter niet dat complexe methoden in lange lijsten van labels de besluitvorming in kritieke situaties zullen vertragen. Met andere woorden, maak het niet te ingewikkeld.<\/p>\n<p>Zoals hierboven vermeld, stelt Kubernetes je in staat om de binding van huidige pods op te geven. Dat wil zeggen, je kunt ervoor zorgen dat bepaalde pods samenwerken met andere pods in dezelfde beschikbaarheidszone (relevant voor cloudomgevingen) of knooppunten.<\/p>\n<p>In <code>podAffinity<\/code> velden <code>affinity<\/code> de sectie <code>spec<\/code> zijn dezelfde velden beschikbaar als in het geval van <code>nodeAffinity<\/code>: <code>requiredDuringSchedulingIgnoredDuringExecution<\/code><strong> <\/strong>en <code>preferredDuringSchedulingIgnoredDuringExecution<\/code>. Het enige verschil is dat <code>matchExpressions<\/code> pods bindt aan een knooppunt waarop al een pod met dat label draait.<\/p>\n<p>Verder biedt Kubernetes het veld <code>podAntiAffinity<\/code>, dat, in tegenstelling tot, de pod niet bindt aan een knooppunt met bepaalde pods.<\/p>\n<p>Wat betreft de uitdrukkingen, <code>nodeAffinity<\/code> kan dezelfde raad worden gegeven: probeer de regels eenvoudig en logisch te houden, en probeer de specificatie van pods niet te overladen met een complexe set regels. Het is heel gemakkelijk om een regel te cre\u00ebren die niet voldoet aan de voorwaarden van het cluster, wat extra belasting op de planner cre\u00ebert en de algehele prestaties verlaagt.<\/p>\n<h2>7. Taints &amp; Tolerances<\/h2>\n<p>Er is nog een manier om de planner te beheren. Als je een groot cluster hebt met honderden knooppunten en duizenden microservices, is het zeer moeilijk om bepaalde pods niet toe te staan op bepaalde knooppunten.<\/p>\n<p>Hier helpt het taints-mechanisme \u2014 beperkende regels. Bijvoorbeeld, in bepaalde scenario's kan het verboden zijn dat bepaalde knooppunten pods draaien. Om een taint op een specifiek knooppunt toe te passen, moet je de optie <code>taint<\/code> in kubectl gebruiken. Geef de sleutel en waarde op, en dan taint zoals <code>NoSchedule<\/code> of <code>NoExecute<\/code>:<\/p>\n<pre><code>$ kubectl taint nodes node10 node-role.kubernetes.io\/ingress=true:NoSchedule<\/code><\/pre>\n<p>Het is ook vermeldenswaard dat het taint-mechanisme drie belangrijke effecten ondersteunt: <code>NoSchedule<\/code>, <code>NoExecute<\/code> en <code>PreferNoSchedule<\/code><strong>. <\/strong><\/p>\n<ul>\n<li>\n<p><code>NoSchedule<\/code><strong> <\/strong>betekent dat zolang er geen overeenkomstige vermelding in de pod-specificatie is <code>tolerances<\/code>, deze niet op een knooppunt kan worden gedeployed (in dit geval <code>node10<\/code>).<\/p>\n<\/li>\n<li>\n<p><code>PreferNoSchedule <\/code>\u2014 een vereenvoudigde versie <code>NoSchedule<\/code>. In dit geval zal de planner proberen geen pods zonder de betreffende vermelding <code>tolerances<\/code> op het knooppunt te distribueren, maar dit is geen harde beperking. Als er geen middelen in het cluster beschikbaar zijn, zullen de pods beginnen te deploegen op dit knooppunt.<\/p>\n<\/li>\n<li>\n<p><code>NoExecute<\/code><strong> <\/strong>\u2014 dit effect activeert onmiddellijke evacuatie van pods die geen overeenkomstige vermelding hebben. <code>tolerances<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>Interessant is dat dit gedrag kan worden teruggedraaid met behulp van het mechanisme tolerations. Dit is handig wanneer er een 'verboden' node is en je alleen infrastructuurservices op deze node wilt plaatsen. Hoe doe je dat? Sta alleen die pods toe waarvoor er een geschikte toleration is.<\/p>\n<p>Zo zal de specificatie van de pod eruitzien:<\/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>Dit betekent niet dat bij de volgende redeploy de pod op deze node terechtkomt, dit is niet het Node Affinity mechanisme en <code>nodeSelector<\/code>. Maar door verschillende functies te combineren, kun je een zeer flexibele configuratie van de scheduler bereiken.<\/p>\n<h2>8. Stel de prioriteit van pod-implementaties in<\/h2>\n<p>Het feit dat je de binding van pods aan nodes hebt ingesteld, betekent niet dat alle pods met dezelfde prioriteit moeten worden verwerkt. Bijvoorbeeld, je wilt misschien bepaalde pods eerder implementeren dan anderen.<\/p>\n<p>Kubernetes biedt verschillende manieren om de prioriteit van pods in te stellen (Pod Priority and Preemption). De configuratie bestaat uit verschillende delen: het object <code>PriorityClass<\/code><strong> <\/strong>en de beschrijving van het veld <code>priorityClassName<\/code><strong> <\/strong>in de specificatie van de pod. Laten we een voorbeeld bekijken:<\/p>\n<pre><code>apiVersion: scheduling.k8s.io\\\/v1\nkind: PriorityClass\nmetadata:\n  name: high-priority\nvalue: 99999\nglobalDefault: false\ndescription: \"Deze prioriteitsklasse mag alleen worden gebruikt voor zeer belangrijke pods\"<\/code><\/pre>\n<p>We maken <code>PriorityClass<\/code>, geven het een naam, beschrijving en waarde.<strong> <\/strong>Hoe hoger <code>value<\/code>, hoe hoger de prioriteit. De waarde kan elk 32-bits geheel getal zijn dat kleiner is dan of gelijk aan 1.000.000.000. Hogere waarden zijn gereserveerd voor kritieke systeem-pods die doorgaans niet kunnen worden weggehaald.<strong> <\/strong>Wegnemen zal alleen gebeuren als er geen plek is voor de hoog-prioritaire pod om te worden ge\u00efmplementeerd, waarna bepaalde pods van een specifieke node zullen worden ge\u00ebvacueerd. Als dit mechanisme te rigide voor je is, kun je de optie <code>preemptionPolicy: Never<\/code>, toevoegen, en dan zal er geen afname zijn, de pod staat bovenaan de wachtrij en wacht tot de scheduler vrije middelen voor hem vindt.<\/p>\n<p>Vervolgens maken we een pod waarin we de naam opgeven <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>Je kunt zoveel prioriteitsklassen cre\u00ebren als je wilt, maar het wordt aanbevolen om dit niet te overdrijven (laten we zeggen, beperk je tot lage, gemiddelde en hoge prioriteit). <\/p>\n<p>Zo kun je de effici\u00ebntie van de uitrol van kritieke services zoals de nginx-ingress-controller, coredns, enzovoort verbeteren wanneer dat nodig is.<\/p>\n<h2>9. Optimaliseer je ETCD-cluster<\/h2>\n<p><img decoding=\"async\" alt=\"Negen tips voor het verbeteren van de prestaties van Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/f5917adfa943c789b6c784f43305851b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>ETCD kan worden gezien als de hersenen van het hele cluster. Het is erg belangrijk om deze database op hoog niveau te laten functioneren, omdat de snelheid van de operaties in 'Kube' ervan afhangt. Een standaard, maar toch goede oplossing is om het ETCD-cluster op de master-knooppunten te houden, zodat je een minimale latency naar kube-apiserver hebt. Als dit niet mogelijk is, positioneer ETCD dan zo dicht mogelijk bij elkaar, met goede bandbreedte tussen de deelnemers. Houd ook rekening met het aantal knooppunten dat uit ETCD kan vallen zonder schade aan het cluster.<\/p>\n<p><img decoding=\"async\" alt=\"Negen tips voor het verbeteren van de prestaties van Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/cdd2c32eefed253c6ff774899c367ccc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Houd er rekening mee dat een overmatig aantal deelnemers in het cluster de fouttolerantie kan verhogen ten koste van de prestaties; alles moet in evenwicht zijn.<\/p>\n<p>Als het gaat om de configuratie van de service, zijn er niet veel aanbevelingen:<\/p>\n<ol>\n<li>\n<p>Zorg voor goede hardware, afhankelijk van de grootte van het cluster (meer hierover te lezen) <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/etcd-io\/etcd\/blob\/master\/Documentation\/op-guide\/hardware.md\">here<\/a><\/noindex>).<\/p>\n<\/li>\n<li>\n<p>Pas een paar parameters aan als je het cluster verspreid hebt over een paar datacenters of als je netwerk en schijven te wensen overlaten (meer hierover te lezen) <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/etcd-io\/etcd\/blob\/master\/Documentation\/tuning.md\">here<\/a><\/noindex>).<\/p>\n<\/li>\n<\/ol>\n<h2>Conclusie<\/h2>\n<p>In dit artikel worden punten beschreven die ons team probeert te volgen. Dit is geen stapsgewijze handleiding, maar opties die nuttig kunnen zijn voor het optimaliseren van overheadkosten voor het cluster. Het is duidelijk dat elk cluster uniek is, en de oplossingen voor configuratie kunnen sterk vari\u00ebren, daarom zou het interessant zijn om van jullie te horen: hoe monitoren jullie jullie Kubernetes-cluster, waarmee verbeteren jullie de prestaties? Deel je ervaringen in de reacties, we zijn benieuwd naar je inzichten. <\/p>\n<p>Bron: <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.3 - 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\/nl\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"nl_NL\" \/>\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\/nl\/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\udd47Negen tips voor het verbeteren van de prestaties van Kubernetes | ProHoster","description":"Hallo allemaal!","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","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\/nl\/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\/nl\/wp-json\/wp\/v2\/posts\/97982","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=97982"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/97982\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/97983"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=97982"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=97982"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=97982"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}