web-dev-qa-db-fra.com

Différence entre «kubectl appliquer» et «kubectl créer»

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.

8
Praveen Sripati

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.

16
Praveen Sripati

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?

4
Rico

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 .

0
Sunil Gajula