kubectl apply
et kubectl create
les deux sont deux approches différentes pour créer des ressources dans l'environnement de cluster Kubernetes.
Ils créent tous les deux des ressources à partir d'un fichier ou de STDIN.
kubectl apply and create :deux approches pour créer des ressources
Passons maintenant aux détails et comprenons en quoi kubectl apply et create diffèrent l'un de l'autre lors de la mise en œuvre.
kubectl create :gestion impérative
kubectl create
c'est ce que nous appelons la gestion impérative. Dans cette approche, vous indiquez à l'API Kubernetes ce que vous souhaitez créer, remplacer ou supprimer.
En termes plus simples, create
crée un tout nouvel objet (précédemment inexistant ou supprimé).
kubectl apply :gestion déclarative
kubectl apply
fait partie de l'approche de gestion déclarative, où les modifications que vous avez pu appliquer à un objet actif (c'est-à-dire via scale
) sera "maintenu " même si vous apply
autres modifications de l'objet.
En termes plus simples, apply
- apporte des modifications incrémentielles à un objet existant en définissant ce dont nous avons besoin.
REMARQUE : Les approches de création et d'application de kubectl acceptent les formats de fichiers JSON et YAML.
Comprendre la différence entre kubectl create et apply avec exemple
Je vais utiliser le fichier YAML ci-dessous pour créer un pod Kubernetes.
[email protected]:~/pod-create# cat mypod.yml
apiVersion: v1
kind: Pod
metadata:
name: create-vs-apply-demo
labels:
app: front-end
rel: dev
spec:
containers:
- name: httpd
image: docker.io/httpd
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
Créons le pod de manière impérative, c'est-à-dire en utilisant kubectl create
commande :
[email protected]:~/pod-create# kubectl create -f mypod.yml
pod/create-vs-apply-demo created
Répertoriez l'état du pod avec les libellés :
[email protected]:~/pod-create# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
create-vs-apply-demo 1/1 Running 0 8s app=front-end,rel=dev
Je vais maintenant modifier le fichier YAML et y ajouter une étiquette supplémentaire (démo : applyVscreate).
[email protected]:~/pod-create# cat mypod.yml
apiVersion: v1
kind: Pod
metadata:
name: create-vs-apply-demo
labels:
app: front-end
rel: dev
demo: applyVscreate
spec:
containers:
- name: httpd
image: docker.io/httpd
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
Maintenant, utilisons à nouveau l'approche impérative pour appliquer les modifications.
[email protected]:~/pod-create# kubectl create -f mypod.yml
Error from server (AlreadyExists): error when creating "mypod.yml": pods "create-vs-apply-demo" already exists
Il génère une erreur et indique que la ressource existe déjà.
Faisons maintenant la même opération en utilisant une approche déclarative, c'est-à-dire kubectl apply
commande.
[email protected]:~/pod-create# kubectl apply -f mypod.yml
pod/create-vs-apply-demo configured
Ainsi, la ressource a été configurée cette fois. Vérifiez les modifications apportées.
[email protected]:~/pod-create# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
create-vs-apply-demo 1/1 Running 0 3m19s app=front-end,demo=applyVscreate,rel=dev
Vous pouvez voir que la nouvelle étiquette a été appliquée au pod.
Je pense que vous devriez maintenant avoir une compréhension claire des deux approches.
Kubectl créer ou appliquer ? Lequel utiliser ?
Cela dépend du cas d'utilisation de la manière dont vous souhaitez utiliser ces concepts ou cette méthodologie. Il ne s'agit pas de savoir lequel est bon ou mauvais.
Si vous souhaitez contrôler la version l'objet k8s alors il vaut mieux utiliser déclaratif (kubectl apply) qui aide à déterminer l'exactitude des données dans les objets k8s.
Et si vous souhaitez simplement créer une ressource à des fins de dépannage, d'apprentissage ou d'expérimentation interactive aller avec impératif approche (kubectl create).
Encore confus? Laissez un commentaire et j'essaierai de répondre à vos doutes.
Rakesh Jain
DevOps Professionnel | RHCA | Jenkins | Gite | Docker | Kubernetes | Ansible | Prométhée | Grafane | Nuage AWS