Alibaba Cloud Knative は、Horizontal Pod Autoscaler (HPA) と統合して、リソース負荷に基づく自動スケーリングを有効にすることができます。Knative はネイティブでリクエスト数に基づく自動スケーリングをサポートしていますが、HPA と統合することで、CPU 使用率やメモリ使用率などの追加メトリクスを使用したきめ細かいスケーリングが可能になります。
前提条件
Knative が ACS クラスタにデプロイされていること。詳細については、Knative のデプロイを参照してください。
kubectl クライアントがクラスタに接続されていること。詳細については、クラスタの kubeconfig ファイルを取得し、kubectl を使用してクラスタに接続するを参照してください。
Knative ダッシュボードを使用して Knative サービスの監視データを表示するには、Knative を Managed Service for Prometheus と連携させる必要があります。詳細については、Knative 監視ダッシュボードの表示を参照してください。
ステップ 1: Knative サービスをデプロイする
ACS コンソールにログインします。左側のナビゲーションペインで、クラスタをクリックします。
クラスタページで、管理するクラスタを見つけ、その ID をクリックします。クラスタ詳細ページの左側のナビゲーションペインで、
を選択します。サービスタブのKnativeページで、名前空間ドロップダウンリストからdefaultを選択し、テンプレートから作成をクリックし、次の YAML コンテンツをコードエディタにコピーして、作成をクリックします。
次のサンプルコードは、
helloworld-go-hpa
という名前の Knative サービスを作成します。apiVersion: serving.knative.dev/v1 kind: Service metadata: name: helloworld-go-hpa # Knative サービスの名前を指定します。 spec: template: metadata: labels: app: helloworld-go-hpa annotations: autoscaling.knative.dev/class: "hpa.autoscaling.knative.dev" # スケーラーとして HPA を指定します。 autoscaling.knative.dev/metric: "cpu" # HPA でサポートされているメトリクスには、CPU 使用率とメモリ使用率が含まれます。この例では、HPA は CPU 使用率に基づいて動作するように構成されています。 autoscaling.knative.dev/target: "30" # CPU 使用率のしきい値を指定します。HPA は、しきい値を超えると、Knative サービスのポッドを自動的にスケーリングします。 autoscaling.knative.dev/minScale: "1" # 保証する必要があるポッドの最小数を指定します。 autoscaling.knative.dev/maxScale: "4" # 許可されるポッドの最大数を指定します。 spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/autoscale-go:v1024 resources: requests: cpu: '200m'
次のコマンドを実行して、Knative サービスが想定どおりに実行されているかどうかを確認します。
kubectl get ksvc
期待される出力:
NAME URL LATESTCREATED LATESTREADY READY REASON helloworld-go-hpa http://helloworld-go-hpa.default.example.com helloworld-go-hpa-00001 helloworld-go-hpa-00001 True
READY
列にTrue
と表示されている場合、Knative サービスは想定どおりに実行されています。
ステップ 2: CPU メトリクスに基づく自動スケーリングを実装する
負荷テストツール hey をインストールします。
hey の詳細については、Hey を参照してください。
次のコマンドを実行して、1 秒あたり 100 クエリ (QPS) を 60 秒間送信することで負荷テストを実行します。
説明121.XX.XX.10
をゲートウェイの IP アドレスまたはドメイン名に置き換えます。hey -z 60s -q 100 -host "helloworld-go-hpa.default.example.com" "http://121.XX.XX.10?prime=40000000" # 121.199.XXX.XXX はゲートウェイの IP アドレスまたはドメイン名です。
負荷テスト中に、次のコマンドを実行して、ポッドがリアルタイムでスケーリングされているかどうかを確認できます。
kubectl get pods --watch
期待される出力:
NAME READY STATUS RESTARTS AGE # ポッドは想定どおりに実行されており、コンテナはレディ状態です。 helloworld-go-hpa-00001-deployment-67cc8f979b-fxfl5 2/2 Running 0 101m # ポッドの数が 4 つにスケールアウトされています。READY 列には各ポッドに 0/2 と表示され、STATUS 列には各ポッドに Pending と表示されます。これは、ポッドが保留中で、リソースがポッドに割り当てられていないことを意味します。 helloworld-go-hpa-00001-deployment-67cc8f979b-kv6rj 0/2 Pending 0 0s helloworld-go-hpa-00001-deployment-67cc8f979b-fxq85 0/2 Pending 0 0s helloworld-go-hpa-00001-deployment-67cc8f979b-kv6rj 0/2 Pending 0 0s helloworld-go-hpa-00001-deployment-67cc8f979b-fxq85 0/2 Pending 0 0s # READY 列には各ポッドに 0/2 と表示され、STATUS 列には各ポッドに ContainerCreating と表示されます。これは、ポッド内のコンテナが作成されていることを意味します。 helloworld-go-hpa-00001-deployment-67cc8f979b-kv6rj 0/2 ContainerCreating 0 0s helloworld-go-hpa-00001-deployment-67cc8f979b-fxq85 0/2 ContainerCreating 0 0s helloworld-go-hpa-00001-deployment-67cc8f979b-kv6rj 0/2 ContainerCreating 0 0s helloworld-go-hpa-00001-deployment-67cc8f979b-fxq85 0/2 ContainerCreating 0 0s # READY 列には 2 つのポッドに 1/2 と表示され、2 つのポッドに 2/2 と表示され、STATUS 列には各ポッドに Running と表示されます。これは、各ポッドに対して少なくとも 1 つのコンテナが作成され、想定どおりに実行されていることを意味します。 helloworld-go-hpa-00001-deployment-67cc8f979b-kv6rj 1/2 Running 0 1s helloworld-go-hpa-00001-deployment-67cc8f979b-kv6rj 2/2 Running 0 1s helloworld-go-hpa-00001-deployment-67cc8f979b-fxq85 1/2 Running 0 1s helloworld-go-hpa-00001-deployment-67cc8f979b-fxq85 2/2 Running 0 1s
出力は、HPA が Knative サービスのポッドを自動的にスケーリングできることを示しています。負荷が増加すると、HPA は Knative サービスの処理能力とスループットを向上させるために、ポッドの数を 1 から 4 にスケーリングします。
(オプション) ステップ 3: Knative 監視ダッシュボードを表示する
Knative は、すぐに使える監視機能を提供します。Knativeページで、監視ダッシュボードタブをクリックして、指定されたサービスの監視データを表示します。Knative ダッシュボードの詳細については、Knative ダッシュボードの表示を参照してください。
関連情報
Alibaba Cloud Knative は、コンテナ (または関数) の作成、ワークロード管理 (自動スケーリング)、イベントモデルを統合することにより、Kubernetes ベースのサーバーレスフレームワークを実装します。Alibaba Cloud Knative の詳細については、Knative の概要を参照してください。
Alibaba Cloud Knative の機能の詳細については、Alibaba Cloud Knative とオープンソース Knative の比較を参照してください。