Kubernetes, qu'est-ce que c'est ?
Kubernetes, k8s (pour k, 8 caractères, s) ou encore « kube », est une plateforme Open Source qui automatise l'exploitation des conteneurs Linux. Elle permet d'éliminer de nombreux processus manuels associés au déploiement et à la mise à l'échelle des applications conteneurisées. En d'autres termes, Kubernetes vous aide à gérer facilement et efficacement des clusters au sein desquels vous aurez rassemblé des groupes d'hôtes exécutant des conteneurs Linux. Ces clusters peuvent couvrir des hôtes situés dans des clouds publics, privés ou hybrides.
À l'origine, la plateforme Kubernetes a été développée et conçue par des ingénieurs chez Google. Google était l'un des premiers contributeurs aux technologies de conteneurs Linux, et a d'ailleurs expliqué publiquement que tout dans l'entreprise fonctionnait dans des conteneurs (il s'agit de la technologie à la base des services cloud de Google). Google déploie plus de 2 milliards de conteneurs par semaine via une plateforme interne nommée Borg. Cette plateforme est la « grande sœur » de Kubernetes et toute l'expérience acquise au fil des ans lors du développement de Borg a servi de fondation à la technologie Kubernetes.
Le saviez-vous ? Les sept rayons du logo Kubernetes font référence au nom d'origine du projet, « Project Seven of Nine ».
Red Hat était l'une des premières entreprises à travailler avec Google sur le projet Kubernetes et ce, bien avant son lancement. Red Hat est d'ailleurs devenu son deuxième contributeur principal.
Google a fait don du projet Kubernetes en 2015 à la toute récente Cloud Native Computing Foundation (CNCF).
Pourquoi avez-vous besoin de Kubernetes ?
Les véritables applications de production s'étendent sur plusieurs conteneurs, des conteneurs qui doivent être déployés sur différents hôtes serveur. Kubernetes vous offre les outils d'orchestration et de gestion requis pour déployer des conteneurs, à grande échelle, pour ces charges de travail. Les fonctionnalités d'orchestration de Kubernetes vous permettent de créer des services applicatifs sur plusieurs conteneurs, de planifier l'exécution de ces conteneurs dans un cluster, de les mettre à l'échelle et de gérer leur intégrité au fil du temps.
Kubernetes doit pouvoir s'intégrer aux services de mise en réseau, de stockage, de sécurité, de télémétrie, entre autres, pour fournir une infrastructure de conteneurs complète.
Bien sûr, tout dépend de la manière dont vous utilisez les conteneurs dans votre environnement. Une application de conteneurs Linux rudimentaire les traite comme des machines virtuelles rapides et efficaces. Mais une fois que vous évoluez vers un environnement de production et multipliez le nombre d'applications, surgit le besoin de plusieurs conteneurs colocalisés qui fonctionnent ensemble pour fournir des services individuels. Le nombre de conteneurs dans votre environnement augmente alors significativement et l'accumulation de ces conteneurs complexifie votre infrastructure.
Kubernetes vous permet de résoudre de nombreux problèmes courants liés à la prolifération des conteneurs en les triant au sein d'un « Pod ». Ces Pods ajoutent une couche d'abstraction aux groupes de conteneurs, ce qui vous aide à planifier les charges de travail et à fournir les services nécessaires (réseau, stockage, etc.) à ces conteneurs. D'autres composants de Kubernetes vous aident à équilibrer la charge sur ces Pods et à vous assurer que vous disposez de suffisamment de conteneurs pour exécuter vos charges de travail.
Que pouvez-vous faire avec Kubernetes ?
Le principal avantage de la technologie Kubernetes est qu'elle vous offre une plateforme dédiée à la planification et à l'exécution de conteneurs sur des clusters de machines physiques ou virtuelles. Autrement dit, elle vous aide à mettre en œuvre et à utiliser une infrastructure de conteneurs dans vos environnements de production. Kubernetes vise avant tout l'automatisation des tâches opérationnelles, c'est pourquoi cette technologie vous permet d'effectuer un grand nombre de tâches que d'autres plateformes d'applications et systèmes de gestion vous permettent déjà de faire, mais pour vos conteneurs.
Avec Kubernetes, vous pouvez :
- orchestrer des conteneurs sur plusieurs hôtes ;
- optimiser l'utilisation de votre matériel afin de maximiser les ressources requises pour l'exécution de vos applications d'entreprise ;
- contrôler et automatiser les déploiements et mises à jour d'applications ;
- monter et ajouter des systèmes de stockage pour exécuter des applications avec état ;
- mettre à l'échelle des applications conteneurisées et leurs ressources à la volée ;
- gérer des services de façon déclarative et garantir ainsi que les applications déployées s'exécutent toujours de la manière dont vous les avez déployées ;
- vérifier l'intégrité de vos applications et les réparer automatiquement grâce au placement, au démarrage, à la réplication et à la mise à l'échelle automatiques.
Pour vous offrir des services orchestrés de qualité optimale, Kubernetes s'appuie sur d'autres projets. Ces projets Open Source complémentaires vous permettront de tirer pleinement parti de Kubernetes. Voici quelques-unes des pièces maîtresses de Kubernetes :
- Registre : Atomic Registry ou Docker Registry
- Réseau : Open vSwitch et routage périphérique intelligent
- Télémétrie : Heapster, Kibana, Hawkular ou Elastic
- Sécurité : LDAP, SELinux, RBAC et OAUTH avec les couches multi-clients
- Automatisation : ajout de playbooks Ansible pour la gestion de l'installation et du cycle de vie du cluster
- Services : catalogue riche en modèles d'applications populaires pré-créés
Kubernetes architecture
Kubernetes est basé sur une architecture client-serveur. Par défaut, Kubernetes est composé d'un Master qui joue le rôle de contrôleur de Node et de point de contact.
Pour de la haute disponibilité, un cluster est composé de 3, 5 ou 7 Master.
Le Master est constitué de plusieurs composants :
- kube-apiserver
- stockage etcd
- kube-controller-manager
- cloud-controller-manager
- kube-scheduler
- serveur DNS
Le Node est constitué de :
- Kubelet
- Kube-proxy
- Container Runtime
Kubernetes suit une architecture client-serveur. Il est possible d’avoir une configuration multi-maîtres (pour une haute disponibilité), mais il existe par défaut un seul serveur maître qui joue le rôle de nœud de contrôle et de point de contact. Le serveur maître est constitué de divers composants, notamment un kube-apiserver, un stockage etcd, un kube-controller-manager, un cloud-controller-manager, un kube-scheduler et un serveur DNS pour les services Kubernetes. Les composants de nœud incluent kubelet et kube-proxy au-dessus de Docker.
Kubernetes language
À l'instar de toute technologie, Kubernetes dispose d'une terminologie propre. Pour vous aider à mieux appréhender Kubernetes, voyons ensemble les termes les plus courants.
Composants Master
Les composants Master fournissent le plan de contrôle (control plane) du cluster. Les composants Master prennent des décisions globales à propos du cluster (par exemple, la planification (scheduling)). Ils détectent et répondent aux événements du cluster (par exemple, démarrer un nouveau Pod lorsque le champ replicas d’un déploiement n’est pas satisfait).
Les composants Master peuvent être exécutés sur n’importe quelle machine du cluster. Toutefois, par soucis de simplicité, les scripts de mise en route démarrent typiquement tous les composants master sur la même machine et n’exécutent pas de conteneurs utilisateur sur cette machine. Voir Construire des Clusters en Haute Disponibilité pour une configuration d’exemple en multi-master-VM.
kube-apiserver Composant sur le master qui expose l’API Kubernetes. Il s’agit du front-end pour le plan de contrôle Kubernetes.
Il est conçu pour une mise à l’échelle horizontale, ce qui veut dire qu’il met à l’échelle en déployant des instances supplémentaires. Voir Construire des Clusters en Haute Disponibilité.
etcd Base de données clé-valeur consistante et hautement disponible utilisée comme mémoire de sauvegarde pour toutes les données du cluster.
Si votre cluster Kubernetes utilise etcd comme mémoire de sauvegarde, assurez-vous d’avoir un plan de back up pour ces données.
Vous pouvez trouver plus d’informations à propos d’etcd dans la documentation officielle.
kube-scheduler Composant sur le master qui surveille les pods nouvellement créés qui ne sont pas assignés à un nœud et sélectionne un nœud sur lequel ils vont s’exécuter.
Les facteurs pris en compte pour les décisions de planification (scheduling) comprennent les exigences individuelles et collectives en ressources, les contraintes matérielles/logicielles/politiques, les spécifications d’affinité et d’anti-affinité, la localité des données, les interférences entre charges de travail et les dates limites.
kube-controller-manager Composant du master qui exécute les contrôleurs.
Logiquement, chaque contrôleur est un processus à part mais, pour réduire la complexité, les contrôleurs sont tous compilés dans un seul binaire et s’exécutent dans un seul processus.
Ces contrôleurs incluent :
- Node Controller : Responsable de détecter et apporter une réponse lorsqu’un nœud tombe en panne.
- Replication Controller : Responsable de maintenir le bon nombre de pods pour chaque objet ReplicationController dans le système.
- Endpoints Controller : Remplit les objets Endpoints (c’est-à-dire joint les Services et Pods).
- Service Account & Token Controllers : Créent des comptes par défaut et des jetons d’accès à l’API pour les nouveaux namespaces.
cloud-controller-manager
Le cloud-controller-manager exécute les contrôleurs qui interagissent avec les fournisseurs cloud sous-jacents. Le binaire du cloud-controller-manager est une fonctionnalité alpha introduite dans la version 1.6 de Kubernetes.
Le cloud-controller-manager exécute seulement les boucles spécifiques des fournisseurs cloud. Vous devez désactiver ces boucles de contrôleurs dans le kube-controller-manager. Vous pouvez désactiver les boucles de contrôleurs en définissant la valeur du flag –cloud-provider à external lors du démarrage du kube-controller-manager.
Le cloud-controller-manager permet au code du fournisseur cloud et au code de Kubernetes d’évoluer indépendamment l’un de l’autre. Dans des versions antérieures, le code de base de Kubernetes dépendait du code spécifique du fournisseur cloud pour la fonctionnalité. Dans des versions ultérieures, le code spécifique des fournisseurs cloud devrait être maintenu par les fournisseurs cloud eux-mêmes et lié au cloud-controller-manager lors de l’exécution de Kubernetes.
Les contrôleurs suivants ont des dépendances vers des fournisseurs cloud :
- Node Controller : Pour vérifier le fournisseur de cloud afin de déterminer si un nœud a été supprimé dans le cloud après avoir cessé de répondre
- Route Controller : Pour mettre en place des routes dans l’infrastructure cloud sous-jacente
- Service Controller : Pour créer, mettre à jour et supprimer les load balancers des fournisseurs cloud
- Volume Controller : Pour créer, attacher et monter des Volumes, et interagir avec le fournisseur cloud pour orchestrer les volumes.
Composants Node
Les composants de nœud (Node components) s’exécutent sur chaque nœud, en maintenant les pods en exécution et en fournissant l’environnement d’exécution Kubernetes.
kubelet Un agent qui s’exécute sur chaque nœud du cluster. Il s’assure que les conteneurs fonctionnent dans un pod.
Le kubelet prend un ensemble de PodSpecs fournis par divers mécanismes et s’assure du fonctionnement et de la santé des conteneurs décrits dans ces PodSpecs. Le kubelet ne gère que les conteneurs créés par Kubernetes.
kube-proxy kube-proxy est un proxy réseau qui s’exécute sur chaque nœud du cluster et implémente une partie du concept Kubernetes de Service.
kube-proxy maintient les règles réseau sur les nœuds. Ces règles réseau permettent une communication réseau vers les Pods depuis des sessions réseau à l’intérieur ou à l’extérieur du cluster.
kube-proxy utilise la couche de filtrage de paquets du système d’exploitation s’il y en a une et qu’elle est disponible. Sinon, kube-proxy transmet le trafic lui-même.
Container Runtime L’environnement d’exécution de conteneurs est le logiciel responsable de l’exécution des conteneurs.
Kubernetes est compatible avec plusieurs environnements d’exécution de conteneur: Docker, containerd, cri-o, rktlet ainsi que toute implémentation de Kubernetes CRI (Container Runtime Interface).
Annexe
https://github.com/kubernetes/sig-release/tree/master/releases
https://v1-16.docs.kubernetes.io/fr/docs/reference/kubectl/kubectl/
https://www.cncf.io/blog/2019/01/14/9-kubernetes-security-best-practices-everyone-must-follow/
https://cloud.google.com/solutions/best-practices-for-operating-containers?hl=fr
https://kubernetes.io/docs/reference/
https://kubernetes.io/fr/docs/concepts/overview/what-is-kubernetes/
https://kubernetes.io/docs/concepts/overview/components/
https://kubernetes.io/fr/docs/concepts/services-networking/ingress/
CI/CD : https://github.com/keel-hq/keel
https://www.hebergeurcloud.com/les-objets-et-autres-composants-kubernetes/
https://medium.com/faun/kubernetes-architecture-85ad2999882a
https://www.gekko.fr/kubernetes-son-architecture/
https://cloud.google.com/kubernetes-engine/docs/concepts/cluster-architecture?hl=fr
https://blog.wescale.fr/2018/05/31/introduction-a-helm/
helm - gestionnaire de package : http://blog.gsagnard.fr/comprendre-helm-le-package-manager-de-kubernetes/
# List all pods in ps output format. kubectl get pods
# List all pods in ps output format with more information (such as node name). kubectl get pods -o wide
# List a single replication controller with specified NAME in ps output format. kubectl get replicationcontroller web
# List deployments in JSON output format, in the "v1" version of the "apps" API group: kubectl get deployments.v1.apps -o json
# List a single pod in JSON output format. kubectl get -o json pod web-pod-13je7
# List a pod identified by type and name specified in "pod.yaml" in JSON output format. kubectl get -f pod.yaml -o json
# Return only the phase value of the specified pod.
kubectl get -o template pod/web-pod-13je7 --template={{.status.phase}}
# List all replication controllers and services together in ps output format. kubectl get rc,services
# List one or more resources by their type and names. kubectl get rc/web service/frontend pods/web-pod-13je7