すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:ステートフルアプリケーションを作成するための StatefulSet の使用

最終更新日:Jul 03, 2025

Deployment とは異なり、StatefulSet はポッドのステータスに関する情報を保持します。そのため、StatefulSet はデータベース、メッセージキュー、または分散ストレージシステムが使用されるシナリオに最適です。このトピックでは、StatefulSet について紹介し、コンテナサービス Kubernetes 版 (ACK) コンソールまたは kubectl を使用して StatefulSet を作成する方法について説明します。

StatefulSet の概要

Deployment と同様に、StatefulSet は通常どおり実行される特定の数のポッドを保持します。ただし、StatefulSet は、ポッドの ID 情報を維持するために、次の機能を提供します。

  • 順序付けられた固定ポッド名: StatefulSet によって作成されたポッドには、<StatefulSet 名>-<シリアル番号> の形式で順番に名前が付けられます。たとえば、db-app という名前の StatefulSet によって 2 つのポッドがプロビジョニングされる場合、ポッドの名前は db-app-0 と db-app-1 になります。ポッドが再作成されると、元の名前が使用されます。

  • 安定したネットワーク識別子: ほとんどの場合、ヘッドレス サービスを StatefulSet に関連付ける必要があります。StatefulSet の spec.serviceName パラメーターでヘッドレス サービスの名前を指定できます。ヘッドレス サービスは、StatefulSet のポッドの負荷分散を行いません。代わりに、ヘッドレス サービスは、ポッドに固定ドメイン名を提供するためにのみ使用されます。ヘッドレス サービスのすべてのバックエンド ポッドの IP アドレスは、ヘッドレス サービスの DNS クエリに対して返されます。ヘッドレス サービスを StatefulSet に関連付けると、StatefulSet のポッドのドメイン名は <ポッド名>.<ヘッドレス サービス名>.<名前空間>.svc.<ClusterDomain> 形式を使用します。例: db-app-01.db-app.default.svc.cluster.local。ポッドが再作成されると、ポッドのドメイン名は新しいポッドの IP アドレスに自動的に解決されます。

  • 安定した永続ストレージ: StatefulSet の spec.volumeClaimTemplates パラメーターで永続ボリューム要求 (PVC) テンプレートを指定できます。StatefulSet は、指定されたテンプレートに基づいて、各ポッドに対して個別の PVC を自動的に作成します。PVC には、<PVC テンプレート名>-<ポッド名> テンプレートの形式で名前が付けられます。ポッドが削除されると、関連する PVC は保持されます。ポッドが再作成されると、PVC は元のシリアル番号を持つ新しいポッドに自動的に関連付けられます。

StatefulSet のポッドが再作成されると、上記の機能により、新しいポッドが元のポッドのネットワークとストレージのステータスを継承することが保証されます。このようにして、新しいポッドは永続ストレージ内のデータで回復します。 StatefulSet の詳細については、「StatefulSets」をご参照ください。

重要

このトピックで使用されているサンプル イメージはパブリック イメージです。クラスターまたはノードは、それらをプルするためにパブリック ネットワーク アクセスが必要です。

StatefulSet を作成する

ACK コンソール

  1. ACK コンソール にログインします。左側のナビゲーション ウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、目的のクラスターを見つけて名前をクリックします。左側のペインで、[ワークロード] > [StatefulSet] を選択します。

  3. [StatefulSet] ページの右上隅にある [イメージから作成] をクリックします。

  4. [基本情報] ステップで、アプリケーションの基本設定を構成します。 [次へ] をクリックして [コンテナー] ページに進みます。

  5. [コンテナー] ステップで、[イメージ名] パラメーターと [ポート] パラメーターを構成します。 その他のパラメーターはオプションです。デフォルト設定を維持します。 [次へ] をクリックして [詳細設定] ページに進みます。 次のセクションでは、コンテナー イメージの詳細について説明します。

    重要

    このイメージをプルする前に、クラスターのインターネットアクセスを有効にする必要があります。クラスターを作成するときに [VPC の SNAT を構成する] パラメーターのデフォルト値を維持すると、クラスターはインターネットにアクセスできます。既存のクラスターのインターネットアクセスを有効にする方法の詳細については、「既存の ACK クラスタがインターネットにアクセスできるようにする」をご参照ください。

    registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest

    image

  6. [詳細設定] ステップで、アクセス制御、スケーリング、スケジューリング、ラベル、アノテーションなどの設定を構成します。[アクセス制御] セクションで、[ClusterIP] サービスを作成します。サービスを構成する際に、[ヘッドレス サービス] を選択し、[OK] をクリックします。次に、ページの下部にある [作成] をクリックします。

    image

  7. [基本情報][コンテナー][詳細設定] の各ステップのパラメーターは、Deployment を作成する場合と同じです。その他のパラメーターの詳細については、「パラメーター」をご参照ください。

kubectl

重要
  1. statefulset.yaml という名前のファイルを作成し、次の YAML テンプレートをファイルにコピーします。YAML テンプレートには、次のリソースが含まれています。

    • nginx という名前のヘッドレス サービス。ヘッドレス サービスは、安定したドメイン名を提供するために使用されます。

    • hostPath ボリュームがマウントされた StatefulSet。

    • StatefulSet を公開するために使用される LoadBalancer サービス。この例では、サービスは StatefulSet の機能を確認するのに役立ちます。

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      clusterIP: None  # ヘッドレス サービス
      selector:
        app: nginx
      ports:
      - port: 80
        name: http
    ---
    apiVersion: apps/v1
    kind: StatefulSet   # ワークロードタイプ
    metadata:
      name: nginx-test
      namespace: default  # ビジネス要件に基づいて名前空間を変更します。
      labels:
        app: nginx
    spec:
      serviceName: "nginx" # 作成したヘッドレス サービスの名前を指定します。
      replicas: 2  # ポッドの数を指定します。
      selector:
        matchLabels:
          app: nginx
      template: # ポッドの構成
        metadata:
          labels: # ポッドのラベル
            app: nginx 
        spec:
          containers:
          - name: nginx  # コンテナ名
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6  # NGINX イメージのバージョン
            ports:
            - containerPort: 80  # コンテナによって公開されるポート
              protocol: TCP  # プロトコルを TCP または UDP に設定します。
            volumeMounts:
            - name: node-dir-volume  # ボリューム名。値は、以下の volumes セクションで指定されたボリューム名と同じである必要があります。
              mountPath: /tmp  # コンテナ内のボリュームのマウントパス
          volumes:
          - name: node-dir-volume
            hostPath:
              path: /local_storage  # ボリュームとしてマウントするホスト上のディレクトリ
              type: DirectoryOrCreate     # 指定されたディレクトリが存在しない場合、システムは自動的にディレクトリを作成します。
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-test-svc
      namespace: default  # ビジネス要件に基づいて名前空間を変更します。
      labels:
        app: nginx
    spec:
      selector:
        app: nginx  # バックエンド ポッドの照合に使用されるラベル
      ports:
        - port: 80           # クラスター内のサービスによって提供されるポート
          targetPort: 80     # コンテナ内のアプリケーションがリッスンするポート (containerPort)
          protocol: TCP      # プロトコル。デフォルト値: TCP
      type: LoadBalancer      # サービス タイプ。デフォルト値: ClusterIP。ClusterIP サービスは、クラスター内からアクセスできます。
  2. 次のコマンドを実行して、StatefulSet とサービスを作成します。

    kubectl apply -f statefulset.yaml

    予想される出力:

    service/nginx created
    statefulset.apps/nginx-test created
    service/nginx-test-svc created
  3. 次のコマンドを実行して、サービスのパブリック IP アドレスをクエリします。

    kubectl get svc

    予想される出力:

    NAME            TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)        AGE
    kubernetes      ClusterIP      172.16.**.***    <none>          443/TCP        4h47m
    nginx           ClusterIP      None             <none>          80/TCP         1h10m
    nginx-test-svc  LoadBalancer   172.16.**.***    106.14.**.***   80:31130/TCP   1h10m
  4. ブラウザのアドレスバーに NGINX のパブリック IP アドレス (106.14.**.***) を入力して、ワークロードが属する NGINX コンテナにアクセスします。image

StatefulSet の機能を確認する

  1. 次のコマンドを実行して、ポッドのステータスをクエリします。

    kubectl get pod nginx-test-0

    予想される出力:

    NAME           READY   STATUS    RESTARTS   AGE
    nginx-test-0   1/1     Running   0          7m41s
  2. 次のコマンドを実行して、ポッドを削除します。

    kubectl delete pod nginx-test-0

    予想される出力:

    pod "nginx-test-0" deleted
  3. 次のコマンドを実行して、ポッドのステータスをクエリします。

    kubectl get pod nginx-test-0

    出力の STATUS 列に Running と表示されます。これは、元の名前で新しいポッドが作成され、正常に実行されていることを示します。

    NAME           READY   STATUS    RESTARTS   AGE
    nginx-test-0   1/1     Running   0          20s

関連情報