Разница между "kubectl apply" и "kubectl создать"

Я создал стручок с kubectl create -f pod.xml а также kubectl apply -f pod.xml используя приведенный ниже yaml, и я не вижу никакой разницы, модуль создается с помощью обеих команд. В документе K8S упоминаются императивные и декларативные команды. Но все же создание и применение ведут себя одинаково.

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']

Какая разница? Кроме того, как это kubectl apply декларативный и kubectl create императив? Оба они берут один или несколько файлов yaml с подробной информацией об объекте.

2 ответа

Существует тонкая разница между kubectl create а также kubectl apply команды.

kubectl create Команда создает новый ресурс. Таким образом, если команда будет выполнена снова, она выдаст ошибку, поскольку имена ресурсов должны быть уникальными в пространстве имен.

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) kubectl apply Команда применяет конфигурацию к ресурсу. Если ресурса нет, он будет создан. kubectl apply Команда может быть запущена во второй раз, так как она просто применяет конфигурацию, как показано ниже. В этом случае конфигурация не изменилась. Итак, стручок не изменился.

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

в kubectl createмы указываем определенное действие, в этом случае create и так обязательно. в kubectl apply Командой мы указываем целевое состояние системы и не указываем определенное действие и поэтому декларативное. Мы позволяем системе решать, какие действия предпринять. Если ресурса нет, он его создаст, если ресурс там, то он применит конфигурацию к существующему ресурсу.

С точки зрения исполнения, нет разницы, когда ресурс создается впервые между kubectl create а также kubectl apply как показано выше. Но во второй раз kubectl create выдаст ошибку.

Мне потребовалось некоторое время, чтобы обойти это, но теперь это имеет смысл.

Проще говоря, create а также apply по сути одинаковы, если вы запускаете операцию над одним файлом для создания ресурсов. Тем не мение, apply позволяет создавать и исправлять одновременно несколько файлов в каталоге.

Там также есть apply удалить ресурсы из каталога, но он находится в альфа-версии на момент написания этой статьи:

kubectl apply -f <directory/> --prune -l your=label)

По этому вопросу есть и другие идеи: Kubectl apply vs kubectl create?

Это два разных подхода. kubectl create - это то, что мы называем императивным управлением. При таком подходе вы сообщаете API Kubernetes, что вы хотите создать, заменить или удалить, а не то, как вы хотите, чтобы ваш кластерный мир K8s выглядел.

kubectl apply является частью подхода декларативного управления, в котором изменения, которые вы, возможно, применили к живому объекту (т. е. через масштабирование), сохраняются, даже если вы применяете другие изменения к объекту.

Вы можете прочитать больше об императивном и декларативном управлении в документации по управлению объектами Kubernetes.

Другие вопросы по тегам