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

**Alibaba Cloud Container Service for Kubernetes**で**Knative**を体験する方法をご紹介します。

[Knative Serving](https://knative.dev/docs/serving/?spm=a2c65.11461447.0.0.27a07c04YtIn10)は、サーバーレスアプリケーションと機能のデプロイとサービングをサポートするために、[Kubernetes](https://kubernetes.io/?spm=a2c65.11461447.0.0.27a07c04YtIn10)と[Istio](https://istio.io/?spm=a2c65.11461447.0.0.27a07c04YtIn10)上に構築されたゼロスケールのリクエスト駆動型コンピューティングランタイム環境です。KnativeServingは、サーバーレスワークロードをデプロイして実行するためのKubernetes拡張機能を提供することを目的としています。

この投稿では、Knative Servingを素早く構築し、Alibaba Cloud [Container Service for Kubernetes](https://www.alibabacloud.com/product/kubernetes?spm=a2c65.11461447.0.0.27a07c04YtIn10)で自動スケーリングを実装する方法を説明します。

#Knative Servingの構築
###ステップ1：Kubernetes環境の準備
Alibaba Cloud Container Service for Kubernetesのバージョン1.11.5がリリースされました。コンソールを使用して、素早く簡単にKubernetesクラスタを作成することができます。詳細については、[Kubernetesクラスタの作成](https://help.aliyun.com/document_detail/53752.html?spm=a2c65.11461447.0.0.27a07c04YtIn10)を参照してください。

###ステップ2：Istioの導入
Knative ServingはIstio上で動作します。現在、Alibaba Cloud Container Service for Kubernetesでは、ワンクリックでIstioをすばやくインストールして構成することができます。やり方がよくわからない場合は、[Deploy Istio](https://help.aliyun.com/document_detail/89805.html?spm=a2c65.11461447.0.0.27a07c04YtIn10)を参照してください。

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/4517e9a5-e103-7f0d-e684-b92a7127f33b.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/a929a491-3be4-4bd6-abb3-a58f609e85d2.png)


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



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/2b8af1bd-4412-f5aa-8228-62cbeaba167d.png)

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



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/93e8509d-10a5-1d60-229c-04d01dbb902d.png)


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/6f2837a8-ade2-dea5-7360-70361e17bd5c.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/d8316f0d-d3af-c206-0b45-65411fd78147.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/09d56947-983f-7237-6871-5af7eb92e658.png)


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/6c995c3d-65fe-e94b-b3b9-ec13dee2d426.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/205b8741-31f0-6511-a220-2cda9e637f8f.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/d63cfd7f-abfa-74ea-ce1e-cd386f5e6826.png)


#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を素早く構築し、プロジェクト開発に簡単に組み込んでみてください。

*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/experience-knative-on-alibaba-cloud_596005)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*


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