Ce que j’ai compris dans la documentation, c’est que kubectl s’applique = kubectl create + kubectl replace . référence
D'après ce que je comprends, si je veux créer une nouvelle ressource k8s dans le cluster, je devrais utiliser l'opération kubectl create . Maintenant, si je veux mettre à jour quelque chose dans une ressource K8 en direct, je devrais utiliser l'opération kubectl replace .
Si je veux faire les deux opérations (créer une nouvelle ressource k8s ainsi que mettre à jour les ressources k8s actives), alors je devrais utiliser kubectl apply opération
Mes questions sont Pourquoi existe-t-il trois opérations pour effectuer la même tâche dans un cluster? Quels sont les cas d'utilisation de ces opérations? Comment se différencient-ils les uns des autres sous le capot?
Pour le moment, j'utilise l'opération kubectl create pour créer de nouvelles ressources dans le cluster. Merci
Ce sont deux approches différentes. 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, mais pas comment vous voulez que le monde de votre cluster K8 ressemble.
kubectl apply
fait partie de l’approche gestion déclarative , dans laquelle les modifications que vous avez éventuellement appliquées à un objet actif (c.-à-d. à scale
) sont conservées même si vous apply
autres modifications apportées à l'objet.
Vous pouvez en savoir plus sur la gestion impérative et déclarative dans la documentation Kubernetes Object Management .
Lors de l'exécution dans un script de CI, vous aurez des problèmes avec les commandes impératives car create génère une erreur si la ressource existe déjà.
Ce que vous pouvez faire est de appliquer (modèle déclaratif) la sortie de votre commande impérative, en utilisant les options --dry-run=true
et -o yaml
:
kubectl create whatever --dry-run=true -o yaml | kubectl apply -f -
La commande ci-dessus ne générera 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 du registre docker).
Juste pour donner une réponse plus directe, si je comprends bien:
apply
- apporte des modifications incrémentiellescreate
- écrase toutes les modifications
En prenant ceci d'un article de DigitalOcean qui était lié au site Web de Kubernetes:
Nous utilisons appliquer au lieu de créer ici afin de pouvoir appliquer à l'avenir des modifications incrémentielles aux objets Ingress Controller au lieu de les écraser complètement.
L'explication ci-dessous tirée du documentation officielle m'a aidée à comprendre kubectl apply
.
Cette commande compare la version de la configuration que vous avez poussée avec la version précédente et applique les modifications que vous avez apportées, sans écraser les modifications automatisées apportées aux propriétés que vous n'avez pas spécifiées.
kubectl create
quant à lui créera (devrait être non existant) des ressources.