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

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

最終更新日:Dec 28, 2024

Alibaba Cloud Container Service for Kubernetes(ACK)コンソールでStatefulSetを使用して、ステートフルアプリケーションを迅速に作成できます。このトピックでは、ステートフルなNGINXアプリケーションの作成方法とStatefulSetの機能について説明します。

前提条件

kubectlクライアントがクラスタに接続されていること。詳細については、クラスタのkubeconfigファイルを取得し、kubectlを使用してクラスタに接続するを参照してください。

背景情報

StatefulSetは、以下の機能を提供します。

機能

説明

Podの整合性

Podの整合性により、Podが指定された順序で起動および終了され、ネットワークの整合性が確保されます。Podの整合性は、Podがスケジュールされるノードに関係なく、Podの設定によって決まります。

安定した永続ストレージ

VolumeClaimTemplateを使用すると、永続ボリューム(PV)を各Podにマウントできます。レプリケートされたPodにマウントされたPVは、レプリケートされたPodを削除したり、レプリケートされたPodの数をスケールインしたりした後も削除されません。

安定したネットワーク識別子

StatefulSet内の各Podは、StatefulSetの名前とPodの序数からhostnameを取得します。ホスト名の形式は、StatefulSet名-Pod序数です。

安定した順序

N個のレプリケートされたPodを持つStatefulSetの場合、各Podには0からN-1までの整数の序数が割り当てられます。StatefulSet内でPodに割り当てられた序数は一意です。

手順

ステップ1:基本設定

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

  2. クラスタページで、管理するクラスタを見つけ、そのIDをクリックします。クラスタ詳細ページの左側のナビゲーションペインで、ワークロード > StatefulSetsを選択します。

  3. StatefulSetsページで、イメージから作成をクリックします。

  4. 基本情報ウィザードページで、基本設定を行います。

    パラメータ

    説明

    名前

    アプリケーションの名前を入力します。

    レプリカ

    アプリケーションにプロビジョニングされるPodの数。デフォルト値:2。

    ワークロード

    StatefulSetを選択します。

    ラベル

    アプリケーションにラベルを追加します。ラベルは、アプリケーションを識別するために使用されます。

    アノテーション

    アプリケーションにアノテーションを追加します。

    インスタンスタイプ

    使用するインスタンスタイプ。詳細については、ACK Podの概要を参照してください。

    Qosタイプ

    QoSクラスを選択します。詳細については、コンピューティングパワーQoSを参照してください。

    • 汎用Podは、デフォルトBestEffort QoSクラスをサポートしています。

    • パフォーマンス向上Podは、デフォルトQoSクラスのみをサポートしています。

  5. 次へをクリックして、コンテナウィザードページに進みます。

ステップ2:コンテナの設定

コンテナウィザードページで、コンテナイメージ、リソース設定、ポート、環境変数、ヘルスチェック、ライフサイクル、ボリューム、およびログを設定します。

説明

コンテナ1タブの右側にあるコンテナを追加をクリックして、さらにコンテナを追加します。

  1. 全般セクションで、基本的なコンテナ設定を行います。

    パラメータ

    説明

    イメージ名

    • イメージを選択

      イメージを選択をクリックし、コンテナイメージを選択します。

      • Container Registry Enterprise Edition:Container Registry Enterprise Editionインスタンスに保存されているイメージを選択します。イメージが属するリージョンとContainer Registryインスタンスを選択する必要があります。Container Registryの詳細については、Container Registryとはを参照してください。

      • Container Registry Personal Edition:Container Registry Personal Editionインスタンスに保存されているイメージを選択します。Container Registry Personal Editionがアクティブになっていることを確認してください。イメージが属するリージョンとContainer Registryインスタンスを選択する必要があります。

      • アーティファクトセンター:アーティファクトセンターには、アプリケーションのコンテナ化のための基本オペレーティングシステムイメージ、基本言語イメージ、およびAIおよびビッグデータ関連のイメージが含まれています。この例では、NGINXイメージが選択されています。詳細については、アーティファクトセンターの概要を参照してください。

    • (オプション)イメージプルポリシーを設定する

      イメージプルポリシードロップダウンリストからイメージプルポリシーを選択します。デフォルトでは、KubernetesのIfNotPresentポリシーが使用されます。

      • ifNotPresent:プルするイメージがオンプレミスマシンで見つかった場合、オンプレミスマシンのイメージが使用されます。それ以外の場合、システムはイメージレジストリからイメージをプルします。

      • 常に:アプリケーションがデプロイまたは拡張されるたびに、システムはレジストリからイメージをプルします。

      • しない:システムはオンプレミスマシンのイメージのみを使用します。

    • (オプション)イメージプルシークレットを設定する

      イメージプルシークレットを設定をクリックして、プライベートイメージをプルするために使用するシークレットを設定します。

    必要なリソース

    コンテナのリソースリクエストを指定します。

    • CPU:コンテナのCPUリクエストとCPU制限を設定できます。デフォルトでは、CPUリクエストはCPU制限と同じです。CPUリソースは従量課金制です。YAMLテンプレートを使用してリソースリクエストとは異なるリソース制限を設定した場合、リソースリクエストはリソース制限の値に自動的に上書きされます。詳細については、リソース仕様を参照してください。

    • メモリ:コンテナのメモリリクエストとメモリ制限を設定できます。デフォルトでは、メモリリクエストはメモリ制限と同じです。メモリリソースは従量課金制です。YAMLテンプレートを使用してリソースリクエストとは異なるリソース制限を設定した場合、リソースリクエストはリソース制限の値に自動的に上書きされます。詳細については、リソース仕様を参照してください。

    コンテナ起動パラメータ

    コンテナの起動オプションを指定します。このパラメータはオプションです。

    • stdin:ACKコンソールの入力をコンテナに渡します。

    • tty:仮想端末で定義された起動パラメータをACKコンソールに渡します。

    説明

    stdinttyは一緒に使用されます。この場合、仮想端末(tty)はコンテナのstdinに関連付けられます。たとえば、インタラクティブプログラムはユーザーからstdinを受信し、端末にコンテンツを表示します。

    Initコンテナ

    このチェックボックスを選択すると、initコンテナが作成されます。このパラメータはオプションです。

    Initコンテナを使用して、アプリケーションコンテナの起動をブロックまたは延期できます。Pod内のアプリケーションコンテナは、initコンテナが起動した後にのみ同時に起動します。たとえば、initコンテナを使用して、アプリケーションが依存するサービスの可用性を確認できます。アプリケーションイメージでは提供されていないツールやスクリプトをinitコンテナで実行して、アプリケーションコンテナのランタイム環境を初期化できます。たとえば、ツールやスクリプトを実行して、カーネルパラメータを設定したり、設定ファイルを生成したりできます。詳細については、Initコンテナを参照してください。

  2. オプション:ポートセクションで、追加をクリックしてコンテナポートを追加できます。

    パラメータ

    説明

    名前

    コンテナポートの名前を入力します。

    コンテナポート

    公開するコンテナポートを指定します。ポート番号は1~65535の範囲でなければなりません。

    プロトコル

    有効な値:TCPおよびUDP。

  3. オプション:環境セクションで、追加をクリックして環境変数を追加できます。

    環境ラベルを追加したり、設定を渡したりするために、キーと値のペアで環境変数をPodに追加できます。詳細については、環境変数を通じてPod情報をコンテナに公開するを参照してください。

    パラメータ

    説明

    タイプ

    環境変数のタイプを選択します。有効な値:

    • カスタム

    • パラメータ

    • シークレット

    • 値/valuefrom

    • ResourceFieldRef

    ConfigMapまたはシークレットを選択した場合、選択したConfigMapまたはシークレットのすべてのデータをコンテナ環境変数に渡すことができます。

    この例では、シークレットが選択されています。タイプドロップダウンリストからシークレットを選択し、値/ValueFromドロップダウンリストからシークレットを選択します。デフォルトでは、選択したシークレットのすべてのデータが環境変数に渡されます。环境变量

    この場合、アプリケーションのデプロイに使用されるYAMLファイルには、選択したシークレットのすべてのデータを参照する設定が含まれています。yaml

    変数キー

    環境変数の名前。

    値/valuefrom

    環境変数の値。

  4. オプション:ヘルスチェックセクションで、ビジネス要件に基づいてlivenessreadiness、およびstartupプローブを有効にできます。

    • Liveness:Livenessプローブは、コンテナをいつ再起動するかを判断するために使用されます。

    • Readiness:Readinessプローブは、コンテナがトラフィックを受信する準備ができているかどうかを判断するために使用されます。

    • Startup:Startupプローブは、コンテナをいつ起動するかを判断するために使用されます。

    詳細については、Liveness、Readiness、およびStartupプローブの設定を参照してください。

    パラメータ

    説明

    HTTP

    コンテナにHTTP GETリクエストを送信します。以下のパラメータを設定できます。

    • プロトコル:リクエストを送信するプロトコル。有効な値:HTTPおよびHTTPS

    • パス:サーバーでリクエストされたHTTPパス。

    • ポート:コンテナによって公開されるポートの番号または名前。ポート番号は1~65535でなければなりません。

    • HTTPヘッダー:HTTPリクエストのカスタムヘッダー。重複ヘッダーが許可されます。キーと値のペアでHTTPヘッダーを指定できます。

    • 初期遅延(秒):YAMLファイルのinitialDelaySecondsフィールド。このフィールドは、コンテナの起動後、最初のプローブが実行されるまでの待機時間(秒単位)を指定します。デフォルト値:3。

    • 期間(秒):YAMLファイルのperiodSecondsフィールド。このフィールドは、プローブが実行される時間間隔(秒単位)を指定します。デフォルト値:10。最小値:1。

    • タイムアウト(秒):YAMLファイルのtimeoutSecondsフィールド。このフィールドは、プローブがタイムアウトするまでの時間(秒単位)を指定します。デフォルト値:1。最小値:1。

    • 正常しきい値:プローブの失敗後、コンテナが正常と見なされるまでに必要な連続成功の最小回数。デフォルト値:1。最小値:1。Livenessプローブの場合、このパラメータは1に設定する必要があります。

    • 異常しきい値:成功後、コンテナが異常と見なされるまでに必要な連続失敗の最小回数。デフォルト値:3。最小値:1。

    TCP

    コンテナにTCPソケットを送信します。kubeletは、指定されたポートでソケットを開こうとします。接続が確立できる場合、コンテナは正常と見なされます。それ以外の場合、コンテナは異常と見なされます。以下のパラメータを設定できます。

    • ポート:コンテナによって公開されるポートの番号または名前。ポート番号は1~65535でなければなりません。

    • 初期遅延(秒):YAMLファイルのinitialDelaySecondsフィールド。このフィールドは、コンテナの起動後、最初のプローブが実行されるまでの待機時間(秒単位)を指定します。デフォルト値:15。

    • 期間(秒):YAMLファイルのperiodSecondsフィールド。このフィールドは、プローブが実行される時間間隔(秒単位)を指定します。デフォルト値:10。最小値:1。

    • タイムアウト(秒):YAMLファイルのtimeoutSecondsフィールド。このフィールドは、プローブがタイムアウトするまでの時間(秒単位)を指定します。デフォルト値:1。最小値:1。

    • 正常しきい値:プローブの失敗後、コンテナが正常と見なされるまでに必要な連続成功の最小回数。デフォルト値:1。最小値:1。Livenessプローブの場合、このパラメータは1に設定する必要があります。

    • 異常しきい値:成功後、コンテナが異常と見なされるまでに必要な連続失敗の最小回数。デフォルト値:3。最小値:1。

    コマンド

    コンテナでプローブコマンドを実行して、コンテナのヘルスステータスを確認します。以下のパラメータを設定できます。

    • コマンド:コンテナのヘルスステータスを確認するために実行されるプローブコマンド。

    • 初期遅延(秒):YAMLファイルのinitialDelaySecondsフィールド。このフィールドは、コンテナの起動後、最初のプローブが実行されるまでの待機時間(秒単位)を指定します。デフォルト値:5。

    • 期間(秒):YAMLファイルのperiodSecondsフィールド。このフィールドは、プローブが実行される時間間隔(秒単位)を指定します。デフォルト値:10。最小値:1。

    • タイムアウト(秒):YAMLファイルのtimeoutSecondsフィールド。このフィールドは、プローブがタイムアウトするまでの時間(秒単位)を指定します。デフォルト値:1。最小値:1。

    • 正常しきい値:プローブの失敗後、コンテナが正常と見なされるまでに必要な連続成功の最小回数。デフォルト値:1。最小値:1。Livenessプローブの場合、このパラメータは1に設定する必要があります。

    • 異常しきい値:成功後、コンテナが異常と見なされるまでに必要な連続失敗の最小回数。デフォルト値:3。最小値:1。

  5. オプション:ライフサイクルセクションで、コンテナのライフサイクルを設定できます。

    Start、Post Start、Pre Stopなどのパラメータを指定して、コンテナのライフサイクルを設定できます。詳細については、コンテナライフサイクルイベントにハンドラをアタッチするを参照してください。

    パラメータ

    説明

    開始

    コンテナが起動する前に有効になるコマンドとパラメータを指定します。

    Post Start

    コンテナが起動した後に有効になるコマンドを指定します。

    Pre Stop

    コンテナを終了するコマンドを指定します。

  6. オプション:ボリュームセクションで、コンテナにマウントするボリュームを設定します。

    • ローカルストレージ:PVタイプドロップダウンリストからConfigMap、シークレット、またはEmptyDirを選択できます。次に、マウントソースとコンテナパスパラメータを設定して、ボリュームをコンテナパスにマウントします。詳細については、ボリュームを参照してください。

    • クラウドストレージ:ディスクおよびファイルストレージNAS(NAS)ファイルシステムがサポートされています。詳細については、ストレージの概要を参照してください。

  7. オプション:ログセクションで、ログ設定を指定し、収集されたログにカスタムタグを追加できます。

    パラメータ

    説明

    収集設定

    • ログストア:ログサービスにログストアを作成して、収集されたログデータを保存します。

    • コンテナ内のログパス(stdoutに設定可能):ログを収集するstdoutまたはパスを指定します。

      • stdoutファイルを収集:stdoutを指定すると、stdoutファイルが収集されます。

      • テキストログ:コンテナの指定されたパスにあるログが収集されることを指定します。この例では、/var/log/nginxがパスとして指定されています。パスにはワイルドカード文字を使用できます。

    カスタムタグ

    カスタムタグを追加することもできます。タグは、ログが収集されるときにコンテナのログに追加されます。ログの分析とフィルタリングのために、コンテナログにカスタムタグを追加できます。

  8. 次へをクリックして、詳細設定ウィザードページに進みます。

ステップ3:詳細設定

詳細設定ウィザードページで、アクセス制御、スケーリング、スケジューリング、アノテーション、およびラベルなどの設定を行います。

  1. アクセス制御セクションで、バックエンドPodを公開するためのアクセス制御設定を行うことができます。

    また、バックエンドPodをインターネットに公開する方法を指定することもできます。この例では、ClusterIPサービスとイングレスが作成され、NGINXアプリケーションがインターネットに公開されます。

    • サービスを作成するには、サービスの右側にある作成をクリックします。作成ダイアログボックスで、パラメータを設定します。

      サービスパラメータの表示

      パラメータ

      説明

      名前

      サービスの名前。この例では、nginx-svcが使用されています。

      ステータス

      サービスのタイプ。このパラメータは、サービスへのアクセス方法を指定します。この例では、クラスタIPが選択されています。

      • クラスタIP:ClusterIPサービス。このタイプのサービスは、クラスタの内部IPアドレスを使用してサービスを公開します。このオプションを選択すると、サービスはクラスタ内からのみアクセスできます。これはデフォルト値です。

        説明

        ヘッドレスサービスパラメータは、タイプをクラスタIPに設定した場合にのみ使用できます。

      • サーバーロードバランサ:LoadBalancerタイプのサービス。このタイプのサービスは、サーバーロードバランサ(SLB)インスタンスを使用してサービスを公開します。このタイプを選択すると、サービスへの内部アクセスまたは外部アクセスを有効にできます。SLBインスタンスを使用して、リクエストをClusterIPサービスにルーティングできます。

        • SLBインスタンスの作成:変更をクリックして、SLBインスタンスの仕様を変更できます。

        • 既存のSLBインスタンスの使用:リストからSLBインスタンスタイプを選択します。

        説明

        SLBインスタンスを作成するか、既存のSLBインスタンスを使用できます。また、SLBインスタンスを複数のサービスに関連付けることもできます。ただし、以下の制限に注意する必要があります。

        • 既存のSLBインスタンスを使用する場合、SLBインスタンスのリスナーはサービスのリスナーを上書きします。

        • サービスとともにSLBインスタンスが作成された場合、他のサービスを作成するときにこのSLBインスタンスを再利用することはできません。そうしないと、SLBインスタンスが削除される可能性があります。コンソールで手動で作成された、またはAPIを呼び出すことによって作成されたSLBインスタンスのみを、複数のサービスを公開するために使用できます。

        • 同じSLBインスタンスを共有するサービスは、異なるフロントエンドリスナーポートを使用する必要があります。そうしないと、ポートの競合が発生する可能性があります。

        • 複数のサービスが同じSLBインスタンスを共有する場合、Kubernetesではリスナー名とvServerグループ名を一意の識別子として使用する必要があります。リスナーまたはvServerグループの名前を変更しないでください。

        • クラスタ間でSLBインスタンスを共有することはできません。

      ポートマッピング

      サービスポートとコンテナポートを指定します。コンテナポートは、バックエンドPodで公開されているポートと同じである必要があります。

      外部トラフィックポリシー

      • ローカル:トラフィックは、イングレスゲートウェイがデプロイされているノード上のPodにのみルーティングされます。

      • クラスタ:このポリシーは、他のノード上のPodにトラフィックをルーティングできます。

      説明

      外部トラフィックポリシーパラメータは、タイプをサーバーロードバランサに設定した場合にのみ使用できます。

      アノテーション

      SLBインスタンスに1つ以上のアノテーションを追加します。たとえば、service.beta.kubernetes.io/alicloud-loadbalancer-bandwidth:20は、サービスの最大帯域幅が20 Mbit/sであることを指定します。これは、サービスを通過するトラフィック量を制限します。

      ラベル

      サービスに追加されるラベル。サービスを識別します。

    • イングレスを作成するには、イングレスの右側にある作成をクリックします。作成ダイアログボックスで、パラメータを設定します。

      イングレスパラメータの表示

      説明

      イメージからアプリケーションを作成する場合、1つのサービスに対してのみイングレスを作成できます。この例では、仮想ホストの名前がテストドメイン名として使用されています。ホストファイルに次のマッピングルールを追加して、ドメイン名をイングレスのIPアドレスにマッピングする必要があります。エントリの形式は、<イングレス外部エンドポイント> + <イングレスドメイン名>です。実際のシナリオでは、インターネットコンテンツプロバイダ(ICP)番号を持つドメイン名を使用してください。

      101.37.xx.xx   foo.bar.com    # イングレスのIPアドレス。

      パラメータ

      説明

      名前

      イングレスの名前。この例では、alb-ingressが使用されています。

      ルール

      イングレスルールは、クラスタ内の特定のサービスへのアクセスを有効にするために使用されます。詳細については、ALBイングレス入門を参照してください。

      • ドメイン:イングレスのドメイン名を入力します。

      • パス:サービスURLを入力します。デフォルトのパスはルートパス/です。この例では、デフォルトのパスが使用されています。各パスはバックエンドサービスに関連付けられています。SLBは、受信リクエストがドメイン名とパスに一致する場合にのみ、トラフィックをバックエンドサービスに転送します。

      • サービス:サービスとサービスポートを選択します。

      • TLS設定:このチェックボックスを選択して、TLSを有効にします。

      この例では、テストドメイン名foo.bar.comが使用されています。nginx-svcサービスは、イングレスのバックエンドとして設定されています。

      カナリアリリース

      カナリアリリース機能を有効または無効にします。Alibaba Cloudが提供するカナリアリリース機能は廃止されているため、オープンソースソリューションを選択することをお勧めします。

      イングレスクラス

      イングレスのクラスを指定します。

      アノテーション

      カスタムアノテーションを追加するか、既存のアノテーションを選択できます。追加をクリックし、キーと値を入力します。イングレスアノテーションの詳細については、アノテーションを参照してください。

      ラベル

      +追加をクリックして、イングレスを識別するために、キーと値のペアでラベルをイングレスに追加します。

  2. オプション:スケーリングセクションで、HPAを有効にして、変動するワークロードを処理できます。

    • Horizontal Pod Autoscaler(HPA)は、CPUおよびメモリ使用率メトリックに基づいて、ACKクラスタ内のPodの数を自動的にスケーリングできます。

      説明

      HPAを有効にするには、コンテナに必要なリソースを設定する必要があります。そうしないと、HPAは有効になりません。

      パラメータ

      説明

      メトリック

      CPU使用率またはメモリ使用率を選択します。選択したリソースタイプは、必要なリソースフィールドで指定したものと同じである必要があります。

      条件

      リソース使用率のしきい値を指定します。HPAは、しきい値を超えるとスケールアウトイベントをトリガーします。

      最大レプリカ数

      アプリケーションをスケーリングできるレプリケートされたPodの最大数。

      最小レプリカ数

      実行する必要があるレプリケートされたPodの最小数。

    • CronHPA は、スケジュールされた時間に ACS クラスタをスケーリングできます。CronHPA を有効にする前に、まず ack-kubernetes-cronhpa-controller をインストールする必要があります。CronHPA の詳細については、CronHPA を参照してください。

  1. オプション:ラベルとアノテーションセクションで、追加をクリックして、Podのラベルとアノテーションを追加できます。

  2. 作成をクリックします。

ステップ 4: アプリケーション情報の表示

アプリケーションの作成後、表示されるページの詳細の表示をクリックして、StatefulSet詳細ページに移動します。

ジョブページの情報も表示できます。StatefulSetの名前をクリックするか、アクション列の詳細をクリックして、StatefulSet詳細ページに移動します。