{"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\/fr\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes","title":{"rendered":"Neuf conseils pour am\u00e9liorer la performance de Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Neuf conseils pour am\u00e9liorer la performance de Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/92dc510aa9d785a31d310816b18bf854.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Bonjour \u00e0 tous ! Je m'appelle Oleg Sidorenkov, je travaille chez DomClick en tant que responsable de l'\u00e9quipe infrastructure. Nous exploitons \u00ab Kubik \u00bb en production depuis plus de trois ans, et durant ce temps, nous avons v\u00e9cu de nombreux moments int\u00e9ressants avec lui. Aujourd'hui, je vais vous expliquer comment, en adoptant la bonne approche, vous pouvez tirer encore plus de performance de votre cluster Kubernetes \u00ab vanille \u00bb. Pr\u00eats, partez ! <\/p>\n<p>Vous savez tous tr\u00e8s bien que Kubernetes est un syst\u00e8me \u00e9volutif de code ouvert pour l'orchestration des conteneurs ; enfin, ou 5 binaires qui font de la magie en g\u00e9rant le cycle de vie de vos microservices dans un environnement serveur. De plus, c'est un outil assez flexible que l'on peut assembler comme un ensemble Lego pour une personnalisation maximale selon diff\u00e9rentes t\u00e2ches.<\/p>\n<p>Tout semble aller pour le mieux : mettez les serveurs dans le cluster comme du bois dans un four et ne vous inqui\u00e9tez pas. Mais si vous pensez \u00e0 l'\u00e9cologie, vous vous demanderez : \u00ab Comment puis-je entretenir le feu dans la chemin\u00e9e tout en pr\u00e9servant la for\u00eat ? \u00bb. Autrement dit, comment trouver des moyens d'am\u00e9liorer l'infrastructure tout en r\u00e9duisant les co\u00fbts.<\/p>\n<h2>1. Surveillez les ressources des \u00e9quipes et des applications<\/h2>\n<p><img decoding=\"async\" alt=\"Neuf conseils pour am\u00e9liorer la performance de Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/91e2e60b47ee985b024532c8b685230c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Une des m\u00e9thodes les plus banales mais efficaces est l'introduction de requests\/limits. S\u00e9parez les applications par namespaces, et les namespaces par \u00e9quipes de d\u00e9veloppement. Attribuez aux applications, avant d\u00e9ploiement, des valeurs de consommation en termes de temps CPU, m\u00e9moire, et stockage \u00e9ph\u00e9m\u00e8re.<\/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>Par exp\u00e9rience, nous avons constat\u00e9 qu'il ne faut pas gonfler les requests par rapport aux limits de plus du double. Le volume du cluster est calcul\u00e9 en fonction des requests, et si vous attribuez aux applications une diff\u00e9rence de ressources, par exemple, de 5 \u00e0 10 fois, imaginez ce qui arrivera \u00e0 votre n\u0153ud lorsqu'il sera rempli de pods et recevra soudain une charge. Rien de bon. Au minimum, du throttling, et au maximum, vous direz adieu \u00e0 votre worker et aurez une charge cyclique sur les autres n\u0153uds apr\u00e8s que les pods aient commenc\u00e9 \u00e0 migraient.<\/p>\n<p>De plus, \u00e0 l'aide de <code>limitranges<\/code> vous pouvez d\u00e9finir d\u00e8s le d\u00e9part des valeurs de ressources pour le conteneur \u2014 minimales, maximales et par d\u00e9faut :<\/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>N'oubliez pas de limiter les ressources du namespace pour qu'une \u00e9quipe ne puisse pas prendre toutes les ressources du cluster :<\/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>Comme on peut le voir dans la description <code>resourcequotas<\/code>, si l'\u00e9quipe ops souhaite d\u00e9ployer des pods qui utiliseront encore 10 CPU, l'ordonnanceur ne le permettra pas et renverra une erreur :<\/p>\n<pre><code>Error creating: pods \"nginx-proxy-9967d8d78-nh4fs\" is forbidden: exceeded quota: resource-quota, requested: limits.cpu=5,requests.cpu=5, used: limits.cpu=77250m,requests.cpu=53850m, limited: limits.cpu=10,requests.cpu=10<\/code><\/pre>\n<p>Pour r\u00e9soudre un tel probl\u00e8me, on peut \u00e9crire un outil, par exemple, comme <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pauljamm\/team-operator\">celui-ci<\/a><\/noindex>, capable de stocker et de commettre l'\u00e9tat des ressources des \u00e9quipes.<\/p>\n<h2>2. Choisissez un stockage de fichiers optimal<\/h2>\n<p><img decoding=\"async\" alt=\"Neuf conseils pour am\u00e9liorer la performance de Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/c7f8bdbf5490acc9061695a6d608015e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Ici, je voudrais aborder le sujet des volumes persistants et du syst\u00e8me de stockage des n\u0153uds de travail de Kubernetes. J'esp\u00e8re que personne n'utilise de \u00ab Cube \u00bb sur HDD en production, mais parfois un SSD standard devient d\u00e9j\u00e0 insuffisant. Nous avons \u00e9t\u00e9 confront\u00e9s au probl\u00e8me o\u00f9 les journaux saturent le disque par les op\u00e9rations d'entr\u00e9e-sortie, et les options de solution ne sont pas tr\u00e8s nombreuses : <\/p>\n<ul>\n<li>\n<p>Utiliser des SSD hautes performances ou passer \u00e0 NVMe (si vous g\u00e9rez vous-m\u00eame votre mat\u00e9riel).<\/p>\n<\/li>\n<li>\n<p>R\u00e9duire le niveau de journalisation.<\/p>\n<\/li>\n<li>\n<p>Effectuer un \u00e9quilibre \u00ab intelligent \u00bb des pods qui saturent le disque (<code>podAntiAffinity<\/code>).<\/p>\n<\/li>\n<\/ul>\n<p>L'\u00e9cran ci-dessus montre ce qui se passe avec le disque lors de l'utilisation du nginx-ingress-controller lorsque la journalisation access_logs est activ\u00e9e (~12 000 journaux\/sec.). Cet \u00e9tat peut \u00e9videmment mener \u00e0 une d\u00e9gradation de toutes les applications sur ce n\u0153ud.<\/p>\n<p>En ce qui concerne les PV, malheureusement, je n'ai pas test\u00e9 tous les <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/storage\/persistent-volumes\/#types-of-persistent-volumes\">types<\/a><\/noindex> Volumes persistants. Utilisez la meilleure option qui vous convient. Historiquement, une petite partie des services n\u00e9cessite des volumes RWX, et nous avons depuis longtemps utilis\u00e9 un stockage NFS pour cette t\u00e2che. C'est peu co\u00fbteux et\u2026 suffisant. Bien s\u00fbr, nous avons rencontr\u00e9 des probl\u00e8mes \u2014 heureusement, nous avons appris \u00e0 l'optimiser, et cela ne nous pose plus de soucis. Et si possible, passez \u00e0 un stockage d'objet S3.<\/p>\n<h2>3. Rassemblez des images optimis\u00e9es<\/h2>\n<p><img decoding=\"async\" alt=\"Neuf conseils pour am\u00e9liorer la performance de Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/c25ce405d1eb4c01f031e18b0bfa4836.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Il est pr\u00e9f\u00e9rable d'utiliser des images optimis\u00e9es pour les conteneurs, afin que Kubernetes puisse les r\u00e9cup\u00e9rer plus rapidement et les ex\u00e9cuter de mani\u00e8re plus efficace.&nbsp;<\/p>\n<p>L'optimisation signifie que les images :<\/p>\n<ul>\n<li>\n<p>contiennent une seule application ou effectuent une seule fonction ;<\/p>\n<\/li>\n<li>\n<p>sont de petite taille, car les grandes images sont plus mal transmises sur le r\u00e9seau ;<\/p>\n<\/li>\n<li>\n<p>ont des points de terminaison pour v\u00e9rifier l'\u00e9tat de sant\u00e9 et la disponibilit\u00e9, permettant \u00e0 Kubernetes d'agir en cas de pannes ;<\/p>\n<\/li>\n<li>\n<p>utilisent des syst\u00e8mes d'exploitation favorables aux conteneurs (comme Alpine ou CoreOS), qui sont plus r\u00e9silients aux erreurs de configuration ;<\/p>\n<\/li>\n<li>\n<p>utilisent des constructions multi-\u00e9tapes, afin que vous puissiez d\u00e9ployer uniquement des applications compil\u00e9es, et non des sources connexes.<\/p>\n<\/li>\n<\/ul>\n<p>Il existe de nombreux outils et services permettant de v\u00e9rifier et d'optimiser les images \u00e0 la vol\u00e9e. Il est important de toujours les maintenir \u00e0 jour et v\u00e9rifi\u00e9s en termes de s\u00e9curit\u00e9. En fin de compte, vous obtenez : <\/p>\n<ol>\n<li>\n<p>Une r\u00e9duction de la charge r\u00e9seau sur l'ensemble du cluster.<\/p>\n<\/li>\n<li>\n<p>Une diminution du temps de d\u00e9marrage du conteneur.<\/p>\n<\/li>\n<li>\n<p>Un volume r\u00e9duit de tout votre registre Docker.<\/p>\n<\/li>\n<\/ol>\n<h2>4. Utilisez le cache DNS<\/h2>\n<p><img decoding=\"async\" alt=\"Neuf conseils pour am\u00e9liorer la performance de Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/9f4384462a77dc528d7911c56f684f2d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>En ce qui concerne les charges \u00e9lev\u00e9es, il est assez difficile de vivre sans l'optimisation du syst\u00e8me DNS du cluster. Il y a longtemps, les d\u00e9veloppeurs de Kubernetes prenaient en charge leur solution kube-dns. Celle-ci a \u00e9t\u00e9 mise en \u0153uvre chez nous, mais ce logiciel n'a pas \u00e9t\u00e9 particuli\u00e8rement optimis\u00e9 et ne fournissait pas la performance requise, m\u00eame si la t\u00e2che semblait simple. Puis est arriv\u00e9 coredns, que nous avons adopt\u00e9 et qui nous a donn\u00e9 satisfaction ; il est devenu le service DNS par d\u00e9faut dans K8s. \u00c0 un moment donn\u00e9, nous avons atteint 40 000 rps sur le syst\u00e8me DNS, et cette solution est devenue insuffisante. Mais, par un heureux hasard, Nodelocaldns est sorti, \u00e9galement connu sous le nom de cache local de n\u0153ud, <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/tasks\/administer-cluster\/nodelocaldns\/\">NodeLocal DNSCache<\/a><\/noindex>.<\/p>\n<p>Pourquoi l'utilisons-nous ? Il existe un bug dans le noyau Linux qui, lors de multiples acc\u00e8s via conntrack NAT en UDP, entra\u00eene une condition de course pour l'\u00e9criture dans les tables conntrack, et une partie du trafic est perdue \u00e0 travers le NAT (chaque appel via le Service est un NAT). Nodelocaldns r\u00e9sout ce probl\u00e8me en \u00e9liminant le NAT et en am\u00e9liorant la connexion \u00e0 TCP vers les DNS en amont, ainsi qu'en mettant en cache localement les requ\u00eates DNS vers les sources en amont (y compris un court cache n\u00e9gatif de 5 secondes).<\/p>\n<h2>5. Scalez les pods horizontalement et verticalement de mani\u00e8re automatique<\/h2>\n<p><img decoding=\"async\" alt=\"Neuf conseils pour am\u00e9liorer la performance de Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/3804a14685a55160fa7d9f3226eab1fa.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Pouvez-vous affirmer avec confiance que tous vos microservices sont pr\u00eats pour une augmentation de charge de deux \u00e0 trois fois ? Comment allouer correctement les ressources \u00e0 vos applications ? Avoir quelques pods en plus de la charge de travail peut sembler redondant, et en garder juste assez vous expose au risque d'un arr\u00eat soudain en cas de pic de trafic sur le service. La voie du juste milieu est facilit\u00e9e par des services tels que <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/tasks\/run-application\/horizontal-pod-autoscale\/\">Horizontal Pod Autoscaler<\/a><\/noindex> et <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> permet d'augmenter automatiquement les requests\/limits de vos conteneurs dans le pod en fonction de l'utilisation r\u00e9elle. En quoi cela peut-il \u00eatre utile ? Si vous avez des pods qui ne peuvent pas \u00eatre mis \u00e0 l'\u00e9chelle horizontalement pour une raison quelconque (ce qui n'est pas tout \u00e0 fait fiable), vous pouvez essayer de confier l'ajustement de ses ressources au VPA. Son atout r\u00e9side dans un syst\u00e8me de recommandations bas\u00e9 sur des donn\u00e9es historiques et actuelles provenant du metric-server, donc, si vous ne souhaitez pas changer automatiquement les requests\/limits, vous pouvez simplement suivre les ressources recommand\u00e9es pour vos conteneurs et optimiser les param\u00e8tres pour \u00e9conomiser du CPU et de la m\u00e9moire dans le cluster. <\/p>\n<p><img decoding=\"async\" alt=\"Neuf conseils pour am\u00e9liorer la performance de Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/3965950aa3315faa4bb3e3ff5bd61955.png\" style=\"display:block;margin: 0 auto;\" \/>L'image est tir\u00e9e de https:\/\/levelup.gitconnected.com\/kubernetes-autoscaling-101-cluster-autoscaler-horizontal-pod-autoscaler-and-vertical-pod-2a441d9ad231<\/p>\n<p>Le planificateur dans Kubernetes est toujours bas\u00e9 sur les requests. Quelle que soit la valeur que vous y attribuez, le planificateur cherchera un n\u0153ud appropri\u00e9 en fonction de celle-ci. Les valeurs des limits sont n\u00e9cessaires au kubelet pour comprendre quand limiter ou tuer un pod. Et puisque le seul param\u00e8tre important est la valeur des requests, le VPA travaillera avec cela. Chaque fois que vous d\u00e9finissez le dimensionnement vertical d'une application, vous d\u00e9terminez quelles doivent \u00eatre les requests. Et qu'en est-il des limits ? Ce param\u00e8tre sera \u00e9galement redimensionn\u00e9 proportionnellement.<\/p>\n<p>Par exemple, voici les configurations normales d'un pod :<\/p>\n<pre><code>ressources:\n   demandes:\n     m\u00e9moire: 250Mi\n     cpu: 200m\n   limites:\n     m\u00e9moire: 500Mi\n     cpu: 350m<\/code><\/pre>\n<p>Le m\u00e9canisme de recommandation d\u00e9termine que votre application n\u00e9cessite 300m de CPU et 500Mi pour fonctionner normalement. Vous obtiendrez ces param\u00e8tres :<\/p>\n<pre><code>ressources:\n   demandes:\n     m\u00e9moire: 500Mi\n     cpu: 300m\n   limites:\n     m\u00e9moire: 1000Mi\n     cpu: 525m<\/code><\/pre>\n<p>Comme mentionn\u00e9 pr\u00e9c\u00e9demment, il s'agit d'une mise \u00e0 l'\u00e9chelle proportionnelle bas\u00e9e sur le ratio demandes\/limites dans le manifeste :<\/p>\n<ul>\n<li>\n<p>CPU: 200m \u2192 300m : ratio 1:1.75 ;<\/p>\n<\/li>\n<li>\n<p>M\u00e9moire: 250Mi \u2192 500Mi : ratio 1:2.<\/p>\n<\/li>\n<\/ul>\n<p>Concernant <strong>HPA<\/strong>, ici le m\u00e9canisme est plus transparent. Des seuils de m\u00e9triques sont d\u00e9finis, par exemple pour le CPU et la m\u00e9moire, et si la valeur moyenne de toutes les r\u00e9pliques d\u00e9passe le seuil, l'application est mise \u00e0 l'\u00e9chelle en ajoutant +1 pod jusqu'\u00e0 ce que la valeur redescende en dessous du seuil ou jusqu'\u00e0 atteindre le nombre maximal de r\u00e9pliques.<\/p>\n<p><img decoding=\"async\" alt=\"Neuf conseils pour am\u00e9liorer la performance de Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/f7a3fa28177d66be925867e38f5bbed6.png\" style=\"display:block;margin: 0 auto;\" \/>L'image est tir\u00e9e de https:\/\/levelup.gitconnected.com\/kubernetes-autoscaling-101-cluster-autoscaler-horizontal-pod-autoscaler-and-vertical-pod-2a441d9ad231<\/p>\n<p>En plus des m\u00e9triques habituelles, comme le CPU et la m\u00e9moire, vous pouvez configurer des seuils sur vos m\u00e9triques personnalis\u00e9es \u00e0 partir de Prometheus et travailler avec elles si vous pensez que cela d\u00e9finit le mieux quand il faut mettre \u00e0 l'\u00e9chelle votre application. Une fois l'application stabilis\u00e9e sous la limite de m\u00e9trique sp\u00e9cifi\u00e9e, le HPA commencera \u00e0 r\u00e9duire le nombre de pods jusqu'\u00e0 atteindre le minimum de r\u00e9pliques ou jusqu'\u00e0 ce que la charge soit satisfaisante par rapport au seuil donn\u00e9.<\/p>\n<h2>6. N'oubliez pas le Node Affinity et le Pod Affinity<\/h2>\n<p><img decoding=\"async\" alt=\"Neuf conseils pour am\u00e9liorer la performance de Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/e718191d9e8ff25fd3b2d65cba9b3b73.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Tous les n\u0153uds ne fonctionnent pas sur le m\u00eame mat\u00e9riel, et tous les pods n'ont pas besoin d'ex\u00e9cuter des applications gourmandes en calculs. Kubernetes permet de sp\u00e9cifier une sp\u00e9cialisation des n\u0153uds et des pods \u00e0 l'aide de <strong>Node Affinity<\/strong> et <strong>Pod Affinity<\/strong>.<\/p>\n<p>Si vous avez des n\u0153uds adapt\u00e9s aux op\u00e9rations gourmandes en calcul, il est pr\u00e9f\u00e9rable de lier les applications \u00e0 ces n\u0153uds correspondants pour une efficacit\u00e9 maximale. Pour cela, utilisez <code>nodeSelector<\/code> avec l'\u00e9tiquette du n\u0153ud.<\/p>\n<p>Supposons que vous ayez deux n\u0153uds : un avec <code>CPUType=HIGHFREQ<\/code> et un grand nombre de c\u0153urs rapides, l'autre avec <code>MemoryType=HIGHMEMORY<\/code> une grande quantit\u00e9 de m\u00e9moire et un d\u00e9bit plus rapide. Le plus simple est d'assigner le d\u00e9ploiement du pod au n\u0153ud <code>HIGHFREQ<\/code>, en ajoutant dans la section <code>spec<\/code> ce s\u00e9lecteur :<\/p>\n<pre><code>\u2026\nnodeSelector:\n\tCPUType: HIGHFREQ<\/code><\/pre>\n<p>Un moyen plus co\u00fbteux et sp\u00e9cifique de faire cela est d'utiliser <code>nodeAffinity<\/code> dans le champ <code>affinity<\/code> de la section <code>spec<\/code>. Il existe deux options :<\/p>\n<ul>\n<li>\n<p><code>requiredDuringSchedulingIgnoredDuringExecution<\/code>: configuration stricte (le planificateur ne d\u00e9ploiera des pods que sur des n\u0153uds sp\u00e9cifiques (et nulle part ailleurs));<\/p>\n<\/li>\n<li>\n<p><code>preferredDuringSchedulingIgnoredDuringExecution<\/code>: configuration flexible (le planificateur essaiera de d\u00e9ployer sur des n\u0153uds sp\u00e9cifiques, et s'il n'y parvient pas, il essaiera sur le prochain n\u0153ud disponible).<\/p>\n<\/li>\n<\/ul>\n<p>Vous pouvez sp\u00e9cifier une syntaxe de gestion des \u00e9tiquettes de n\u0153uds, par exemple, <code>Dans<\/code>, <code>PasDans<\/code>, <code>Existe<\/code>, <code>N'existePas<\/code>, <code>Gt<\/code> ou <code>Lt<\/code>. Cependant, gardez \u00e0 l'esprit que des m\u00e9thodes complexes dans de longues listes d'\u00e9tiquettes ralentiront la prise de d\u00e9cision dans des situations critiques. En d'autres termes, ne compliquez pas.<\/p>\n<p>Comme mentionn\u00e9 pr\u00e9c\u00e9demment, Kubernetes permet de d\u00e9finir la liaison des pods actuels. Cela signifie que vous pouvez faire en sorte que certains pods fonctionnent avec d'autres pods dans la m\u00eame zone de disponibilit\u00e9 (pertinent pour les clouds) ou n\u0153uds.<\/p>\n<p>Dans <code>podAffinity<\/code> champs <code>affinity<\/code> de la section <code>spec<\/code> les m\u00eames champs sont disponibles que dans le cas de <code>nodeAffinity<\/code>: <code>requiredDuringSchedulingIgnoredDuringExecution<\/code><strong> <\/strong>et <code>preferredDuringSchedulingIgnoredDuringExecution<\/code>. La seule diff\u00e9rence est que <code>matchExpressions<\/code> lier les pods \u00e0 un n\u0153ud sur lequel un pod avec cette \u00e9tiquette est d\u00e9j\u00e0 en cours d'ex\u00e9cution.<\/p>\n<p>De plus, Kubernetes propose le champ <code>podAntiAffinity<\/code>, qui, au contraire, ne lie pas un pod \u00e0 un n\u0153ud avec certains pods.<\/p>\n<p>Concernant les expressions <code>nodeAffinity<\/code> on peut donner le m\u00eame conseil : essayez de garder la simplicit\u00e9 et la logique des r\u00e8gles, ne tentez pas de surcharger la sp\u00e9cification des pods avec un ensemble complexe de r\u00e8gles. Il est tr\u00e8s facile de cr\u00e9er une r\u00e8gle qui ne correspondra pas aux conditions du cluster, cr\u00e9ant une charge suppl\u00e9mentaire sur le planificateur et r\u00e9duisant les performances globales.<\/p>\n<h2>7. Taints &amp; Tolerations<\/h2>\n<p>Il existe \u00e9galement un autre moyen de g\u00e9rer le planificateur. Si vous avez un grand cluster avec des centaines de n\u0153uds et des milliers de microservices, il est tr\u00e8s difficile de ne pas permettre \u00e0 certains pods de se d\u00e9ployer sur certains n\u0153uds.<\/p>\n<p>Le m\u00e9canisme des taints aide \u00e0 cela \u2014 r\u00e8gles prohibitives. Par exemple, dans certaines situations, il peut \u00eatre interdit \u00e0 certains n\u0153uds d'ex\u00e9cuter des pods. Pour appliquer un taint \u00e0 un n\u0153ud sp\u00e9cifique, vous devez utiliser l'option <code>taint<\/code> dans kubectl. Sp\u00e9cifiez la cl\u00e9 et la valeur, puis un taint comme <code>NoSchedule<\/code> ou <code>NoExecute<\/code>:<\/p>\n<pre><code>$ kubectl taint nodes node10 node-role.kubernetes.io\/ingress=true:NoSchedule<\/code><\/pre>\n<p>Il convient \u00e9galement de noter que le m\u00e9canisme de taint prend en charge trois effets principaux : <code>NoSchedule<\/code>, <code>NoExecute<\/code> et <code>PreferNoSchedule<\/code><strong>. <\/strong><\/p>\n<ul>\n<li>\n<p><code>NoSchedule<\/code><strong> <\/strong>signifie que tant qu'il n'y a pas d'enregistrement correspondant dans la sp\u00e9cification du pod <code>tolerations<\/code>, il ne pourra pas \u00eatre d\u00e9ploy\u00e9 sur le n\u0153ud (dans cet exemple <code>node10<\/code>).<\/p>\n<\/li>\n<li>\n<p><code>PreferNoSchedule <\/code>\u2014 une version simplifi\u00e9e <code>NoSchedule<\/code>. Dans ce cas, le planificateur tentera de ne pas r\u00e9partir les pods qui n'ont pas d'enregistrement correspondant <code>tolerations<\/code> sur le n\u0153ud, mais ce n'est pas une restriction stricte. Si le cluster ne dispose pas de ressources, les pods commenceront \u00e0 se d\u00e9ployer sur ce n\u0153ud.<\/p>\n<\/li>\n<li>\n<p><code>NoExecute<\/code><strong> <\/strong>\u2014 cet effet d\u00e9clenche une \u00e9vacuation imm\u00e9diate des pods qui n'ont pas d'enregistrement correspondant <code>tolerations<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>Il est int\u00e9ressant de noter que ce comportement peut \u00eatre annul\u00e9 \u00e0 l'aide du m\u00e9canisme des tolerations. Cela est pratique lorsqu'il existe un n\u0153ud \"interdit\" et que vous souhaitez y placer uniquement des services d'infrastructure. Comment faire ? Autorisez uniquement les pods pour lesquels il existe une toleration appropri\u00e9e.<\/p>\n<p>Voici \u00e0 quoi ressemblera la sp\u00e9cification du pod :<\/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>Cela ne signifie pas qu'au prochain redeploiement, le pod se retrouvera n\u00e9cessairement sur ce n\u0153ud, ce n'est pas un m\u00e9canisme d'affinit\u00e9 de n\u0153ud et <code>nodeSelector<\/code>. Mais en combinant plusieurs fonctionnalit\u00e9s, vous pouvez obtenir une configuration tr\u00e8s flexible de l'ordonnanceur.<\/p>\n<h2>8. Configurez la priorit\u00e9 de d\u00e9ploiement des pods<\/h2>\n<p>Le fait que vous ayez configur\u00e9 la liaison des pods aux n\u0153uds ne signifie pas que tous les pods doivent \u00eatre trait\u00e9s avec la m\u00eame priorit\u00e9. Par exemple, vous pouvez vouloir d\u00e9ployer certains pods avant les autres.<\/p>\n<p>Kubernetes propose diff\u00e9rentes mani\u00e8res de configurer la priorit\u00e9 des pods (Pod Priority and Preemption). La configuration se compose de plusieurs parties : l'objet <code>PriorityClass<\/code><strong> <\/strong>et la description du champ <code>priorityClassName<\/code><strong> <\/strong>dans la sp\u00e9cification du pod. Examinons un exemple :<\/p>\n<pre><code>apiVersion: scheduling.k8s.io\/v1\nkind: PriorityClass\nmetadata:\n  name: high-priority\nvalue: 99999\nglobalDefault: false\ndescription: \"Cette classe de priorit\u00e9 ne doit \u00eatre utilis\u00e9e que pour des pods tr\u00e8s importants\"<\/code><\/pre>\n<p>Nous cr\u00e9ons <code>PriorityClass<\/code>, lui attribuons un nom, une description et une valeur.<strong> <\/strong>Plus la <code>value<\/code>, plus la priorit\u00e9 est \u00e9lev\u00e9e. La valeur peut \u00eatre n'importe quel entier 32 bits, inf\u00e9rieur ou \u00e9gal \u00e0 1 000 000 000. Des valeurs plus \u00e9lev\u00e9es sont r\u00e9serv\u00e9es pour des pods syst\u00e8me critiques qui ne peuvent g\u00e9n\u00e9ralement pas \u00eatre \u00e9vacu\u00e9s.<strong> <\/strong>L'\u00e9vacuation n'aura lieu que si un pod de haute priorit\u00e9 n'a pas d'endroit o\u00f9 se d\u00e9ployer, alors une partie des pods d'un n\u0153ud particulier sera \u00e9vacu\u00e9e. Si ce m\u00e9canisme vous semble trop strict, vous pouvez ajouter l'option <code>preemptionPolicy: Never<\/code>, et alors il n'y aura pas d'\u00e9vacuation, le pod sera plac\u00e9 en t\u00eate de file et attendra que l'ordonnanceur trouve des ressources libres pour lui.<\/p>\n<p>Ensuite, nous cr\u00e9ons un pod dans lequel nous sp\u00e9cifions le nom <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>Vous pouvez cr\u00e9er autant de classes de priorit\u00e9 que vous le souhaitez, bien qu'il soit recommand\u00e9 de ne pas en abuser (par exemple, se limiter aux priorit\u00e9s basse, moyenne et haute). <\/p>\n<p>Ainsi, si n\u00e9cessaire, vous pourrez am\u00e9liorer l'efficacit\u00e9 du d\u00e9ploiement de services critiques, tels que nginx-ingress-controller, coredns, etc.<\/p>\n<h2>9. Optimisez le cluster ETCD<\/h2>\n<p><img decoding=\"async\" alt=\"Neuf conseils pour am\u00e9liorer la performance de Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/f5917adfa943c789b6c784f43305851b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>On peut consid\u00e9rer ETCD comme le cerveau de tout le cluster. Il est tr\u00e8s important de maintenir cette base de donn\u00e9es \u00e0 un niveau \u00e9lev\u00e9, car c'est de l\u00e0 que d\u00e9pend la vitesse des op\u00e9rations dans le \u00ab Cube \u00bb. Il est assez standard, et en m\u00eame temps pas mal, de garder le cluster ETCD sur les n\u0153uds ma\u00eetres afin d'avoir une latence minimale avec le kube-apiserver. Si cela n'est pas possible, placez ETCD aussi pr\u00e8s que possible, en ayant une bonne bande passante entre les participants. Faites \u00e9galement attention au nombre de n\u0153uds d'ETCD qui peuvent \u00eatre perdus sans nuire au cluster.<\/p>\n<p><img decoding=\"async\" alt=\"Neuf conseils pour am\u00e9liorer la performance de Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/cdd2c32eefed253c6ff774899c367ccc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Gardez \u00e0 l'esprit qu'une augmentation excessive du nombre de participants dans le cluster peut am\u00e9liorer la tol\u00e9rance aux pannes au d\u00e9triment de la performance, tout doit \u00eatre \u00e9quilibr\u00e9.<\/p>\n<p>En ce qui concerne la configuration du service, les recommandations sont rares :<\/p>\n<ol>\n<li>\n<p>Ayez un bon mat\u00e9riel, en fonction des dimensions du cluster (vous pouvez lire <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/etcd-io\/etcd\/blob\/master\/Documentation\/op-guide\/hardware.md\">ici<\/a><\/noindex>).<\/p>\n<\/li>\n<li>\n<p>Ajustez quelques param\u00e8tres si vous avez r\u00e9parti le cluster entre plusieurs centres de donn\u00e9es ou si votre r\u00e9seau et vos disques laissent \u00e0 d\u00e9sirer (vous pouvez lire <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/etcd-io\/etcd\/blob\/master\/Documentation\/tuning.md\">ici<\/a><\/noindex>).<\/p>\n<\/li>\n<\/ol>\n<h2>Conclusion<\/h2>\n<p>Cet article d\u00e9crit des points que notre \u00e9quipe s'efforce de respecter. Ce n'est pas un guide pas \u00e0 pas, mais des options qui peuvent \u00eatre utiles pour optimiser les co\u00fbts de fonctionnement du cluster. Il est \u00e9vident que chaque cluster est unique, et les solutions de configuration peuvent varier consid\u00e9rablement, c'est pourquoi il serait int\u00e9ressant d'avoir votre retour : comment surveillez-vous votre cluster Kubernetes, avec quoi am\u00e9liorez-vous son fonctionnement ? Partagez votre exp\u00e9rience dans les commentaires, nous serions ravis de la conna\u00eetre. <\/p>\n<p>Source : <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.2 - 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\/fr\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/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\udd47Neuf conseils pour am\u00e9liorer la performance de Kubernetes | ProHoster","description":"Bonjour \u00e0 tous !","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/97982","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=97982"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/97982\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/97983"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=97982"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=97982"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=97982"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}