ステートフル アプリケーションのデプロイ

このページでは、Google Kubernetes Engine を使用してステートフル アプリケーションをデプロイする方法について説明します。

概要

ステートフル アプリケーションは、サーバー、クライアント、およびその他のアプリケーションが使用するデータを永続ディスク ストレージに保存します。ステートフル アプリケーションの例としては、他のアプリケーションがデータの保存先および取得元として使用するデータベースや Key-Value ストアが挙げられます。

永続ストレージは動的にプロビジョニングできるため、基礎となるボリュームがオンデマンドで作成されます。Kubernetes では、StorageClass を作成して動的プロビジョニングを構成します。GKE では、デフォルトの StorageClass によって、Compute Engine の永続ディスクを動的にプロビジョニングできます。

Kubernetes は、StatefulSet コントローラを使用して、ステートフル アプリケーションを StatefulSet オブジェクトとしてデプロイします。StatefulSet のポッドに互換性はありません。各ポッドには、スケジュールされた場所に関係なく管理される一意の識別子があります。

ステートフル アプリケーションは、クライアント データがセッション間でサーバーに保存されないステートレス アプリケーションとは異なります。

マルチゾーン クラスタとリージョン クラスタの永続ストレージで詳細を確認できます。

始める前に

このタスクの準備として、次の手順を行います。

  • Google Kubernetes Engine API が有効になっていることを確認します。
  • Enable Google Kubernetes Engine API を有効にする
  • Cloud SDK がインストール済みであることを確認します。
  • デフォルトのプロジェクト ID を設定します。
    gcloud config set project [PROJECT_ID]
  • ゾーンクラスタを使用する場合は、デフォルトのコンピューティング ゾーンを設定します。
    gcloud config set compute/zone [COMPUTE_ZONE]
  • リージョン クラスタを使用する場合は、デフォルトのコンピューティング リージョンを設定します。
    gcloud config set compute/region [COMPUTE_REGION]
  • gcloud を最新バージョンに更新します。
    gcloud components update
  • コンテナ化されたアプリケーションが Container Registry などのイメージ レジストリに格納されていることを確認します。

GKE API の有効化、クラスタの作成、GKE の詳細については、クイックスタートをご覧ください。

StatefulSet 内の永続ストレージの要求

アプリケーションでは、[PersistentVolumeClaim] 永続ディスク ストレージを使用して永続ストレージをリクエストできます。

通常、ポッドに加えて PersistentVolumeClaim オブジェクトがユーザーによって作成される必要があります。ただし StatefulSet には、PersistentVolumeClaim オブジェクトを自動生成する volumeClaimTemplates 配列が含まれています。各 StatefulSet レプリカは、それぞれ独自の PersistentVolumeClaim オブジェクトを取得します。

ステートフル セットを作成する

kubectl apply を使用して、StatefulSet を作成します。

kubectl apply は、マニフェスト ファイルを使用して、クラスタ内のリソースを作成、更新、削除します。これは、宣言型のオブジェクト構成方法です。この方法では、ライブ オブジェクトに対して行われた書き込みが保持され、オブジェクトの構成ファイルに変更がマージされません。

別個に作成された Service によって管理される StatefulSet の簡単な例を次に示します。

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: [STATEFULSET_NAME]
spec:
  serviceName: [SERVICE_NAME]
  replicas: 3
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app=[APP_NAME]
    spec:
      containers:
      - name: [CONTAINER_NAME]
        image: ...
        ports:
        - containerPort: 80
          name: [PORT_NAME]
        volumeMounts:
        - name: [PVC_NAME]
          mountPath: ...
  volumeClaimTemplates:
  - metadata:
      name: [PVC_NAME]
      annotations:
        ...
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

ここで

  • [STATEFULSET_NAME] は StatefulSet に付ける名前です
  • [SERVICE_NAME] は Service に付ける名前です
  • [APP_NAME] は、ポッドで実行するアプリケーションの名前です
  • [CONTAINER_NAME] は、ポッド内のコンテナに付ける名前です
  • [PORT_NAME] は、ステートフル セットによって開かれたポートに付ける名前です
  • [PVC_NAME] は、永続ボリュームの要求に付ける名前です。

このファイルの kind フィールドは、このファイルに定義された仕様で StatefulSet オブジェクトを作成する必要があることを指定します。この例の StatefulSet は 3 つの複製ポッドを生成し、StatefulSet をインターネットに公開するためにポート 80 を開きます。

ステートフル セットを作成するには、次のコマンドを実行します。

kubectl apply -f [STATEFULSET_FILE]

kubectl apply -f [DIRECTORY]/ を使用して、ディレクトリに保存された構成ファイルで定義されているすべてのオブジェクト(既存のものを除く)を作成することもできます。

kubectl apply の詳細については、kubectl リファレンス ドキュメントを参照してください。

StatefulSet を検査する

kubectl

StatefulSet を検査するには、次のコマンドを実行します。

kubectl get statefulset [STATEFULSET_NAME] -o yaml

このコマンドは、StatefulSet のライブ設定を YAML 形式で表示します。

ステートフル セットによって作成されたポッドを一覧表示するには、次のコマンドを実行します。

kubectl get pods -l app=[APP_NAME]

このコマンドの -l フラグは、アプリ [APP_NAME] 用にラベル付けされたすべてのポッドを取得するよう kubectl に指示します。

出力は次のようになります。

NAME                                READY     STATUS    RESTARTS   AGE
[POD_NAME]                                      1/1       Running   0          1m
[POD_NAME]                                      1/1       Running   0          1m

StatefulSet の詳細情報を取得するには、次のコマンドを実行します。

kubectl describe statefulset [STATEFULSET_NAME]

[STATEFULSET_NAME] はステートフル セットの名前です。

特定のポッドの情報を取得するには、次のコマンドを実行します。

kubectl describe pod [POD_NAME]

作成された PersistentVolumeClaim のリストを取得するには、次のようにします。

kubectl get pvc

出力は次のようになります。

NAME                            STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS    AGE
[STATEFULSET_NAME]-[PVC_NAME]-0 Bound     pvc-bdff4e1e-183e-11e8-bf6d-42010a800002   1G         RWO            standard        9s
[STATEFULSET_NAME]-[PVC_NAME]-1 Bound     pvc-bdff4e1e-183e-11e8-bf6d-42010a800003   1G         RWO            standard        9s
[STATEFULSET_NAME]-[PVC_NAME]-2 Bound     pvc-bdff4e1e-183e-11e8-bf6d-42010a800004   1G         RWO            standard        9s

特定の PersistentVolumeClaim の情報を取得するには、

kubectl describe pvc [STATEFULSET_NAME]-[PVC_NAME]-0

特定の PersistentVolume の情報を取得するには、次のコマンドを実行します。

kubectl describe pv [PV_NAME]

Console

StatefulSet を検査するには、次の手順を行います。

  1. Cloud Console で Google Kubernetes Engine の [ワークロード] メニューに移動します。

    [ワークロード] メニューに移動

  2. メニューから目的のワークロードを選択します。

[ワークロード] メニューには複数のメニュー項目があります。

  • StatefulSet のライブ構成を表示するには、[YAML] をクリックします。
  • StatefulSet に関連するすべてのイベントを表示するには、[イベント] をクリックします。
  • StatefulSet の変更履歴を表示するには、[変更履歴] をクリックします。

StatefulSet を更新する

StatefulSet を更新する方法は複数あります。一般的な宣言型メソッドは kubectl apply です。StatefulSet をシェルで直接更新するか、任意のエディタで更新するには、kubectl edit を使用します。また、Cloud Console の [GKE ワークロード] メニューから YAML エディタを使用することもできます。

StatefulSet の [Pods の仕様] に、イメージ、リソースの使用量 / リクエスト、構成などの更新をロールアウトできます。

kubectl apply

新規作成または更新されたマニフェスト ファイルを適用することで、StatefulSet を更新できます。 これは、アプリケーションのスケーリングや新しいバージョンの指定など、StatefulSet にさまざまな変更を加える場合に便利です。

ステートフル セットを更新するには、次のコマンドを実行します。

kubectl apply -f [STATEFULSET_FILE]

[STATEFULSET_FILE] は、更新されたマニフェスト ファイルです。

kubectl apply コマンドは、リソースにマニフェスト ファイルを適用します。指定されたリソースが存在しない場合は、このコマンドによって作成されます。

kubectl apply の詳細については、kubectl リファレンス ドキュメントを参照してください。

Console

StatefulSet のライブ構成を編集するには、次の手順を行います。

  1. Cloud Console で Google Kubernetes Engine の [ワークロード] メニューに移動します。

    [ワークロード] メニューに移動

  2. 目的のワークロードを選択します。

  3. [編集] をクリックします。

  4. エディタを使用してオブジェクトに必要な変更を加えます。

  5. [保存] をクリックします。

更新ロールアウトを検査する

kubectl

StatefulSet のロールアウトを検査するには、次のコマンドを実行します。

kubectl rollout status statefulset [STATEFULSET_NAME]

StatefulSet のロールアウト履歴を表示するには、次のコマンドを実行します。

kubectl rollout history statefulset [STATEFULSET_NAME]

ロールアウトを取り消すには、次のコマンドを実行します。

kubectl rollout undo statefulset [STATEFULSET_NAME]

Console

StatefulSet の変更履歴を表示するには、次の手順を行います。

  1. Cloud Console で Google Kubernetes Engine の [ワークロード] メニューに移動します。

    [ワークロード] メニューに移動

  2. メニューから目的のワークロードを選択します。

  3. [変更履歴] をクリックします。

  4. 目的のリビジョンを選択します。

更新戦略

StatefulSet の updateStrategy フィールドを使用すると、StatefulSet 内のポッドのコンテナ、ラベル、リソース リクエスト / 制限、アノテーションの自動ローリング更新の構成および無効化を行うことができます。

StatefulSet の更新戦略の詳細については、Kubernetes のドキュメントをご覧ください。

StatefulSet をスケーリングする

kubectl

ステートフル セットをスケーリングするには、kubectl scale を使用します。これはいつでも実行できます。

ステートフル セットを手動でスケーリングするには、次のコマンドを実行します。

kubectl scale statefulset [STATEFULSET_NAME] --replicas [NUMBER_OF_REPLICAS]

ここで、[NUMBER_OF_REPLICAS] は必要な複製ポッドの数です。

Console

StatefulSet をスケーリングするには、次の手順を行います。

  1. Cloud Console で Google Kubernetes Engine の [ワークロード] メニューに移動します。

    [ワークロード] メニューに移動

  2. メニューから目的のワークロードを選択します。

  3. [アクション] をクリックしてから、[スケール] をクリックします。

  4. [レプリカ] フィールドに必要なレプリカの数を入力します。

  5. [スケール] をクリックします。

StatefulSet を削除する

kubectl

StatefulSet を削除するには、次のコマンドを実行します。

kubectl delete statefulset [STATEFULSET_NAME]

Console

StatefulSet を削除するには、次の手順を行います。

  1. Cloud Console で Google Kubernetes Engine の [ワークロード] メニューに移動します。

    [ワークロード] メニューに移動

  2. メニューから、目的のワークロードを選択します。

  3. [削除] をクリックします。

  4. 確認ダイアログのメニューで、[削除] をクリックします。

次のステップ