Alibaba Cloud Container Service for KubernetesによるKnative Servingの構築とAutomatic Scalingの実装について


Alibaba Cloud Container Service for KubernetesKnativeを体験する方法をご紹介します。

Knative Servingは、サーバーレスアプリケーションと機能のデプロイとサービングをサポートするために、KubernetesIstio上に構築されたゼロスケールのリクエスト駆動型コンピューティングランタイム環境です。KnativeServingは、サーバーレスワークロードをデプロイして実行するためのKubernetes拡張機能を提供することを目的としています。

この投稿では、Knative Servingを素早く構築し、Alibaba Cloud Container Service for Kubernetesで自動スケーリングを実装する方法を説明します。

Knative Servingの構築

ステップ1:Kubernetes環境の準備

Alibaba Cloud Container Service for Kubernetesのバージョン1.11.5がリリースされました。コンソールを使用して、素早く簡単にKubernetesクラスタを作成することができます。詳細については、Kubernetesクラスタの作成を参照してください。

ステップ2:Istioの導入

Knative ServingはIstio上で動作します。現在、Alibaba Cloud Container Service for Kubernetesでは、ワンクリックでIstioをすばやくインストールして構成することができます。やり方がよくわからない場合は、Deploy Istioを参照してください。

Container Service - Kubernetes consoleにログオンします。左側のナビゲーションペインで、「Cluster」を選択し、さらに「Cluster」を選択して「Clusters」ページに移動します。そして、クラスタを選択し、Actions欄でMore、Deploy Istioの順に選択してください。

「Deploy Istio」のページに表示されるパラメータを設定し、完了したら「Deploy Istio」をクリックします。数秒から1分ほどで、Istio環境がデプロイされます。実際にデプロイされたことを確認するには、コンソールでポッドの状態を確認します。下図のような画面が表示されます。

ステップ3:Istio Ingress Gatewayの導入

このステップでは、Container Service - Kubernetes consoleにログオンします。左側のナビゲーションペインで、「Marketplace」を選択し、「App Catalog」を選択します。表示されたページで、ack-istio-ingressgatewayを見つけてクリックします。下の赤い四角で囲ったものがそれです。

「Parameters」タブをクリックします。Istio Ingress Gatewayのデフォルト設定が提供されます。特定の要件に基づいてこれらのパラメータを変更し、「作成」をクリックします。

istio-system名前空間のポッドリストを見て、稼働状況を確認します。以下のように表示されているはずです。

ステップ4:Knative CRDのデプロイ

Container Service - Kubernetes consoleにログオンします。左側のナビゲーションペインで、[Marketplace]を選択し、[App Catalog]を選択します。表示されたページで、ack-knative-initを見つけてクリックします。

「Create」をクリックすると、Custom Resource Definitions(CRD)など、Knativeの初期化に必要なコンテンツがインストールされます。

ステップ5:Knative Servingのデプロイ

Container Service - Kubernetes consoleにログオンします。左側のナビゲーションペインで、[Marketplace]を選択し、[App Catalog]を選択します。表示されるページで、ack-knative-servingを見つけてクリックします。

次に、「Parameters」タブをクリックします。Istio Ingress Gatewayのデフォルト設定が用意されています。必要に応じてこれらのパラメータを変更し、「Create」をクリックします。

これで、Knative Servingのインストールに必要な4つのHelmチャートがインストールされました。これはコンソールで確認してください。

Knativeの体験

ステップ1:サンプルのAutoscaleアプリにKnative Serviceを導入する

このステップでは、以下のコマンドを実行して、サンプルのオートスケール・アプリにKnative Serviceをデプロイします。

kubectl create -f autoscale.yaml

autoscale.yamlファイルの内容は以下の通りです。

apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
  name: autoscale-go
  namespace: default
spec:
  runLatest:
    configuration:
      revisionTemplate:
        metadata:
          annotations:
            # Target 10 in-flight-requests per pod.
            autoscaling.knative.dev/target: "10"
            autoscaling.knative.dev/class:  kpa.autoscaling.knative.dev
        spec:
          container:
            image: registry.cn-beijing.aliyuncs.com/wangxining/autoscale-go:0.1

ステップ2:サンプルのAutoscaleアプリのKnativeサービスへのアクセス

このステップでは、エントリーのホスト名とIPアドレスを見つけて、環境変数としてエクスポートします。

export IP_ADDRESS=`kubectl get svc istio-ingressgateway --namespace istio-system --output jsonpath="{.status.loadBalancer.ingress[*].ip}"`

autoscaleアプリにリクエストを送り、リソースの消費量を確認します。

curl --header "Host: autoscale-go.default.{domain.name}" "http://${IP_ADDRESS?}?sleep=100&prime=10000&bloat=5"

注:{domain.name}は、ドメイン名のサフィックスに置き換えてください。デフォルトの例では、サフィックスはaliyun.comです。

curl --header "Host: autoscale-go.default.aliyun.com" "http://${IP_ADDRESS?}?sleep=100&prime=10000&bloat=5"
Allocated 5 Mb of memory.
The largest prime less than 10000 is 9973.
Slept for 100.16 milliseconds.

以下のコマンドを実行してロードジェネレーターをインストールします。

go get -u github.com/rakyll/hey

50件の同時リクエストを維持し、30秒間トラフィックを送信します。

hey -z 30s -c 50 \
  -host "autoscale-go.default.aliyun.com" \
  "http://${IP_ADDRESS?}?sleep=100&prime=10000&bloat=5" \
  && kubectl get pods

30秒の間に、リクエスト数の増加に伴い、Knative Serviceが自動的にスケールアップしていることがわかります。

Summary:
  Total:    30.1126 secs
  Slowest:    2.8528 secs
  Fastest:    0.1066 secs
  Average:    0.1216 secs
  Requests/sec:    410.3270

  Total data:    1235134 bytes
  Size/request:    99 bytes

Response time histogram:
  0.107 [1]    |
  0.381 [12305]    |°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ°ˆ
  0.656 [0]    |
  0.930 [0]    |
  1.205 [0]    |
  1.480 [0]    |
  1.754 [0]    |
  2.029 [0]    |
  2.304 [0]    |
  2.578 [27]    |
  2.853 [23]    |


Latency distribution:
  10% in 0.1089 secs
  25% in 0.1096 secs
  50% in 0.1107 secs
  75% in 0.1122 secs
  90% in 0.1148 secs
  95% in 0.1178 secs
  99% in 0.1318 secs

Details (average, fastest, slowest):
  DNS+dialup:    0.0001 secs, 0.1066 secs, 2.8528 secs
  DNS-lookup:    0.0000 secs, 0.0000 secs, 0.0000 secs
  req write:    0.0000 secs, 0.0000 secs, 0.0023 secs
  resp wait:    0.1214 secs, 0.1065 secs, 2.8356 secs
  resp read:    0.0001 secs, 0.0000 secs, 0.0012 secs

Status code distribution:
  [200]    12356 responses



NAME                                             READY   STATUS        RESTARTS   AGE
autoscale-go-00001-deployment-5fb497488b-2r76v   2/2     Running       0          29s
autoscale-go-00001-deployment-5fb497488b-6bshv   2/2     Running       0          2m
autoscale-go-00001-deployment-5fb497488b-fb2vb   2/2     Running       0          29s
autoscale-go-00001-deployment-5fb497488b-kbmmk   2/2     Running       0          29s
autoscale-go-00001-deployment-5fb497488b-l4j9q   1/2     Terminating   0          4m
autoscale-go-00001-deployment-5fb497488b-xfv8v   2/2     Running       0          29s

概要

この記事で示したように、Alibaba CloudのContainer Service for Kubernetesをベースに、Knative Servingを素早く構築し、自動スケーリングを実装することができます。ぜひ、Alibaba Cloud Container Serviceを使ってKnative Servingを素早く構築し、プロジェクト開発に簡単に組み込んでみてください。

本ブログは英語版からの翻訳です。オリジナルはこちらからご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。

アリババクラウドは日本に2つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
アリババクラウドジャパン公式ページ