PuppetConf 2016. Kubernetes pour les administrateurs système. Partie 1

Je suis administrateur système, je travaille avec des ordinateurs et aujourd'hui nous parlerons de Kubernetes. J'essaierai d'approfondir le sujet, en considérant les problèmes que l'administrateur système peut résoudre avec cette application, et j'aborderai également certains aspects du fonctionnement de Puppet, qui semblaient entrer dans ce monde à l'aide d'un nouvel ensemble d'abstractions pour que l'application fonctionne.
Il y a cinq ou six ans, Luis Andre Barroso et Urs Hoesl dans l'article «Data Center as a Computer» ont suggéré que nous devrions percevoir le centre de données comme un ordinateur massif. Il est nécessaire de faire abstraction du fait que le centre de données se compose de machines distinctes et de le considérer comme une entité logique. Dès que vous essayez d'utiliser cette idée dans la pratique, vous pouvez appliquer les principes de la construction de systèmes distribués et de l'informatique distribuée aux centres de données.



Pour traiter le centre de données comme un ordinateur, vous avez besoin d'un système d'exploitation. Il ressemble beaucoup à celui que vous utilisez sur un ordinateur séparé, mais doit avoir une interface différente, car vous n'avez pas besoin d'accéder à une machine distincte et vous n'avez pas besoin d'accéder au noyau. Alors, considérons le centre de données comme un gros ordinateur. Aujourd'hui, je vais vous dire quoi faire si vous semblez être privé de la possibilité de contrôler n'importe quelle machine utilisant SSH. Vous ne pourrez pas vous connecter, et bien que certaines personnes croient que sans cela, il est impossible de contrôler le système, je vais vous dire ce qui peut être fait avec Kubernetes. Tout d'abord, vous devez considérer Kubernetes comme un cadre pour la création de plates-formes distribuées.



Cela ne signifie pas qu'après avoir téléchargé Kubernetes, vous obtiendrez une interface utilisateur qui vous fournira tout ce que vous voulez faire avec le système. Non, ce n'est que le fondement de la création des outils dont vous avez besoin pour exécuter votre infrastructure. Je vais vous montrer comment créer une intégration à l'aide de l'Autorité de certification Let's Encrypt pour automatiser le processus de certificat pour mon application en utilisant Kubernetes comme cadre.



Beaucoup de gens demandent exactement à quoi Kubernetes est bon. J'ai travaillé avec Puppet Labs pendant de nombreuses années et j'ai vu que cette chose était installée sur des ordinateurs afin de fournir au système une API qui n'existait pas jusqu'à présent. Au lieu de Bash, de scripts YAML et d'autres choses similaires, Puppet a fourni un utilisateur DSL qui lui a permis d'interagir par programme avec les machines sans scripts shell. La différence entre Kubernetes est qu'il est situé au-dessus du niveau de "fer". Concentrons-nous non pas tant sur l'automatisation et l'abstraction de ce système que sur les relations, ou sur le contrat, entre notre infrastructure et nos applications que nous allons tirer de n'importe quel nœud. Dans Kubernetes, nous n’affectons aucune application aux machines, il n’existe pas de «manifeste de nœud», le planificateur considère les nœuds individuels simplement comme des ressources de centre de données,représentant un gros ordinateur.

Questions: "Kubernetes fonctionne-t-il sur OpenStack, sur VMware, sur Bare Metal, dans le cloud?" ça n'a pas de sens. La bonne question est: «Puis-je exécuter l'agent Kubernetes pour récupérer ces ressources?» Et la réponse sera «oui». Parce que le fonctionnement de cette application est totalement indépendant de la plateforme que vous choisissez.



Kubernetes est indépendant de la plateforme. Kubernetes est déclaratif de la même manière que Puppet. Par conséquent, vous signalez pour quelle application vous allez l'utiliser - dans cet exemple, il s'agit de nginx. Il s'agit d'un contrat entre vous, le développeur et Kubernetes comme moyen de créer des images de conteneur.

J'aime utiliser l'analogie avec la société de messagerie FedEx - vous ne pouvez pas les faire glisser tout un wagon de choses et attendre qu'ils trient tout et l'envoient à l'endroit où il devrait être. Ils ont une règle: mettez vos affaires dans une boîte. Une fois que vous le ferez, ils enverront votre boîte et pourront dire quand elle arrivera à destination. "Si vous n'avez pas de boîte, vous ne pourrez pas travailler avec notre système."

Par conséquent, lorsque vous travaillez avec des conteneurs, il est inutile de discuter de ce que vous avez - Python, Java et ou quelque chose d'autre, peu importe - prenez simplement toutes vos dépendances et placez-les dans le conteneur. Beaucoup de gens disent que les conteneurs semblent résoudre les problèmes de l'ensemble de l'infrastructure. Cependant, le problème est que les gens ne perçoivent pas les conteneurs comme deux choses différentes qu’ils sont réellement. La première chose est l'idée d'un format d'emballage, la seconde est l'idée d'un runtime de conteneur. Ce sont deux choses différentes qui ne nécessitent pas nécessairement les mêmes outils.

Laquelle des personnes présentes a créé les conteneurs? Et qui utilise Puppet pour construire des conteneurs? C'est vrai, je ne suis pas d'accord non plus! Vous pouvez dire: «comment cela? Vous êtes à la conférence Puppet, vous devez être d'accord! » La raison pour laquelle je ne suis pas d'accord avec l'idée de construire des conteneurs dans Puppet est la suivante: je ne sais pas si nous en avons besoin, car les choses dont nous avons besoin pour créer une image sont différentes de celles dont nous avons besoin pour démarrer le processus de production.

Imaginons-le comme la création d'un pipeline logiciel et jetons un œil à ce Dockerfile. Fermez les yeux sur ceux qui n'ont jamais vu ces fichiers, car pour vous, ils peuvent sembler intimidants. Ce fichier montre comment créer une application Ruby on Rails - une application Ruby avec un framework Rails.



Il indique «FROM ruby ​​2.3.1», qui insérera probablement l'intégralité du système d'exploitation dans le conteneur, dans ce cas l'image de base alpin-linux Ruby. Est-ce que quelqu'un sait pourquoi nous incorporons des images Ubuntu ou Red Hat dans ces conteneurs? La plupart des gens ne savent pas ce que sont les dépendances et utilisent une approche aléatoire, simplement en fourrant l'ensemble du système d'exploitation dans un conteneur pour s'assurer qu'ils ont leurs dépendances quelque part à l'intérieur. Donc, après avoir construit cette chose, vous ne devez l'exécuter qu'une seule fois. C'est de là que vient le malentendu: si cette chose ne fonctionne pas, changez la ligne de code jusqu'à ce qu'elle fonctionne. Vérifiez simplement! Vous n'avez pas besoin d'être trop intelligent avec ces fichiers, votre objectif est de construire une représentation hors ligne de votre application avec toutes les dépendances. Ce n'est qu'une béquille que nous utilisons d'Ubuntu comme point de départ.

Si vous venez de créer l'application et de la lancer, vous utiliseriez quelque chose comme un lien statique. Aucune dépendance à l'hôte, dans votre conteneur, vous auriez juste un binaire d'un fichier Docker sur une seule ligne et aucune image de base. En fait, c'est juste un transfert de choses auxquelles nous sommes habitués. Voyez à quoi ressemblera cet assemblage.



J'ai déjà créé ce fichier, mais il ressemble généralement à une tentative de création d'Internet entier. J'ai un peu peur de cet assemblage, car je ne suis pas sûr que l'Internet local puisse gérer Ruby. Voyez ce qui s'est passé.



Comment aimez-vous ce volume de 1 Gig? De plus, le fichier source, c'est-à-dire votre application elle-même, ne peut occuper, disons, que 100 Ko. Alors, comment avons-nous obtenu un gigaoctet entier? En effet, nous utilisons des outils inefficaces pour créer des applications autonomes. Tous sont conçus pour fonctionner sur des ordinateurs et utiliser des bibliothèques dynamiques chargées à partir de l'environnement externe.

Nous allons maintenant essayer de faire ce que nous faisons sur un téléphone mobile - des versions portables d'applications pour lesquelles il existe un contrat entre vous et l'infrastructure. Dès que nous aurons un tel contrat, nous serons en mesure de dire exactement au système ce qu'il doit faire, et il ne se souciera pas de ce qu'il doit faire.

Vous n'avez aucune application spéciale spécialement créée. Je suis tombé sur des entreprises qui disent: «nous avons une application spéciale!». Je dis: "Imaginons ce qu'il fait: il démarre, se lie au port, reçoit du trafic, fait quelque chose avec les données", et ils sont: "Wow, comment savez-vous cela?" Je sais, car il n'y a rien de spécial ici!

Ainsi, nous prenons l'échantillon que nous avons placé dans le conteneur et l'envoyons au serveur API. Ensuite, nous devons transformer cela en quelque chose qui fonctionnera sur notre machine. Cependant, afin de collecter des ressources de la machine, nous devons installer plusieurs choses: un runtime de conteneur pour le fichier Docker, un agent qui comprend comment communiquer avec l'assistant afin d'exécuter tout le nécessaire, quelle devrait être la réponse du système pour que l'application commence à fonctionner . Cet agent observe simplement - il n'y a pas d'intervalle de 30 secondes, des contrôles répétés, rien de tel. Il observe simplement en disant: «s'il y a du travail pour moi, faites-le moi savoir, je vais commencer et je vous informerai en permanence de l'état d'avancement du processus», afin que vous sachiez qu'il fonctionne.



Dès que nous le faisons en voiture, nous avons besoin d'un planificateur. Combien de personnes utilisent le planificateur? Vous devez tous lever la main! C'est la même chose que la réponse à la question: "Lequel d'entre vous a un ordinateur portable avec plus d'un processeur monocœur?". En effet, lorsque je pose une question sur le planificateur, la plupart ne lèvent pas la main.

Lorsque vous démarrez votre processus sur une machine, quelque chose devrait choisir le processeur à utiliser. Qui fait ce travail? C'est vrai, le noyau. Je vais maintenant vous expliquer ce qu'est un planificateur. Le moyen le plus rapide de le faire est de jouer à Tetris. La première chose dont nous allons discuter est le déploiement automatique.



Combien d'entre vous ont utilisé un déploiement entièrement automatique? De toute évidence, je pense que c'est pourquoi nous sommes tous ici. Donc, j'appuie sur le bouton, les blocs commencent à tomber d'en haut, et maintenant vous pouvez aller prendre une bière. Mais remarquez ce qui se passe à gauche et à droite: votre processeur et votre mémoire se transforment en poubelle.



Cela se produit car la plupart des gens n'utilisent pas plus de 5% des ressources informatiques. Vous automatisez les processus, mais perdez une tonne d'argent. Je travaille en tant que fournisseur de cloud, j'ai d'énormes réserves de ressources, mais c'est tout simplement horrible lorsque les gens dépensent de l'argent de la même manière.

Lorsque vous utilisez le planificateur, par analogie avec Tetris, contrôlez le terrain de jeu et contrôlez chaque bloc, en le dirigeant au bon endroit, c'est-à-dire, utilisez les ressources de la machine de la manière la plus optimale. Kubernetes utilise pour cela deux algorithmes. L'algorithme principal s'appelle Bin Packing - le même «Tetris» aidera à le comprendre. Kubernetes reçoit une charge de travail de différentes formes et tailles, et notre tâche est de l'emballer dans des machines de manière optimale.

Notre objectif est de réutiliser toutes les ressources qui deviennent disponibles au fur et à mesure de l'avancement des travaux. Toutes les charges de travail ne sont pas identiques, il est donc difficile de les mettre dans la même boîte. Mais dans Kubernetes, lorsqu'un «morceau» de la charge de travail apparaît (ou le bloc Tetris, si nous continuons notre analogie), il y a toujours le bon cluster où vous pouvez le placer et l'exécuter. Et comme pour tout traitement par lots, une fois la tâche terminée, nous récupérons toutes les ressources précédemment occupées afin de pouvoir les utiliser pour de futures tâches.

Puisque nous ne vivons pas dans le jeu, mais dans le monde réel, vous avez développé des solutions il y a de nombreuses années. Ensuite, vous devenez administrateur système, les employeurs vous montrent leur production et vous remarquez que leur déploiement n'est pas suffisant.



Vous pouvez installer des gestionnaires de cluster sur des parties de vos machines et les laisser gérer certaines ressources. Dans ce cas particulier, vous pouvez utiliser Kubernetes, qui commencera à remplir les espaces vides de votre Tetris à mesure que vous avancerez.
Que ceux qui travaillent dans l'industrie lèvent la main. Oui, c'est un classique appelé salaire. Supposons que vous rencontriez plusieurs problèmes dans votre entreprise. La première est que tout est écrit en Java ou même en COBOL - généralement personne n'est prêt pour cela.

Le deuxième problème souvent rencontré dans les entreprises est le SGBD Oracle. C'est une telle chose, qui est située à l'arrière du logiciel et dit: "N'essayez pas d'automatiser quoi que ce soit!". Si vous automatisez le logiciel, votre coût augmentera. Par conséquent, pas d'automatisation - nous faisons la promotion de notre écosystème de conseil!

Dans de telles circonstances, les gens demandent généralement si Kubernetes peut simplement être utilisé pour résoudre ces problèmes. Je réponds: «non», car dans une situation similaire à la défaite à Tetris, rien ne vous aidera. Vous devez faire autre chose, à savoir utiliser le planificateur.
Maintenant que nous avons un planificateur qui comprend avec succès les charges de travail, vous pouvez simplement tout mettre dans des boîtes et le planificateur commencera son travail.



Parlons des entités clés de Kubernetes. Premièrement, ce sont des pods Pods, qui sont une collection de conteneurs. Dans la plupart des cas, une application se compose de plusieurs composants. Vous pouvez vous attacher une application écrite sans scripts Java, mais vous voudrez peut-être utiliser nginx pour terminer TLS et juste un proxy en arrière-plan de l'application, puis ces choses devraient être connectées ensemble, car ce sont des dépendances codées en dur. Une dépendance faiblement couplée est une base de données que vous mettez à l'échelle indépendamment.



La deuxième chose importante est le Replication Controller, qui est un gestionnaire des processus se produisant dans le cluster Kubernetes. Il vous permet de créer plusieurs instances de foyers et de surveiller leur état.

Lorsque vous dites que vous souhaitez démarrer un processus, cela signifie qu'il fonctionnera tout le temps quelque part dans le cluster.

Le troisième élément important est le Service, un ensemble de foyers collaboratifs. Votre déploiement est basé sur la détermination dynamique de l'état souhaité - où les applications doivent fonctionner, avec quelle adresse IP, etc., vous avez donc besoin d'une certaine forme de service.

Le quatrième élément est les référentiels Volumes, qui peuvent être vus comme des répertoires disponibles pour les conteneurs dans l'âtre. Kubernetes possède différents types de volumes qui déterminent comment ce magasin est créé et ce qu'il contient. Le concept de volume était également présent dans Docker, mais le problème était que le stockage y était limité à un foyer spécifique. Dès que under a cessé d'exister, Volume a disparu avec lui.

Le stockage créé par Kubernetes n'est limité à aucun conteneur. Il prend en charge tout ou partie des conteneurs déployés à l'intérieur du foyer. Un avantage clé de Kubernetes Volume est sa prise en charge de divers types de stockage que Pod peut utiliser simultanément.

Voyons ce qu'est un conteneur. Il s'agit du format d'image dans lequel notre application avec toutes les dépendances est compressée, et la configuration principale de l'environnement d'exécution, montrant comment cette application devrait fonctionner. Ce sont deux éléments différents, bien que vous puissiez emballer tout ce que vous aimez dans cette chose, en particulier, le système de fichiers racine en tant que fichier tar Tarball compressé qui contient de nombreux fichiers de configuration pour un système spécifique.



Ensuite, nous pouvons effectuer la distribution, un processus que vous connaissez tous - RPM ou un autre système de référentiel est utilisé ici. Vous prenez toutes ces choses et les mettez dans le référentiel. Ce processus est très similaire à ce que nous faisons avec les packages OS, uniquement pour les conteneurs créés à partir d'images.



Pod vous permet de composer tout ce dont notre application logique a besoin. Une application logique est un outil de gestion de plusieurs applications dans le même profil système. Un sous-ensemble est un package de ressources qui comprend un ou plusieurs conteneurs et stockages, un espace de noms commun et une adresse IP par sous-marin. Les coffres peuvent être répartis entre les conteneurs.



En général, la conception du foyer ressemble à une machine virtuelle. Il garantit que l'application démarrera et s'arrêtera en tant qu'unité atomique. La diapositive suivante montre à quoi ressemble le contrôleur de réplication. Si j'envoie cette déclaration au serveur et dis: «Hé, je veux qu'une réplique de l'application Foo fonctionne!», Le contrôleur la créera à partir du modèle et l'enverra au planificateur, qui placera l'application sur le nœud 1. Nous ne précisons sur quelle machine il doit fonctionner, bien que nous puissions le faire. Augmentez maintenant le nombre de répliques à 3.



Quelles actions attendez-vous du système si l'une des machines tombe en panne? Dans ce cas, le contrôleur de réplication amènera l'état actuel du système à l'état souhaité, en le déplaçant sous le conteneur de la troisième machine non fonctionnelle à la seconde.



Vous n'avez pas besoin de vous plonger dans ce processus et de le diriger - en confiant le travail au contrôleur, vous pouvez être sûr que le travail des applications sera correctement assuré en surveillant constamment les changements dans l'état actuel de l'infrastructure et en prenant des décisions qui garantissent le fonctionnement du système.

Ces choses sont en avance sur leur temps - vous dites simplement au système: "Je veux que ces trois machines fonctionnent!", Et c'est là que votre contrôle s'arrête. Cette approche est très différente de l'écriture de scripts et de l'automatisation pure, lorsque vous avez vraiment besoin de gérer ce qui se passe en ce moment pour influencer la décision future. Vous ne pouvez pas codifier tout cela sans avoir la possibilité de recevoir les informations entrantes afin de répondre correctement à la situation. L'approche décrite ci-dessus vous offre cette opportunité.
Comment imaginez-vous la configuration - le concept de fichiers de configuration pour les services? Beaucoup de gens sont silencieux sur ce problème quand il s'agit de conteneurs, mais nous avons encore besoin de configuration, il ne disparaît nulle part!

Kubernetes utilise également le concept Secrets, qui est utilisé pour stocker et transférer des données chiffrées entre les gestionnaires et les nœuds Nods.

Nous n'exécutons jamais Puppet dans un conteneur car il n'y a aucune raison de le faire. Vous pouvez utiliser Puppet pour générer un fichier de configuration, mais vous souhaitez toujours le stocker dans Kubernetis car il vous permet de le distribuer à l'aide du runtime. Voyons à quoi ça ressemble.



Dans cet exemple, nous créons un secret à partir d'un fichier et l'enregistrons sur le serveur API Kubernetes. Vous pouvez imaginer que vous avez remplacé cette partie par quelque chose comme Puppet, qui utilise le modèle eRB et des données cachées pour remplir le contenu du secret - peu importe qui le fait, mais vous pouvez le faire quand même.

Une fois le secret en place, il peut servir de lien pour créer un déploiement qui dit: «Je veux utiliser ce secret!» Dans ce cas, Kubernetes effectue les opérations suivantes.



Il crée un pod, prend les données du secret, les place dans un système de fichiers temporaire et les présente comme un conteneur, tout comme Puppet crée une copie sur une machine. Cela suit le cycle de vie de l'application et lorsque l'application meurt, la configuration disparaît avec elle. Si vous avez besoin de 10 000 instances d'application, vous devrez créer et injecter dans moins de 10 000 systèmes de fichiers temporaires.

Les services vous permettent d'exécuter tous ces éléments dans un cluster et de les synchroniser avec un autre point de terminaison. En fait, un service est un groupe de foyers qui fonctionnent comme un seul foyer. Il contient une adresse IP et un port permanents, fournit une intégration dans DNS, utilise l'équilibrage de charge et est mis à jour lorsque le micrologiciel change.



Voyons maintenant la collaboration des composants conceptuels de Kubernetes. Nous avons des briques et des configurations Lego qui doivent interagir les unes avec les autres. Si vous avez l'intention d'exécuter une base de données dans un cluster, vous pouvez vraiment le faire sur Kubernetes. Beaucoup disent que vous ne pourrez pas exécuter des applications avec état dans des conteneurs, mais c'est complètement faux.

Si vous pensez au fonctionnement des hyperviseurs, vous pouvez comprendre qu'ils font presque la même chose que vous: créer une machine virtuelle, le planificateur la déplace vers l'hyperviseur et attache le stockage. Parfois, vous travaillez avec un stockage local qui provient de l'hyperviseur, et il n'y a aucune raison pour que les conteneurs ne puissent pas faire de même.

Cependant, le problème avec les conteneurs est que la plupart des gens ne sont pas habitués à avoir une liste explicite de chemins de fichiers qu'ils doivent fournir à l'application. La plupart des gens ne pourront pas vous dire exactement les appareils et les fichiers dont l'entrepôt de données a besoin. Ils emballent tout dans des conteneurs, et en conséquence, rien de bon n'en sort. Par conséquent, ne croyez pas que les conteneurs ne sont pas capables d'exécuter des applications économisant l'état - vous pouvez très bien le faire.



Sur la diapositive, vous voyez un exemple de Ruby-on-Rails, et avant de pouvoir utiliser notre application, nous devons migrer la base de données. Passons à la démo en direct du programme. Afin d'effectuer le déploiement, j'utilise MY_SQL, et vous voyez beaucoup de données à l'écran.



Je vous montre tout cela parce qu'en tant qu'administrateur système, vous devez comprendre beaucoup de choses. Dans ce déploiement, j'affine certaines des métadonnées de mon application, mais la chose principale que je vais souligner en gris: je veux démarrer 1 copie de l'application mysql et utiliser la version 5.6.32 du conteneur mysql.



Notez que je sélectionne ici un secret de Kubernetes en tant que liens, que dans ce cas je vais injecter en tant que variables d'environnement. Plus tard, je vous montrerai un autre cas lorsque nous les insérerons dans le système de fichiers. Ainsi, je n'ai pas besoin de "cuire" des secrets dans ma configuration. La prochaine ligne importante est le bloc de ressources.



Vous ne pouvez pas jouer à Tetris tant que vous ne connaissez pas la taille des blocs. De nombreuses personnes commencent à se déployer sans utiliser de limites de ressources pour ce processus. En conséquence, la RAM est complètement obstruée et vous "empilez" tout le serveur.

22:09 min

A suivre très prochainement ...


Un peu de publicité :)


Merci de rester avec nous. Aimez-vous nos articles? Vous voulez voir des matériaux plus intéressants? Soutenez-nous en passant une commande ou en recommandant à vos amis des VPS basés sur le cloud pour les développeurs à partir de 4,99 $ , un analogue unique de serveurs d'entrée de gamme que nous avons inventés pour vous: Toute la vérité sur les VPS (KVM) E5-2697 v3 (6 cœurs) 10 Go DDR4 480 Go SSD 1 Gbit / s à partir de 19 $ ou comment diviser le serveur? (les options sont disponibles avec RAID1 et RAID10, jusqu'à 24 cœurs et jusqu'à 40 Go de DDR4).

Dell R730xd 2 fois moins cher au centre de données Equinix Tier IV à Amsterdam? Nous avons seulement 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV à partir de 199 $ aux Pays-Bas!Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - à partir de 99 $! En savoir plus sur la création d'un bâtiment d'infrastructure. classe c utilisant des serveurs Dell R730xd E5-2650 v4 coûtant 9 000 euros pour un sou?

All Articles