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」をご参照ください。
このトピックで使用されているサンプル イメージはパブリック イメージです。クラスターまたはノードは、それらをプルするためにパブリック ネットワーク アクセスが必要です。
既存の ACK クラスタがインターネットにアクセスできるようにする (推奨): クラスタをホストする VPC にパブリック NAT ゲートウェイを作成します。すべてのクラスター リソースがパブリック アクセスを取得します。
ノードに 静的パブリック IP アドレスを割り当てる : パブリック IP を持つノードはパブリック イメージをプルできますが、ワークロードを実行するすべてのノードにパブリック IP を割り当てる必要があります。
StatefulSet を作成する
ACK コンソール
ACK コンソール にログインします。左側のナビゲーション ウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、目的のクラスターを見つけて名前をクリックします。左側のペインで、 を選択します。
[StatefulSet] ページの右上隅にある [イメージから作成] をクリックします。
[基本情報] ステップで、アプリケーションの基本設定を構成します。 [次へ] をクリックして [コンテナー] ページに進みます。
[コンテナー] ステップで、[イメージ名] パラメーターと [ポート] パラメーターを構成します。 その他のパラメーターはオプションです。デフォルト設定を維持します。 [次へ] をクリックして [詳細設定] ページに進みます。 次のセクションでは、コンテナー イメージの詳細について説明します。
重要このイメージをプルする前に、クラスターのインターネットアクセスを有効にする必要があります。クラスターを作成するときに [VPC の SNAT を構成する] パラメーターのデフォルト値を維持すると、クラスターはインターネットにアクセスできます。既存のクラスターのインターネットアクセスを有効にする方法の詳細については、「既存の ACK クラスタがインターネットにアクセスできるようにする」をご参照ください。
registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
[詳細設定] ステップで、アクセス制御、スケーリング、スケジューリング、ラベル、アノテーションなどの設定を構成します。[アクセス制御] セクションで、[ClusterIP] サービスを作成します。サービスを構成する際に、[ヘッドレス サービス] を選択し、[OK] をクリックします。次に、ページの下部にある [作成] をクリックします。
[基本情報]、[コンテナー]、[詳細設定] の各ステップのパラメーターは、Deployment を作成する場合と同じです。その他のパラメーターの詳細については、「パラメーター」をご参照ください。
kubectl
ワークロードを作成する前に、kubectl を使用してクラスターに接続していることを確認してください。詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
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 サービスは、クラスター内からアクセスできます。
次のコマンドを実行して、StatefulSet とサービスを作成します。
kubectl apply -f statefulset.yaml
予想される出力:
service/nginx created statefulset.apps/nginx-test created service/nginx-test-svc created
次のコマンドを実行して、サービスのパブリック 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 の機能を確認する
次のコマンドを実行して、ポッドのステータスをクエリします。
kubectl get pod nginx-test-0
予想される出力:
NAME READY STATUS RESTARTS AGE nginx-test-0 1/1 Running 0 7m41s
次のコマンドを実行して、ポッドを削除します。
kubectl delete pod nginx-test-0
予想される出力:
pod "nginx-test-0" deleted
次のコマンドを実行して、ポッドのステータスをクエリします。
kubectl get pod nginx-test-0
出力の
STATUS
列にRunning
と表示されます。これは、元の名前で新しいポッドが作成され、正常に実行されていることを示します。NAME READY STATUS RESTARTS AGE nginx-test-0 1/1 Running 0 20s
関連情報
ワークロードの作成時に発生する問題の解決方法の詳細については、「ワークロードに関するよくある質問」をご参照ください。
ポッドの例外のトラブルシューティング方法の詳細については、「ポッドのトラブルシューティング」をご参照ください。