В чем разница между kubectl apply и kubectl replace

Я недавно изучаю Kubernetes, и я не очень понимаю разницу между «kubectl apply» и «kubectl replace». Есть ли ситуация, когда мы можем использовать только один из них?


person JimmyCYJ    schedule 11.11.2017    source источник
comment
Отвечает ли это на ваш вопрос? kubectl apply vs kubectl create?   -  person Inanc Gumus    schedule 21.04.2020


Ответы (6)


Я написал подробное объяснение различий между применением, заменой и исправлением: Kubernetes Apply vs. заменить или исправить. Он включает объяснение, что текущий ответ на этот вопрос неверен.

Вкратце, kubectl apply использует предоставленную спецификацию для создания ресурса, если он не существует, и обновления, т.е. исправления, если он существует. Спецификация, предоставленная apply, должна содержать только необходимые части спецификации, при создании ресурса API будет использовать значения по умолчанию для остальных, а при обновлении ресурса он будет использовать его текущие значения.

kubectl replace полностью заменяет существующий ресурс на тот, который определен предоставленной спецификацией. replace требует ввода полной спецификации, включая свойства только для чтения, предоставляемые API, такие как .metadata.resourceVersion, .spec.nodeName для модулей, .spec.clusterIP для служб и .secrets для учетных записей служб. У kubectl есть некоторые внутренние уловки, которые помогут вам сделать это правильно, но обычно вариант использования replace - это получение спецификации ресурса, изменение свойства, а затем использование этой измененной полной спецификации для замены существующего ресурса.

Команда kubectl replace имеет параметр --force, который фактически не использует замену, то есть PUT, конечную точку API. Он принудительно удаляет (DELETE), а затем воссоздает (POST) ресурс, используя предоставленную спецификацию.

person David Dooling    schedule 28.05.2020

Обновленный ответ

Мой оригинал был довольно противоречивым, и я бы даже сказал сейчас, оглядываясь назад, наполовину неверным. Итак, вот обновленный ответ, который, я надеюсь, будет более полезным:

  • такие команды, как kubectl patch, replace, delete, create, даже edit, являются обязательными: они сообщают kubectl, что делать
  • команда kubectl apply является декларативной OTOH в том смысле, что она сообщает kubernetes, вот желаемое состояние (yaml из файла, предоставленного команде apply), теперь выясните, как туда добраться: создать, исправить, заменить объект и т. д., что бы это ни было берет ... вы поняли.

Итак, две команды сильно отличаются.

Например, с apply вы можете внести в него только те изменения, которые вы хотите: он определит, какие свойства объекта нужно изменить, а остальные оставит в покое; если эти свойства неизменяемы (например, nodeName модуля), он будет жаловаться, и если вы затем повторите команду с --force, он будет достаточно умен, чтобы знать, что делать эквивалент replace --force.

В общем, вы должны отдавать предпочтение apply--force при необходимости) и использовать императивные команды только тогда, когда декларативный подход не дает ожидаемого результата (хотя я бы хотел увидеть примеры этого - я предполагаю, что это произойдет только когда вам потребуется несколько шагов из-за взаимозависимостей, которые будут иметь негативные последствия, если их выполнить с помощью apply).

person Oliver    schedule 08.01.2019
comment
На практике этого не происходит. Если я kubectl apply новое развертывание без указанного количества реплик - по умолчанию используется 0 или 1. - person Chris Stryczynski; 16.08.2019
comment
@Code, вы правы, и было довольно много голосов (только 2/3 голосов было за), поэтому я обновил свой ответ несколько недель назад, надеюсь, это сделает его более полезным - person Oliver; 25.01.2021
comment
Лучше всего удалить исходный раздел ответов, поскольку он неверен. - person RichVel; 27.01.2021
comment
@richvel удалил оригинал - person Oliver; 28.01.2021

От: https://github.com/kubernetes/website/blob/master/content/en/docs/concepts/cluster-administration/manage-deployment.md

Срывочные обновления

В некоторых случаях вам может потребоваться обновить поля ресурсов, которые не могут быть обновлены после инициализации, или вы можете просто немедленно внести рекурсивное изменение, например исправить сломанные модули, созданные в результате развертывания. Чтобы изменить такие поля, используйте replace --force, который удаляет и повторно создает ресурс.

person Eyal Levin    schedule 20.09.2018
comment
Я думаю, что это больше касается варианта --force, чем самого kubectl replace, как это видно на примере kubectl replace --help: --force=false: Delete and re-create the specified resource. Документы не содержат информации о том, что отличает kubectl replace от kubectl apply. - person Florian von Stosch; 29.10.2018

Разница между apply и replace аналогична разнице между apply и create.

create / replace использует императивный подход, а apply использует декларативный подход.

Если вы использовали create для создания ресурса, используйте replace для его обновления. Если вы использовали apply для создания ресурса, используйте apply для его обновления.

Обратите внимание, что и replace, и apply требуют полной спецификации, и оба сначала создают новые ресурсы перед удалением старых (если не указано --force).

person Code    schedule 18.08.2019
comment
Для более подробного объяснения и сравнения см. этот раздел в документации Kubernetes. - person Rob van Maris; 02.12.2019

вы можете добавить опцию -v = 8 при использовании kubectl, и вы найдете такой журнал

apply --force
patch 422
delete 200
get 200
get 200
get 404
post 201

replace --force
get 200
delete 200
get 404
post 201
person shuaihanhungry    schedule 26.08.2019

kubectl apply .. будет использовать различные эвристики для выборочного обновления значений, указанных в ресурсе.

kubectl replace ... заменит / перезапишет весь объект указанными значениями. Это предпочтительнее, так как вы избегаете сложности выборочного эвристического обновления. Однако некоторые ресурсы, такие как входящие / балансировщики нагрузки, не могут быть заменены, поскольку они неизменяемы.

Пример эвристического обновления, приводящего к неочевидной операции: https://github.com/kubernetes/kubernetes/issues/67135

person Chris Stryczynski    schedule 16.01.2020