Kubernetes est une plate-forme open source pour gérer des applications conteneurisées dans un groupe de machines physiques ou virtuelles. L'inspiration originale pour Kubernetes était le système Borg de Google. Borg est un système de gestion de cluster qui gère des centaines de milliers d'emplois et d'applications dans des centres de données Google massifs. Kubernetes était destiné à être une version plus conviviale du système de gestion des cluster que tout le monde pouvait utiliser.
La popularité des conteneurs dans le processus de développement logiciel rend également Kubernetes populaire. Dans l'ancien processus de développement de logiciels, les applications ont été déployées sur des machines hôtes physiques. Les développeurs travaillant sur différentes composants de l'application nécessaire pour maintenir un environnement cohérent. Fonctionnement et personnel informatique nécessaire pour gérer soigneusement les exécutables, les configurations et les bibliothèques. Différentes composantes de l'application pourraient être confrontées à un conflit pendant le processus d'intégration. De plus, le processus était sensible aux erreurs humaines et aux erreurs de communication.
Les machines virtuelles (VM) ont contribué à apporter un certain niveau de fiabilité au processus. Mais il était encore difficile de gérer les applications. De plus, les machines virtuelles sont coûteuses à maintenir. Les conteneurs ont changé le paysage. Avec des conteneurs, il a été possible pour les développeurs travaillant sur différentes composants du même logiciel pour maintenir des environnements séparés. Les conteneurs sont légers, peu coûteux et rapides. Ces avantages ont donné l'idée de développer un logiciel à l'aide de microservices où chaque conteneur sert une tâche spécifique pour l'application.
Avec la montée en puissance de l'utilisation des conteneurs, Kubernetes est devenu un outil efficace pour planifier et exécuter les applications entre les clusters. En tant que plate-forme, il peut libérer les développeurs du fardeau de la gestion de tout type de machines. Au lieu de concevoir des infrastructures centrées sur l'hôte avec des considérations de machines physiques ou virtuelles, les développeurs peuvent commencer à concevoir pour une infrastructure centrée sur les conteneurs. Kubernetes fournit la couche d'abstraction nécessaire.
Partie 1: Concepts
Les composants principaux sont les services de contrôle du cluster. Ces composants gèrent les décisions et les événements mondiaux. Tout nœud dans le cluster peut les exécuter. Cependant, attribuer des nœuds particuliers à ces composants est considéré comme une bonne pratique.
kube-apiserver
Le Kube-apiserver sert l'API Kubernetes. L'API Kubernetes implémente une interface reposante. Il fonctionne comme le pont entre divers composants Kubernetes comme les gousses, les services, les contrôleurs de réplication et autres. Il est responsable de la cohérence de la communication entre le magasin ETCD et les conteneurs déployés.
etcd
L'ETCD est responsable du stockage de toutes les données de cluster Kubernetes. Le projet ETCD a été développé par l'équipe CoreOS. Il s'agit d'un magasin de valeurs de clé légère et distribué qui utilise une API HTTP / JSON. Les nœuds du cluster peuvent utiliser les données de configuration de l'ETCD pour découvrir les services et se remettre des états défaillants. En raison de l'importance des données, etcd doit être sauvegardé correctement.
kube-contrôleur-manager
Le Kube-Controller-Manager gère divers contrôleurs pour fournir des services différents. Par exemple, les contrôleurs de nœuds récupérent les nœuds défaillants et les contrôleurs de réplication maintiennent le nombre correct de gousses. Chaque contrôleur s'exécute comme un thread séparé et dépend des informations etcd pour effectuer leurs tâches.
contrôleur de cloud
Le cloud-contrôleur-manager fournit des contrôleurs spécifiques au nuage. Il peut être désactivé dans le kube-contrôleur-manager. Le cloud-contrôleur-manager a été séparé du noyau pour permettre au noyau de Kubernetes d'évoluer indépendamment du code spécifique du fournisseur de cloud. Dans le passé, les dépendances causaient des problèmes.
kube
Le Kube-Scheduler est responsable de la distribution de la charge de travail. Il garde une trace des exigences des ressources et attribue des nœuds pour les pods nouvellement créés. Il s'occupe également de la qualité des exigences de service.
addons
Les addons sont des pods et des services utilisés pour implémenter des fonctionnalités de cluster. Les utilisateurs peuvent utiliser le gestionnaire complémentaire pour créer et maintenir des addons. Certains addons importants et utiles sont le DNS, l'interface utilisateur Web (tableau de bord), la surveillance des ressources de conteneurs et la journalisation au niveau du cluster.
Une machine de travailleur à Kubernetes est appelée un nœud. Les composants de nœud sont présents dans chaque nœud et ils gèrent différents aspects de la charge de travail.
kublet
Le service KubElet sur chaque nœud est l'agent principal. Il garde une trace des pods attribués à son nœud via un apiseur ou un fichier de configuration local. Il communique avec les composants maîtres pour découvrir les demandes de travail et signaler l'état de son nœud.
kube
Le Kube-Proxy est un petit service proxy sur chaque nœud pour traiter la sous-réseau hôte individuel. Il peut effectuer un équilibrage de la charge rudimentaire pour TCP et UDP.
docker
Kubernetes dépendent principalement de Docker pour exécuter des conteneurs. Il est capable de créer des applications à partir d'images Docker.
rkt
Kubernetes prend également en charge les conteneurs RKT. Le soutien est actuellement expérimental.
supervisord
Le supervisord peut être utilisé pour surveiller et contrôler les kubelets et les conteneurs Docker.
couramment
Le Fluentd est un Deamon pour fournir une journalisation de niveau Custer.
Les charges de travail de Kubernetes peuvent être définies comme suit:
Gousses
Une pod est une unité fondamentale de la charge de travail de Kubernetes. Les conteneurs ne sont pas individuellement affectés aux hôtes. Les groupes de conteneurs, appartenant généralement à une application, sont représentés comme un pod et le pod est ensuite déployé sur l'hôte en une seule unité. Bien sûr, un pod ne peut contenir qu'un seul conteneur. Ceci est généralement plus courant à Kubernetes. Cependant, les conteneurs sont regroupés en fonction des besoins en ressources et en application. Le regroupement est destiné à optimiser le partage des ressources.
Contrôleurs
Les contrôleurs comme les ensembles de répliques, le contrôleur de réplication, les déploiements, les ensembles avec état, la collecte des ordures et les travaux CRON aident à gérer les charges de travail Kubernetes. Les contrôleurs de réplication gèrent le nombre de pods. Il démarre et termine des gousses pour maintenir le nombre correct de gousses en cours d'exécution. Le contrôleur de déploiement aide à modifier les pods et les objets de déploiement pour atteindre l'état de déploiement souhaité.
Prestations de service
Les gousses de kubernetes sont créées et détruites régulièrement. Il est donc difficile de les suivre par les adresses IP. La nature dynamique des gousses les rend difficiles à communiquer entre eux. Un service fonctionne comme une abstraction. Il fournit la politique pour atteindre un ensemble logique de gousses. Dans Kubernetes, un service est un objet de repos. Les services simplifient la conception des conteneurs.
Étiquettes
Les étiquettes sont un moyen puissant de garder une trace et de gérer des groupes de composants de travail. Les étiquettes sont des paires de valeurs clés qui fonctionnent comme des étiquettes arbitraires pour aider à obtenir un contrôle plus fin sur les différentes fonctions du système.
Partie 2: Projet pratique
Minikube est un binaire qui configure un seul cluster Kubernetes sur une machine locale. Dans ce projet, un nœud.L'application JS sera transformée en une image de conteneur Docker et l'image sera exécutée sur Minikube.
Installation de minikube, kubectl, hyperviseur, nodejs et docker
Vous pouvez installer l'outil de ligne de commande minikube et kubernetes kubectl sur Mac OS X, Linux et Windows avec divers hyperviseurs. Les instructions pour différents systèmes d'exploitation sont disponibles ici. En outre, vous aurez besoin de Nodejs installés sur votre machine pour exécuter l'exemple d'application Helloworld. Vous pouvez installer Docker ici.
Démarrer un cluster
Utilisez la commande suivante pour démarrer un cluster:
$ minikube commencer à démarrer Kubernetes local v1.7.5 Cluster… Démarrage de VM… Téléchargement Minikube ISO 106.36 Mb / 106.36 Mo [==========================================.00% 0S Obtenir l'adresse IP de machine virtuelle… les fichiers de déménagement dans le cluster… configurer des certificats… se connecter au cluster… configurer kubeconfig… Démarrer les composants du cluster… Kubectl est maintenant configuré pour utiliser le cluster.
Utilisez la commande ci-dessous pour voir si le cluster s'exécute correctement:
$ kubectl cluster-info kubernetes maître s'exécute sur https: // 192.168.99.100: 8443
Créer une image d'application
Créons un serveur.Fichier JS avec le contenu suivant:
var http = require ('http'); |
var handlerequest = fonction (request, réponse) |
console.Log ('Demande reçue pour URL:' + demande.url); |
réponse.Writehead (200); |
réponse.fin ('Hello World!'); |
; |
var www = http.CreateServer (handlerequest); |
www.Écoutez (8080); |
Vous pouvez exécuter la commande suivante:
$ serveur de nœud.js
Et vérifiez si le serveur s'exécute sur http: // localhost: 8080. Tu devrais voir «Hello World!»Texte sur la page Web.
Convertir en conteneur Docker
Dans le même répertoire que le serveur.JS Créez un fichier dockerfile avec le texte suivant:
Du nœud: 6.9.2 |
Exposer 8080 |
Copier le serveur.js . |
Serveur de nœuds CMD.js |
Le dockerfile créera une image qui commencera à partir du nœud: 6.9.2 image sur le hub docker.
Nous voulons exécuter les images docker localement. Ainsi, la commande suivante indiquera à Docker d'utiliser Minikube Deamon pour le stockage d'images Docker:
$ eval $ (minikube docker-env)
Vous pouvez utiliser eval $ (minikube docker-env -u) pour le changer par défaut.
Construisons maintenant l'image Docker:
$ docker build -t my-node: v1 . Envoi du contexte de construction à Docker Daemon 3.072KB Étape 1: du nœud: 6.9.2 6.9.2: Tirer de la bibliothèque / nœud 75A822CD7888: Pull complet 57DE64C72267: Pull complet 4306BE1E8943: Pull complet 871436AB7225: Pull complet 0110C26A367A: Pull complet 1F04FE713F1B: Pull complet AC7C0B5FB553 60FAF429D6C97D928C762CB36F1940F4456CE4BD33FBDC34DE94A5E043 Statut: téléchargeée Image plus récente pour le nœud: 6.9.2 ---> FAAADB4AAF9B Étape 2: Expose 8080 ---> Exécution dans DA7D251B3FD5 ---> 881F9FB69B2C Suppression du conteneur intermédiaire DA7D251B3FD5 Étape 3: Copier le serveur.js . ---> 0ACF61D9E75E Suppression du conteneur intermédiaire 3A4025539CF6 Étape 4: serveur de nœuds CMD.JS ---> Running in 8aa9a4cbd723 ---> 41445e5c48fe Suppression du conteneur intermédiaire 8AA9A4CBD723 Construit avec succès 41445E5C48FE
Déploier dans le cluster
Pour déployer mon nœud: v1, exécutez la commande suivante:
$ kubectl run my-node --image = my-node: v1 --port = 8080 déploiement "my-node" créé
Il créera un pod sur le cluster. Nous pouvons vérifier les statuts de pod avec les commandes suivantes:
$ kubectl obtenir les déploiements nom souhaité
$ kubectl get gods nom statut Ready Restarts Âge My-node-276881918-QTH5S 1/1 Exécution 0 1M
$ kubectl obtenir des événements LastSeen PremierSeen Nom Nom Kind Sous-Object Type Raison Message source 32m 32m 1 Node minikube normal Démarrage Kube-Proxy, Minikube Démarrage de Kube-Proxy. 32m 32m 1 nœud minikube kubelet de démarrage normal, minikube de démarrage. 32M 32M 2 NODE MINIKUBE NODE NODEHASSUFFIENTSIDSK KUBELET, Minikube Node Minikube Status est maintenant: NodeHassufficientDisk 32M 32M 2 MINIKUBE NODE NODEHASSUFFIENTSMEMORY KUBELET, MINIKUBE NODE MINIKUBE STAT Ubelet, Minikube Node Minikube Le statut est maintenant: Nodehasnodiskpressure 32m 32m 1 nœud minikube normal nodeallocatable forcé kubelet, minikube à mise à jour limite allocatiable à travers les pods 32m 32m 1 nœud minikube normal regritsnode ContrôleManager nœud minikube event: nœud inscripteur nodecready kudelef Le statut de nœud Ube est maintenant: NODEREADY 6M 6M 1 NODE MINIKUBE NODE NORMAL REPROST NODE NODE MINIKUBE ÉVÉNEMENT: NODE RECHERCHÉ MINIKUBE DANS NODECONTROLLER 5M 5M 1 NODE MINIKUBE NODE KUBUBLET NORMAL,minikube de départ kublet. 5m 5m 1 nœud minikube normal nodeallocatiable forcé kubelet, minikube à jour limite allocative de nœud à travers les pods 5m 5m 1 nœud minikube nœud nodehassufficient disk kubelet, minikube minikube Le statut est maintenant: nodehassufficientmemory 5m 5m 1 minikube Node Normal NodeHasNoDiskPressure kubelet, minikube Node minikube status is now: NodeHasNoDiskPressure 5m 5m 1 minikube Node Normal NodeNotReady kubelet, minikube Node minikube status is now: NodeNotReady 5m 5m 1 minikube Node Normal Starting kube-proxy, minikube Starting kube-proxy. 5m 5m 1 nœud minikube normal NODEREADY KUBELET, MINIKUBE NODE MINIKUBE L'état est maintenant: NodeDeady 2M 2M 1 MY-NODE-276881918-QTH5S POD POD NORMAL PLANDÉ Prévu de défaut -276881918-QTH5S POD NORMAL SUCCHEMOUNTVOLUME KUBELET, MINIKUBE MOUNTVOLUME.La configuration a réussi pour le volume "par défaut-R5Pl1" 2m 2m 1 My-Node-276881918-QTH5S POD Spec spec.conteneurs my-node kubelet tiré normal, image de conteneur minikube "My-node: v1" déjà présent sur la machine 2m 2m 1 my-node-276881918-qth5s pod spec spec spec spec spec spec spec spec spec.conteneurs my-node kubelet créé normal, récipient créé minikube 2m 2m 1 my-node-276881918-qth5s pod spec spec.conteneurs my-node kubelet démarré normal, minikube démarré 2m 2m 1 my-node-276881918 répliquant normal réussi repré Réplica Up Set my-node-276881918
Créer un service
Un pod est inaccessible. Vous devez créer un service pour rendre le pod accessible au monde. La commande suivante doit créer le service nécessaire:
$ kubectl exposer le déploiement my-node --type = service de chargement "My-node" exposé
Vous pouvez vérifier l'état du service comme ceci:
$ kubectl obtenir le nom des services Cluster-IP Port (s) Port (s) IP (s) Age Kubernetes 10.0.0.1443 / TCP 34M MY-NODE 10.0.0.213 8080: 31460 / TCP 31S
Si vous utilisez la commande suivante, elle ouvrira le service sur un navigateur Web:
$ MINIKUBE SERVICE MY-NODE OUVRIR KUBERNETES Service par défaut / My-Node dans le navigateur par défaut…
Vous pouvez vérifier ce qui se passe dans votre pod avec la commande «journaux» - kubectl journaux [nameofthepod].
$ kubectl journaux my-node-276881918-qTH5S Reçu demande d'URL: demande de demande d'URL: / favicon.ICO
Les journaux ci-dessus affichent les demandes faites au serveur.Application JS fonctionnant sur le cluster.
Nettoyer
Vous pouvez supprimer le service et le pod avec les commandes suivantes:
$ kubectl supprimer le service my-node du service "my-node" supprimé $ kubectl delete déploiement my-node [/ code] déploiement "my-node" supprimé
Vous pouvez arrêter le minikube:
$ minikube stop stopping local kubernetes cluster… la machine s'est arrêtée.
Kubernetes est un vaste système avec des capacités à grande échelle. La documentation de Kubernetes est le meilleur endroit pour en savoir plus sur cette technologie puissante.
Une étude plus approfondie:
Kubernetes Documentation: https: // kubernetes.IO / Docs