web-dev-qa-db-ja.com

Kubectlの適用vs kubectlの作成?

私がドキュメントで理解したことは、 kubectl apply = kubectl create + kubectl replace です。 参照

私が理解しているのは、クラスタ内に新しいk8sリソースを作成したい場合は、 kubectl create operationを使用する必要があるということです。ライブのk8sリソースの中で何かを更新したいのなら、 kubectl replace operationを使うべきです。

両方の操作(新しいk8sリソースを作成し、ライブのk8sリソースを更新する)を行いたい場合は、 kubectl apply operationを使用してください。

私の質問は なぜクラスタ内で同じタスクを実行するための3つの操作があるのですか?これらの操作のユースケースは何ですか?フードの下でそれらはお互いにどう違うのですか?

現時点では、クラスタ内に新しいリソースを作成するために kubectl create 操作を使用しています。ありがとう

135
Suresh Vishnoi

それらは2つの異なるアプローチです。 kubectl createは私たちが呼んでいるものです 命令管理 。このアプローチでは、K8sクラスターの世界をどのように見せるかではなく、作成、置換、または削除したいものをKubernetes APIに伝えます。

kubectl apply宣言的管理 アプローチの一部で、ライブオブジェクトに(つまりscaleを通じて)適用した変更は、そのオブジェクトに他の変更をapplyしても維持されます。

命令型と宣言型の管理の詳細については、 Kubernetes Object Management のドキュメントを参照してください。

176
Ara Pulido

CIスクリプトで実行しているとき、 create がリソースがすでに存在する場合はエラーを発生させるので、命令型コマンドで問題が発生します。

--dry-run=trueおよび-o yamlオプションを使用して、命令型コマンドの出力に適用(宣言型パターン)を指定することができます。

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

上記のコマンドは、リソースがすでに存在する場合はエラーを発生させません(そして必要ならリソースを更新します)。

これは宣言型パターンを使用できない場合(たとえばdocker-registryシークレットを作成するときなど)に非常に便利です。

13
Sébastien Dan

私の理解から、より直接的な答えを出すために:

apply - 段階的な変更を加えます
create - すべての変更を上書きします


これをKubernetesのWebサイトでリンクされている DigitalOceanの記事 から取得します。

ここではcreateではなくapplyを使用して、将来的には入力コントローラオブジェクトに完全に上書きするのではなく、徐々に変更を適用できるようにします。

2
User9123

公式ドキュメント からの以下の説明は、私がkubectl applyを理解するのを助けました。

このコマンドは、プッシュしている設定のバージョンを以前のバージョンと比較し、行った変更を適用します。指定していないプロパティへの自動変更は上書きされません。

一方、kubectl createは(存在しないはずの)リソースを作成します。

1
f01