{"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\/de\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes","title":{"rendered":"Neun Tipps zur Leistungssteigerung von Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Neun Tipps zur Leistungssteigerung von Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/92dc510aa9d785a31d310816b18bf854.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Hallo zusammen! Mein Name ist Oleg Sidorenkov, ich arbeite als Teamleiter der Infrastruktur bei der Firma DomClick. Wir betreiben den \u201eKubik\u201c seit \u00fcber drei Jahren in der Produktion, und in dieser Zeit haben wir viele verschiedene interessante Momente damit erlebt. Heute werde ich euch erz\u00e4hlen, wie man mit dem richtigen Ansatz noch mehr Leistung aus \u201evanilla\u201c Kubernetes f\u00fcr euren Cluster herausholen kann. Bereit, fertig, los! <\/p>\n<p>Ihr wisst alle, dass Kubernetes ein skalierbares Open-Source-System zur Orchestrierung von Containern ist; oder, nun ja, 5 Bin\u00e4rdateien, die Magie bewirken, indem sie den Lebenszyklus eurer Mikrodienste in einer Serverumgebung verwalten. Dar\u00fcber hinaus ist es ein ziemlich flexibles Werkzeug, das man wie ein Lego-Baukasten f\u00fcr maximale Anpassung an verschiedene Anforderungen zusammenstellen kann.<\/p>\n<p>Und es scheint alles gut zu sein: Werf die Server in den Cluster, wie Holzscheite in den Ofen, und sorge dir nicht um die Hitze. Aber wenn du um die Umwelt besorgt bist, wirst du dir Gedanken machen: \"Wie kann ich das Feuer im Ofen am Brennen halten und gleichzeitig den Wald schonen?\" Mit anderen Worten, wie kannst du Wege finden, die Infrastruktur zu verbessern und die Kosten zu senken.<\/p>\n<h2>1. Achte auf die Ressourcen der Teams und Anwendungen<\/h2>\n<p><img decoding=\"async\" alt=\"Neun Tipps zur Leistungssteigerung von Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/91e2e60b47ee985b024532c8b685230c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Eine der banalsten, aber effektivsten Methoden ist die Einf\u00fchrung von requests\/limits. Teile die Anwendungen nach Namespaces auf und die Namespaces nach Entwicklungsteams. Setze f\u00fcr die Anwendung vor der Bereitstellung Werte f\u00fcr den Verbrauch von CPU-Zeit, Speicher, ephemeral storage.<\/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>Durch Erfahrung sind wir zu dem Schluss gekommen: Man sollte die Requests nicht mehr als doppelt so hoch wie die Limits ansetzen. Das Volumen des Clusters wird auf Grundlage der Requests berechnet, und wenn du deinen Anwendungen einen Unterschied bei den Ressourcen von beispielsweise 5-10 mal gibst, stell dir vor, was mit deinem Node passiert, wenn sie sich mit Pods f\u00fcllt und pl\u00f6tzlich eine Last erh\u00e4lt. Nichts Gutes. Mindestens throttling, und im schlimmsten Fall verabschiedest du dich von dem Worker und erh\u00e4ltst eine zyklische Last auf den anderen Nodes, nachdem die Pods anfangen umzuziehen.<\/p>\n<p>Au\u00dferdem k\u00f6nnt ihr mit <code>limitranges<\/code> zu Beginn f\u00fcr den Container Werte f\u00fcr die Ressourcen festlegen \u2013 minimal, maximal und standardm\u00e4\u00dfig:<\/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>Vergessen Sie nicht, die Ressourcen des Namensraums zu begrenzen, damit ein Team nicht alle Ressourcen des Clusters f\u00fcr sich beanspruchen kann:<\/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>Wie aus der Beschreibung hervorgeht <code>resourcequotas<\/code>, wenn das Team ops Pods bereitstellen m\u00f6chte, die weitere 10 CPU verbrauchen, wird der Scheduler dies nicht zulassen und einen Fehler ausgeben:<\/p>\n<pre><code>Fehler beim Erstellen: Pods \"nginx-proxy-9967d8d78-nh4fs\" sind nicht erlaubt: Quota \u00fcberschritten: resource-quota, angefordert: limits.cpu=5, requests.cpu=5, genutzt: limits.cpu=77250m, requests.cpu=53850m, begrenzt: limits.cpu=10, requests.cpu=10<\/code><\/pre>\n<p>Um ein solches Problem zu l\u00f6sen, kann man ein Tool schreiben, wie <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pauljamm\/team-operator\">diesen<\/a><\/noindex>, das in der Lage ist, den Zustand der Ressourcen der Teams zu speichern und zu commiten.<\/p>\n<h2>2. W\u00e4hlen Sie den optimalen Speicherorte f\u00fcr Dateien aus<\/h2>\n<p><img decoding=\"async\" alt=\"Neun Tipps zur Leistungssteigerung von Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/c7f8bdbf5490acc9061695a6d608015e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Hier m\u00f6chte ich auf das Thema persistente Volumes und das Speichersystem der Worker-Knoten von Kubernetes eingehen. Ich hoffe, dass niemand \u201eCube\u201c auf HDD in der Produktion verwendet, aber manchmal reicht auch ein gew\u00f6hnliches SSD nicht mehr aus. Wir sind auf das Problem gesto\u00dfen, dass die Protokolle die Festplatte aufgrund von Ein-\/Ausgaben \u00fcberlasteten, und die L\u00f6sungsm\u00f6glichkeiten sind nicht sehr vielf\u00e4ltig: <\/p>\n<ul>\n<li>\n<p>Verwenden Sie Hochleistungs-SSDs oder wechseln Sie zu NVMe (wenn Sie selbst \u00fcber Ihre Hardware verf\u00fcgen).<\/p>\n<\/li>\n<li>\n<p>Verringern Sie das Protokollierungslevel.<\/p>\n<\/li>\n<li>\n<p>F\u00fchren Sie ein \"intelligentes\" Balancing der Pods durch, die die Festplatte stark beanspruchen (<code>podAntiAffinity<\/code>).<\/p>\n<\/li>\n<\/ul>\n<p>Der Screenshot oben zeigt, was mit der Festplatte unter nginx-ingress-controller passiert, wenn das Protokollieren von access_logs (~12.000 Protokolle\/Sek.) aktiviert ist. Solch ein Zustand kann nat\u00fcrlich zur Verschlechterung aller Anwendungen auf diesem Knoten f\u00fchren.<\/p>\n<p>Was die PV betrifft, so habe ich leider nicht alle <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/storage\/persistent-volumes\/#types-of-persistent-volumes\">Arten ausprobiert<\/a><\/noindex> Persistente Volumes. Nutzen Sie die beste Option, die genau zu Ihnen passt. Historisch gesehen ben\u00f6tigen nur einige wenige Dienste RWX-Volumes, und schon lange haben wir daf\u00fcr NFS-Speicher verwendet. Preiswert und\u2026 ausreichend. Nat\u00fcrlich hatten wir viele Probleme damit \u2013 das war nicht einfach, aber wir haben gelernt, es zu optimieren, und nun haben wir keinen Stress mehr. Und wo m\u00f6glich, sollten Sie auf Objekt-Speicher S3 umsteigen.<\/p>\n<h2>3. Optimierte Images erstellen<\/h2>\n<p><img decoding=\"async\" alt=\"Neun Tipps zur Leistungssteigerung von Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/c25ce405d1eb4c01f031e18b0bfa4836.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Es ist am besten, optimierte Images f\u00fcr Container zu verwenden, damit Kubernetes sie schneller abrufen und effizienter ausf\u00fchren kann.&nbsp;<\/p>\n<p>Optimiert bedeutet, dass die Images:<\/p>\n<ul>\n<li>\n<p>nur eine Anwendung enthalten oder nur eine Funktion ausf\u00fchren;<\/p>\n<\/li>\n<li>\n<p>klein sind, da gr\u00f6\u00dfere Images schlechter \u00fcber das Netzwerk \u00fcbertragen werden;<\/p>\n<\/li>\n<li>\n<p>\u00fcber Endpunkte zur \u00dcberpr\u00fcfung der Betriebsbereitschaft und Verf\u00fcgbarkeit verf\u00fcgen, mit denen Kubernetes Ma\u00dfnahmen bei Ausf\u00e4llen ergreifen kann;<\/p>\n<\/li>\n<li>\n<p>betriebssystemfreundlich f\u00fcr Container sind (wie Alpine oder CoreOS), die weniger anf\u00e4llig f\u00fcr Konfigurationsfehler sind;<\/p>\n<\/li>\n<li>\n<p>mehrstufige Builds verwenden, damit Sie nur die kompilierten Anwendungen und nicht die zugeh\u00f6rigen Quelltexte bereitstellen k\u00f6nnen.<\/p>\n<\/li>\n<\/ul>\n<p>Es gibt viele Tools und Dienstleistungen, die es erm\u00f6glichen, Images im laufenden Betrieb zu \u00fcberpr\u00fcfen und zu optimieren. Es ist wichtig, sie immer auf dem aktuellen Stand und sicher zu halten. Am Ende erzielen Sie: <\/p>\n<ol>\n<li>\n<p>Reduzierung der Netzwerkbelastung des gesamten Clusters.<\/p>\n<\/li>\n<li>\n<p>Verringerung der Startzeit des Containers.<\/p>\n<\/li>\n<li>\n<p>Kleineren Speicherbedarf f\u00fcr Ihr gesamtes Docker-Registry.<\/p>\n<\/li>\n<\/ol>\n<h2>4. Verwenden Sie den DNS-Cache<\/h2>\n<p><img decoding=\"async\" alt=\"Neun Tipps zur Leistungssteigerung von Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/9f4384462a77dc528d7911c56f684f2d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Wenn es um hohe Lasten geht, ist das Leben ohne Optimierung des DNS-Systems des Clusters ziemlich belastend. Vor langer Zeit unterst\u00fctzten die Entwickler von Kubernetes ihre L\u00f6sung kube-dns. Diese wurde auch bei uns implementiert, aber diese Software wurde nicht besonders optimiert und erzielte nicht die erforderliche Leistung, obwohl die Aufgabe scheinbar einfach war. Dann kam coredns, zu dem wir \u00fcbergegangen sind und keine Probleme hatten; es wurde schlie\u00dflich zum Standard-DNS-Dienst in K8s. Irgendwann erreichten wir 40.000 rps beim DNS-System, und auch dieses L\u00f6sung reichte nicht mehr aus. Aber aus gl\u00fccklichen Umst\u00e4nden kam Nodelocaldns heraus, auch bekannt als node local cache, auch bekannt als <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/tasks\/administer-cluster\/nodelocaldns\/\">NodeLocal DNSCache<\/a><\/noindex>.<\/p>\n<p>Warum verwenden wir das? Im Linux-Kernel gibt es einen Bug, der bei mehrfachen Anfragen \u00fcber conntrack NAT \u00fcber UDP zu einem Wettlauf um die Aufzeichnung in den conntrack-Tabellen f\u00fchrt, wodurch ein Teil des Traffics \u00fcber NAT verloren geht (jeder Zugang \u00fcber den Service ist NAT). Nodelocaldns l\u00f6st dieses Problem, indem es NAT vermeidet und die Verbindung auf TCP zu den Upstream-DNS-Servern aufr\u00fcstet, sowie ein lokales Caching von DNS-Anfragen an die Upstream-Server bereitstellt (einschlie\u00dflich eines kurzen negativen Caches von 5 Sekunden).<\/p>\n<h2>5. Skalieren Sie Pods automatisch horizontal und vertikal<\/h2>\n<p><img decoding=\"async\" alt=\"Neun Tipps zur Leistungssteigerung von Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/3804a14685a55160fa7d9f3226eab1fa.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>K\u00f6nnen Sie mit Zuversicht sagen, dass alle Ihre Mikrodienste f\u00fcr eine zwei- bis dreifache Erh\u00f6hung der Last bereit sind? Wie weisen Sie Ihren Anwendungen die richtigen Ressourcen zu? Ein paar Pods \u00fcber der Arbeitslast laufen zu lassen, kann \u00fcberfl\u00fcssig sein, und sie am Limit zu halten, birgt das Risiko, bei pl\u00f6tzlichem Anstieg des Traffics auf den Dienst Ausfallzeiten zu erfahren. Der goldene Mittelweg wird durch den Zauber der Multiplikation mit Diensten wie erreicht, die <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/tasks\/run-application\/horizontal-pod-autoscale\/\">Horizontal Pod Autoscaler<\/a><\/noindex> und <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> erm\u00f6glicht es, automatisch die Requests\/Limits Ihrer Container im Pod basierend auf der tats\u00e4chlichen Nutzung zu erh\u00f6hen. Wie kann das n\u00fctzlich sein? Wenn Sie Pods haben, die aus irgendeinem Grund nicht horizontal skaliert werden k\u00f6nnen (was nicht ganz zuverl\u00e4ssig ist), k\u00f6nnen Sie versuchen, die Anpassung ihrer Ressourcen dem VPA zu \u00fcberlassen. Sein Hauptmerkmal ist ein Empfehlungssystem auf der Grundlage historischer und aktueller Daten vom metric-server, daher k\u00f6nnen Sie, wenn Sie nicht m\u00f6chten, dass die Requests\/Limits automatisch ge\u00e4ndert werden, einfach die empfohlenen Ressourcen f\u00fcr Ihre Container beobachten und die Einstellungen zur Einsparung von CPU und Speicher im Cluster optimieren. <\/p>\n<p><img decoding=\"async\" alt=\"Neun Tipps zur Leistungssteigerung von Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/3965950aa3315faa4bb3e3ff5bd61955.png\" style=\"display:block;margin: 0 auto;\" \/>Das Bild wurde von https:\/\/levelup.gitconnected.com\/kubernetes-autoscaling-101-cluster-autoscaler-horizontal-pod-autoscaler-and-vertical-pod-2a441d9ad231 entnommen<\/p>\n<p>Der Scheduler in Kubernetes basiert immer auf Requests. Welchen Wert Sie auch verwenden, der Scheduler sucht einen geeigneten Knoten, basierend darauf. Die Limits-Werte ben\u00f6tigt der Kubelet, um zu wissen, wann er einen Pod drosseln oder killen soll. Und da der einzige wichtige Parameter der Request-Wert ist, wird der VPA damit arbeiten. Jedes Mal, wenn Sie vertikales Scaling f\u00fcr eine Anwendung festlegen, definieren Sie, wie die Requests beschaffen sein sollten. Und was passiert dann mit den Limits? Dieser Parameter wird ebenfalls proportional skaliert.<\/p>\n<p>Zum Beispiel, hier sind die typischen Einstellungen f\u00fcr einen Pod:<\/p>\n<pre><code>Ressourcen:\n   Anfragen:\n     Arbeitsspeicher: 250Mi\n     CPU: 200m\n   Limits:\n     Arbeitsspeicher: 500Mi\n     CPU: 350m<\/code><\/pre>\n<p>Der Empfehlungssystem bestimmt, dass Ihre Anwendung f\u00fcr einen normalen Betrieb 300m CPU und 500Mi ben\u00f6tigt. Sie erhalten folgende Einstellungen:<\/p>\n<pre><code>Ressourcen:\n   Anfragen:\n     Arbeitsspeicher: 500Mi\n     CPU: 300m\n   Limits:\n     Arbeitsspeicher: 1000Mi\n     CPU: 525m<\/code><\/pre>\n<p>Wie oben erw\u00e4hnt, handelt es sich um eine proportionale Skalierung basierend auf dem Verh\u00e4ltnis von Anfragen\/Limits im Manifest:<\/p>\n<ul>\n<li>\n<p>CPU: 200m \u2192 300m: Verh\u00e4ltnis 1:1.75;<\/p>\n<\/li>\n<li>\n<p>Arbeitsspeicher: 250Mi \u2192 500Mi: Verh\u00e4ltnis 1:2.<\/p>\n<\/li>\n<\/ul>\n<p>Was das betrifft <strong>HPA<\/strong>, hier ist der Mechanismus transparenter. Es werden Schwellenwerte f\u00fcr Metriken festgelegt, zum Beispiel f\u00fcr CPU und Arbeitsspeicher. Wenn der Durchschnittswert aller Replikate den Schwellenwert \u00fcberschreitet, wird die Anwendung um +1 Pod skaliert, bis der Wert unter dem Schwellenwert liegt oder die maximale Anzahl an Replikaten erreicht ist.<\/p>\n<p><img decoding=\"async\" alt=\"Neun Tipps zur Leistungssteigerung von Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/f7a3fa28177d66be925867e38f5bbed6.png\" style=\"display:block;margin: 0 auto;\" \/>Das Bild wurde von https:\/\/levelup.gitconnected.com\/kubernetes-autoscaling-101-cluster-autoscaler-horizontal-pod-autoscaler-and-vertical-pod-2a441d9ad231 entnommen<\/p>\n<p>Neben den \u00fcblichen Metriken wie CPU und Arbeitsspeicher k\u00f6nnen Sie Schwellenwerte f\u00fcr Ihre benutzerdefinierten Metriken aus Prometheus festlegen und mit ihnen arbeiten, wenn Sie dies als die genaueste Betrachtungsweise erachten, wann Ihre Anwendung skaliert werden sollte. Sobald die Anwendung sich unter den festgelegten Schwellenwert f\u00fcr die Metrik stabilisiert, beginnt die HPA, die Pods nach unten bis zur minimalen Anzahl an Replikaten oder bis zu dem Zustand zu skalieren, in dem die Last dem festgelegten Schwellenwert entspricht.<\/p>\n<h2>6. Vergessen Sie nicht die Node Affinity und Pod Affinity<\/h2>\n<p><img decoding=\"async\" alt=\"Neun Tipps zur Leistungssteigerung von Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/e718191d9e8ff25fd3b2d65cba9b3b73.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Nicht alle Knoten arbeiten mit derselben Hardware, nicht alle Pods m\u00fcssen rechenintensive Anwendungen ausf\u00fchren. Kubernetes erm\u00f6glicht es, Spezialisierungen f\u00fcr Knoten und Pods \u00fcber <strong>Node Affinity<\/strong> und <strong>Pod Affinity<\/strong>.<\/p>\n<p>Wenn Sie Knoten haben, die f\u00fcr rechenintensive Operationen geeignet sind, ist es besser, Anwendungen entsprechend diesen Knoten zuzuordnen, um maximale Effizienz zu erzielen. Verwenden Sie dazu <code>nodeSelector<\/code> mit dem Knotenlabel.<\/p>\n<p>Angenommen, Sie haben zwei Knoten: einen mit <code>CPUType=HIGHFREQ<\/code> und einer gro\u00dfen Anzahl schneller Kerne, und einen anderen mit <code>MemoryType=HIGHMEMORY<\/code> einer gro\u00dfen Menge Arbeitsspeicher und h\u00f6herer Leistung. Am einfachsten ist es, das Deployment des Pods dem Knoten <code>HIGHFREQ<\/code>, indem Sie in den Abschnitt <code>spec<\/code> diesen Selector hinzuf\u00fcgen:<\/p>\n<pre><code>\u2026\nnodeSelector:\n\tCPUType: HIGHFREQ<\/code><\/pre>\n<p>Ein kostspieligerer und spezifischer Ansatz, dies zu tun, ist die Verwendung von <code>nodeAffinity<\/code> im Feld <code>Affinity<\/code> im Abschnitt. <code>spec<\/code>Es gibt zwei Optionen:<\/p>\n<ul>\n<li>\n<p><code>requiredDuringSchedulingIgnoredDuringExecution<\/code>: harte Einschr\u00e4nkung (der Scheduler wird Pods nur auf bestimmten Knoten bereitstellen (und nirgendwo anders));<\/p>\n<\/li>\n<li>\n<p><code>preferredDuringSchedulingIgnoredDuringExecution<\/code>: weiche Konfiguration (der Scheduler wird versuchen, auf bestimmten Knoten bereitzustellen, und wenn das nicht funktioniert, wird er versuchen, auf dem n\u00e4chsten verf\u00fcgbaren Knoten bereitzustellen).<\/p>\n<\/li>\n<\/ul>\n<p>Sie k\u00f6nnen eine bestimmte Syntax zur Steuerung der Knotentags festlegen, zum Beispiel <code>In<\/code>, <code>NotIn<\/code>, <code>Exists<\/code>, <code>DoesNotExist<\/code>, <code>Gt<\/code> oder <code>Lt<\/code>. Denken Sie jedoch daran, dass komplexe Methoden in langen Listen von Tags die Entscheidungsfindung in kritischen Situationen verlangsamen. Mit anderen Worten, machen Sie es nicht komplizierter.<\/p>\n<p>Wie oben erw\u00e4hnt, erlaubt Kubernetes die Bindung aktueller Pods. Das hei\u00dft, Sie k\u00f6nnen bestimmte Pods so konfigurieren, dass sie zusammen mit anderen Pods in derselben Verf\u00fcgbarkeitszone (f\u00fcr Clouds relevant) oder auf Knoten arbeiten.<\/p>\n<p>Im <code>podAffinity<\/code> Felder <code>Affinity<\/code> im Abschnitt. <code>spec<\/code> stehen die gleichen Felder zur Verf\u00fcgung wie bei <code>nodeAffinity<\/code>: <code>requiredDuringSchedulingIgnoredDuringExecution<\/code><strong> <\/strong>und <code>preferredDuringSchedulingIgnoredDuringExecution<\/code>. Der einzige Unterschied besteht darin, dass <code>matchExpressions<\/code> Pods an den Knoten bindet, auf dem bereits ein Pod mit diesem Tag ausgef\u00fchrt wird.<\/p>\n<p>Au\u00dferdem bietet Kubernetes das Feld <code>podAntiAffinity<\/code>, das im Gegensatz dazu keinen Pod an einen Knoten mit bestimmten Pods bindet.<\/p>\n<p>Was die Ausdr\u00fccke betrifft, <code>nodeAffinity<\/code> kann der gleiche Rat gegeben werden: Bem\u00fchen Sie sich um Einfachheit und Klarheit der Regeln, und versuchen Sie nicht, die Podspezifikation mit komplexen Regelwerken zu \u00fcberladen. Es ist sehr einfach, eine Regel zu erstellen, die den Clusterbedingungen nicht entspricht, was zus\u00e4tzliche Last auf den Scheduler erzeugt und die Gesamtleistung verringert.<\/p>\n<h2>7. Taints &amp; Tolerations<\/h2>\n<p>Es gibt noch eine weitere Methode zur Steuerung des Schedulers. Wenn Sie einen gro\u00dfen Cluster mit Hunderten von Knoten und Tausenden von Mikrodiensten haben, ist es sehr schwierig, bestimmten Pods die Bereitstellung auf bestimmten Knoten zu verwehren.<\/p>\n<p>Hierbei hilft der Mechanismus der Taints \u2013 verbotene Regeln. Zum Beispiel kann man in bestimmten Szenarien bestimmten Knoten verbieten, Pods bei sich zu starten. Um einen Taint auf einen bestimmten Knoten anzuwenden, muss die Option <code>taint<\/code> in kubectl verwendet werden. Geben Sie den Schl\u00fcssel und den Wert an und dann einen Taint wie <code>NoSchedule<\/code> oder <code>NoExecute<\/code>:<\/p>\n<pre><code>$ kubectl taint nodes node10 node-role.kubernetes.io\/ingress=true:NoSchedule<\/code><\/pre>\n<p>Es ist auch erw\u00e4hnenswert, dass der Mechanismus f\u00fcr Taints drei Hauptwirkungen unterst\u00fctzt: <code>NoSchedule<\/code>, <code>NoExecute<\/code> und <code>PreferNoSchedule<\/code><strong>. <\/strong><\/p>\n<ul>\n<li>\n<p><code>NoSchedule<\/code><strong> <\/strong>bedeutet, dass solange in der Podspezifikation kein entsprechender Eintrag vorhanden ist <code>tolerations<\/code>, wird er nicht auf dem Knoten bereitgestellt (in diesem Beispiel <code>node10<\/code>).<\/p>\n<\/li>\n<li>\n<p><code>PreferNoSchedule <\/code>\u2014 eine vereinfachte Version <code>NoSchedule<\/code>. In diesem Fall wird der Scheduler versuchen, Pods, die keinen entsprechenden Eintrag haben, nicht auf den Knoten zu verteilen, aber das ist keine strikte Einschr\u00e4nkung. Wenn im Cluster keine Ressourcen vorhanden sind, beginnen die Pods, auf diesem Knoten bereitgestellt zu werden. <code>tolerations<\/code> auf den Knoten, aber das ist keine strikte Einschr\u00e4nkung. Wenn im Cluster nicht gen\u00fcgend Ressourcen vorhanden sind, beginnen die Pods, sich auf diesem Knoten zu messen.<\/p>\n<\/li>\n<li>\n<p><code>NoExecute<\/code><strong> <\/strong>\u2014 dieser Effekt l\u00f6st eine sofortige Evakuierung von Pods aus, f\u00fcr die kein entsprechender Eintrag vorhanden ist <code>tolerations<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>Interessanterweise l\u00e4sst sich dieses Verhalten durch ein Toleranzmechanismus r\u00fcckg\u00e4ngig machen. Dies ist praktisch, wenn es einen \"verbotenen\" Knoten gibt und Sie nur Infrastruktur-Services darauf platzieren m\u00f6chten. Wie macht man das? Erlauben Sie nur die Pods, f\u00fcr die eine entsprechende Toleranz vorhanden ist.<\/p>\n<p>So k\u00f6nnte die Pod-Spezifikation aussehen:<\/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>Das bedeutet nicht, dass der Pod beim n\u00e4chsten Redeployment genau auf diesem Knoten landet, das ist kein Node Affinity Mechanismus und <code>nodeSelector<\/code>. Aber durch die Kombination mehrerer Funktionen k\u00f6nnen Sie eine sehr flexible Planer-Konfiguration erreichen.<\/p>\n<h2>8. Konfigurieren Sie die Bereitstellungspriorit\u00e4t von Pods<\/h2>\n<p>Dass Sie die Bindung von Pods an Knoten konfiguriert haben, bedeutet nicht, dass alle Pods mit derselben Priorit\u00e4t behandelt werden m\u00fcssen. Beispielsweise m\u00f6chten Sie m\u00f6glicherweise bestimmte Pods fr\u00fcher als andere bereitstellen.<\/p>\n<p>Kubernetes bietet verschiedene M\u00f6glichkeiten zur Konfiguration der Priorit\u00e4t von Pods (Pod Priority und Preemption). Die Konfiguration besteht aus mehreren Teilen: dem Objekt <code>PriorityClass<\/code><strong> <\/strong>und der Beschreibung des Feldes <code>priorityClassName<\/code><strong> <\/strong>in der Pod-Spezifikation. Sehen wir uns ein Beispiel an:<\/p>\n<pre><code>apiVersion: scheduling.k8s.io\\\/v1\nkind: PriorityClass\nmetadata:\n  name: high-priority\nvalue: 99999\nglobalDefault: false\ndescription: \"Diese Priorit\u00e4tsklasse sollte nur f\u00fcr sehr wichtige Pods verwendet werden\"<\/code><\/pre>\n<p>Wir erstellen <code>PriorityClass<\/code>, geben ihm einen Namen, eine Beschreibung und einen Wert.<strong> <\/strong>Je h\u00f6her <code>value<\/code>, desto h\u00f6her die Priorit\u00e4t. Der Wert kann jede 32-Bit-Ganzzahl sein, die kleiner oder gleich 1.000.000.000 ist. H\u00f6here Werte sind f\u00fcr systemkritische Pods reserviert, die in der Regel nicht verdr\u00e4ngt werden k\u00f6nnen.<strong> <\/strong>Die Verdr\u00e4ngung erfolgt nur, wenn der hochpriorisierte Pod keinen Platz zum Bereitstellen hat; dann werden einige Pods von einem bestimmten Knoten evakuiert. Wenn Ihnen dieser Mechanismus zu streng ist, k\u00f6nnen Sie die Option <code>preemptionPolicy: Never<\/code>, hinzuf\u00fcgen, und dann wird es keine Verdr\u00e4ngung geben, der Pod wird an erster Stelle in der Warteschlange stehen und warten, bis der Scheduler freie Ressourcen f\u00fcr ihn findet.<\/p>\n<p>Dann erstellen wir einen Pod, in dem wir den Namen angeben <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>Es k\u00f6nnen beliebig viele Priorit\u00e4tsklassen erstellt werden, obwohl empfohlen wird, sich daf\u00fcr nicht zu sehr zu begeistern (zum Beispiel auf niedrig, mittel und hoch zu beschr\u00e4nken). <\/p>\n<p>So k\u00f6nnen Sie im Bedarfsfall die Effizienz der Bereitstellung kritischer Dienste wie nginx-ingress-controller, coredns usw. steigern.<\/p>\n<h2>9. Optimieren Sie den ETCD-Cluster<\/h2>\n<p><img decoding=\"async\" alt=\"Neun Tipps zur Leistungssteigerung von Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/f5917adfa943c789b6c784f43305851b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>ETCD kann als das Gehirn des gesamten Clusters bezeichnet werden. Es ist sehr wichtig, dass diese Datenbank auf hohem Niveau funktioniert, da die Geschwindigkeit der Operationen im 'Kube' von ihr abh\u00e4ngt. Eine durchaus g\u00e4ngige und gleichzeitig gute L\u00f6sung ist es, den ETCD-Cluster auf Master-Nodes zu halten, um eine minimale Verz\u00f6gerung zum kube-apiserver zu haben. Wenn das nicht m\u00f6glich ist, sollten Sie ETCD so nah wie m\u00f6glich platzieren, wobei eine gute Bandbreite zwischen den Teilnehmern gew\u00e4hrleistet sein sollte. Achten Sie auch darauf, wie viele Nodes aus ETCD ausfallen k\u00f6nnen, ohne dem Cluster zu schaden.<\/p>\n<p><img decoding=\"async\" alt=\"Neun Tipps zur Leistungssteigerung von Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/cdd2c32eefed253c6ff774899c367ccc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Bedenken Sie, dass eine \u00fcberm\u00e4\u00dfige Anzahl von Teilnehmern im Cluster die Ausfallsicherheit auf Kosten der Leistung erh\u00f6hen kann, alles sollte in Ma\u00dfen geschehen.<\/p>\n<p>Wenn es um die Konfiguration des Dienstes geht, sind die Empfehlungen sp\u00e4rlich:<\/p>\n<ol>\n<li>\n<p>Haben Sie gute Hardware, abh\u00e4ngig von der Gr\u00f6\u00dfe des Clusters (Sie k\u00f6nnen lesen <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/etcd-io\/etcd\/blob\/master\/Documentation\/op-guide\/hardware.md\">hier<\/a><\/noindex>).<\/p>\n<\/li>\n<li>\n<p>Passen Sie einige Parameter an, wenn Sie den Cluster \u00fcber mehrere Rechenzentren verteilt haben oder Ihr Netzwerk und die Festplatten verbesserungsw\u00fcrdig sind (Sie k\u00f6nnen lesen <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/etcd-io\/etcd\/blob\/master\/Documentation\/tuning.md\">hier<\/a><\/noindex>).<\/p>\n<\/li>\n<\/ol>\n<h2>Fazit<\/h2>\n<p>In diesem Artikel werden Punkte beschrieben, die unser Team zu befolgen versucht. Dies ist kein schrittweiser Aktionsplan, sondern Optionen, die zur Optimierung der Betriebskosten des Clusters n\u00fctzlich sein k\u00f6nnen. Klar ist, dass jeder Cluster einzigartig ist und die Anpassungsl\u00f6sungen stark variieren k\u00f6nnen. Daher w\u00e4re es interessant, Ihr Feedback zu erhalten: Wie \u00fcberwachen Sie Ihren Kubernetes-Cluster, mit welchen Mitteln optimieren Sie seine Leistung? Teilen Sie Ihre Erfahrungen in den Kommentaren, es wird interessant sein, diese zu erfahren. <\/p>\n<p>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/domclick\/blog\/520968\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041e\u043b\u0435\u0433 \u0421\u0438\u0434\u043e\u0440\u0435\u043d\u043a\u043e\u0432, \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0414\u043e\u043c\u041a\u043b\u0438\u043a \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u041c\u044b \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0438\u0440\u0443\u0435\u043c \u00ab\u041a\u0443\u0431\u0438\u043a\u00bb \u0432 \u043f\u0440\u043e\u0434\u0435 \u0443\u0436\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0442\u0440\u0451\u0445 \u043b\u0435\u0442, \u0438 \u0437\u0430 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u0436\u0438\u043b\u0438 \u0441 \u043d\u0438\u043c \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u043f\u043e\u0432\u0435\u0434\u0430\u044e \u0432\u0430\u043c, \u043a\u0430\u043a \u043f\u0440\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0436\u0430\u0442\u044c \u0438\u0437 \u00ab\u0432\u0430\u043d\u0438\u043b\u044c\u043d\u043e\u0433\u043e\u00bb Kubernetes \u0435\u0449\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. Ready steady [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":97983,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-97982","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442!\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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\/de\/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\udd47Neun Tipps zur Leistungssteigerung von Kubernetes | ProHoster","description":"Hallo zusammen!","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/97982","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=97982"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/97982\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/97983"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=97982"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=97982"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=97982"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}