428 votes

kubectl apply vs kubectl create ?

Ce que j'ai compris de la documentation, c'est que :

  • kubectl create \= Crée une nouvelle ressource k8s dans le cluster
  • kubectl replace \= Mise à jour d'une ressource dans le cluster live
  • kubectl appliquer \= Si je veux faire une création + remplacement ( Référence )

Mes questions sont les suivantes

  1. Pourquoi y a-t-il trois opérations pour effectuer la même tâche dans un cluster ?
  2. Quels sont les cas d'utilisation de ces opérations ?
  3. Comment diffèrent-ils les uns des autres sous le capot ?

476voto

Ara Pulido Points 2482

Ce sont deux approches différentes :

Gestion impérative

kubectl create est ce que nous appelons Gestion impérative . Avec cette approche, vous indiquez à l'API Kubernetes ce que vous voulez créer, remplacer ou supprimer, et non pas comment vous voulez que le monde de votre cluster K8s ressemble.

Gestion déclarative

kubectl apply fait partie de la Gestion déclarative où les changements que vous avez appliqués à un objet vivant (c'est-à-dire par le biais de l'utilisation de l'outil de gestion de l'information) ne sont pas pris en compte. scale ) sont " maintenu " même si vous apply d'autres modifications de l'objet.

Pour en savoir plus sur la gestion impérative et déclarative, consultez le site Web de la Commission européenne. Gestion des objets Kubernetes documentation.

28 votes

Lequel doit être utilisé en production alors ?

14 votes

@YogeshJilhawar Les deux méthodes sont valables pour travailler en production.

2 votes

Donc, en substance, c'est comme une modification complète de l'objet par rapport à un patch partiel ?

87voto

Sébastien Dan Points 384

Lors de l'exécution dans un CI script, vous aurez des difficultés avec les commandes impératives telles que créer soulève une erreur si la ressource existe déjà.

Ce que vous pouvez faire, c'est en appliquant (modèle déclaratif) la sortie de votre commande impérative, en utilisant --dry-run=true et -o yaml options :

kubectl create whatever --dry-run=true -o yaml | kubectl apply -f -

La commande ci-dessus ne soulèvera pas d'erreur si la ressource existe déjà (et mettra à jour la ressource si nécessaire).

Ceci est très utile dans certains cas où vous ne pouvez pas utiliser le modèle déclaratif (par exemple lors de la création d'un secret de docker-registry).

1 votes

Alternativement, supprimez la ressource avant de la créer, avec --ignore-not-found drapeau. Cela ne soulèvera pas AlreadyExists erreur. Par exemple : kubectl delete deployment nginx --ignore-not-found; kubectl create deployment nginx --image=nginx

3 votes

Je parierais que de nombreuses personnes qui répondent à cette question recherchent en fait quelque chose comme ce qui précède. C'est tellement idiomatique à ce stade qu'on devrait simplement l'incorporer dans kubectl .

2 votes

--dry-run est déprécié et peut être remplacé par --dry-run=client

49voto

User9123 Points 196

Juste pour donner une réponse plus directe, d'après ce que j'ai compris :

apply - apporte des modifications incrémentielles à un objet existant
create - crée un tout nouvel objet (précédemment inexistant / supprimé)

D'après un Article de DigitalOcean qui était lié par le site web de Kubernetes :

Nous utilisons apply au lieu de create ici afin de pouvoir, à l'avenir, appliquer progressivement les modifications aux objets du contrôleur d'accès au lieu de les écraser complètement.

0 votes

Est-ce que c'est ? comme lorsque nous utilisons docker-compose : + utiliser apply comme docker-compose up -d + utilisation create comme docker-compose up -d --build ?

5 votes

Je pense qu'il est important de préciser que apply créera quand même l'objet s'il n'existe pas.

19voto

Zoe Li Points 28

Ce sont commandes impératives :

kubectl run = kubectl create deployment

Avantages :

  • Simple, facile à apprendre et facile à retenir.
  • Nécessite une seule étape pour apporter des modifications au cluster.

Inconvénients :

  • Ne s'intègre pas aux processus de révision des changements.
  • Ne pas fournir de piste d'audit associée aux changements.
  • Ne fournissez pas de source d'enregistrements sauf pour ce qui est en direct.
  • Ne fournissez pas de modèle pour la création de nouveaux objets.

Ce sont Configuration de l'objet impératif :

kubectl create -f your-object-config.yaml

kubectl delete -f your-object-config.yaml

kubectl replace -f your-object-config.yaml

Avantages par rapport aux commandes impératives :

  • Peut être stocké dans un système de contrôle de source tel que Git.
  • Peut s'intégrer à des processus tels que l'examen des changements avant la diffusion et les pistes d'audit.
  • Fournit un modèle pour la création de nouveaux objets.

Inconvénients par rapport aux commandes impératives :

  • Requiert une compréhension de base du schéma d'objet.
  • Nécessite l'étape supplémentaire d'écriture d'un fichier YAML.

Avantages par rapport à la configuration déclarative des objets :

  • Plus simple et plus facile à comprendre.
  • Plus mature après la version 1.5 de Kubernetes.

Inconvénients par rapport à la configuration déclarative des objets :

  • Fonctionne mieux sur les fichiers, pas sur les répertoires.
  • Les mises à jour des objets vivants doivent être reflétées dans les fichiers de configuration, sinon elles seront perdues lors du prochain remplacement.

Ce sont des objets déclaratifs de configuration

kubectl diff -f configs/

kubectl apply -f configs/

Avantages par rapport à la configuration impérative des objets :

  • Les modifications apportées directement aux objets vivants sont conservées, même si elles ne sont pas réintégrées dans les fichiers de configuration.
  • Meilleure prise en charge des opérations sur les répertoires et détection automatique des types d'opérations (création, correction, suppression) par objet.

Inconvénients par rapport à la configuration impérative des objets :

  • Plus difficile de déboguer et de comprendre les résultats lorsqu'ils sont inattendus.
  • Les mises à jour partielles utilisant les diffs créent des opérations complexes de fusion et de correction.

0 votes

Cette réponse aurait besoin d'une mise à jour. kubectl run crée des pods maintenant.

3voto

f01 Points 21

L'explication ci-dessous de la documentation officielle m'a aidé à comprendre kubectl apply .

Cette commande comparera la version de la configuration que vous poussez avec la version précédente et appliquera les modifications que vous avez apportées, sans écraser les modifications automatiques des propriétés que vous n'avez pas spécifiées.

kubectl create d'autre part, créera des ressources (qui devraient être inexistantes).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X