私は最近Kubernetesを学習していますが、「kubectl apply」と「kubectl replace」の違いについてはあまり明確ではありません。そのうちの1つしか使用できない状況はありますか?
違いは、replace
は最初にリソースを削除し、次に指定したファイルからリソースを作成することです。一方、apply
は、現在のライブリソースで、ファイルで指定した属性のみを直接更新しようとします。 インプレース更新 および 破壊的な更新 を参照してください。
その結果、apply
で使用するファイルは不完全な仕様になる可能性があります。つまり、変更したいものだけです。一方、replace
の場合、仕様は完全でなければなりません。
したがって、リソースの他のプロパティを指定せずに、注釈のみを変更するファイルをapply
できます。ただし、replace
コマンドで同じファイルを使用しようとすると、情報が不足しているため、コマンドが失敗します。
また、apply
はリソースの一部のプロパティでのみ機能します。 apply
が適用されないプロパティを更新する必要がある場合は(しゃれで申し訳ありません!)、代わりにreplace
を使用する必要があります。
破壊的な更新
場合によっては、一度初期化すると更新できないリソースフィールドを更新する必要がある場合や、Deploymentによって作成された壊れたポッドを修正するなど、再帰的な変更をすぐに行いたい場合があります。このようなフィールドを変更するには、
replace --force
を使用して、リソースを削除して再作成します。
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
kubectl apply ..
は、さまざまなヒューリスティックを使用して、リソース内で指定された値を選択的に更新します。
kubectl replace ...
は、オブジェクト全体を指定された値で置換/上書きします。 これは、選択的なヒューリスティック更新の複雑さを回避するために推奨されます。
明白でない操作につながるヒューリスティックアップデートの例: https://github.com/kubernetes/kubernetes/issues/67135