{"id":91199,"date":"2020-08-10T01:42:03","date_gmt":"2020-08-09T23:42:03","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/kubernetes-v-domklik-kak-spat-spokojno-upravlyaya-klasterom-na-1000-mikroservisov"},"modified":"2020-08-10T01:42:03","modified_gmt":"2020-08-09T23:42:03","slug":"kubernetes-v-domklik-kak-spat-spokojno-upravlyaya-klasterom-na-1000-mikroservisov","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/kubernetes-v-domklik-kak-spat-spokojno-upravlyaya-klasterom-na-1000-mikroservisov","title":{"rendered":"Kubernetes chez DomKlik : comment dormir tranquillement en g\u00e9rant un cluster de 1000 microservices","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Je m'appelle Viktor Yagofarov et je d\u00e9veloppe une plateforme Kubernetes chez DomKlik en tant que responsable technique de d\u00e9veloppement dans l'\u00e9quipe Ops (exploitation). Je voudrais vous parler de l'organisation de nos processus Dev  Ops, des particularit\u00e9s de l'exploitation de l'un des plus grands clusters k8s en Russie, ainsi que des pratiques DevOps\/SRE que notre \u00e9quipe applique.<\/p>\n<p><img decoding=\"async\" alt=\"Kubernetes chez DomKlik : comment dormir tranquillement en g\u00e9rant un cluster de 1000 microservices\" src=\"\/wp-content\/uploads\/2020\/08\/6c908104c734b36cc7a960fbe4d65e3f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h4>\u00c9quipe Ops<\/h4>\n<p>\nL'\u00e9quipe Ops compte actuellement 15 personnes. Trois d'entre elles s'occupent du bureau, deux travaillent dans un autre fuseau horaire et sont disponibles, y compris la nuit. Ainsi, il y a toujours quelqu'un de l'\u00e9quipe Ops derri\u00e8re un \u00e9cran, pr\u00eat \u00e0 r\u00e9agir \u00e0 tout incident, quelle que soit sa complexit\u00e9. Nous n'avons pas de nuits de garde, ce qui pr\u00e9serve notre sant\u00e9 mentale et permet \u00e0 chacun de bien dormir et de passer du temps libre en dehors des ordinateurs.<\/p>\n<p><img decoding=\"async\" alt=\"Kubernetes chez DomKlik : comment dormir tranquillement en g\u00e9rant un cluster de 1000 microservices\" src=\"\/wp-content\/uploads\/2020\/08\/47051db273f116df376e64bad67c6f37.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLes comp\u00e9tences varient d'une personne \u00e0 l'autre : administrateurs r\u00e9seau, DBA, sp\u00e9cialistes de la pile ELK, administrateurs\/d\u00e9veloppeurs Kubernetes, experts en surveillance, virtualisation, mat\u00e9riel, etc. Ce qui nous unit, c'est que chacun peut remplacer, dans une certaine mesure, n'importe lequel d'entre nous : par exemple, ajouter de nouveaux n\u0153uds au cluster k8s, mettre \u00e0 jour PostgreSQL, \u00e9crire un pipeline CI\/CD + Ansible, automatiser des t\u00e2ches en Python\/Bash\/Go, connecter du mat\u00e9riel dans un datacenter. Avoir de solides comp\u00e9tences dans un domaine n'emp\u00eache pas de changer de direction et de se perfectionner dans un autre domaine. Par exemple, j'ai rejoint l'entreprise en tant que sp\u00e9cialiste de PostgreSQL, et maintenant ma principale zone de responsabilit\u00e9 est les clusters Kubernetes. Au sein de l'\u00e9quipe, toute progression est encourag\u00e9e et il existe un fort sentiment de camaraderie.<\/p>\n<p>En fait, nous sommes en train de recruter. Les exigences pour les candidats sont assez standard. Pour moi personnellement, il est important que la personne s'int\u00e8gre dans l'\u00e9quipe, qu'elle soit non conflictuelle, mais qu'elle puisse aussi d\u00e9fendre son point de vue, qu'elle ait l'envie de se d\u00e9velopper et qu'elle n'ait pas peur de faire quelque chose de nouveau, en proposant ses id\u00e9es. De plus, des comp\u00e9tences en programmation sur des langages de script, une connaissance des bases de Linux et de l'anglais sont indispensables. L'anglais est n\u00e9cessaire simplement pour que la personne puisse rapidement rechercher une solution \u00e0 un probl\u00e8me en cas de p\u00e9pin, en 10 secondes plut\u00f4t qu'en 10 minutes. Il est actuellement tr\u00e8s difficile de trouver des sp\u00e9cialistes ayant une connaissance approfondie de Linux : c'est dr\u00f4le, mais deux candidats sur trois ne peuvent pas r\u00e9pondre \u00e0 la question \u00ab Qu'est-ce que la charge moyenne ? De quoi est-elle compos\u00e9e ? \u00bb, et ils consid\u00e8rent la question \u00ab Comment collecter un core dump d'un programme en C \u00bb comme quelque chose qui appartient \u00e0 un autre monde\u2026 ou \u00e0 celui des dinosaures. Nous devons composer avec cela, car g\u00e9n\u00e9ralement, les gens ont des comp\u00e9tences tr\u00e8s d\u00e9velopp\u00e9es dans d'autres domaines, et nous allons former sur Linux. La r\u00e9ponse \u00e0 la question \u00ab Pourquoi est-il n\u00e9cessaire de tout savoir pour un ing\u00e9nieur DevOps dans le monde moderne du cloud \u00bb devra \u00eatre laiss\u00e9e en dehors de cet article, mais en trois mots : tout cela est n\u00e9cessaire.<\/p>\n<h4>\u00c9quipe Outils<\/h4>\n<p>\nL'\u00e9quipe Outils joue un r\u00f4le non n\u00e9gligeable dans l'automatisation. Leur principal objectif est de cr\u00e9er des outils graphiques et CLI pratiques pour les d\u00e9veloppeurs. Par exemple, notre d\u00e9veloppement interne Confer permet de d\u00e9ployer une application dans Kubernetes en seulement quelques clics, de configurer ses ressources, cl\u00e9s de vault, etc. Auparavant, nous utilisions Jenkins + Helm 2, mais nous avons d\u00fb d\u00e9velopper notre propre outil pour \u00e9liminer le copier-coller et introduire l'uniformit\u00e9 dans le cycle de vie des logiciels.<\/p>\n<p>L'\u00e9quipe Ops n'\u00e9crit pas de pipelines pour les d\u00e9veloppeurs, mais peut les conseiller sur toutes les questions concernant leur r\u00e9daction (certaines personnes utilisent encore Helm 3).<\/p>\n<h4>DevOps<\/h4>\n<p>\nEn ce qui concerne DevOps, nous le voyons comme suit :<\/p>\n<p>Les \u00e9quipes Dev \u00e9crivent du code, le d\u00e9ploient via Confer dans dev -&gt; qa\/stage -&gt; prod. La responsabilit\u00e9 de s'assurer que le code ne ralentit pas et ne g\u00e9n\u00e8re pas d'erreurs repose sur les \u00e9quipes Dev et Ops. Pendant la journ\u00e9e, la r\u00e9action \u00e0 un incident avec son application doit \u00eatre assur\u00e9e en premi\u00e8re instance par le r\u00e9f\u00e9rent de l'\u00e9quipe Ops, tandis que le soir et la nuit, l'admin de garde (Ops) doit r\u00e9veiller le d\u00e9veloppeur de garde s'il est certain que le probl\u00e8me n'est pas dans l'infrastructure. Toutes les m\u00e9triques et alertes dans la surveillance apparaissent automatiquement ou semi-automatiquement.<\/p>\n<p>La zone de responsabilit\u00e9 des Ops commence au moment du d\u00e9ploiement de l'application en production, mais la responsabilit\u00e9 des Devs ne s'arr\u00eate pas l\u00e0 - nous faisons un travail commun et sommes dans le m\u00eame bateau.<\/p>\n<p>Les d\u00e9veloppeurs conseillent les administrateurs si de l'aide est n\u00e9cessaire pour \u00e9crire un microservice admin (par exemple, backend Go + HTML5), et les administrateurs conseillent les d\u00e9veloppeurs sur toute question d'infrastructure ou li\u00e9e \u00e0 k8s.<\/p>\n<p>Au fait, nous n'avons pas de monolithe, seulement des microservices. Leur nombre oscille actuellement entre 900 et 1000 dans notre cluster k8s en production, si l'on mesure par le volume. <i>d\u00e9ploiements<\/i>Le nombre de pods varie entre 1700 et 2000. Il y a actuellement environ 2000 pods dans le cluster de production.<\/p>\n<p>Je ne peux pas donner de chiffres pr\u00e9cis, car nous surveillons les microservices inutiles et les supprimons de mani\u00e8re semi-automatique. La surveillance des entit\u00e9s inutiles dans k8s est facilit\u00e9e par <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Nastradamus\/useless-operator\">useless-operator<\/a><\/noindex>, ce qui permet d'\u00e9conomiser des ressources et de l'argent.<\/p>\n<h2> Gestion des ressources <\/h2>\n<p><\/p>\n<h4> Surveillance <\/h4>\n<p>\nLa pierre angulaire de l'exploitation d'un grand cluster est un monitoring bien structur\u00e9 et informatif. Nous n'avons pas encore trouv\u00e9 de solution universelle qui couvre 100 % de tous les besoins en mati\u00e8re de monitoring, c'est pourquoi nous d\u00e9veloppons p\u00e9riodiquement diff\u00e9rentes solutions personnalis\u00e9es dans ce domaine.<\/p>\n<ul>\n<li><b>Zabbix<\/b>. Un monitoring classique, qui est principalement destin\u00e9 \u00e0 suivre l'\u00e9tat g\u00e9n\u00e9ral de l'infrastructure. Il nous indique quand un n\u0153ud \u00e9choue en raison d'un pourcentage de CPU, de m\u00e9moire, de disque, de r\u00e9seau, etc. Rien de surhumain, mais nous avons \u00e9galement un DaemonSet d'agents, gr\u00e2ce auxquels, par exemple, nous surveillons l'\u00e9tat du DNS dans le cluster : nous recherchons les pods coredns qui ralentissent, v\u00e9rifions l'accessibilit\u00e9 des h\u00f4tes externes. On pourrait se demander pourquoi g\u00e9rer cela, mais avec de gros volumes de trafic, ce composant repr\u00e9sente un point de d\u00e9faillance s\u00e9rieux. Pr\u00e9c\u00e9demment, j'avais d\u00e9j\u00e0 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/domclick\/blog\/495450\/\">d\u00e9crit comment cr\u00e9er un certificat auto-sign\u00e9 et l'installer dans TomCat.<\/a><\/noindex>, comment j'avais lutt\u00e9 contre les performances du DNS dans le cluster.<\/li>\n<li><b>Prometheus Operator<\/b>. Un ensemble de diff\u00e9rents exporters offre une grande vue d'ensemble de tous les composants du cluster. Ensuite, nous visualisons tout cela sur de grands tableaux de bord dans Grafana, et pour les alertes, nous utilisons alertmanager.\n<\/li>\n<\/ul>\n<p>\nUn autre outil utile pour nous est devenu <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Nastradamus\/list-ingress\">list-ingress<\/a><\/noindex>. Nous l'avons \u00e9crit apr\u00e8s avoir rencontr\u00e9 plusieurs fois la situation o\u00f9 une \u00e9quipe interf\u00e8re avec les Ingress d'une autre \u00e9quipe, ce qui entra\u00eene des erreurs 50x. Maintenant, avant de d\u00e9ployer en production, les d\u00e9veloppeurs v\u00e9rifient qu'ils ne perturbent personne, et pour mon \u00e9quipe, c'est un bon outil de diagnostic initial des probl\u00e8mes avec les Ingress. C'est amusant de noter qu'il a \u00e9t\u00e9 initialement con\u00e7u pour les admins et qu'il avait l'air assez \u00ab rudimentaire \u00bb, mais apr\u00e8s que l'outil a plu aux \u00e9quipes de d\u00e9veloppement, il a beaucoup \u00e9volu\u00e9 et ne ressemble plus \u00e0 \u00ab un admin a fait une interface web pour les admins \u00bb. Bient\u00f4t, nous abandonnerons cet outil et de telles situations seront valid\u00e9es avant le d\u00e9ploiement du pipeline.<\/p>\n<h4>Ressources des \u00e9quipes dans \u00ab Kube \u00bb<\/h4>\n<p>\nAvant de commencer avec les exemples, il est important d'expliquer comment nous allouons les ressources pour <i>microservices<\/i>.<\/p>\n<p>Pour comprendre quelles \u00e9quipes et en quelles quantit\u00e9s utilisent leurs <i>ressources<\/i> (processeur, m\u00e9moire, SSD local), nous attribuons \u00e0 chaque \u00e9quipe sa propre <i>namespace<\/i> dans \u00ab Kubernetes \u00bb et nous limitons ses capacit\u00e9s maximales en termes de processeur, de m\u00e9moire et de disque, apr\u00e8s avoir discut\u00e9 des besoins des \u00e9quipes. Par cons\u00e9quent, une \u00e9quipe, en g\u00e9n\u00e9ral, ne bloquera pas l'ensemble du cluster pour le d\u00e9ploiement en s'attribuant des milliers de c\u0153urs et des t\u00e9raoctets de m\u00e9moire. Les acc\u00e8s dans le namespace sont donn\u00e9s via AD (nous utilisons RBAC). Les namespaces et leurs limites sont ajout\u00e9s via une pull-request dans le d\u00e9p\u00f4t GIT, et ensuite, tout est automatiquement d\u00e9ploy\u00e9 via un pipeline Ansible.<\/p>\n<p>Exemple d'allocation de ressources pour une \u00e9quipe :<\/p>\n<pre><code class=\"go\">namespaces:\n\n  chat-team:\n    pods: 23\n    limits:\n      cpu: 11\n      memory: 20Gi\n    requests:\n      cpu: 11\n      memory: 20Gi\n<\/code><\/pre>\n<p><\/p>\n<h4>Demandes et limites<\/h4>\n<p>\nDans \u00ab Kube \u00bb <i>Request<\/i> \u2014 c'est le nombre de ressources r\u00e9serv\u00e9es garantis pour <i>pod<\/i> (un ou plusieurs conteneurs Docker) dans le cluster. Limit \u2014 c'est un maximum non garanti. On peut souvent voir sur les graphiques qu'une \u00e9quipe a demand\u00e9 trop de requ\u00eates pour toutes ses applications et ne peut pas d\u00e9ployer d'application dans \u00ab Kubernetes \u00bb, car tous les request dans leur namespace sont d\u00e9j\u00e0 \u00ab consomm\u00e9s \u00bb.<\/p>\n<p>La bonne fa\u00e7on de sortir de cette situation : observer la consommation r\u00e9elle des ressources et la comparer \u00e0 la quantit\u00e9 demand\u00e9e (Request).<\/p>\n<p><img decoding=\"async\" alt=\"Kubernetes chez DomKlik : comment dormir tranquillement en g\u00e9rant un cluster de 1000 microservices\" src=\"\/wp-content\/uploads\/2020\/08\/417373d4421064f28d57a03b6bb5bf94.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Kubernetes chez DomKlik : comment dormir tranquillement en g\u00e9rant un cluster de 1000 microservices\" src=\"\/wp-content\/uploads\/2020\/08\/3168ad6dc8b159059b21e1177e145376.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSur les captures d'\u00e9cran ci-dessus, on peut voir que les \u00ab demand\u00e9s \u00bb (Requested) en CPU se rapprochent du nombre r\u00e9el de threads, tandis que les Limites peuvent d\u00e9passer le nombre r\u00e9el de threads de processeurs centraux =)<\/p>\n<p>Passons maintenant en revue un namespace sp\u00e9cifique (j'ai choisi le namespace kube-system \u2014 le namespace syst\u00e8me pour les composants de \u00ab Kube \u00bb) et examinons la relation entre le temps processeur r\u00e9ellement utilis\u00e9 et la m\u00e9moire demand\u00e9e :<\/p>\n<p><img decoding=\"async\" alt=\"Kubernetes chez DomKlik : comment dormir tranquillement en g\u00e9rant un cluster de 1000 microservices\" src=\"\/wp-content\/uploads\/2020\/08\/ed6160de5397b8cd39cbae172d4bb872.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIl est \u00e9vident que la m\u00e9moire et le CPU r\u00e9serv\u00e9s pour les services syst\u00e8me sont bien sup\u00e9rieurs \u00e0 leur utilisation r\u00e9elle. Dans le cas de kube-system, cela est justifi\u00e9 : il est arriv\u00e9 que le contr\u00f4leur d'entr\u00e9e nginx ou nodelocaldns atteignent leur maximum de CPU et consomment beaucoup de RAM, donc cette r\u00e9serve est justifi\u00e9e. De plus, nous ne pouvons pas nous fier aux graphiques des derni\u00e8res 3 heures : il est pr\u00e9f\u00e9rable de voir des m\u00e9triques historiques sur une p\u00e9riode plus longue.<\/p>\n<p>Un syst\u00e8me de \u00ab recommandations \u00bb a \u00e9t\u00e9 d\u00e9velopp\u00e9. Par exemple, ici, on peut voir quels ressources il serait b\u00e9n\u00e9fique d'augmenter les \u00ab limites \u00bb (plafond autoris\u00e9), afin d'\u00e9viter le \u00ab throttling \u00bb : le moment o\u00f9 le CPU ou la m\u00e9moire d\u00e9j\u00e0 utilis\u00e9 atteint le temps imparti et attend d'\u00eatre \u00ab d\u00e9bloqu\u00e9 \u00bb :<\/p>\n<p><img decoding=\"async\" alt=\"Kubernetes chez DomKlik : comment dormir tranquillement en g\u00e9rant un cluster de 1000 microservices\" src=\"\/wp-content\/uploads\/2020\/08\/f23aece10a585e6847bcacfe947031d1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEt voici les pods qui devraient r\u00e9duire leur consommation :<\/p>\n<p><img decoding=\"async\" alt=\"Kubernetes chez DomKlik : comment dormir tranquillement en g\u00e9rant un cluster de 1000 microservices\" src=\"\/wp-content\/uploads\/2020\/08\/1ec9996ce6355aeba603008d51aac209.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00c0 propos de <i>throttling<\/i> + la surveillance des ressources est un sujet qui pourrait faire l'objet de plusieurs articles, donc n'h\u00e9sitez pas \u00e0 poser vos questions dans les commentaires. En quelques mots, je peux dire que l'automatisation de telles m\u00e9triques est une t\u00e2che complexe et n\u00e9cessite beaucoup de temps et une certaine dext\u00e9rit\u00e9 avec les fonctions \u00ab window \u00bb et \u00ab CTE \u00bb Prometheus \/ VictoriaMetrics (ces termes sont entre guillemets, car dans PromQL, il n'y a presque rien de semblable, et il faut cr\u00e9er des requ\u00eates complexes de plusieurs \u00e9crans de texte et s'occuper de leur optimisation).<\/p>\n<p>En fin de compte, les d\u00e9veloppeurs disposent d'outils pour surveiller leurs namespaces dans \u00ab Kube \u00bb, et ils peuvent choisir o\u00f9 et \u00e0 quel moment des ressources peuvent \u00eatre \u00ab r\u00e9duites \u00bb, et quels pods peuvent se voir allouer tout le CPU pour toute la nuit.<\/p>\n<h4>M\u00e9thodologies<\/h4>\n<p>\nDans notre entreprise, comme c'est \u00e0 la mode maintenant, <i>nous adh\u00e9rons aux pratiques DevOps et<\/i>-pratiques. Lorsqu'une entreprise compte 1000 microservices, environ 350 d\u00e9veloppeurs et 15 administrateurs pour toute l'infrastructure, il faut \u00ab \u00eatre \u00e0 la mode \u00bb : derri\u00e8re tous ces \u00ab mots \u00e0 la mode \u00bb se cache un besoin urgent d'automatisation de tout, et les administrateurs ne doivent pas constituer un goulot d'\u00e9tranglement dans les processus. <i>SRE<\/i>En tant qu'Ops, nous fournissons diverses m\u00e9triques et tableaux de bord pour les d\u00e9veloppeurs, li\u00e9s \u00e0 la rapidit\u00e9 de r\u00e9ponse des services et leurs erreurs.<\/p>\n<p>Nous utilisons des m\u00e9thodologies telles que :<\/p>\n<p>RED <noindex><a rel=\"nofollow\" href=\"https:\/\/thenewstack.io\/monitoring-microservices-red-method\/\">USE<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"http:\/\/www.brendangregg.com\/usemethod.html\">Golden Signals<\/a><\/noindex> et <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/forepaas\/distributed-monitoring-101-the-four-golden-signals-305bbbc33d35\">Signaux dor\u00e9s<\/a><\/noindex>, en les combinant. Nous essayons de minimiser le nombre de tableaux de bord afin qu'il soit clair en un coup d'\u0153il quel service est actuellement en d\u00e9gradation (par exemple, les codes de r\u00e9ponse par seconde, le temps de r\u00e9ponse au 99\u00e8me percentile), etc. D\u00e8s que de nouvelles m\u00e9triques sont n\u00e9cessaires pour les tableaux de bord g\u00e9n\u00e9raux, nous les tra\u00e7ons et les ajoutons imm\u00e9diatement.<\/p>\n<p><i>Je n'ai pas dessin\u00e9 de graphiques depuis un mois. C'est probablement un bon signe : cela signifie que la plupart des \u00ab d\u00e9sirs \u00bb ont d\u00e9j\u00e0 \u00e9t\u00e9 r\u00e9alis\u00e9s. Il y a eu des semaines o\u00f9 je dessinais au moins un nouveau graphique par jour.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Kubernetes chez DomKlik : comment dormir tranquillement en g\u00e9rant un cluster de 1000 microservices\" src=\"\/wp-content\/uploads\/2020\/08\/574f1b4d2be78fb779f1771bffac51dd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Kubernetes chez DomKlik : comment dormir tranquillement en g\u00e9rant un cluster de 1000 microservices\" src=\"\/wp-content\/uploads\/2020\/08\/6ab2aa05f912839b14bdbcf84faaeb3a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLe r\u00e9sultat obtenu est pr\u00e9cieux car maintenant les d\u00e9veloppeurs viennent assez rarement voir les administrateurs avec des questions comme \u00ab o\u00f9 puis-je trouver une certaine m\u00e9trique ? \u00bb<\/p>\n<p>D\u00e9ploiement <i>Service Mesh<\/i> n\u2019est pas loin et devrait grandement faciliter la vie de tous, mes coll\u00e8gues des Outils sont d\u00e9j\u00e0 proches de la mise en \u0153uvre de l\u2019abstrait \u00ab Istio de la personne saine \u00bb : le cycle de vie de chaque requ\u00eate HTTP(s) sera visible dans la surveillance, et il sera toujours possible de comprendre \u00ab \u00e0 quel moment cela a cass\u00e9 \u00bb lors des interactions entre services (et pas seulement). Abonnez-vous aux nouvelles du hub de l'entreprise DomClick. =)<\/p>\n<h2>Support de l'infrastructure Kubernetes<\/h2>\n<p>\nHistoriquement, nous utilisons une version patch\u00e9e <i>Kubespray<\/i> \u2014 r\u00f4le Ansible pour d\u00e9ployer, \u00e9tendre et mettre \u00e0 jour Kubernetes. \u00c0 un moment donn\u00e9, la prise en charge des installations non kubeadm a \u00e9t\u00e9 supprim\u00e9e de la branche principale, et le processus de transition vers kubeadm n'a pas \u00e9t\u00e9 propos\u00e9. En cons\u00e9quence, la soci\u00e9t\u00e9 Southbridge a fait son fork (avec prise en charge de kubeadm et correction rapide des probl\u00e8mes critiques). <\/p>\n<p>Le processus de mise \u00e0 jour de tous les clusters k8s se d\u00e9roule comme suit :<\/p>\n<ul>\n<li>Nous prenons <i>Kubespray<\/i> de Southbridge, v\u00e9rifions avec notre branche, fusionnons.<\/li>\n<li>Nous d\u00e9ployons la mise \u00e0 jour dans <i>Stress<\/i>-\u00ab Cube \u00bb.<\/li>\n<li>Nous d\u00e9ployons la mise \u00e0 jour un n\u0153ud \u00e0 la fois (dans Ansible, c'est \u00ab serial: 1 \u00bb) dans <i>Dev<\/i>-\u00ab Cube \u00bb.<\/li>\n<li>Nous mettons \u00e0 jour <i>Prod<\/i> le samedi soir un n\u0153ud \u00e0 la fois.<\/li>\n<\/ul>\n<p>\n\u00c0 l'avenir, il est pr\u00e9vu de remplacer <i>Kubespray<\/i> par quelque chose de plus rapide et de passer \u00e0 <i>kubeadm<\/i>.<\/p>\n<p>Nous avons au total trois \u00ab Cubes \u00bb : Stress, Dev et Prod. Nous pr\u00e9voyons de lancer un autre (<i>hot standby<\/i>) Prod-\u00ab Cube \u00bb dans le second datacenter. <i>Stress<\/i> et <i>Dev<\/i> vivent dans des \u00ab virtual machines \u00bb (oVirt pour Stress et VMWare cloud pour Dev). <i>Prod<\/i>-\u00ab Cube \u00bb vit sur du \u00ab mat\u00e9riel nu \u00bb (bare metal) : ce sont des n\u0153uds identiques avec 32 threads CPU, 64-128 Go de RAM et 300 Go de SSD RAID 10 \u2014 un total de 50 pi\u00e8ces. Trois n\u0153uds \u00ab fins \u00bb sont r\u00e9serv\u00e9s pour le \u00ab ma\u00eetre \u00bb <i>Prod<\/i>-\u00ab Cube \u00bb : 16 Go de RAM, 12 threads CPU.<\/p>\n<p>Pour la production, nous pr\u00e9f\u00e9rons utiliser du \u00ab mat\u00e9riel nu \u00bb et \u00e9vitons les niveaux interm\u00e9diaires inutiles comme <i>OpenStack<\/i>: nous n'avons pas besoin de \u00ab voisins bruyants \u00bb et de temps de vol CPU <i>steal time<\/i>. De plus, la complexit\u00e9 de l'administration augmente presque de moiti\u00e9 dans le cas d'OpenStack en interne.<\/p>\n<p>Pour les composants d'infrastructure CI\/CD \u00ab Cubiques \u00bb et autres, nous utilisons un serveur GIT distinct, Helm 3 (nous avons migr\u00e9 assez douloureusement depuis Helm 2, mais nous sommes tr\u00e8s contents de l'option <i>atomic<\/i>), Jenkins, Ansible et Docker. Nous aimons les branches de fonctionnalit\u00e9s et le d\u00e9ploiement dans diff\u00e9rents environnements \u00e0 partir d'un seul r\u00e9f\u00e9rentiel.<\/p>\n<h3>Conclusion<\/h3>\n<p><img decoding=\"async\" alt=\"Kubernetes chez DomKlik : comment dormir tranquillement en g\u00e9rant un cluster de 1000 microservices\" src=\"\/wp-content\/uploads\/2020\/08\/34ddcd1f275c63c1ad821218d16b5abb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVoil\u00e0, en gros, \u00e0 quoi ressemble le processus DevOps chez DomClick du point de vue de l'ing\u00e9nieur d'exploitation. L'article s'est av\u00e9r\u00e9 moins technique que je ne l'avais pr\u00e9vu, donc, restez \u00e0 l'\u00e9coute des nouvelles de DomClick sur Habr : il y aura des articles plus \u00ab hardcore \u00bb sur Kubernetes et plus encore.<br \/>\n<br \/>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/domclick\/blog\/501122\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0412\u0438\u043a\u0442\u043e\u0440 \u042f\u0433\u043e\u0444\u0430\u0440\u043e\u0432, \u0438 \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435\u043c Kubernetes-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0414\u043e\u043c\u041a\u043b\u0438\u043a \u0432 \u0434\u043e\u043b\u0436\u043d\u043e\u0441\u0442\u0438 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Ops (\u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u044f). \u042f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 Dev &lt;-&gt; Ops, \u043e\u0431 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u0445 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 k8s-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u0432 \u0420\u043e\u0441\u0441\u0438\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e DevOps\/SRE-\u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u043d\u0430\u0448\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430. \u041a\u043e\u043c\u0430\u043d\u0434\u0430 Ops \u0412 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Ops [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":91200,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-91199","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.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0412\u0438\u043a\u0442\u043e\u0440 \u042f\u0433\u043e\u0444\u0430\u0440\u043e\u0432, \u0438 \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435\u043c Kubernetes-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0414\u043e\u043c\u041a\u043b\u0438\u043a \u0432 \u0434\u043e\u043b\u0436\u043d\u043e\u0441\u0442\u0438 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Ops (\u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u044f).\" \/>\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\/kubernetes-v-domklik-kak-spat-spokojno-upravlyaya-klasterom-na-1000-mikroservisov\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\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\udd47Kubernetes \u0432 \u0414\u043e\u043c\u041a\u043b\u0438\u043a: \u043a\u0430\u043a \u0441\u043f\u0430\u0442\u044c \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c \u043d\u0430 1000 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0412\u0438\u043a\u0442\u043e\u0440 \u042f\u0433\u043e\u0444\u0430\u0440\u043e\u0432, \u0438 \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435\u043c Kubernetes-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0414\u043e\u043c\u041a\u043b\u0438\u043a \u0432 \u0434\u043e\u043b\u0436\u043d\u043e\u0441\u0442\u0438 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Ops (\u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u044f).\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/kubernetes-v-domklik-kak-spat-spokojno-upravlyaya-klasterom-na-1000-mikroservisov\" \/>\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-08-09T23:42:03+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-09T23:42:03+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\udd47Kubernetes chez DomClick : comment dormir paisiblement en g\u00e9rant un cluster de 1000 microservices | ProHoster","description":"Je m'appelle Viktor Yagofarov, et je suis responsable du d\u00e9veloppement de la plateforme Kubernetes chez DomClick en tant que responsable technique du d\u00e9veloppement au sein de l'\u00e9quipe Ops (exploitation).","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/kubernetes-v-domklik-kak-spat-spokojno-upravlyaya-klasterom-na-1000-mikroservisov","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\udd47Kubernetes \u0432 \u0414\u043e\u043c\u041a\u043b\u0438\u043a: \u043a\u0430\u043a \u0441\u043f\u0430\u0442\u044c \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c \u043d\u0430 1000 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 | ProHoster","og:description":"\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0412\u0438\u043a\u0442\u043e\u0440 \u042f\u0433\u043e\u0444\u0430\u0440\u043e\u0432, \u0438 \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435\u043c Kubernetes-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0414\u043e\u043c\u041a\u043b\u0438\u043a \u0432 \u0434\u043e\u043b\u0436\u043d\u043e\u0441\u0442\u0438 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Ops (\u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u044f).","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/kubernetes-v-domklik-kak-spat-spokojno-upravlyaya-klasterom-na-1000-mikroservisov","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-08-09T23:42:03+00:00","article:modified_time":"2020-08-09T23:42:03+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"91199","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 12:32:23","updated":"2022-09-28 06:43:59","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\/91199","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=91199"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/91199\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/91200"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=91199"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=91199"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=91199"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}