J'ai créé un pod avec kubectl create -f pod.xml
et kubectl apply -f pod.xml
en utilisant le yaml ci-dessous et je ne vois aucune différence, un pod est créé avec les deux commandes. Le document K8S , mentionne les commandes impératives et déclaratives. Mais, la création et l'application se comportent toujours de la même manière.
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
Quelle est la différence? En outre, comment kubectl apply
déclaratif et kubectl create
impératif? Les deux prennent un ou plusieurs fichiers yaml avec les détails de l'objet.
Il existe une différence subtile entre les commandes kubectl create
Et kubectl apply
.
La commande kubectl create
Crée une nouvelle ressource. Ainsi, si la commande est réexécutée, elle générera une erreur car les noms de ressources doivent être uniques dans un espace de noms.
kubectl get pods
No resources found.
kubectl create -f pod.xml
pod/myapp-pod created
kubectl create -f pod.xml
Error from server (AlreadyExists): error when creating "pod.xml": pods "myapp-pod" already exists
2) La commande kubectl apply
Applique la configuration à une ressource. Si la ressource n'est pas là, elle sera créée. La commande kubectl apply
Peut être exécutée la deuxième fois car elle applique simplement la configuration comme indiqué ci-dessous. Dans ce cas, la configuration n'a pas changé. Donc, le pod n'a pas changé.
kubectl delete pod/myapp-pod
pod "myapp-pod" deleted
kubectl apply -f pod.xml
pod/myapp-pod created
kubectl apply -f pod.xml
pod/myapp-pod unchanged
Dans le kubectl create
, Nous spécifions une certaine action, dans ce cas create
et c'est donc impératif. Dans la commande kubectl apply
, Nous spécifions l'état cible du système et ne spécifions pas une certaine action et donc déclarative. Nous laissons le système décider des mesures à prendre. Si la ressource n'est pas là, elle la créera, si la ressource est là, elle appliquera la configuration à la ressource existante.
Du point de vue de l'exécution, il n'y a aucune différence lorsqu'une ressource est créée pour la première fois entre kubectl create
Et kubectl apply
Comme indiqué ci-dessus. Mais, la deuxième fois, kubectl create
Générera une erreur.
Il m'a fallu un certain temps pour m'en sortir, mais cela a du sens maintenant.
En termes simples, create
et apply
sont essentiellement les mêmes si vous exécutez l'opération sur un seul fichier pour créer des ressources. Cependant, apply
vous permet de créer et d'appliquer des correctifs en même temps sur plusieurs fichiers dans un répertoire.
Il y a aussi un apply
pour supprimer les ressources d'un répertoire mais il est en alpha au moment de l'écriture:
kubectl apply -f <directory/> --Prune -l your=label)
Il y a aussi plus d'informations sur cette question: Kubectl applique vs kubectl crée?
Ce sont deux approches différentes. kubectl create est ce que nous appelons Imperative Management . Dans cette approche, vous indiquez à l'API Kubernetes ce que vous souhaitez créer, remplacer ou supprimer, et non à quoi vous voulez que votre monde de cluster K8 ressemble.
kubectl apply fait partie de l'approche Declarative Management , où les modifications que vous avez pu appliquer à un objet vivant (c'est-à-dire à l'échelle) sont conservées même si vous appliquez d'autres modifications à l'objet.
Vous pouvez en savoir plus sur la gestion impérative et déclarative dans la documentation Kubernetes Object Management .