Quelle est la différence entre un pod et un déploiement?

241

J'ai créé des pods avec type:deploymentmais je vois que certaines documentations utilisent type:pod, plus spécifiquement la documentation des pods multi-conteneurs :

apiVersion: v1
kind: Pod
metadata:
  name: ""
  labels:
    name: ""
  namespace: ""
  annotations: []
  generateName: ""
spec:
  ? "// See 'The spec schema' for details."
  : ~

Mais pour créer des pods, je peux simplement utiliser un type de déploiement :

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: ""
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: ""
    spec:
      containers:
        etc

J'ai remarqué que la documentation du pod indique:

La commande create peut être utilisée pour créer un pod directement, ou elle peut créer un ou des pods via un déploiement. Il est fortement recommandé d'utiliser un déploiement pour créer vos pods. Il surveille les pods défaillants et démarre de nouveaux pods si nécessaire pour maintenir le nombre spécifié. Si vous ne voulez pas qu'un déploiement surveille votre pod (par exemple, votre pod écrit des données non persistantes qui ne survivront pas à un redémarrage, ou votre pod est destiné à être de courte durée), vous pouvez créer un pod directement avec la commande create.

Remarque: Nous vous recommandons d'utiliser un déploiement pour créer des modules. Vous ne devez utiliser les instructions ci-dessous que si vous ne souhaitez pas créer de déploiement.

Mais cela soulève la question de savoir à quoi kind:podbon? Pouvez-vous en quelque sorte référencer des pods dans un déploiement? Je n'ai vu aucun moyen. Il semble que ce que vous obtenez avec les pods soit des métadonnées supplémentaires, mais aucune des options de déploiement telles que replicaou une politique de redémarrage. À quoi sert un pod qui ne conserve pas les données, survit à un redémarrage? Je pense que je serais également en mesure de créer un pod multi-conteneurs avec un déploiement.

Bjorn
la source

Réponses:

191

Pod et Deployment sont des objets à part entière dans l'API Kubernetes. Le déploiement gère la création de pods au moyen de ReplicaSets. Cela revient à dire que le déploiement créera des pods avec des spécifications tirées du modèle. Il est assez peu probable que vous ayez besoin de créer des pods directement pour un cas d'utilisation de production.

Radek 'Goblin' Pieczonka
la source
7
Merci, mais quand créeriez-vous des pods directement?
Bjorn
11
Avoir un contrôleur personnalisé est un cas où vous souhaitez probablement créer et gérer des pods directement, au lieu d'utiliser l'une des abstractions de niveau supérieur.
Anirudh Ramanathan
24
@BjornTipling Je crée des pods sans déploiement lorsque je n'ai pas besoin de kubernetes pour recréer des pods lorsqu'ils sont supprimés. Un cas d'utilisation consiste à tester les choses en créant d'abord un module.
user2526795
243

La réponse de Radek est très bonne, mais je voudrais m'appuyer sur mon expérience, vous n'utiliserez presque jamais un objet avec le pod de type , car cela n'a aucun sens dans la pratique.

Parce que vous avez besoin d'un objet de déploiement - ou d'autres objets de l'API Kubernetes comme un contrôleur de réplication ou un jeu de réplicas - qui doit garder les réplicas (pods) en vie (c'est un peu l'intérêt d'utiliser kubernetes).

Ce que vous utiliserez dans la pratique pour une application typique sont:

  1. Objet de déploiement (où vous spécifierez le ou les conteneurs de vos applications) qui hébergera le conteneur de votre application avec d'autres spécifications.

  2. Objet de service (qui est comme un objet de regroupement et lui donne une IP dite virtuelle (IP de cluster) pour ceux podsqui ont une certaine étiquette - et ce podssont essentiellement les conteneurs d'applications que vous avez déployés avec l'ancien objet de déploiement ).

Vous devez avoir l' objet de service , car l' podsobjet de déploiement peut être tué, augmenté et réduit, et vous ne pouvez pas vous fier à leurs adresses IP car elles ne seront pas persistantes.

Vous avez donc besoin d'un objet comme un service , qui leur donne podsune IP stable.

Je voulais juste vous donner un peu de contexte podspour que vous sachiez comment les choses fonctionnent ensemble.

J'espère que cela vous éclaircira, il n'y a pas si longtemps j'étais à votre place :)

Tomislav Mikulin
la source
1
Bonne réponse, avons-nous besoin d'un replicaSet ou d'un ReplicationController parce que j'ai pensé que l'objet Deployment encapsule ces objets contrôlant les réplicas?
user_mda
3
oui, l'objet Deployment gère le jeu de réplicas, mais vous pouvez également utiliser un objet avec le genre: ReplicationController ou kind: ReplicaSet seul si vous le vouliez vraiment, mais je n'en ai pas vu beaucoup dans la pratique ...
Tomislav Mikulin
2
Pourquoi plusieurs documents kubernetes donnent-ils kind: Podl'exemple? Par exemple, Comment consommer des secrets en tant que vars env: kubernetes.io/docs/concepts/configuration/secret/…
rm.rf.etc
1
Je ne suis pas tout à fait sûr, peut-être parce qu'il est plus facile d'expliquer les concepts en k8 ... sans donner le poids des contrôleurs, des déploiements, etc.
Tomislav Mikulin
1
Il y a des cas où vous souhaitez créer un pod, par exemple si vous exécutez un side-car de test (exemple helm test) où vous n'avez pas besoin d'exécuter l'application pour toujours, et nous n'avons pas besoin de plusieurs répliques, dans ce cas, le pod convient.
Balkrishna
61

Kubernetes possède trois types d'objets que vous devez connaître:

  • Pods - exécute un ou plusieurs conteneurs étroitement liés
  • Services - configure la mise en réseau dans un cluster Kubernetes
  • Déploiement - Maintient un ensemble de pods identiques, garantissant qu'ils ont la bonne configuration et que le bon nombre d'entre eux existent.

Pods:

  • Exécute un seul ensemble de conteneurs
  • Bon à des fins de développement ponctuelles
  • Rarement utilisé directement en production

Déploiement:

  • Exécute un ensemble de pods identiques
  • Surveille l'état de chaque module, en le mettant à jour si nécessaire
  • Bon pour le dev
  • Bon pour la production

Et je suis d'accord avec d'autres réponses, oublie les pods et utilise simplement le déploiement. Pourquoi? Regardez le deuxième point, il surveille l'état de chaque module, en le mettant à jour si nécessaire.

Ainsi, au lieu de lutter avec des messages d'erreur tels que celui-ci:

Interdit: les mises à jour des modules ne peuvent pas modifier des champs autres que spec.containers[*].image

Il suffit donc de refactoriser ou de recréer complètement votre pod dans un déploiement qui crée un pod pour faire ce que vous avez besoin de faire. Avec le déploiement, vous pouvez modifier n'importe quel élément de configuration que vous souhaitez et vous n'avez pas à vous soucier de voir ce message d'erreur.

Daniel
la source
9

Pod est une instance de conteneur.

entrez la description de l'image ici

C'est la sortie de replicas: 3

Pensez à un deploymentpeut avoir plusieurs instances en cours d'exécution (réplique).

//deployment.yaml
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: tomcat-deployment222
spec:
  selector:
    matchLabels:
      app: tomcat
  replicas: 3
  template:
    metadata:
      labels:
        app: tomcat
    spec:
      containers:
      - name: tomcat
        image: tomcat:9.0
        ports:
        - containerPort: 8080
serkan
la source
La meilleure réponse jusqu'à présent. Les autres réponses visent à montrer comment les déploiements sont un concept plus important et que vous utilisez rarement les pods en production, mais il manque une information claire sur la façon dont ils sont liés les uns aux autres.
Diego Queiroz
Alors, pouvons-nous nommer le pod comme l'un des répliques du déploiement?
kioria
@kioria, que voulez-vous dire par "répliques de déploiement"?
serkan
@serkan je veux dire ces répliques: 3 de la spécification de déploiement.
kioria
@kioria, replicas: 3références à la partie supérieure de l'image, cela signifie "hé, lorsque vous exécutez ce processus, créez 3 ordinateurs virtuels / réels - instances.". ses «déploiements» similaires sont une maison et les «pods» sont des personnes. Une maison et trois personnes à l'intérieur qui font le travail. Qu'essayez-vous de faire spécifiquement à cela?
serkan
6

Pod est une collection de conteneurs et objet de base de Kuberntes. Tous les conteneurs de pod se trouvent dans le même nœud.

  • Ne convient pas à la production
  • Aucune mise à jour continue

Le déploiement est une sorte de contrôleur dans Kubernetes.

Controllers use a Pod Template that you provide to create the Pods for which it is responsible.

Le déploiement crée un ReplicaSet qui, à son tour, garantit que les CurrentReplicas sont toujours les mêmes que les désiréReplicas.

Avantages:

  • Vous pouvez déployer et annuler vos modifications à l'aide du déploiement
  • Surveille l'état de chaque pod
  • Idéal pour la production
  • Prend en charge les mises à jour continues
Nikhil Kumar
la source
4

Je veux ajouter des informations de livre Kubernetes In Action , afin que vous puissiez voir toutes les images et les relations entre les ressources Kubernetes comme Pod, Deployment et ReplicationController (ReplicaSet)

Pods

sont l'unité déployable de base de Kubernetes. Mais dans les cas d'utilisation réels, vous souhaitez que vos déploiements restent opérationnels automatiquement et restent en bonne santé sans aucune intervention manuelle. Pour cela, l'approche recommandée consiste à utiliser un déploiement , qui sous le capot crée un ReplicaSet .

Un ReplicaSet , comme son nom l'indique, est un ensemble de répliques (Pods) conservées avec leur historique de révision .

(ReplicaSet étend un objet plus ancien appelé ReplicationController - qui est exactement le même mais sans l'historique de révision.)

Un ReplicaSet surveille en permanence la liste des pods en cours d'exécution et s'assure que le nombre de pods correspondant à une certaine spécification correspond toujours au nombre souhaité.

entrez la description de l'image ici

Removing a pod from the scope of the ReplicationController comes in handy
when you want to perform actions on a specific pod. For example, you might 
have a bug that causes your pod to start behaving badly after a specific amount 
of time or a specific event.

Un déploiement

est une ressource de niveau supérieur destinée à déployer des applications et à les mettre à jour de manière déclarative.

Lorsque vous créez un déploiement , une ressource ReplicaSet est créée en dessous (éventuellement plus). Les ReplicaSets répliquent et gèrent également les pods. Lors de l' utilisation d' un déploiement, les gousses réels sont créés et gérés par le déploiement de » les ReplicaSets , non par le déploiement directement entrez la description de l'image ici

Réfléchissons à ce qui s'est passé. En modifiant le modèle de pod dans votre ressource de déploiement, vous avez mis à jour votre application vers une version plus récente, en modifiant un seul champ!

entrez la description de l'image ici

Enfin, annulez un déploiement vers la révision précédente ou vers une révision antérieure si simple avec la ressource de déploiement.

Ces images sont également extraites du livre Kubernetes In Action .

fgul
la source
2

Essayez d'éviter les pods et implémentez plutôt les déploiements pour gérer les conteneurs, car les objets de type pod ne seront pas reprogrammés (ou auto-réparés) en cas de défaillance d'un nœud ou de terminaison de pod.

Un déploiement est généralement préférable car il définit un ReplicaSet pour garantir que le nombre souhaité de pods est toujours disponible et spécifie une stratégie pour remplacer les pods, telle que RollingUpdate.

maelga
la source
1

Dans kubernetes, les pods sont les plus petites unités déployables. Chaque fois que nous créons un objet kubernetes comme les déploiements, les jeux de réplicas, les jeux avec état, les jeux de démons, il crée un pod.

Comme mentionné ci-dessus, les déploiements créent des modules en fonction de l'état souhaité mentionné dans votre objet de déploiement. Donc, par exemple, vous voulez 5 répliques d'une application, vous avez mentionnéreplicas: 5 dans votre manifeste de déploiement. Désormais, le contrôleur de déploiement est chargé de créer 5 répliques identiques (ni moins, ni plus) de l'application donnée avec toutes les métadonnées telles que la stratégie RBAC, la stratégie de réseau, les étiquettes, les annotations, le contrôle d'intégrité, les quotas de ressources, les souillures / tolérances et autres et les associer à chaque pod. ça crée.

Il y a des cas où vous voulez créer un pod, par exemple si vous exécutez un side-car de test où vous n'avez pas besoin d'exécuter l'application pour toujours, vous n'avez pas besoin de plusieurs répliques et vous exécutez l'application lorsque vous souhaitez l'exécuter le boîtier du boîtier convient. Par exemple helm test, qui est une définition de pod qui spécifie un conteneur avec une commande donnée à exécuter.

Balkrishna
la source