kubectl применить против kubectl создать?

В документации я понял, что kubectl apply= kubectl create + kubectl replace. Ссылка

Насколько я понимаю, если я хочу создать новый ресурс k8s в кластере, я должен использовать операцию kubectl create. Теперь, если я хочу обновить что-либо в живых ресурсах k8s, я должен использовать операцию kubectl replace.

Если я хочу выполнить обе операции (создать новый ресурс k8s, а также обновить живые ресурсы k8s), я должен использовать операцию kubectl apply

Мои вопросы: почему в кластере есть три операции для выполнения одной и той же задачи? Каковы варианты использования для этих операций? Чем они отличаются друг от друга под капотом?

В данный момент я использую kubectl create для создания новых ресурсов в кластере. Спасибо

Ответ 1

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

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

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

Ответ 2

При запуске в скрипте CI у вас будут проблемы с императивными командами, так как create вызывает ошибку, если ресурс уже существует.

Что вы можете сделать, это применить (декларативный шаблон) вывод вашей императивной команды, используя параметры --dry-run=true и -o yaml:

kubectl create whatever --dry-run=true -o yaml | kubectl apply -f -

Команда выше не вызовет ошибку, если ресурс уже существует (и при необходимости обновит ресурс).

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

Ответ 3

Просто чтобы дать более прямой ответ, исходя из моего понимания:

apply - вносит дополнительные изменения
create - перезаписывает все изменения


Взяв это из статьи DigitalOcean, которая была связана с веб-сайтом Kubernetes:

Мы используем apply вместо create здесь, чтобы в будущем мы могли постепенно применять изменения к объектам Ingress Controller вместо того, чтобы полностью перезаписывать их.

Ответ 4

Приведенное ниже объяснение из официальной документации помогло мне понять, kubectl apply.

Эта команда сравнивает версию конфигурации, которую вы отправляете, с предыдущей версией и применяет сделанные вами изменения, не перезаписывая автоматические изменения свойств, которые вы не указали.

kubectl create другой стороны, kubectl create создаст (не должно быть) ресурсы.

Ответ 5

Это императивные команды :

kubectl run = kubectl create deployment

Преимущества:

  • Просто, легко учиться и легко запомнить.
  • Для внесения изменений в кластер требуется только один шаг.

Недостатки:

  • Не включайтесь в процессы проверки изменений.
  • Не предоставляйте контрольный журнал, связанный с изменениями.
  • Не предоставляйте источник записей, за исключением того, что является живым.
  • Не предоставляйте шаблон для создания новых объектов.

Это императивный объект конфигурации:

kubectl create -f your-object-config.yaml

kubectl delete -f your-object-config.yaml

kubectl replace -f your-object-config.yaml

Преимущества по сравнению с императивными командами:

  • Может храниться в системе контроля версий, такой как Git.
  • Может интегрироваться с такими процессами, как проверка изменений перед отправкой и аудитом.
  • Предоставляет шаблон для создания новых объектов.

Недостатки по сравнению с императивными командами:

  • Требует базового понимания схемы объекта.
  • Требуется дополнительный шаг написания файла YAML.

Преимущества по сравнению с декларативным объектом:

  • Проще и проще для понимания.
  • Более зрелый после Kubernetes версии 1.5.

Недостатки по сравнению с декларативной конфигурацией объекта:

  • Лучше всего работает с файлами, а не с каталогами.
  • Обновления живых объектов должны быть отражены в файлах конфигурации, иначе они будут потеряны при следующей замене.

Это декларативный объектный конфиг

kubectl diff -f configs/

kubectl apply -f configs/

Преимущества по сравнению с конфигурацией императивного объекта:

  • Изменения, сделанные непосредственно в живых объектах, сохраняются, даже если они не объединяются в файлах конфигурации.
  • Улучшенная поддержка работы с каталогами и автоматического определения типов операций (создание, исправление, удаление) для каждого объекта.

Недостатки по сравнению с императивной конфигурацией объекта:

  • Труднее отлаживать и понимать результаты, когда они неожиданны.
  • Частичные обновления с использованием diffs создают сложные операции слияния и исправления.

Ответ 6

kubectl create может одновременно работать с одним файлом конфигурации объекта. Это также известно как императивное управление

kubectl создать -f имя файла | URL

kubectl apply работает с каталогами и их подкаталогами, содержащими файлы конфигурации объектов yaml. Это также известно как декларативное управление. Можно выбрать несколько файлов конфигурации объектов из каталогов. kubectl apply -f каталог /

Подробности :
https://kubernetes.io/docs/tasks/manage-kubernetes-objects/declarative-config/ https://kubernetes.io/docs/tasks/manage-kubernetes-objects/imperative-config/