Découverte de Kubernetes

Mastering Kubernetes Objets

Objectives

After completing this lesson, you will be able to:
  • Définir objets Kubernetes
  • Répertorier les types d'objets Kubernetes
  • Expliquer comment les objets Kubernetes sont organisés dans des espaces noms
  • Décrire comment les objets Kubernetes sont définis et identifiés

Objets Kubernetes

Introduction

Vous avez déjà appris les composants de base d'un cluster Kubernetes. Dans cette leçon, vous allez découvrir les objets Kubernetes et comment ils fonctionnent ensemble.

Que sont les objets Kubernetes ?

Les objets Kubernetes sont des entités qui sont rendues persistantes dans le cluster Kubernetes. Plus précisément, elles sont conservées dans le stockage à valeur clé etcd. Les objets Kubernetes peuvent représenter un large éventail de ressources différentes, telles que les modules, les services, les déploiements, etc.

Ces objets sont définis à l'aide du format YAML ou JSON et peuvent être gérés à l'aide de l'API Kubernetes RESTful, qui est exposée par le composant kube-apiserver du plan de contrôle Kubernetes. Cela signifie que vous pouvez créer, mettre à jour, supprimer et interroger des objets à l'aide de l'API.

Voici un exemple de demande d'extraction d'informations sur un objet Pod :

Code Snippet
1
GET https://<kubernetes-cluster>.com/api/v1/namespaces/<namespace>/pods/<pod-name>

Chaque objet Kubernetes est défini dans un fichier de configuration au format YAML ou JSON. Le fichier de configuration contient la spécification de l'objet de manière déclarative. Cela vous permet de définir l'état souhaité de l'objet. Kubernetes vérifie alors de façon permanente si l'état réel de l'objet correspond à l'état souhaité. Si ce n'est pas le cas, Kubernetes tente de faire correspondre l'état réel à l'état souhaité. C'est ce que l'on appelle la boucle de rapprochement.

Un objet Kubernetes Pod simple est déclaré comme suit :

YAML
12345678
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: nginx:1.21.3

Découvrons les différentes parties de l'objet Pod :

  • La zone apiVersion indique la version de l'API Kubernetes utilisée pour définir l'objet. Chaque objet peut avoir différentes versions d'API.
  • Le champ kind indique le type de l'objet Kubernetes.
  • La zone de métadonnées contient les métadonnées de l'objet.
  • La zone Spécification contient la spécification de l'objet. La zone de spécification est différente pour chaque type d'objet. Par exemple, la zone Spécification d'un objet Pod contient la spécification des conteneurs qui font partie du pod.

Il s'agit des zones obligatoires d'un objet Kubernetes. Cependant, vous pouvez également ajouter des zones supplémentaires à l'objet.

L'objet décrit ci-dessus crée un Pod portant le nom my-pod qui contient un seul conteneur portant le nom my-container. Le conteneur utilise l'image nginx dans la version 1.21.3.

Types de différents objets Kubernetes

Il y a quelques objets de base que vous pouvez trouver dans presque tous les clusters de Kubernetes. Voir une synthèse des objets Kubernetes les plus importants :

Pods

Comme introduit précédemment, les pods sont les plus petites unités déployables dans Kubernetes et sont un enveloppeur mince autour d'un ou plusieurs conteneurs. Les modules sont toujours planifiés vers des nœuds. Les modules peuvent être créés, mis à jour et supprimés à l'aide de l'API Kubernetes.

L'exécution de plusieurs conteneurs dans un seul pod est un anti-motif. La raison principale est qu'il rend la mise à l'échelle et la mise à jour des conteneurs plus difficiles. Il est également plus difficile de gérer les conteneurs car ils sont étroitement couplés. Par exemple, un Pod exécute deux conteneurs, comme un serveur Web et une base de données. Si vous souhaitez mettre à l'échelle le serveur Web, vous devez également mettre à l'échelle la base de données, même si cela n'est pas nécessaire.

Cependant, il existe plusieurs scénarios courants dans lesquels il est judicieux d'exécuter plusieurs conteneurs dans un seul pod. Par exemple, si vous voulez exécuter un conteneur sidecar qui fournit des fonctionnalités supplémentaires au conteneur principal, telles que la journalisation, la surveillance ou le trafic proxy. Nous examinerons les injections de sidecar plus en détail plus tard, alors que nous regardons les mailles de service avec Istio.

Module Kubernetes avec un conteneur principal et un conteneur sidecar pour le proxy, la journalisation et le suivi. Exemple de pod nommé my-pod comprend un récipient nginx et un conteneur sidecar.

Services

Les services regroupent un ensemble de modules et fournissent un point d'entrée stable pour y accéder. Le Service dans le diagramme suivant offre également des fonctionnalités d'équilibrage de charge qui répartissent le trafic entre plusieurs modules. Les modules sont regroupés à l'aide d'étiquettes et de sélecteurs, que nous examinerons plus tard.

Kubernetes architecture avec deux nœuds. Chaque nœud contient un service et plusieurs modules. Chaque boîte comprend un conteneur principal et un conteneur side-car.

Cela est particulièrement utile lorsqu'une application est mise à l'échelle pour s'exécuter sur plusieurs modules d'un cluster, car le service peut efficacement regrouper et fournir un point d'entrée stable pour y accéder.

Astuce

Un service Kubernetes expose les modules d'application en tant que service réseau avec un nom DNS et une adresse IP cohérents à l'intérieur d'un cluster Kubernetes. Pour exposer le service Kubernetes interne à Internet, vous devez créer la ressource personnalisée APIRule. Cette approche est similaire à la création d'itinéraires dans l'exécution Cloud Foundry. Vous en apprendrez plus sur l'exposition des services dans le chapitre Découverte des services à Kubernetes.
ReplicaSets

ReplicaSet est un ensemble de modules d'un type spécifique qui s'exécutent à l'échelle du cluster à tout moment. Le ReplicaSet garantit que le nombre souhaité de modules est toujours en cours d'exécution. Si un module est supprimé, le ReplicaSet crée un nouveau module pour le remplacer. Cette validation est effectuée dans la boucle de rapprochement, qui compare l'état souhaité (le nombre de modules) à l'état réel (le nombre de modules en cours d'exécution). Les ReplicaSets sont un bon moyen d'assurer la haute disponibilité des applications et d'utiliser les capacités d'auto-guérison de Kubernetes.

Remarque

Il est également important de savoir que le ReplicaSet ne possède pas les Pods. Au lieu de cela, il est responsable de s'assurer que le nombre souhaité de modules est en cours d'exécution. Si vous supprimez un module, le ReplicaSet crée un nouveau module pour le remplacer. Vous pouvez également supprimer le ReplicaSet sans supprimer les modules.
Diagramme d'architecture Kubernetes montrant deux nœuds, chacun avec un service. Le ReplicaSet contient trois modules, chacun avec un conteneur et un sidecar. Le service s'étend sur les nœuds.

Déploiements

Les déploiements sont une abstraction de haut niveau en plus des ReplicaSets. Vous pouvez utiliser Déploiements pour définir de manière déclarative le statut souhaité de votre application. Cela inclut le nombre de répliques, les images du conteneur et d'autres configurations. Les déploiements gèrent les ReplicaSets et les ReplicaSets gèrent les Pods.

Avec Déploiements, vous pouvez déployer de nouvelles versions de votre application. Un tel déploiement est réalisé de manière très contrôlée. Le déploiement crée un ReplicaSet à côté de l'ancien. Ensuite, il lance un nouveau ReplicaSet et l'adapte au nombre de répliques souhaité. Une fois que le nouveau ReplicaSet est opérationnel, il commence à réduire l'ancien ReplicaSet. Cela garantit qu'au moins un ReplicaSet est toujours en cours d'exécution. C'est ce que l'on appelle une mise à jour continue et c'est une fonctionnalité puissante des Déploiements, car il s'agit d'un moyen sûr de déployer de nouvelles versions de vos applications sans temps d'arrêt (Déploiement Zero Downtime).

Diagramme illustrant un déploiement de Kubernetes avec un ReplicaSet gérant trois modules. Chaque pod contient un conteneur principal et un conteneur Sidecar.

Astuce

Pour appliquer un déploiement dans Kyma, utilisez la commande kubectl apply -f deployment.yaml. Cette commande est similaire à la commande cf push dans l'exécution Cloud Foundry. Cependant, dans Kubernetes, le déploiement doit inclure des informations sur l’artefact (image Docker). La création et le stockage des artefacts ne sont pas requis dans l'exécution Cloud Foundry.

Remarque

Il existe de nombreux autres objets Kubernetes, dont certains seront abordés plus tard dans ce cours. Kubernetes est, en fait, également extensible. Vous pouvez définir vos objets personnalisés et étendre l'API Kubernetes à l'aide des CRD (Custom Resource Definitions).

Pour en savoir plus sur d'autres objets ou CRD, consultez la documentation officielle de Kubernetes.

Organisation des objets Kubernetes dans les espaces noms

Dans un cluster Kubernetes, chaque objet doit avoir un nom unique dans son espace nom. En d'autres termes, vous ne pouvez pas avoir deux modules avec le même nom dans un seul espace nom, mais vous pouvez avoir des modules avec le même nom s'ils se trouvent dans des espaces noms différents. Les espaces noms sont un moyen de regrouper des objets Kubernetes et de fournir une séparation logique des objets. Cette séparation permet d'exécuter deux versions différentes de votre application exécutées en parallèle ou permet à différentes équipes de travailler au sein d'un même cluster sans interférer entre elles. Vous pouvez également limiter l'accès aux espaces de noms sélectionnés pour fournir uniquement un sous-ensemble du cluster à certains utilisateurs.

Dans un cluster Kubernetes, il existe un espace de noms par défaut appelé default. Cet espace nom est utilisé si vous n'indiquez aucun espace nom dans votre définition d'objet ou votre demande API. Vous pouvez également créer vos propres espaces noms.

Identification des objets Kubernetes avec étiquettes et sélecteurs

Chaque objet Kubernetes peut être étiqueté avec des paires clé-valeur. Les étiquettes sont utilisées pour identifier les objets. Par exemple, vous pouvez étiqueter tous les modules d'une application particulière avec l'étiquette app: my-app.

Voici un exemple de la manière dont les services regroupent des modules. Les Services utilisent des sélecteurs d'étiquettes pour identifier les Modules qui doivent faire partie du Service. Un sélecteur d'étiquettes est une requête utilisée pour sélectionner des objets en fonction de leurs étiquettes. Par exemple, le sélecteur d'étiquettes app: my-app sélectionne tous les modules avec l'étiquette app: my-app.

Vous pouvez définir des étiquettes dans la section des métadonnées de la définition d'objet :

YAML
12345678910
apiVersion: v1 kind: Pod metadata: name: my-pod labels: app: my-app spec: containers: - name: my-container image: nginx

Annotations

Les annotations sont similaires aux étiquettes, mais, contrairement aux étiquettes, les annotations ne sont pas utilisées pour identifier, filtrer ou sélectionner des objets. Les annotations enrichissent l'objet avec des métadonnées sémantiques. En règle générale, différents outils utilisent des annotations pour stocker des détails supplémentaires sur l'objet.

Synthèse

Vous pouvez maintenant faire la distinction entre les différents objets Kubernetes et leur objectif. Vous savez également comment ils sont liés les uns aux autres et comment ils peuvent être étiquetés et regroupés dans des espaces noms.

En savoir plus sur les objets Kubernetes