このページでは、Google Kubernetes Engine(GKE)を使用してステートフル アプリケーションをデプロイする方法について説明します。
概要
ステートフル アプリケーションは、サーバー、クライアント、およびその他のアプリケーションが使用するデータを永続ディスク ストレージに保存します。ステートフル アプリケーションの例としては、他のアプリケーションがデータの保存先および取得元として使用するデータベースや Key-Value ストアが挙げられます。
永続ストレージは動的にプロビジョニングできるため、基礎となるボリュームがオンデマンドで作成されます。Kubernetes では、StorageClass を作成して動的プロビジョニングを構成します。GKE では、デフォルトの StorageClass によって、Compute Engine の永続ディスクを動的にプロビジョニングできます。
Kubernetes は、StatefulSet コントローラを使用して、ステートフル アプリケーションを StatefulSet オブジェクトとしてデプロイします。StatefulSet の Pod に互換性はありません。各 Pod は、スケジュールされた場所に関係なく維持される一意の識別子を持っています。
ステートフル アプリケーションは、クライアント データがセッション間でサーバーに保存されないステートレス アプリケーションとは異なります。
マルチゾーン クラスタとリージョン クラスタの永続ストレージで詳細を確認できます。
始める前に
作業を始める前に、次のことを確認してください。
- Google Kubernetes Engine API を有効にする。 Google Kubernetes Engine API の有効化
- このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、
gcloud components update
を実行して最新のバージョンを取得する。
- コンテナ化されたアプリケーションが Artifact 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
: Service の名前。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 リソースを作成するには、次のコマンドを実行して、STATEFULSET_FILE
をマニフェスト ファイル名に置き換えます。
kubectl apply -f STATEFULSET_FILE
kubectl apply -f DIRECTORY/
を使用して、ディレクトリに保存された構成ファイルで定義されているすべてのオブジェクト(既存のオブジェクトを除く)を作成することもできます。
StatefulSet を検査する
kubectl
StatefulSet を検査するには、次のコマンドを実行します。
kubectl get statefulset STATEFULSET_NAME -o yaml
このコマンドでは、StatefulSet リソースのライブ構成を YAML 形式で表示します。
ステートフル セットによって作成されたポッドを一覧表示するには、次のコマンドを実行します。
kubectl get pods -l app=APP_NAME
このコマンドで -l
フラグを指定すると、kubectl
は APP_NAME
ラベルを持つすべての Pod を取得します。
出力は次のようになります。
NAME READY STATUS RESTARTS AGE
pod-name 1/1 Running 0 1m
pod-name 1/1 Running 0 1m
ステートフル セットの詳細情報を取得するには、次のコマンドを実行します。
kubectl describe statefulset STATEFULSET_NAME
特定の 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 を検査するには、次の手順を行います。
Google Cloud コンソールの [ワークロード] ページに移動します。
ワークロード リストで、検査する StatefulSet の名前をクリックします。
[SattefulSet の詳細] ページで、次の操作を行います。
- [変更履歴] タブをクリックして、StatefulSet の変更履歴を確認します。
- [イベント] タブをクリックすると、StatefulSet に関連するすべてのイベントが表示されます。
- [ログ] タブをクリックして、StatefulSet のコンテナログを表示します。
- [YAML] タブをクリックして、StatefulSet の構成 YAML の表示、コピーまたはダウンロードを行います。
StatefulSet を更新する
StatefulSet を更新する方法は複数あります。一般的な宣言型メソッドは kubectl apply
です。ステートフル セットをシェルで直接更新するか、任意のエディタで更新するには、kubectl edit
を使用します。また、Google Cloud コンソールの [GKE ワークロード] メニューから YAML エディタを使用することもできます。
StatefulSet リソースの Pod 仕様に、イメージ、リソースの使用量 / リクエスト、構成などの更新をロールアウトできます。
kubectl apply
新規作成または更新されたマニフェスト ファイルを適用することで、StatefulSet を更新できます。 これは、アプリケーションのスケーリングや新しいバージョンの指定など、StatefulSet にさまざまな変更を加える場合に便利です。
ステートフル セットを更新するには、次のコマンドを実行します。
kubectl apply -f STATEFULSET_FILE
STATEFULSET_FILE
は、更新されたマニフェスト ファイルに置き換えます。
kubectl apply
コマンドは、リソースにマニフェスト ファイルを適用します。指定されたリソースが存在しない場合は、このコマンドによって作成されます。
kubectl apply
の詳細については、kubectl
リファレンス ドキュメントを参照してください。
Console
StatefulSet のライブ構成を編集するには、次の手順を行います。
Google Cloud コンソールの [ワークロード] ページに移動します。
ワークロード リストで、変更する StatefulSet の名前をクリックします。
[edit 編集] をクリックします。
必要に応じて構成 YAML を変更します。
[保存] をクリックします。
更新ロールアウトを検査する
kubectl
StatefulSet のロールアウトを検査するには、次のコマンドを実行します。
kubectl rollout status statefulset STATEFULSET_NAME
StatefulSet のロールアウト履歴を表示するには、次のコマンドを実行します。
kubectl rollout history statefulset STATEFULSET_NAME
ロールアウトを元に戻すには、次のコマンドを実行します。
kubectl rollout undo statefulset STATEFULSET_NAME
Console
StatefulSet の変更履歴を表示するには、次の手順を行います。
Google Cloud コンソールの [ワークロード] ページに移動します。
ワークロード リストで、検査する StatefulSet の名前をクリックします。
[変更履歴] タブをクリックします。
目的のリビジョンを選択します。
更新戦略
StatefulSet の updateStrategy
フィールドを使用すると、StatefulSet 内の Pod に対して、コンテナ、ラベル、リソース リクエスト / 上限、アノテーションの自動ローリング更新の構成と無効化を行うことができます。
StatefulSet の更新戦略の詳細については、Kubernetes のドキュメントをご覧ください。
StatefulSet をスケーリングする
kubectl
kubectl scale
コマンドを使用して、随時 StatefulSet をスケーリングできます。
ステートフル セットを手動でスケーリングするには、次のコマンドを実行します。
kubectl scale statefulset STATEFULSET_NAME --replicas NUMBER_OF_REPLICAS
NUMBER_OF_REPLICAS
は、必要な複製 Pod の数に置き換えます。
Console
StatefulSet をスケールするには、次の手順を行います。
Google Cloud コンソールの [ワークロード] ページに移動します。
ワークロード リストで、変更する StatefulSet の名前をクリックします。
list [アクション] > [スケール] > [レプリカの編集] をクリック
StatefulSet の新しいレプリカ数を入力します。
[スケール] をクリックします。
StatefulSet を削除する
kubectl
StatefulSet を削除するには、次のコマンドを実行します。
kubectl delete statefulset STATEFULSET_NAME
Console
StatefulSet を削除するには、次の手順を行います。
Google Cloud コンソールの [ワークロード] ページに移動します。
ワークロード リストで、削除する StatefulSet を 1 つ以上選択します。
[delete 削除] をクリックします。
確認のメッセージが表示されたら、[削除] をクリックします。
次のステップ
- 高可用性のために GKE に MySQL クラスタをデプロイする方法を確認する
- ステートレス アプリケーションのデプロイについて学習する。
- ステートフル ワークロードを実行するクラスタのアップグレードに関するチュートリアルに進む。