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

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

最終更新日:Nov 09, 2025

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

StatefulSet の紹介

Deployment と同様に、StatefulSet は正常に実行される特定の数の Pod を維持します。ただし、StatefulSet は Pod の ID 情報を保持するために次の特徴を提供します。

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

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

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

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

重要

StatefulSet の作成

コンソールから作成

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

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

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

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

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

    重要

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

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

    image

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

    image

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

kubectl の使用

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

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

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

    • StatefulSet を公開するために使用される LoadBalancer Service。この例では、Service は StatefulSet の特徴を検証するのに役立ちます。

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      clusterIP: None  # ヘッドレス Service
      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" # 作成したヘッドレス Service の名前を指定します。
      replicas: 2  # Pod の数を指定します。
      selector:
        matchLabels:
          app: nginx
      template: # Pod の構成。
        metadata:
          labels: # Pod のラベル。
            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  # バックエンド Pod の照合に使用されるラベル。
      ports:
        - port: 80           # クラスター内の Service によって提供されるポート。
          targetPort: 80     # コンテナー内のアプリケーションがリッスンするポート (containerPort)。
          protocol: TCP      # プロトコル。デフォルト値: TCP。
      type: LoadBalancer      # Service タイプ。デフォルト値: ClusterIP。ClusterIP Service はクラスター内からアクセスできます。
  2. 次のコマンドを実行して、StatefulSet と Service を作成します。

    kubectl apply -f statefulset.yaml

    予想される出力:

    service/nginx created
    statefulset.apps/nginx-test created
    service/nginx-test-svc created
  3. 次のコマンドを実行して、Service のパブリック 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. 次のコマンドを実行して、Pod のステータスをクエリします。

    kubectl get pod nginx-test-0

    予想される出力:

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

    kubectl delete pod nginx-test-0

    予想される出力:

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

    kubectl get pod nginx-test-0

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

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

リファレンス