Разница между «kubectl apply» и «kubectl создать» - PullRequest
0 голосов
/ 25 сентября 2018

Я создал модуль с 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 с подробной информацией об объекте.

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

Существует небольшая разница между командами 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 выдаст ошибку.

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

0 голосов
/ 10 января 2019

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

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

Подробнее об императивном и декларативном управлении можно прочитать в Kubernetes Object Management документация.

0 голосов
/ 25 сентября 2018

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

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

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

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

...