私がドキュメントで理解したことは、 kubectl apply = kubectl create + kubectl replace です。 参照
私が理解しているのは、クラスタ内に新しいk8sリソースを作成したい場合は、 kubectl create operationを使用する必要があるということです。ライブのk8sリソースの中で何かを更新したいのなら、 kubectl replace operationを使うべきです。
両方の操作(新しいk8sリソースを作成し、ライブのk8sリソースを更新する)を行いたい場合は、 kubectl apply operationを使用してください。
私の質問は なぜクラスタ内で同じタスクを実行するための3つの操作があるのですか?これらの操作のユースケースは何ですか?フードの下でそれらはお互いにどう違うのですか?
現時点では、クラスタ内に新しいリソースを作成するために kubectl create 操作を使用しています。ありがとう
それらは2つの異なるアプローチです。 kubectl create
は私たちが呼んでいるものです 命令管理 。このアプローチでは、K8sクラスターの世界をどのように見せるかではなく、作成、置換、または削除したいものをKubernetes APIに伝えます。
kubectl apply
は 宣言的管理 アプローチの一部で、ライブオブジェクトに(つまりscale
を通じて)適用した変更は、そのオブジェクトに他の変更をapply
しても維持されます。
命令型と宣言型の管理の詳細については、 Kubernetes Object Management のドキュメントを参照してください。
CIスクリプトで実行しているとき、 create がリソースがすでに存在する場合はエラーを発生させるので、命令型コマンドで問題が発生します。
--dry-run=true
および-o yaml
オプションを使用して、命令型コマンドの出力に適用(宣言型パターン)を指定することができます。
kubectl create whatever --dry-run=true -o yaml | kubectl apply -f -
上記のコマンドは、リソースがすでに存在する場合はエラーを発生させません(そして必要ならリソースを更新します)。
これは宣言型パターンを使用できない場合(たとえばdocker-registryシークレットを作成するときなど)に非常に便利です。
私の理解から、より直接的な答えを出すために:
apply
- 段階的な変更を加えますcreate
- すべての変更を上書きします
これをKubernetesのWebサイトでリンクされている DigitalOceanの記事 から取得します。
ここではcreateではなくapplyを使用して、将来的には入力コントローラオブジェクトに完全に上書きするのではなく、徐々に変更を適用できるようにします。
公式ドキュメント からの以下の説明は、私がkubectl apply
を理解するのを助けました。
このコマンドは、プッシュしている設定のバージョンを以前のバージョンと比較し、行った変更を適用します。指定していないプロパティへの自動変更は上書きされません。
一方、kubectl create
は(存在しないはずの)リソースを作成します。