Я недавно изучаю Kubernetes, и я не очень понимаю разницу между «kubectl apply» и «kubectl replace». Есть ли ситуация, когда мы можем использовать только один из них?
В чем разница между kubectl apply и kubectl replace
Ответы (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
) ресурс, используя предоставленную спецификацию.
Обновленный ответ
Мой оригинал был довольно противоречивым, и я бы даже сказал сейчас, оглядываясь назад, наполовину неверным. Итак, вот обновленный ответ, который, я надеюсь, будет более полезным:
- такие команды, как kubectl
patch
,replace
,delete
,create
, дажеedit
, являются обязательными: они сообщают kubectl, что делать - команда kubectl
apply
является декларативной OTOH в том смысле, что она сообщает kubernetes, вот желаемое состояние (yaml из файла, предоставленного команде apply), теперь выясните, как туда добраться: создать, исправить, заменить объект и т. д., что бы это ни было берет ... вы поняли.
Итак, две команды сильно отличаются.
Например, с apply
вы можете внести в него только те изменения, которые вы хотите: он определит, какие свойства объекта нужно изменить, а остальные оставит в покое; если эти свойства неизменяемы (например, nodeName модуля), он будет жаловаться, и если вы затем повторите команду с --force
, он будет достаточно умен, чтобы знать, что делать эквивалент replace --force
.
В общем, вы должны отдавать предпочтение apply
(с --force
при необходимости) и использовать императивные команды только тогда, когда декларативный подход не дает ожидаемого результата (хотя я бы хотел увидеть примеры этого - я предполагаю, что это произойдет только когда вам потребуется несколько шагов из-за взаимозависимостей, которые будут иметь негативные последствия, если их выполнить с помощью apply).
kubectl apply
новое развертывание без указанного количества реплик - по умолчанию используется 0
или 1
.
- person Chris Stryczynski; 16.08.2019
Срывочные обновления
В некоторых случаях вам может потребоваться обновить поля ресурсов, которые не могут быть обновлены после инициализации, или вы можете просто немедленно внести рекурсивное изменение, например исправить сломанные модули, созданные в результате развертывания. Чтобы изменить такие поля, используйте
replace --force
, который удаляет и повторно создает ресурс.
--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
).
вы можете добавить опцию -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
kubectl apply ..
будет использовать различные эвристики для выборочного обновления значений, указанных в ресурсе.
kubectl replace ...
заменит / перезапишет весь объект указанными значениями. Это предпочтительнее, так как вы избегаете сложности выборочного эвристического обновления. Однако некоторые ресурсы, такие как входящие / балансировщики нагрузки, не могут быть заменены, поскольку они неизменяемы.
Пример эвристического обновления, приводящего к неочевидной операции: https://github.com/kubernetes/kubernetes/issues/67135