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 の作成
コンソールから作成
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のペインで、 を選択します。
[StatefulSets] ページの右上隅にある [イメージから作成] をクリックします。
[基本情報] ステップで、アプリケーションの基本設定を構成します。 [次へ] をクリックして [コンテナー] ページに移動します。
[コンテナー] ステップで、[イメージ名] と [ポート] パラメーターを構成します。 その他のパラメーターはオプションです。デフォルト設定のままにします。[次へ] をクリックして [詳細] ページに移動します。 次のセクションでは、コンテナイメージの詳細について説明します。
重要このイメージをプルする前に、クラスターのインターネットアクセスを有効にする必要があります。[VPC の SNAT を設定] パラメーターのデフォルト値を維持してクラスターを作成した場合、クラスターはインターネットにアクセスできます。既存のクラスターでインターネットアクセスを有効にする方法の詳細については、「既存の ACK クラスターでインターネットアクセスを有効にする」をご参照ください。
registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
[詳細] ステップで、アクセスの制御、スケーリング、スケジューリング、ラベル、およびアノテーションの設定を構成します。[アクセスの制御] セクションで、[ClusterIP] Service を作成します。Service を構成するときに、[ヘッドレスサービス] を選択し、[OK] をクリックします。次に、ページの下部にある [作成] をクリックします。

[基本情報]、[コンテナー]、および [詳細] ステップのパラメーターは、Deployment を作成するときのパラメーターと同じです。その他のパラメーターの詳細については、「パラメーター」をご参照ください。
kubectl の使用
ワークロードを作成する前に、kubectl を使用してクラスターに接続していることを確認してください。詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
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 はクラスター内からアクセスできます。次のコマンドを実行して、StatefulSet と Service を作成します。
kubectl apply -f statefulset.yaml予想される出力:
service/nginx created statefulset.apps/nginx-test created service/nginx-test-svc created次のコマンドを実行して、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ブラウザのアドレスバーに NGINX のパブリック IP アドレス (
106.14.**.***) を入力して、ワークロードが属する NGINX コンテナーにアクセスします。
StatefulSet の特徴の検証
次のコマンドを実行して、Pod のステータスをクエリします。
kubectl get pod nginx-test-0予想される出力:
NAME READY STATUS RESTARTS AGE nginx-test-0 1/1 Running 0 7m41s次のコマンドを実行して、Pod を削除します。
kubectl delete pod nginx-test-0予想される出力:
pod "nginx-test-0" deleted次のコマンドを実行して、Pod のステータスをクエリします。
kubectl get pod nginx-test-0出力の
STATUS列にRunningが表示されます。これは、新しい Pod が元の名前で作成され、正常に実行されていることを示します。NAME READY STATUS RESTARTS AGE nginx-test-0 1/1 Running 0 20s
リファレンス
ワークロードの作成時に発生する問題の解決方法の詳細については、「ワークロードに関するよくある質問」をご参照ください。
Pod の例外のトラブルシューティングの詳細については、「Pod のトラブルシューティング」をご参照ください。