web-dev-qa-db-ja.com

kubectl applyとkubectl replaceの違いは何ですか

私は最近Kubernetesを学習していますが、「kubectl apply」と「kubectl replace」の違いについてはあまり明確ではありません。そのうちの1つしか使用できない状況はありますか?

35
JimmyCYJ

違いは、replaceは最初にリソースを削除し、次に指定したファイルからリソースを作成することです。一方、applyは、現在のライブリソースで、ファイルで指定した属性のみを直接更新しようとします。 インプレース更新 および 破壊的な更新 を参照してください。

その結果、applyで使用するファイルは不完全な仕様になる可能性があります。つまり、変更したいものだけです。一方、replaceの場合、仕様は完全でなければなりません。

したがって、リソースの他のプロパティを指定せずに、注釈のみを変更するファイルをapplyできます。ただし、replaceコマンドで同じファイルを使用しようとすると、情報が不足しているため、コマンドが失敗します。

また、applyはリソースの一部のプロパティでのみ機能します。 applyが適用されないプロパティを更新する必要がある場合は(しゃれで申し訳ありません!)、代わりにreplaceを使用する必要があります。

10
Oliver

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

破壊的な更新

場合によっては、一度初期化すると更新できないリソースフィールドを更新する必要がある場合や、Deploymentによって作成された壊れたポッドを修正するなど、再帰的な変更をすぐに行いたい場合があります。このようなフィールドを変更するには、replace --forceを使用して、リソースを削除して再作成します。

3
Eyal Levin

applyreplaceの違いは、applycreateの違いに似ています。

create/replace命令的 アプローチを使用しますが、apply宣言的 アプローチを使用します。

createを使用してリソースを作成した場合は、replaceを使用して更新します。 applyを使用してリソースを作成した場合は、applyを使用して更新します。

replaceapplyの両方に完全な仕様が必要であり、どちらも古いリソースを削除する前に、最初に新しいリソースを作成することに注意してください(--forceが指定されています)。

2
Code

kubectlを使用するときにオプション-v = 8を追加すると、このようなログが見つかります

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

replace --force
get 200
delete 200
get 404
post 201
0
shuaihanhungry

kubectl apply ..は、さまざまなヒューリスティックを使用して、リソース内で指定された値を選択的に更新します。

kubectl replace ...は、オブジェクト全体を指定された値で置換/上書きします。 これは、選択的なヒューリスティック更新の複雑さを回避するために推奨されます

明白でない操作につながるヒューリスティックアップデートの例: https://github.com/kubernetes/kubernetes/issues/67135

0