AKSでKnativeする

# Knativeを使ってみたかった

なかなか手の出しにくいKnativeに挑戦。　`AKS Knative` で検索するとやっている人は少数のようですね。

## AKSでやってみよう

-  [Knative公式](https://knative.dev/docs/install/knative-with-aks/) にもAKSはありました。要件が厳しい。
    -  Kubernetes version 1.14 or later
    -  Three or more nodes
    -  Standard_DS3_v2 nodes
    -  RBAC enabled

　ひえ〜〜厳しい。無料枠でやりたいので `Standard_DS3_v2 nodes` を諦めて `Standard_DS2_v2` にしました。
デフォルトには制限があるので、この要件で建てるのは難しそう。
https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/sizes-general

実際に建てようとすると怒られます。

```
Operation failed with status: 'Bad Request'. Details: Provisioning of resource(s) for container service knative-cluster in resource group knative-group failed. Message: The operation couldn't be completed as it results in exceeding quota limit of Core. Maximum allowed: 10, Current in use: 0, Additional requested: 12. Read more about quota limits at https://aka.ms/AzurePerVMQuotaLimits. Submit a request for Quota increase using the link https://aka.ms...
```

一応調べてみます。 https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/quotas

```
PS Azure:\> Get-AzVMUsage -Location "East US"

Name                              Current Value Limit  Unit
----                              ------------- -----  ----
略
Standard DSv3 Family vCPUs                    0    10 Count
略

Azure:/
PS Azure:\>
```

で、実際にこちらで建てました。 `eastus`でv1.15.4を使います。

```
$ az aks create --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --kubernetes-version 1.15.4  --node-vm-size Standard_DS2_v2 --ssh-key-value ~/.ssh/azure_id_rsa.pub --node-count 3
```

クラスタが起動したらistioはこちらを参考
https://docs.microsoft.com/ja-jp/azure/aks/servicemesh-istio-install?pivots=client-operating-system-macos

Knative公式はhelmで書かれているが、MS公式はistioctl推奨、versionも1.4.0で書かれている。
Istioを入れたらKnativeはそのまま公式通りインストールします。
[ここ](https://knative.dev/docs/install/knative-with-aks/) に戻る。
ここまででpodの数が...


```
$ kubectl get po --all-namespaces
NAMESPACE            NAME                                      READY   STATUS              RESTARTS   AGE
istio-system         grafana-6bc97ff99-kxtlr                   1/1     Running             0          8m37s
istio-system         istio-citadel-6b5c754454-dllvm            1/1     Running             0          8m44s
istio-system         istio-galley-7d6d78d7c5-kgjxk             2/2     Running             0          8m42s
istio-system         istio-ingressgateway-85869c5cc7-wshw9     1/1     Running             0          8m44s
istio-system         istio-pilot-787d6995b5-mglxg              2/2     Running             0          8m42s
istio-system         istio-policy-6cf4fbc8dc-5m52m             2/2     Running             1          8m43s
istio-system         istio-sidecar-injector-5d5b978668-gvvwk   1/1     Running             0          8m41s
istio-system         istio-telemetry-5498db684-kg9h2           2/2     Running             1          8m42s
istio-system         istio-tracing-78548677bc-d989w            1/1     Running             0          8m45s
istio-system         kiali-59b7fd7f68-mgkkb                    1/1     Running             0          8m42s
istio-system         prometheus-7c7cf9dbd6-xjthf               1/1     Running             0          8m42s
istio-system         zipkin-65889cbb48-rlcmf                   0/1     Pending             0          4s
knative-eventing     eventing-controller-66f887d744-v5tkl      1/1     Running             0          48s
knative-eventing     eventing-webhook-5c45f99585-8c8nn         1/1     Running             0          45s
knative-eventing     imc-controller-57cbf9bbd8-cpxt5           1/1     Running             0          39s
knative-eventing     imc-dispatcher-77c88d7dc4-7hfm7           1/1     Running             0          38s
knative-eventing     sources-controller-7df864ccf-65mmv        1/1     Running             0          47s
knative-monitoring   elasticsearch-logging-0                   0/1     PodInitializing     0          34s
knative-monitoring   grafana-68748c5b45-xjg4j                  0/1     ContainerCreating   0          13s
knative-monitoring   kibana-logging-b5d75f556-7x4zg            0/1     ContainerCreating   0          33s
knative-monitoring   kube-state-metrics-5cb5c6986b-5tmdz       0/1     ContainerCreating   0          27s
knative-monitoring   node-exporter-jslbh                       0/2     ContainerCreating   0          19s
knative-monitoring   node-exporter-ndgdz                       0/2     ContainerCreating   0          19s
knative-monitoring   node-exporter-sprvm                       2/2     Running             0          19s
knative-monitoring   prometheus-system-0                       0/1     ContainerCreating   0          5s
knative-monitoring   prometheus-system-1                       0/1     ContainerCreating   0          5s
knative-serving      activator-79f674fb7b-xwg7m                2/2     Running             0          77s
knative-serving      autoscaler-96dc49858-fndpp                2/2     Running             1          75s
knative-serving      autoscaler-hpa-d887d4895-t4cmh            1/1     Running             0          76s
knative-serving      controller-6bcdd87fd6-szsqv               1/1     Running             0          70s
knative-serving      networking-istio-7fcd97cbf7-5mtcq         1/1     Running             0          66s
knative-serving      webhook-747b799559-vttcp                  1/1     Running             0          69s
kube-system          coredns-68c85fc5d4-mvms4                  1/1     Running             0          22m
kube-system          coredns-68c85fc5d4-sfb4x                  1/1     Running             0          18m
kube-system          coredns-autoscaler-875fb445c-xkrpq        1/1     Running             0          22m
kube-system          kube-proxy-4gqsm                          1/1     Running             0          18m
kube-system          kube-proxy-c8hh2                          1/1     Running             0          19m
kube-system          kube-proxy-n7v9t                          1/1     Running             0          18m
kube-system          kubernetes-dashboard-5758d48c87-c89rn     1/1     Running             0          22m
kube-system          metrics-server-957757c9f-fgcbp            1/1     Running             0          22m
kube-system          tunnelfront-c576f5878-jf94z               1/1     Running             0          22m
```

さてこれで必要なものが揃ったので、HelloWorldしてみます。
https://knative.dev/docs/eventing/samples/helloworld/helloworld-go/###Send-CloudEvent-to-the-Broker

`https://github.com/knative/docs` の `docs/eventing/samples/helloworld` を使ってみます。
[CloudEvent](https://cloudevents.io/) を使った簡単なアプリをデプロイします。

上記docsリポジトリの`helloworld` に DockerfileがあるのでそれをbuildしてDockerhubにPushします。
作ったImageを指定した状態でsample-appをdeployします。

```
knative-samples      default-broker-filter-5f899d7684-9j8dk    1/1     Running   0          33m
knative-samples      default-broker-ingress-7fff74f7d8-nlbl9   1/1     Running   0          33m
knative-samples      helloworld-go-7c58bcc5f-lx596             1/1     Running   0          33m
```

curlでPOSTした結果がこちら

```
[ root@curl-6bf6db5c4f-tgtf8:/ ]$   curl -v "default-broker.knative-samples.svc.cluster.local" \
>   -X POST \
>   -H "Ce-Id: 536808d3-88be-4077-9d7a-a3f162705f79" \
>   -H "Ce-specversion: 0.3" \
>   -H "Ce-Type: dev.knative.samples.helloworld" \
>   -H "Ce-Source: dev.knative.samples/helloworldsource" \
>   -H "Content-Type: application/json" \
>   -d '{"msg":"Hello World from the curl pod."}'
> POST / HTTP/1.1
> User-Agent: curl/7.35.0
> Host: default-broker.knative-samples.svc.cluster.local
> Accept: */*
> Ce-Id: 536808d3-88be-4077-9d7a-a3f162705f79
> Ce-specversion: 0.3
> Ce-Type: dev.knative.samples.helloworld
> Ce-Source: dev.knative.samples/helloworldsource
> Content-Type: application/json
> Content-Length: 40
> 
< HTTP/1.1 202 Accepted
< Content-Length: 0
< Date: Thu, 12 Dec 2019 16:26:24 GMT
< 
[ root@curl-6bf6db5c4f-tgtf8:/ ]$ exit
```

アプリ側のログの確認

```
$ kubectl --namespace knative-samples logs -l app=helloworld-go --tail=50 
2019/12/12 16:24:04 Hello world sample started.
2019/12/12 16:26:24 Event received. Context: Context Attributes,
  specversion: 0.3
  type: dev.knative.samples.helloworld
  source: dev.knative.samples/helloworldsource
  id: 536808d3-88be-4077-9d7a-a3f162705f79
  time: 2019-12-12T16:26:24.887351953Z
  datacontenttype: application/json
Extensions,
  knativearrivaltime: 2019-12-12T16:26:24Z
  knativehistory: default-kne-trigger-kn-channel.knative-samples.svc.cluster.local
  traceparent: 00-30a9dddc4c694ca766cc4c2916011920-5193c1279cc6a8a5-00

2019/12/12 16:26:24 Hello World Message from received event "Hello World from the curl pod."
2019/12/12 16:26:24 Responded with event Validation: valid
Context Attributes,
  specversion: 0.2
  type: dev.knative.samples.hifromknative
  source: knative/eventing/samples/hello-world
  id: 0ef10b40-9672-4e5f-863e-aa04dd82b3fb
Data,
  {"msg":"Hi from helloworld-go app!"}
```

`"Hello World from the curl pod."` で curlのDataが渡っていることを確認。
`{"msg":"Hi from helloworld-go app!"}` でDataを返しているのも確認。

なるほど〜〜〜！


## 所感
- サーバレスってところをあまり意識しなくて済むけどもその上のpodの数が多いので管理が大変。。
結局最終的には45程度のpodがdeployされている状態（Productionを考えると倍くらいになりそう）ということを考えると、大きめのクラスタが必要で、かつ監視もしっかりやる必要がありそう。(Ops側が大変そう)

- [Sample](https://knative.dev/docs/eventing/samples/) を見ると他にも色々なイベント発火でアプリを動かせそう。(GoogleのCloudとの親和性が高い)

- 一通りやってみて、ツラミが多かったが、 [CloudEvent](https://cloudevents.io/) は面白そうに感じた。最近version1.0がリリースされたみたいなので今度はこちらを触ってみたいと思います！