{"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\/da\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes","title":{"rendered":"Ni tips til at forbedre Kubernetes-ydeevnen","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Ni tips til at forbedre Kubernetes-ydeevnen\" src=\"\/wp-content\/uploads\/2020\/10\/92dc510aa9d785a31d310816b18bf854.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Hej alle sammen! Mit navn er Oleg Sidorenkov, og jeg arbejder som leder af infrastrukturteamet hos DomClick. Vi har v\u00e6ret i gang med at k\u00f8re 'Kuben' i produktion i over tre \u00e5r, og i l\u00f8bet af den tid har vi oplevet mange forskellige interessante \u00f8jeblikke. I dag vil jeg fort\u00e6lle jer, hvordan man med den rette tilgang kan presse endnu mere ydeevne ud af 'vanilje' Kubernetes til jeres klynge. Klar, parat, g\u00e5! <\/p>\n<p>I kender alle godt til, at Kubernetes er et skalerbart system med \u00e5ben kildekode til orkestrering af containere; eller 5 bin\u00e6re filer, der udf\u00f8rer magi ved at styre livscyklus for jeres mikrotjenester i servermilj\u00f8et. Desuden er det et ret fleksibelt v\u00e6rkt\u00f8j, som kan samles som et Lego-s\u00e6t for maksimal tilpasning til forskellige opgaver.<\/p>\n<p>Og det ser ud til at fungere godt: smid servere ind i klyngen som br\u00e6nde i ovnen, og v\u00e6r ikke bekymret. Men hvis du t\u00e6nker p\u00e5 milj\u00f8et, vil du overveje: 'Hvordan kan jeg holde ilden i ovnen i gang og samtidig sk\u00e5ne skoven?'. Med andre ord, hvordan finde m\u00e5der at forbedre infrastrukturen og reducere omkostningerne.<\/p>\n<h2>1. Hold \u00f8je med ressourcerne for teams og applikationer<\/h2>\n<p><img decoding=\"async\" alt=\"Ni tips til at forbedre Kubernetes-ydeevnen\" src=\"\/wp-content\/uploads\/2020\/10\/91e2e60b47ee985b024532c8b685230c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>En af de mest banale, men effektive metoder er at indf\u00f8re requests\/limits. Del applikationerne op i namespaces, og del namespaces op efter udviklingsteam. Angiv for applikationen f\u00f8r deployment v\u00e6rdierne for CPU-forbrug, hukommelse og ephemeral lager.<\/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>Vi er erfaret kommet frem til, at man ikke b\u00f8r overdrive requests i forhold til limits med mere end det dobbelte. St\u00f8rrelsen p\u00e5 klyngen beregnes ud fra requests, og hvis du angiver en forskel i ressourcer for applikationer, f.eks. 5-10 gange, s\u00e5 forestil dig, hvad der sker med din node, n\u00e5r den fyldes med pods og pludselig f\u00e5r belastning. Intet godt. Som minimum throttling, og som maksimum, kan du sige farvel til workeren og opleve cyklisk belastning p\u00e5 de andre noder, n\u00e5r pods begynder at flytte rundt.<\/p>\n<p>Derudover, ved hj\u00e6lp af <code>limitranges<\/code> kan du i starten angive ressourcemyderne for containeren \u2014 minimum, maksimum og standard:<\/p>\n<pre><code>\u279c  ~ kubectl beskrive limitranges --namespace ops\nNavn:       limit-range\nNamespace:  ops\nType        Ressource           Min   Max   Standard Anmodning  Standard Gr\u00e6nse  Max Gr\u00e6nse\/Anmodnings 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>Husk at begr\u00e6nse ressourcerne i namespace, s\u00e5 et hold ikke kan tage alle ressourcerne i klyngen:<\/p>\n<pre><code>\u279c  ~ kubectl beskrive resourcequotas --namespace ops\nNavn:                   resource-quota\nNamespace:              ops\nRessource                Bruges          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>Som det fremg\u00e5r af beskrivelsen <code>resourcequotas<\/code>, hvis holdet ops \u00f8nsker at implementere pods, der vil forbruge yderligere 10 cpu, vil planl\u00e6ggere ikke tillade dette og give en fejlmeddelelse:<\/p>\n<pre><code>Fejl ved oprettelse: pods \"nginx-proxy-9967d8d78-nh4fs\" er forbudt: overskredet kvote: resource-quota, anmodet: limits.cpu=5, requests.cpu=5, brugt: limits.cpu=77250m, requests.cpu=53850m, begr\u00e6nset: limits.cpu=10, requests.cpu=10<\/code><\/pre>\n<p>For at l\u00f8se en s\u00e5dan opgave kan man skrive et v\u00e6rkt\u00f8j, for eksempel som <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pauljamm\/team-operator\">denne<\/a><\/noindex>, der kan gemme og commite tilstanden af ressourcerne for hold.<\/p>\n<h2>2. V\u00e6lg det optimale filsystem<\/h2>\n<p><img decoding=\"async\" alt=\"Ni tips til at forbedre Kubernetes-ydeevnen\" src=\"\/wp-content\/uploads\/2020\/10\/c7f8bdbf5490acc9061695a6d608015e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Her vil jeg gerne ber\u00f8re emnet persistent volumes og disk subsystems i Kubernetes worker-noder. Jeg h\u00e5ber, at ingen bruger \"Kube\" p\u00e5 HDD i produktion, men nogle gange er selv almindelige SSD'er ikke tilstr\u00e6kkelige. Vi har st\u00e5et over for det problem, at logs dr\u00e6bte disken ved input-output operationer, og her er mulighederne for l\u00f8sninger ikke mange: <\/p>\n<ul>\n<li>\n<p>Brug h\u00f8jtydende SSD'er eller skift til NVMe (hvis du selv r\u00e5der over dit hardware).<\/p>\n<\/li>\n<li>\n<p>Reducer niveauet for logning.<\/p>\n<\/li>\n<li>\n<p>Lav en \"intelligent\" belastningsbalancering af pods, der nedsl\u00e5r disken (<code>podAntiAffinity<\/code>).<\/p>\n<\/li>\n<\/ul>\n<p>Sk\u00e6rmbilledet ovenfor viser, hvad der sker med nginx-ingress-controlleren med disken, n\u00e5r access_logs logning er aktiveret (~12 tusinde logs\/sek.). Denne tilstand kan naturligvis f\u00f8re til forringelse af alle applikationer p\u00e5 denne node.<\/p>\n<p>Hvad ang\u00e5r PV, desv\u00e6rre har jeg ikke pr\u00f8vet alle <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/storage\/persistent-volumes\/#types-of-persistent-volumes\">typer<\/a><\/noindex> Vedvarende volumner. Brug den bedste mulighed, der passer til dig. Historisk set har en lille del af tjenester brug for RWX-volumener, og l\u00e6nge siden begyndte vi at bruge NFS-lagring til dette form\u00e5l. Billigt og\u2026 det er tilstr\u00e6kkeligt. Selvf\u00f8lgelig har vi f\u00e5et en del problemer med det \u2014 det kan vi godt lide, men vi har l\u00e6rt at optimere det, og nu har vi ikke l\u00e6ngere hovedpine. Hvis det er muligt, skift til objektlagring som S3.<\/p>\n<h2>3. Saml optimerede billeder<\/h2>\n<p><img decoding=\"async\" alt=\"Ni tips til at forbedre Kubernetes-ydeevnen\" src=\"\/wp-content\/uploads\/2020\/10\/c25ce405d1eb4c01f031e18b0bfa4836.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Det er bedst at bruge containeroptimerede billeder, s\u00e5 Kubernetes hurtigere kan hente dem og mere effektivt udf\u00f8re dem.&nbsp;<\/p>\n<p>Optimering betyder, at billederne:<\/p>\n<ul>\n<li>\n<p>indeholder kun \u00e9n applikation eller udf\u00f8rer kun \u00e9n funktion;<\/p>\n<\/li>\n<li>\n<p>er sm\u00e5 i st\u00f8rrelse, fordi store billeder overf\u00f8rer langsommere over netv\u00e6rket;<\/p>\n<\/li>\n<li>\n<p>har endepunkter til sundhedstjek og beredskab, som Kubernetes kan bruge til at tage handling i tilf\u00e6lde af nedetid;<\/p>\n<\/li>\n<li>\n<p>bruger containervenlige operativsystemer (som Alpine eller CoreOS), som er mere modstandsdygtige over for konfigurationsfejl;<\/p>\n<\/li>\n<li>\n<p>bruger multi-trins opbygninger, s\u00e5 du kun kan implementere kompilere applikationer uden ledsagende kildekoder.<\/p>\n<\/li>\n<\/ul>\n<p>Der findes mange v\u00e6rkt\u00f8jer og tjenester, der giver dig mulighed for at kontrollere og optimere billeder i realtid. Det er vigtigt at holde dem opdateret og sikkerhedstestede. I sidste ende f\u00e5r du: <\/p>\n<ol>\n<li>\n<p>Neds\u00e6ttelse af netv\u00e6rksbelastningen p\u00e5 hele klyngen.<\/p>\n<\/li>\n<li>\n<p>Reducering af opstartstiden for containeren.<\/p>\n<\/li>\n<li>\n<p>Mindre volumen af hele din Docker registry.<\/p>\n<\/li>\n<\/ol>\n<h2>4. Brug DNS-cache<\/h2>\n<p><img decoding=\"async\" alt=\"Ni tips til at forbedre Kubernetes-ydeevnen\" src=\"\/wp-content\/uploads\/2020\/10\/9f4384462a77dc528d7911c56f684f2d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>N\u00e5r vi taler om h\u00f8je belastninger, er det ret problematisk at leve uden tuning af klyngens DNS-system. For l\u00e6nge siden underst\u00f8ttede udviklerne af Kubernetes deres egen l\u00f8sning kube-dns. Det blev implementeret hos os, men denne software blev ikke finjusteret og ydede ikke den n\u00f8dvendige ydeevne, selvom opgaven syntes enkel. S\u00e5 kom coredns, som vi skiftede til, og vi oplevede ikke flere problemer, og senere blev det standard DNS-tjenesten i K8s. P\u00e5 et tidspunkt n\u00e5ede vi 40.000 rps til DNS-systemet, og denne l\u00f8sning var ogs\u00e5 utilstr\u00e6kkelig. Men heldigvis blev Nodelocaldns, ogs\u00e5 kendt som node local cache, introduceret. <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/tasks\/administer-cluster\/nodelocaldns\/\">NodeLocal DNSCache<\/a><\/noindex>.<\/p>\n<p>Hvorfor bruger vi dette? Der er en fejl i Linux-kernen, som ved flere samtidige anmodninger gennem conntrack NAT over UDP f\u00f8rer til en race condition ved skrivning til conntrack-tabellerne, hvilket betyder, at en del trafik gennem NAT g\u00e5r tabt (hver gang vi g\u00e5r gennem Service \u2014 er det NAT). Nodelocaldns l\u00f8ser dette problem ved at eliminere NAT og opgradere forbindelsen til TCP til upstream DNS, samt lokal caching af DNS-anmodninger til upstreams (inklusive en kort 5-sekunders negativ cache).<\/p>\n<h2>5. Skaler pods horisontalt og vertikalt automatisk<\/h2>\n<p><img decoding=\"async\" alt=\"Ni tips til at forbedre Kubernetes-ydeevnen\" src=\"\/wp-content\/uploads\/2020\/10\/3804a14685a55160fa7d9f3226eab1fa.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Kan du med sikkerhed sige, at alle dine mikrotjenester er klar til en to- til tre-dobbelt stigning i belastningen? Hvordan tildeler du ressourcer korrekt til dine applikationer? At have et par pods k\u00f8rende ud over den arbejdsbyrde kan vise sig at v\u00e6re overfl\u00f8digt, mens at k\u00f8re dem helt t\u00e6t kan risikere nedetid ved pludselig stigning i trafikken til tjenesten. Guldmidten hj\u00e6lpes med at opn\u00e5 gennem magi af multiplikation ved s\u00e5danne tjenester som <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/tasks\/run-application\/horizontal-pod-autoscale\/\">Horizontal Pod Autoscaler<\/a><\/noindex> og <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> muligg\u00f8r automatisk justering af requests\/limits for dine containere i en pod baseret p\u00e5 faktisk brug. Hvordan kan det v\u00e6re nyttigt? Hvis du har pods, der af en eller anden grund ikke kan skaleres horisontalt (hvilket ikke er helt p\u00e5lideligt), kan du overveje at overlade \u00e6ndringen af ressourcerne til VPA. Dets funktion er baseret p\u00e5 et anbefalingssystem, der bruger historiske og aktuelle data fra metric-serveren, s\u00e5 hvis du ikke \u00f8nsker at \u00e6ndre requests\/limits automatisk, kan du blot overv\u00e5ge de anbefalede ressourcer for dine containere og optimere indstillingerne for at spare CPU og hukommelse i klyngen. <\/p>\n<p><img decoding=\"async\" alt=\"Ni tips til at forbedre Kubernetes-ydeevnen\" src=\"\/wp-content\/uploads\/2020\/10\/3965950aa3315faa4bb3e3ff5bd61955.png\" style=\"display:block;margin: 0 auto;\" \/>Billedet er hentet fra https:\/\/levelup.gitconnected.com\/kubernetes-autoscaling-101-cluster-autoscaler-horizontal-pod-autoscaler-and-vertical-pod-2a441d9ad231<\/p>\n<p>Planl\u00e6ggeren i Kubernetes er altid baseret p\u00e5 requests. Uanset hvilken v\u00e6rdi du angiver, vil planl\u00e6ggeren lede efter en passende node ud fra det. Begr\u00e6nsningsv\u00e6rdierne er n\u00f8dvendige for kubelet for at forst\u00e5, hvorn\u00e5r det skal throttle eller stoppe en pod. Og da den eneste vigtige parameter er requests-v\u00e6rdien, vil VPA arbejde med den. Hver gang du angiver vertikal skalering af applikationen, definerer du, hvad requests skal v\u00e6re. Hvad med limits? Denne parameter vil ogs\u00e5 blive skaleret proportionalt.<\/p>\n<p>For eksempel er her almindelige indstillinger for en pod:<\/p>\n<pre><code>ressourcer:\n   anmodninger:\n     hukommelse: 250Mi\n     cpu: 200m\n   gr\u00e6nser:\n     hukommelse: 500Mi\n     cpu: 350m<\/code><\/pre>\n<p>Anbefalingssystemet bestemmer, at din applikation kr\u00e6ver 300m CPU og 500Mi for at fungere korrekt. Du f\u00e5r f\u00f8lgende indstillinger:<\/p>\n<pre><code>ressourcer:\n   anmodninger:\n     hukommelse: 500Mi\n     cpu: 300m\n   gr\u00e6nser:\n     hukommelse: 1000Mi\n     cpu: 525m<\/code><\/pre>\n<p>Som n\u00e6vnt tidligere er dette en proportional skalering baseret p\u00e5 forholdet mellem anmodninger\/gr\u00e6nser i manifestet:<\/p>\n<ul>\n<li>\n<p>CPU: 200m \u2192 300m: forhold 1:1.75;<\/p>\n<\/li>\n<li>\n<p>Hukommelse: 250Mi \u2192 500Mi: forhold 1:2.<\/p>\n<\/li>\n<\/ul>\n<p>Hvad ang\u00e5r <strong>HPA<\/strong>, s\u00e5 her er arbejdsmetoden mere gennemsigtig. Der indstilles t\u00e6rskelv\u00e6rdier for metrikker, eksempelvis CPU og hukommelse, og hvis gennemsnittet af alle replikaer overstiger t\u00e6rsklen, skaleres applikationen op med +1 pod, indtil v\u00e6rdien falder under t\u00e6rsklen, eller indtil det maksimale antal replikaer er n\u00e5et.<\/p>\n<p><img decoding=\"async\" alt=\"Ni tips til at forbedre Kubernetes-ydeevnen\" src=\"\/wp-content\/uploads\/2020\/10\/f7a3fa28177d66be925867e38f5bbed6.png\" style=\"display:block;margin: 0 auto;\" \/>Billedet er hentet fra https:\/\/levelup.gitconnected.com\/kubernetes-autoscaling-101-cluster-autoscaler-horizontal-pod-autoscaler-and-vertical-pod-2a441d9ad231<\/p>\n<p>Ud over de almindelige metrikker som CPU og hukommelse kan du konfigurere t\u00e6rskler baseret p\u00e5 dine brugerdefinerede metrikker fra Prometheus og arbejde med dem, hvis du mener, det er den mest pr\u00e6cise m\u00e5de at bestemme, hvorn\u00e5r du skal skalere din applikation. N\u00e5r applikationen stabiliseres under den angivne metrikgr\u00e6nse, vil HPA begynde at skalere pods ned til det minimale antal replikaer eller til en tilstand, hvor belastningen opfylder den angivne t\u00e6rskel.<\/p>\n<h2>6. Glem ikke Node Affinity og Pod Affinity<\/h2>\n<p><img decoding=\"async\" alt=\"Ni tips til at forbedre Kubernetes-ydeevnen\" src=\"\/wp-content\/uploads\/2020\/10\/e718191d9e8ff25fd3b2d65cba9b3b73.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Ikke alle noder arbejder p\u00e5 ens udstyr, og ikke alle pods skal k\u00f8re applikationer, der kr\u00e6ver intensive beregninger. Kubernetes tillader specialisering af noder og pods ved hj\u00e6lp af <strong>Node Affinity<\/strong> og <strong>Pod Affinity<\/strong>.<\/p>\n<p>Hvis du har noder, der er velegnede til beregningstunge operationer, er det bedst at binde applikationer til de relevante noder for maksimal effektivitet. Brug <code>nodeSelector<\/code> med nodeskilt.<\/p>\n<p>Lad os sige, du har to noder: en med <code>CPUType=HIGHFREQ<\/code> og et stort antal hurtige kerner, den anden med <code>MemoryType=HIGHMEMORY<\/code> et stort antal hukommelse og h\u00f8jere ydeevne. Det er nemmest at tildele deployment af en pod til noden <code>HIGHFREQ<\/code>, ved at tilf\u00f8je denne v\u00e6lger i sektionen <code>spec<\/code> :<\/p>\n<pre><code>\u2026\nnodeSelector:\n\tCPUType: HIGHFREQ<\/code><\/pre>\n<p>En dyrere og mere specifik m\u00e5de at g\u00f8re dette p\u00e5 er at bruge <code>nodeAffinity<\/code> i feltet <code>affinity<\/code> i sektionen <code>spec<\/code>. Der er to muligheder:<\/p>\n<ul>\n<li>\n<p><code>requiredDuringSchedulingIgnoredDuringExecution<\/code>: h\u00e5rd indstilling (planl\u00e6gningssystemet vil kun deployere pods p\u00e5 specifikke noder (og ingen andre));<\/p>\n<\/li>\n<li>\n<p><code>preferredDuringSchedulingIgnoredDuringExecution<\/code>: bl\u00f8d konfiguration (planl\u00e6ggeren vil fors\u00f8ge at distribuere til specifikke noder, og hvis det ikke er muligt, vil det fors\u00f8ge at distribuere til den n\u00e6ste tilg\u00e6ngelige node).<\/p>\n<\/li>\n<\/ul>\n<p>Du kan angive en bestemt syntaks til kontrol af node-tags, for eksempel, <code>In<\/code>, <code>NotIn<\/code>, <code>Exists<\/code>, <code>DoesNotExist<\/code>, <code>Gt<\/code> eller <code>Lt<\/code>. Men husk, at komplekse metoder med lange lister af tags vil bremse beslutningsprocessen i kritiske situationer. Med andre ord, g\u00f8r ikke tingene mere komplicerede.<\/p>\n<p>Som n\u00e6vnt tidligere giver Kubernetes mulighed for at angive bindende af nuv\u00e6rende pods. Det vil sige, at du kan sikre, at bestemte pods arbejder sammen med andre pods i samme tilg\u00e6ngelighedszone (relevant for skyen) eller noder.<\/p>\n<p>I <code>podAffinity<\/code> felter <code>affinity<\/code> i sektionen <code>spec<\/code> de samme felter er tilg\u00e6ngelige som i tilf\u00e6lde af <code>nodeAffinity<\/code>: <code>requiredDuringSchedulingIgnoredDuringExecution<\/code><strong> <\/strong>og <code>preferredDuringSchedulingIgnoredDuringExecution<\/code>. Den eneste forskel er, at <code>matchExpressions<\/code> binder pods til den node, hvor der allerede k\u00f8rer en pod med det samme tag.<\/p>\n<p>Derudover tilbyder Kubernetes et felt <code>podAntiAffinity<\/code>, som derimod ikke binder en pod til en node med bestemte pods.<\/p>\n<p>N\u00e5r det kommer til udtryk, <code>nodeAffinity<\/code> kan man give den samme r\u00e5dgivning: fors\u00f8g at bevare enkelhed og logik i reglerne, og pr\u00f8v ikke at overbelaste specifikationen af pods med et komplekst regels\u00e6t. Det er meget let at skabe en regel, der ikke vil overholde betingelserne i klyngen, hvilket skaber un\u00f8dvendig belastning p\u00e5 planl\u00e6ggeren og reducerer den samlede ydeevne.<\/p>\n<h2>7. Taints &amp; Tolerations<\/h2>\n<p>Der er endnu en metode til at styre planl\u00e6ggeren. Hvis du har en stor klynge med hundrede noder og tusinder af mikrotjenester, er det meget sv\u00e6rt ikke at tillade bestemte pods at placeres p\u00e5 bestemte noder.<\/p>\n<p>Det hj\u00e6lper med mekanismen for taints \u2014 forbudte regler. For eksempel kan det i visse scenarier v\u00e6re n\u00f8dvendigt at forbyde bestemte noder at k\u00f8re pods. <code>For at anvende en taint til en specifik node skal du bruge muligheden<\/code> taint <code>i kubectl. Angiv n\u00f8gle og v\u00e6rdi, og derefter en taint s\u00e5som<\/code> eller <code>NoSchedule<\/code>:<\/p>\n<pre><code>NoExecute<\/code><\/pre>\n<p>$ kubectl taint nodes node10 node-role.kubernetes.io\/ingress=true:NoSchedule <code>i kubectl. Angiv n\u00f8gle og v\u00e6rdi, og derefter en taint s\u00e5som<\/code>, <code>NoSchedule<\/code> og <code>Det er ogs\u00e5 v\u00e6rd at bem\u00e6rke, at mekanismen for taint underst\u00f8tter tre grundl\u00e6ggende effekter:<\/code><strong>. <\/strong><\/p>\n<ul>\n<li>\n<p><code>i kubectl. Angiv n\u00f8gle og v\u00e6rdi, og derefter en taint s\u00e5som<\/code><strong> <\/strong>PreferNoSchedule <code>betyder, at s\u00e5 l\u00e6nge der ikke er en tilsvarende post i podspecifikationen<\/code>tolerations <code>, vil den ikke kunne distribueres p\u00e5 noden (i dette eksempel<\/code>).<\/p>\n<\/li>\n<li>\n<p><code>Det er ogs\u00e5 v\u00e6rd at bem\u00e6rke, at mekanismen for taint underst\u00f8tter tre grundl\u00e6ggende effekter: <\/code>node10 <code>i kubectl. Angiv n\u00f8gle og v\u00e6rdi, og derefter en taint s\u00e5som<\/code>\u2014 en forenklet version. <code>betyder, at s\u00e5 l\u00e6nge der ikke er en tilsvarende post i podspecifikationen<\/code> I dette tilf\u00e6lde vil planl\u00e6ggeren fors\u00f8ge at undg\u00e5 at distribuere pods, som ikke har den tilsvarende post, p\u00e5 noden, men det er ikke en streng begr\u00e6nsning. Hvis der ikke er ressourcer i klyngen, vil pods begynde at blive distribueret p\u00e5 denne node.<\/p>\n<\/li>\n<li>\n<p><code>NoSchedule<\/code><strong> <\/strong>\u2014 denne effekt udl\u00f8ser en \u00f8jeblikkelig evakuering af pods, som ikke har en tilsvarende optegnelse. <code>betyder, at s\u00e5 l\u00e6nge der ikke er en tilsvarende post i podspecifikationen<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>Det er interessant, at en s\u00e5dan adf\u00e6rd kan annulleres ved hj\u00e6lp af toleration-mekanismen. Dette er praktisk, n\u00e5r der er en \"forbudt\" node, og du kun vil placere infrastrukturtjenester p\u00e5 den. Hvordan g\u00f8r man det? Tillad kun de pods, der har en passende toleration.<\/p>\n<p>S\u00e5dan vil pod-specifikationen se ud:<\/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>Det betyder ikke, at ved n\u00e6ste redeployment vil pod'en n\u00f8dvendigvis lande p\u00e5 denne node, det er ikke en Node Affinity mekanisme, og <code>nodeSelector<\/code>. Men ved at kombinere flere funktioner kan du opn\u00e5 en meget fleksibel konfiguration af planl\u00e6ggeren.<\/p>\n<h2>8. Konfigurer prioritet for deployment af pods<\/h2>\n<p>Det, at du har konfigureret bindingen af pods til noder, betyder ikke, at alle pods skal behandles med samme prioritet. For eksempel kan du \u00f8nske at deploying nogle pods f\u00f8r andre.<\/p>\n<p>Kubernetes tilbyder forskellige m\u00e5der at justere prioriteringen af pods (Pod Priority and Preemption). Konfigurationen best\u00e5r af flere dele: objektet <code>PriorityClass<\/code><strong> <\/strong>og beskrivelsen af feltet <code>priorityClassName<\/code><strong> <\/strong>i pod-specifikationen. Lad os se p\u00e5 et eksempel:<\/p>\n<pre><code>apiVersion: scheduling.k8s.io\/v1\nkind: PriorityClass\nmetadata:\n  name: high-priority\nvalue: 99999\nglobalDefault: false\ndescription: \"Denne prioritet klasse b\u00f8r kun bruges til meget vigtige pods\"<\/code><\/pre>\n<p>Vi opretter <code>PriorityClass<\/code>, giver det et navn, en beskrivelse og en v\u00e6rdi.<strong> <\/strong>Jo h\u00f8jere <code>value<\/code>, jo h\u00f8jere prioritet. V\u00e6rdien kan v\u00e6re et hvilket som helst 32-bit heltal, mindre eller lig med 1.000.000.000. H\u00f8jere v\u00e6rdier er reserveret til kritisk vigtige system-pods, som normalt ikke kan blive fordrevet.<strong> <\/strong>Fordrivelse vil kun finde sted, hvis der ikke er nogen steder for en h\u00f8jt prioriteret pod at deployere, da en del af pods fra en bestemt node vil blive evakueret. Hvis denne mekanisme er for streng for dig, kan du tilf\u00f8je indstillingen <code>preemptionPolicy: Never<\/code>, og s\u00e5 vil der ikke v\u00e6re nogen fordrivelse, pod'en vil st\u00e5 f\u00f8rst i k\u00f8en og vente p\u00e5, at planl\u00e6ggeren finder frie ressourcer til den.<\/p>\n<p>Derefter opretter vi en pod, hvor vi angiver navnet <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>Du kan oprette s\u00e5 mange prioritetsklasser, du \u00f8nsker, men det anbefales at holde sig til et begr\u00e6nset antal (for eksempel lav, medium og h\u00f8j prioritet). <\/p>\n<p>P\u00e5 denne m\u00e5de kan du, hvis det er n\u00f8dvendigt, forbedre effektiviteten af udrulningen af kritiske tjenester s\u00e5som nginx-ingress-controller, coredns osv.<\/p>\n<h2>9. Optimer ETCD-klusteret<\/h2>\n<p><img decoding=\"async\" alt=\"Ni tips til at forbedre Kubernetes-ydeevnen\" src=\"\/wp-content\/uploads\/2020\/10\/f5917adfa943c789b6c784f43305851b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>ETCD kan betragtes som hjernen i hele klusteret. Det er meget vigtigt at holde denne database i god stand, da hastigheden af operationerne i \"Kube\" afh\u00e6nger af den. En standardl\u00f8sning, der samtidig er en god l\u00f8sning, er at holde ETCD-klusteret p\u00e5 master-noderne for at have minimal latens til kube-apiserver. Hvis det ikke er muligt, s\u00e5 plac\u00e9r ETCD s\u00e5 t\u00e6t som muligt med god b\u00e5ndbredde mellem deltagerne. V\u00e6r ogs\u00e5 opm\u00e6rksom p\u00e5, hvor mange noder fra ETCD der kan falde fra uden skade p\u00e5 klusteret.<\/p>\n<p><img decoding=\"async\" alt=\"Ni tips til at forbedre Kubernetes-ydeevnen\" src=\"\/wp-content\/uploads\/2020\/10\/cdd2c32eefed253c6ff774899c367ccc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Husk, at en overdreven stigning i antallet af deltagere i klusteret kan forbedre fejlfindingskapaciteten p\u00e5 bekostning af ydeevnen, alt skal v\u00e6re i balance.<\/p>\n<p>N\u00e5r det kommer til konfigurationen af tjenesten, er der ikke mange anbefalinger:<\/p>\n<ol>\n<li>\n<p>Hav godt udstyr, afh\u00e6ngigt af klusterets st\u00f8rrelse (du kan l\u00e6se mere <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/etcd-io\/etcd\/blob\/master\/Documentation\/op-guide\/hardware.md\">her<\/a><\/noindex>).<\/p>\n<\/li>\n<li>\n<p>Just\u00e9r nogle parametre, hvis du har spredt klusteret over et par datacentre, eller hvis dit netv\u00e6rk og dine diske lader meget tilbage at \u00f8nske (du kan l\u00e6se mere <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/etcd-io\/etcd\/blob\/master\/Documentation\/tuning.md\">her<\/a><\/noindex>).<\/p>\n<\/li>\n<\/ol>\n<h2>Konklusion<\/h2>\n<p>I denne artikel beskrives de punkter, som vores team pr\u00f8ver at overholde. Dette er ikke en trin-for-trin beskrivelse af handlinger, men forslag, der kan v\u00e6re nyttige til at optimere omkostningerne i klusteret. Det er klart, at hvert kluster er unikt, og konfigurationsl\u00f8sninger kan variere meget, s\u00e5 vi ville v\u00e6re interesserede i at h\u00f8re din feedback: hvordan holder du \u00f8je med dit Kubernetes-kluster, og hvordan forbedrer du dets ydeevne? Del din erfaring i kommentarfeltet, det vil v\u00e6re interessant at h\u00f8re. <\/p>\n<p>Kilde: <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\/da\/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=\"da_DK\" \/>\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\/da\/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\udd47Ni tips til at forbedre ydeevnen i Kubernetes | ProHoster","description":"Hej alle sammen!","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/97982","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=97982"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/97982\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/97983"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=97982"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=97982"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=97982"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}