設定ファイルを使用したKubernetesオブジェクトの命令的管理

設定ファイルを使用したKubernetesオブジェクトの命令的管理

Kubernetesオブジェクトは、YAMLやJSONで書かれたオブジェクト設定ファイルとkubectlコマンドラインツールを使用して作成、更新、削除できます。 このドキュメントでは、設定ファイルを使用したオブジェクトの定義と管理の方法を説明します。

始める前に

kubectlをインストールしてください。

Kubernetesクラスターが必要、かつそのクラスターと通信するためにkubectlコマンドラインツールが設定されている必要があります。 このチュートリアルは、コントロールプレーンのホストとして動作していない少なくとも2つのノードを持つクラスターで実行することをおすすめします。 まだクラスターがない場合、minikubeを使って作成するか、 以下のいずれかのKubernetesプレイグラウンドも使用できます:

バージョンを確認するには次のコマンドを実行してください: kubectl version.

トレードオフ

kubectlツールは3種類のオブジェクト管理をサポートしています:

  • 命令型コマンド
  • 命令型オブジェクト設定
  • 宣言型オブジェクト設定

オブジェクト管理の各手法におけるメリットとデメリットについては、Kubernetesオブジェクトの管理を参照してください。

オブジェクトの作成方法

kubectl create -fを使用して、設定ファイルからオブジェクトを作成できます。 詳細については、Kubernetes APIリファレンスを参照してください。

  • kubectl create -f <filename|url>

オブジェクトの更新方法

警告:

replaceコマンドを使用してオブジェクトを更新すると、設定ファイルに指定されていないspecの記述はすべて破棄されます。 そのため、LoadBalancerタイプのServiceのように、externalIPsフィールドが設定ファイルとは無関係にクラスターによって管理されているような、specの一部がクラスター側で管理されているオブジェクトにはreplaceを使用すべきではありません。 replaceによるフィールドの削除を防ぐには、独立して管理されているフィールドを設定ファイルへコピーしておく必要があります。

kubectl replace -fを使用すると、設定ファイルの内容に従って稼働中のオブジェクトを更新できます。

  • kubectl replace -f <filename|url>

オブジェクトの削除方法

kubectl delete -fを使用して、設定ファイルに記述されたオブジェクトを削除できます。

  • kubectl delete -f <filename|url>

備考:

設定ファイルのmetadataセクションでnameフィールドではなくgenerateNameフィールドが指定されている場合、kubectl delete -f <filename|url>でオブジェクトを削除することはできません。 オブジェクトを削除するには、別のフラグを使用する必要があります。 例えば:

kubectl delete <type> <name>
kubectl delete <type> -l <label>

オブジェクトの確認方法

kubectl get -fを使用して、設定ファイルに記述されているオブジェクトの情報を確認できます。

  • kubectl get -f <filename|url> -o yaml

-o yamlフラグを指定すると、完全なオブジェクト設定が出力されます。 利用可能なオプションの一覧を確認するには、kubectl get -hを使用してください。

制限事項

create、replace、およびdeleteコマンドは、各オブジェクトの設定が設定ファイル内に完全に定義・記録されている場合には問題なく動作します。 しかし、稼働中のオブジェクトに対して加えられた変更が設定ファイルに統合されていない場合、次回replaceを実行したタイミングでそれらの変更は失われます。 これは、HorizontalPodAutoscalerなどのコントローラーが、稼働中のオブジェクトに直接変更を加えた場合などに発生します。 以下はその一例です。

  1. 設定ファイルを使用してオブジェクトを作成します。
  2. 別の変更元(コントローラーなど)が一部のフィールドを変更し、オブジェクトを更新します。
  3. 設定ファイルを使ってオブジェクトを置換(replace)します。 このとき、ステップ2で別の変更元によって加えられた変更は失われます。

同一オブジェクトに対する複数の書き込み元をサポートする必要がある場合は、kubectl applyを使用してオブジェクトを管理できます。

設定ファイルを保存せずにURLからオブジェクトを作成・編集する

オブジェクト設定ファイルのURLがある場合、kubectl create --editを使用すると、オブジェクトが作成される前に設定を変更できます。 これは、読者が内容を変更する可能性がある設定ファイルを対象としたチュートリアルやタスクで特に便利です。

kubectl create -f <url> --edit

命令型コマンドから命令型オブジェクト設定への移行

命令型コマンドから命令型オブジェクト設定へ移行するには、いくつか手動での手順が必要です。

  1. 稼働中のオブジェクトをローカルのオブジェクト設定ファイルにエクスポートします:

    kubectl get <kind>/<name> -o yaml > <kind>_<name>.yaml
    
  2. オブジェクト設定ファイルからstatusフィールドを手動で削除します。

  3. 以降のオブジェクト管理には、replaceのみを使用します。

    kubectl replace -f <kind>_<name>.yaml
    

コントローラーセレクターとPodTemplateラベルの定義

警告:

コントローラーのセレクターを更新することは強く非推奨です。

推奨されるアプローチは、単一の不変なPodTemplateラベルを定義することです。 このラベルはコントローラーセレクター専用とし、他の意味を持たせないようにします。

ラベルの例:

selector:
  matchLabels:
      controller-selector: "apps/v1/deployment/nginx"
template:
  metadata:
    labels:
      controller-selector: "apps/v1/deployment/nginx"

次の項目