{"id":81173,"date":"2020-05-11T13:42:51","date_gmt":"2020-05-11T11:42:51","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/production-ready-images-for-k8s"},"modified":"2020-05-11T13:42:51","modified_gmt":"2020-05-11T11:42:51","slug":"production-ready-images-for-k8s","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/production-ready-images-for-k8s","title":{"rendered":"Images pr\u00eates pour la production pour K8s","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Cette histoire porte sur notre utilisation des conteneurs dans un environnement de production, en particulier sous Kubernetes. Cet article est d\u00e9di\u00e9 \u00e0 la collecte de m\u00e9triques et de journaux \u00e0 partir des conteneurs, ainsi qu'\u00e0 la cr\u00e9ation d'images.<\/p>\n<p><img decoding=\"async\" alt=\"Images pr\u00eates pour la production pour K8s\" src=\"\/wp-content\/uploads\/2020\/05\/c7e8df02d845138e489c09c55cd616e6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nNous sommes de la soci\u00e9t\u00e9 fintech Exness, qui d\u00e9veloppe des services de trading en ligne et des produits fintech pour le B2B et le B2C. Dans notre R&amp;D, il y a plusieurs \u00e9quipes diff\u00e9rentes, et notre d\u00e9partement de d\u00e9veloppement compte plus de 100 employ\u00e9s.<\/p>\n<p>Nous repr\u00e9sentons l'\u00e9quipe responsable de la plateforme permettant \u00e0 nos d\u00e9veloppeurs de collecter et de d\u00e9ployer du code. En particulier, nous sommes charg\u00e9s de la collecte, du stockage et de la fourniture de m\u00e9triques, de journaux, et d'\u00e9v\u00e9nements provenant des applications. Actuellement, nous g\u00e9rons environ trois mille conteneurs Docker dans un environnement de production, maintenons notre stockage big data de 50 To et fournissons des solutions architecturales construites autour de notre infrastructure : Kubernetes, Rancher et divers fournisseurs de cloud publics.\u00a0<\/p>\n<h1>Notre motivation<\/h1>\n<p>\nQu'est-ce qui br\u00fble ? Personne ne peut r\u00e9pondre. O\u00f9 est le foyer ? Difficile \u00e0 comprendre. Quand cela a-t-il commenc\u00e9 ? On peut le d\u00e9terminer, mais pas tout de suite.\u00a0<\/p>\n<p><img decoding=\"async\" alt=\"Images pr\u00eates pour la production pour K8s\" src=\"\/wp-content\/uploads\/2020\/05\/3ca2271caf1d02ba14937680cd89d65d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPourquoi certains conteneurs sont-ils \u00e0 l'arr\u00eat tandis que d'autres sont en panne ? Quel conteneur en est la cause ? En dehors, les conteneurs sont identiques, mais chacun a son propre Neo \u00e0 l'int\u00e9rieur.<\/p>\n<p><img decoding=\"async\" alt=\"Images pr\u00eates pour la production pour K8s\" src=\"\/wp-content\/uploads\/2020\/05\/f971583f21e363244f9ea754da2a1f4c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNos d\u00e9veloppeurs sont des gens comp\u00e9tents. Ils cr\u00e9ent de bons services qui rapportent de l'argent \u00e0 l'entreprise. Mais il y a des \u00e9checs, lorsque les conteneurs avec les applications sont en d\u00e9sordre. Un conteneur consomme trop de CPU, un autre de la bande passante, un troisi\u00e8me des op\u00e9rations d'entr\u00e9e-sortie, et un quatri\u00e8me fait quelque chose d'incompr\u00e9hensible avec les sockets. Tout cela s'effondre et le navire coule.\u00a0<\/p>\n<h1>Agents<\/h1>\n<p>\nPour comprendre ce qui se passe \u00e0 l'int\u00e9rieur, nous avons d\u00e9cid\u00e9 d'installer des agents directement dans les conteneurs.<\/p>\n<p><img decoding=\"async\" alt=\"Images pr\u00eates pour la production pour K8s\" src=\"\/wp-content\/uploads\/2020\/05\/cc9eb47d1250bb866ec9452181479df4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCes agents sont des programmes d'alerte qui maintiennent les conteneurs dans un \u00e9tat tel qu'ils ne se cassent pas les uns les autres. Les agents sont standardis\u00e9s, et cela permet de normaliser l'approche de maintenance des conteneurs.\u00a0<\/p>\n<p>Dans notre cas, les agents doivent fournir des journaux dans un format standard, \u00e9tiquet\u00e9s et avec un throttling. Ils doivent \u00e9galement nous fournir des m\u00e9triques normalis\u00e9es, extensibles du point de vue des applications commerciales.<\/p>\n<p>Sous le terme agents, on entend \u00e9galement des utilitaires pour l'exploitation et la maintenance, capables de fonctionner dans diff\u00e9rents syst\u00e8mes d'orchestration, prenant en charge diff\u00e9rentes images (Debian, Alpine, Centos, etc.).<\/p>\n<p>Enfin, les agents doivent maintenir un CI\/CD simple, incluant des fichiers Docker. Sinon, le navire se brisera, car les conteneurs commenceront \u00e0 \u00eatre livr\u00e9s sur des \u00ab rails tordus \u00bb.<\/p>\n<h1>Le processus de construction et la structure de l'image cible<\/h1>\n<p>\nPour que tout soit standardis\u00e9 et g\u00e9rable, il est n\u00e9cessaire de suivre un certain processus standard de construction. C'est pourquoi nous avons d\u00e9cid\u00e9 de construire des conteneurs avec des conteneurs \u2014 une sorte de r\u00e9cursion.<\/p>\n<p><img decoding=\"async\" alt=\"Images pr\u00eates pour la production pour K8s\" src=\"\/wp-content\/uploads\/2020\/05\/708715af05bf79ce1eb9c2a8ce2aeca6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIci, les conteneurs sont repr\u00e9sent\u00e9s par des contours solides. En m\u00eame temps, nous avons d\u00e9cid\u00e9 d'y mettre des distributions, pour que \u00ab la vie ne soit pas trop facile \u00bb. Nous expliquerons pourquoi cela a \u00e9t\u00e9 fait ci-dessous.<br \/>\n\u00a0<br \/>\nEn r\u00e9sultat, nous avons obtenu un outil de construction \u2014 un conteneur d'une version sp\u00e9cifique, qui fait r\u00e9f\u00e9rence \u00e0 des versions sp\u00e9cifiques de distributions et de scripts.<\/p>\n<p>Comment l'utilisons-nous ? Nous avons un Docker Hub, o\u00f9 se trouve le conteneur. Nous le r\u00e9fl\u00e9chissons dans notre syst\u00e8me pour nous d\u00e9barrasser des d\u00e9pendances externes. Cela a abouti \u00e0 un conteneur marqu\u00e9 en jaune. Nous cr\u00e9ons un mod\u00e8le pour installer dans le conteneur toutes les distributions et scripts n\u00e9cessaires. Ensuite, nous construisons une image pr\u00eate \u00e0 l'exploitation : les d\u00e9veloppeurs y ajoutent leur code et certaines de leurs d\u00e9pendances sp\u00e9cifiques.\u00a0<\/p>\n<p>Quels sont les avantages de cette approche ?\u00a0<\/p>\n<ul>\n<li>Tout d'abord, un contr\u00f4le de version complet des outils de construction \u2013 conteneur de construction, versions des scripts et des distributions.\u00a0<\/li>\n<li>Deuxi\u00e8mement, nous avons r\u00e9ussi \u00e0 standardiser : nous cr\u00e9ons des mod\u00e8les, des images interm\u00e9diaires et pr\u00eates \u00e0 l'exploitation de la m\u00eame mani\u00e8re.\u00a0<\/li>\n<li>Troisi\u00e8mement, les conteneurs nous assurent portabilit\u00e9. Aujourd'hui, nous utilisons GitLab, et demain nous passerons \u00e0 TeamCity ou Jenkins tout en continuant \u00e0 ex\u00e9cuter nos conteneurs de la m\u00eame mani\u00e8re.\u00a0<\/li>\n<li>Quatri\u00e8mement, minimisation des d\u00e9pendances. Nous n'avons pas mis les distributions dans le conteneur par hasard, car cela permet d'\u00e9viter de les t\u00e9l\u00e9charger \u00e0 chaque fois depuis Internet.\u00a0<\/li>\n<li>Cinqui\u00e8mement, la vitesse de construction a augment\u00e9 \u2013 la pr\u00e9sence de copies locales des images permet de ne pas perdre de temps \u00e0 t\u00e9l\u00e9charger, car une image locale est disponible.\u00a0<\/li>\n<\/ul>\n<p>\nEn d'autres termes, nous avons obtenu un processus de construction contr\u00f4l\u00e9 et flexible. Nous utilisons les m\u00eames outils pour construire n'importe quels conteneurs avec un versionnage complet.\u00a0<\/p>\n<h1>Comment fonctionne notre proc\u00e9dure de construction<\/h1>\n<p>\n<img decoding=\"async\" alt=\"Images pr\u00eates pour la production pour K8s\" src=\"\/wp-content\/uploads\/2020\/05\/22b9a8546005e289f79962188dbb0659.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLe d\u00e9ploiement s'effectue par une seule commande, le processus s'ex\u00e9cute dans l'image (soulign\u00e9e en rouge). Le d\u00e9veloppeur a un fichier Docker (soulign\u00e9 en jaune) que nous rendons, en rempla\u00e7ant les variables par des valeurs. Nous ajoutons \u00e9galement des en-t\u00eates et des pieds de page - ce sont nos agents.\u00a0<\/p>\n<p>L'en-t\u00eate ajoute des distributions \u00e0 partir des images correspondantes. Le pied de page ins\u00e8re nos services, configure le d\u00e9marrage de la charge de travail, des journaux et d'autres agents, remplace l'entrypoint, etc.\u00a0<\/p>\n<p><img decoding=\"async\" alt=\"Images pr\u00eates pour la production pour K8s\" src=\"\/wp-content\/uploads\/2020\/05\/4004e57dc45771479e535921a839716d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNous avons longtemps r\u00e9fl\u00e9chi \u00e0 l'opportunit\u00e9 d'installer un superviseur. Finalement, nous avons d\u00e9cid\u00e9 qu'il nous \u00e9tait n\u00e9cessaire. Nous avons choisi S6. Le superviseur g\u00e8re le conteneur : il permet de s'y connecter en cas de tomb\u00e9e du processus principal et offre un contr\u00f4le manuel du conteneur sans le recr\u00e9er. Les journaux et les m\u00e9triques sont des processus s'ex\u00e9cutant \u00e0 l'int\u00e9rieur du conteneur. Nous devons \u00e9galement les contr\u00f4ler d'une mani\u00e8re ou d'une autre, et nous le faisons avec l'aide du superviseur. Enfin, S6 prend en charge l'entretien, le traitement des signaux et d'autres t\u00e2ches.<\/p>\n<p>Puisque nous utilisons diff\u00e9rents syst\u00e8mes d'orchestration, apr\u00e8s la construction et le d\u00e9marrage, le conteneur doit comprendre dans quel environnement il se trouve et agir en cons\u00e9quence. Par exemple :<br \/>\nCela nous permet de construire une seule image et de la lancer dans diff\u00e9rents syst\u00e8mes d'orchestration, en prenant en compte les sp\u00e9cificit\u00e9s de ce syst\u00e8me d'orchestration.<\/p>\n<p>\u00a0<img decoding=\"async\" alt=\"Images pr\u00eates pour la production pour K8s\" src=\"\/wp-content\/uploads\/2020\/05\/6e76396afedbbf0e71d44a7fbb8521da.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPour le m\u00eame conteneur, nous obtenons diff\u00e9rents arbres de processus dans Docker et Kubernetes :<\/p>\n<p><img decoding=\"async\" alt=\"Images pr\u00eates pour la production pour K8s\" src=\"\/wp-content\/uploads\/2020\/05\/83f9d23876192930ffebafcdd549915e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLa charge utile s'ex\u00e9cute sous le superviseur S6. Notez le collector et les \u00e9v\u00e9nements - ce sont nos agents responsables des journaux et des m\u00e9triques. Dans Kubernetes, ils ne sont pas pr\u00e9sents, tandis que dans Docker, ils le sont. Pourquoi ?\u00a0<\/p>\n<p>Si nous regardons la sp\u00e9cification du \u00ab pod \u00bb (ici et ci-apr\u00e8s - pod Kubernetes), nous verrons que le conteneur events s'ex\u00e9cute dans le pod, qui a un conteneur collector distinct, charg\u00e9e de la collecte des m\u00e9triques et des journaux. Nous pouvons utiliser les fonctionnalit\u00e9s de Kubernetes : lancer des conteneurs dans un m\u00eame pod, dans un m\u00eame espace de processus et\/ou r\u00e9seau. En fait, nous pouvons int\u00e9grer nos propres agents et r\u00e9aliser certaines fonctions. Et si le m\u00eame conteneur est lanc\u00e9 dans Docker, il obtiendra toutes les m\u00eames fonctionnalit\u00e9s, c'est-\u00e0-dire qu'il pourra livrer des journaux et des m\u00e9triques, car les agents seront lanc\u00e9s \u00e0 l'int\u00e9rieur.\u00a0<\/p>\n<h1>M\u00e9triques et journaux<\/h1>\n<p>\nLa livraison des m\u00e9triques et des journaux est une t\u00e2che complexe. Sa r\u00e9solution est li\u00e9e \u00e0 plusieurs aspects.<br \/>\nL'infrastructure est cr\u00e9\u00e9e pour ex\u00e9cuter des charges utiles, et non pour le transport massif de journaux. Cela signifie que ce processus doit \u00eatre r\u00e9alis\u00e9 avec des exigences minimales en ressources pour les conteneurs. Nous nous effor\u00e7ons d'aider nos d\u00e9veloppeurs : \u00ab Prenez un conteneur Docker Hub, ex\u00e9cutez-le, et nous pourrons livrer les journaux \u00bb.\u00a0<\/p>\n<p>Le deuxi\u00e8me aspect concerne la limitation du volume des journaux. Si plusieurs conteneurs rencontrent une situation de pic de volume de journaux (une application en boucle affiche une stack-trace), cela augmente la charge sur le CPU, les canaux de communication, le syst\u00e8me de traitement des journaux, et cela influence le fonctionnement de l'h\u00f4te dans son ensemble ainsi que d'autres conteneurs sur l'h\u00f4te, ce qui peut parfois entra\u00eener un \u00ab crash \u00bb de l'h\u00f4te.\u00a0<\/p>\n<p>Le troisi\u00e8me aspect est qu'il est n\u00e9cessaire de supporter d\u00e8s le d\u00e9part autant de m\u00e9thodes de collecte de m\u00e9triques que possible. Cela va de la lecture de fichiers au sondage d'un point de terminaison Prometheus, jusqu'\u00e0 l'utilisation de protocoles sp\u00e9cifiques aux applications.<\/p>\n<p>Et le dernier aspect consiste \u00e0 minimiser la consommation de ressources.<\/p>\n<p>Nous avons choisi une solution open-source en Go appel\u00e9e Telegraf. C'est un connecteur polyvalent qui prend en charge plus de 140 types de canaux d'entr\u00e9e (input plugins) et 30 types de sortie (output plugins). Nous l'avons am\u00e9lior\u00e9 et maintenant nous allons expliquer comment il est utilis\u00e9 chez nous via Kubernetes.\u00a0<\/p>\n<p><img decoding=\"async\" alt=\"Images pr\u00eates pour la production pour K8s\" src=\"\/wp-content\/uploads\/2020\/05\/9635d571c852e5f9358458874c58d7b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSupposons qu'un d\u00e9veloppeur d\u00e9ploie une charge, et Kubernetes re\u00e7oit une demande de cr\u00e9ation d'un pod. \u00c0 ce moment-l\u00e0, un conteneur appel\u00e9 Collector est automatiquement cr\u00e9\u00e9 pour chaque pod (nous utilisons un webhook de mutation). Collector est notre agent. Au d\u00e9marrage, ce conteneur s'auto-configure pour travailler avec Prometheus et le syst\u00e8me de collecte des journaux.<\/p>\n<ul>\n<li>Pour cela, il utilise les annotations du pod, et selon leur contenu, il cr\u00e9e, disons, un point de terminaison Prometheus ;\u00a0\n<\/li>\n<li>Sur la base de la sp\u00e9cification du pod et des configurations sp\u00e9cifiques des conteneurs, il d\u00e9cide comment livrer les journaux.\n<\/li>\n<\/ul>\n<p>\nNous collectons les journaux via l'API Docker : il suffit aux d\u00e9veloppeurs de les placer dans stdout ou stderr, et le Collector s'en occupera. Les journaux sont collect\u00e9s par morceaux avec un certain d\u00e9lai pour \u00e9viter une \u00e9ventuelle surcharge de l'h\u00f4te.\u00a0<\/p>\n<p>Les m\u00e9triques sont collect\u00e9es selon les instances de charge de travail (processus) dans les conteneurs. Tout est \u00e9tiquet\u00e9 : namespace, pod, etc., puis converti au format Prometheus \u2013 et devient accessible pour la collecte (en plus des journaux). De plus, les journaux, les m\u00e9triques et les \u00e9v\u00e9nements sont envoy\u00e9s dans Kafka et ensuite :<\/p>\n<ul>\n<li>Les journaux sont disponibles dans Graylog (pour une analyse visuelle) ;\n<\/li>\n<li>Les journaux, m\u00e9triques et \u00e9v\u00e9nements sont envoy\u00e9s vers Clickhouse pour un stockage \u00e0 long terme.\n<\/li>\n<\/ul>\n<p>\nDe la m\u00eame mani\u00e8re, cela fonctionne sur AWS, mais nous rempla\u00e7ons Graylog avec Kafka par Cloudwatch. Nous y envoyons les journaux, et tout est tr\u00e8s pratique : il est imm\u00e9diatement clair \u00e0 quel cluster et conteneur ils appartiennent. Cela s'applique \u00e9galement \u00e0 Google Stackdriver. En d'autres termes, notre syst\u00e8me fonctionne \u00e0 la fois sur site avec Kafka et dans le cloud.\u00a0<\/p>\n<p>En revanche, si nous n'avons pas de Kubernetes avec des pods, le sch\u00e9ma devient un peu plus complexe, mais fonctionne selon les m\u00eames principes.<\/p>\n<p><img decoding=\"async\" alt=\"Images pr\u00eates pour la production pour K8s\" src=\"\/wp-content\/uploads\/2020\/05\/dd8efb33c5c74433a2767cb00caeec2d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00c0 l'int\u00e9rieur du conteneur, les m\u00eames processus sont ex\u00e9cut\u00e9s, orchestr\u00e9s \u00e0 l'aide de S6. Tous ces m\u00eames processus sont lanc\u00e9s \u00e0 l'int\u00e9rieur d'un seul conteneur.<\/p>\n<h1>En fin de compte<\/h1>\n<p>\nNous avons cr\u00e9\u00e9 une solution compl\u00e8te pour la construction et le d\u00e9ploiement d'images, avec des options de collecte et de livraison de journaux et de m\u00e9triques :<\/p>\n<ul>\n<li>Nous avons d\u00e9velopp\u00e9 une approche standardis\u00e9e pour la construction d'images, sur laquelle nous avons bas\u00e9 nos mod\u00e8les CI ;\n<\/li>\n<li>Les agents de collecte de donn\u00e9es sont nos extensions Telegraf. Nous les avons bien test\u00e9es en production ;\n<\/li>\n<li>Nous utilisons un webhook de mutation pour int\u00e9grer des conteneurs avec des agents dans les pods ;\u00a0\n<\/li>\n<li>Nous avons int\u00e9gr\u00e9 l'\u00e9cosyst\u00e8me Kubernetes\/Rancher ;\n<\/li>\n<li>Nous pouvons ex\u00e9cuter des conteneurs identiques dans diff\u00e9rents syst\u00e8mes d'orchestration et obtenir les r\u00e9sultats que nous attendons ;\n<\/li>\n<li>Nous avons cr\u00e9\u00e9 une configuration enti\u00e8rement dynamique pour la gestion des conteneurs.\u00a0\n<\/li>\n<\/ul>\n<p>\nCo-auteur : <b>Ilya Prudnikov<\/b><br \/>\n<br \/>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/exness\/blog\/488392\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042d\u0442\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u0435, \u0432 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434 Kubernetes. \u0421\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u0441\u0431\u043e\u0440\u0443 \u043c\u0435\u0442\u0440\u0438\u043a \u0438 \u043b\u043e\u0433\u043e\u0432 \u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0431\u0438\u043b\u0434\u0443 \u043e\u0431\u0440\u0430\u0437\u043e\u0432. \u041c\u044b \u0438\u0437 \u0444\u0438\u043d\u0442\u0435\u0445-\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Exness, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0434\u043b\u044f \u043e\u043d\u043b\u0430\u0439\u043d-\u0442\u0440\u0435\u0439\u0434\u0438\u043d\u0433\u0430 \u0438 \u0444\u0438\u043d\u0442\u0435\u0445-\u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0434\u043b\u044f B2B \u0438 \u04122\u0421. \u0412 \u043d\u0430\u0448\u0435\u043c R&amp;D \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434, \u0432 \u043e\u0442\u0434\u0435\u043b\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 100 + \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":81174,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-81173","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=\"\u042d\u0442\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u0435, \u0432 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434 Kubernetes.\" \/>\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\/production-ready-images-for-k8s\" \/>\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\udd47Production-ready images for k8s | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u042d\u0442\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u0435, \u0432 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434 Kubernetes.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/production-ready-images-for-k8s\" \/>\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-05-11T11:42:51+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-11T11:42:51+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\udd47Images pr\u00eates pour la production pour k8s | ProHoster","description":"Cette histoire est sur la mani\u00e8re dont nous utilisons des conteneurs dans un environnement produit, en particulier sous Kubernetes.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/production-ready-images-for-k8s","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\udd47Production-ready images for k8s | ProHoster","og:description":"\u042d\u0442\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u0435, \u0432 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434 Kubernetes.","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/production-ready-images-for-k8s","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-05-11T11:42:51+00:00","article:modified_time":"2020-05-11T11:42:51+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"81173","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 16:03:22","updated":"2022-09-28 06:12:17","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\/81173","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=81173"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/81173\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/81174"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=81173"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=81173"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=81173"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}