kubectl createとkubectl applyの違い

はじめに

このブログでは毎回のことになってきていますが,以下の書籍を参考にしております.

Kubernetes完全ガイド (impress top gear)

Kubernetes完全ガイド (impress top gear)

  • 作者:青山 真也
  • 発売日: 2018/09/21
  • メディア: 単行本(ソフトカバー)

今回は実際にk8sを動かしていてcreateとapplyの違いがあまりよくわかっていなかったのでメモしておきます.

createとapply

k8s完全ガイドを読む前までは「kubectl apply」コマンドはリソース更新用コマンドと理解していたため,「kubectl create」コマンドを使用してリソース作成を行っていましたが,更新ではなく作成の時であっても「kubectl apply」を使用した方が良いみたいです.

applyの動作原理

「kubectl apply」コマンドは設定の追加・変更を行う場合,図1のように対象リソースの状態と新たに反映させたいマニフェストの比較を行い差分の抽出をした後,設定を反映します.

fig1
図1:設定の追加・変更の場合

同様に,設定を削除する場合は図2のように前回適用した設定と今回適用する設定の比較を行い差分の抽出をした後,設定を反映します.

fig2
図2:設定を削除する場合

createを使用した場合

「kubectl create --save-config」のように「kubectl create」コマンドにオプションを追加しない限り「kubectl create」コマンドでは設定内容が保存されません.(設定が反映されないわけではなく,履歴が残らないイメージ)そのため図3のように「kubectl create」コマンドでリソースを作成後に「kubectl apply」コマンドで設定を変更する時,特に設定を削除する場合などで正しく差分を出すことができずに,設定の反映がうまくいかないことがあります.

fig3
図3:リソースの作成にcreateコマンドを使用した時

まとめ

以上のような理由から設定の更新だけでなく,リソース作成の際も「kubectl apply」コマンドを使用した方が良いでしょう.