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

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

概要

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

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

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

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

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

始める前に

作業を始める前に、次のことを確認してください。

次のいずれかの方法で gcloud のデフォルトの設定を指定します。

  • gcloud init。デフォルトの設定全般を確認する場合に使用します。
  • gcloud config。プロジェクト ID、ゾーン、リージョンを個別に設定する場合に使用します。

gcloud init の使用

エラー One of [--zone, --region] must be supplied: Please specify location を受信した場合は、このセクションの内容を実施します。

  1. gcloud init を実行して、次の操作を行います。

    gcloud init

    リモート サーバーで SSH を使用している場合は、--console-only フラグを指定して、コマンドがブラウザを起動しないようにします。

    gcloud init --console-only
  2. 手順に従って gcloud を承認し、Google Cloud アカウントを使用します。
  3. 新しい構成を作成するか、既存の構成を選択します。
  4. Google Cloud プロジェクトを選択します。
  5. ゾーンクラスタの場合はデフォルトの Compute Engine ゾーン、リージョン クラスタまたは Autopilot クラスタの場合はデフォルトの Compute Engine リージョンを選択します。

gcloud config の使用

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

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

StatefulSet 内の永続ストレージのリクエスト

アプリケーションは、PersistentVolumeClaim を使って永続ストレージをリクエストできます。

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

StatefulSet で既存のディスクを使用することもできます。

StatefulSet を作成する

StatefulSet を作成するには、kubectl apply コマンドを使用します。

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

Linux

以下のマニフェスト ファイルは、別個に作成された Service によって管理される StatefulSet の簡単な例です。

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: statefulset-name
spec:
  selector:
    matchLabels:
      app: app-name
  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 は、サービスの名前です。
  • app-name は、Pod で実行するアプリケーションの名前です。
  • container-name は Pod 内のコンテナの名前です。
  • port-name は、StatefulSet によって開かれたポートの名前です。
  • pvc-name は、PersistentVolumeClaim の名前です。

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

Windows

Windows Server ノードプールがあるクラスタを使用する場合は、StorageClass を作成する必要があります。デフォルトの StorageClass はファイル システム タイプとして ext4 を使用しますが、ext4 は Linux コンテナに対してのみ動作するからです。Compute Engine Persistent Disk を使用している場合は、次の例のように、ファイル ストレージ タイプとして NTFS を使用する必要があります。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: storageclass-name
parameters:
  type: pd-standard
  fstype: NTFS
provisioner: kubernetes.io/gce-pd
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer

次の StatefulSet マニフェストでは、上記で定義した StorageClass を使用しています。4 つの Compute Engine Persistent Disk を表すために、PersistentVolume と PersistentVolumeClaim のペアを 4 つ作成しています。StatefulSet の各 Pod は、1 つの永続ディスクを消費します。

Pod を Windows Server ノードに正しくスケジュールするには、ノードセレクタを Pod 仕様に追加する必要があります。

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: statefulset-name
spec:
  replicas: 4
  selector:
    matchLabels:
      app: app-name
  template:
    metadata:
      labels:
        app: app-name
      name: container-name
    spec:
      nodeSelector:
        kubernetes.io/os: windows
      containers:
      - name: container-name
        image: ...
        ports:
        - containerPort: 80
          name: port-name
        volumeMounts:
        - name: pvc-name
          mountPath: C:\mnt\state
  volumeClaimTemplates:
  - metadata:
      name: pvc-name
    spec:
      storageClassName: storageclass-name
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

ここで

  • app-name は、Pod で実行するアプリケーションの名前です。
  • statefulset-name は StatefulSet の名前です。
  • container-name は Pod 内のコンテナの名前です。
  • port-name は、StatefulSet によって開かれたポートの名前です。
  • pvc-name は、PersistentVolumeClaim の名前です。
  • storageclass-name は StorageClass の名前です。

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

kubectl apply -f statefulset-file

ここで、statefulset-file はマニフェスト ファイルです。

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

StatefulSet を検査する

kubectl

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

kubectl get statefulset statefulset-name -o yaml

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

StatefulSet によって作成された Pod を一覧表示するには、次のコマンドを実行します。

kubectl get pods -l app=app-name

このコマンドで -l フラグを指定すると、kubectlapp-name ラベルを持つすべての Pod を取得します

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

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 は StatefulSet の名前です。

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

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 の名前をクリックします。

  3. [SattefulSet の詳細] ページで、次の操作を行います。

    • [変更履歴] タブをクリックして、StatefulSet の変更履歴を確認します。
    • [イベント] タブをクリックすると、StatefulSet に関連するすべてのイベントが表示されます。
    • [ログ] タブをクリックして、StatefulSet のコンテナログを表示します。
    • [YAML] タブをクリックして、StatefulSet の構成 YAML の表示、コピーまたはダウンロードを行います。

StatefulSet を更新する

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

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

kubectl apply

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

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

kubectl apply -f statefulset-file

ここで、statefulset-file は更新済みのマニフェスト ファイルです。

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

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

Console

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

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

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

  2. ワークロード リストで、変更する StatefulSet の名前をクリックします。

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

  4. 必要に応じて構成 YAML を変更します。

  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. ワークロード リストで、検査する StatefulSet の名前をクリックします。

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

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

更新戦略

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

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

StatefulSet をスケーリングする

kubectl

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

StatefulSet を手動でスケーリングするには、次のコマンドを実行します。

kubectl scale statefulset statefulset-name --replicas number-of-replicas

ここで、number-of-replicas は必要な複製 Pod の数です。

Console

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

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

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

  2. ワークロード リストで、変更する StatefulSet の名前をクリックします。

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

  4. StatefulSet の新しいレプリカ数を入力します。

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

StatefulSet を削除する

kubectl

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

kubectl delete statefulset statefulset-name

Console

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

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

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

  2. ワークロード リストで、削除する StatefulSet を 1 つ以上選択します。

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

  4. 確認のメッセージが表示されたら、[削除] をクリックします。

次のステップ