Azure Kubernetes Service (AKS)でknativeを動作させる方法

はじめに

AKSでknativeを動作させるためには、公式ドキュメントに加えひと手間が必要となるのでその方法を解説します。
全体の流れは、AKSを起動し、istioのインストール、knativeのインストールというドキュメントと同様ですが途中ドキュメントにない設定が必要となります。
では解説していきます。

knative自体の説明は省きます。
また、検証したバージョンなどに依存関係がある可能もあるので完全に動作する保証はありません。
Azure CLIおよびkubectlがすでに利用できる状態であることを前提にしています。

ドキュメント
https://www.knative.dev/docs/install/knative-with-aks/

AKSの起動

基本的にドキュメントと同様です。

環境の名前を指定します。

export LOCATION=eastus
export RESOURCE_GROUP=knative-group
export CLUSTER_NAME=knative-cluster

リソースグループを作成します。

az group create --name $RESOURCE_GROUP --location $LOCATION

AKSを起動します。
バージョンは1.11.8です。たぶん1.12系でも大丈夫かと・・・

az aks create --resource-group $RESOURCE_GROUP \
   --name $CLUSTER_NAME \
   --generate-ssh-keys \
   --kubernetes-version 1.11.8 \
   --enable-rbac \
   --node-vm-size Standard_DS3_v2

kubectlで操作できるように設定します。(–overwrite-existing は既存の設定の上書き)

az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --admin --overwrite-existing

問題なく起動していることを確認します。

kubectl get node
NAME                       STATUS    ROLES     AGE       VERSION
aks-nodepool1-24002009-0   Ready     agent     3m        v1.11.8
aks-nodepool1-24002009-1   Ready     agent     3m        v1.11.8
aks-nodepool1-24002009-2   Ready     agent     4m        v1.11.8

istioのインストール

ドキュメント通り進めます。

kubectl apply --filename https://github.com/knative/serving/releases/download/v0.4.0/istio-crds.yaml
kubectl apply --filename https://github.com/knative/serving/releases/download/v0.4.0/istio.yaml

ラベルを付けます。

kubectl label namespace default istio-injection=enabled

起動されているPodを確認します。

kubectl get pods --namespace istio-system

RunningもしくはCompletedになるのを待ちます。

NAME                                        READY     STATUS      RESTARTS   AGE
cluster-local-gateway-76db55c785-wkjvh      1/1       Running     0          5m
istio-citadel-746c765786-d758c              1/1       Running     0          6m
istio-cleanup-secrets-cj8cf                 0/1       Completed   0          6m
istio-egressgateway-7b46794587-jbk2s        1/1       Running     0          6m
istio-galley-75c6976d79-z5hp4               1/1       Running     0          6m
istio-ingressgateway-57f76dc4db-xqx8l       1/1       Running     0          6m
istio-pilot-6495978c49-4wl8w                2/2       Running     0          5m
istio-pilot-6495978c49-csfxn                2/2       Running     0          5m
istio-pilot-6495978c49-llw97                2/2       Running     0          6m
istio-policy-6677c87b9f-7ff2g               2/2       Running     0          6m
istio-sidecar-injector-879fd9dfc-2dfkt      1/1       Running     0          5m
istio-statsd-prom-bridge-549d687fd9-8rbfw   1/1       Running     0          6m
istio-telemetry-7d46d668db-khglq            2/2       Running     0          6m

knativeのインストール

ドキュメント通り進めます。

以下をApplyしますがそれぞれPodの起動を確認しながら進めます。
そして途中別途servingをApply後作業が発生します。

kubectl apply --filename https://github.com/knative/serving/releases/download/v0.4.0/serving.yaml
kubectl apply --filename https://github.com/knative/build/releases/download/v0.4.0/build.yaml
kubectl apply --filename https://github.com/knative/eventing/releases/download/v0.4.0/release.yaml
kubectl apply --filename https://github.com/knative/eventing-sources/releases/download/v0.4.0/release.yaml
kubectl apply --filename https://github.com/knative/serving/releases/download/v0.4.0/monitoring.yaml
kubectl apply --filename https://raw.githubusercontent.com/knative/serving/v0.4.0/third_party/config/build/clusterrole.yaml

適用中にエラーが発生した場合は再度同じものを走らせます。

error: unable to recognize "https://github.com/knative/serving/releases/download/v0.4.0/serving.yaml": no matches for kind "Image" in version "caching.internal.knative.dev/v1alpha1"

serving を適用します。

kubectl apply --filename https://github.com/knative/serving/releases/download/v0.4.0/serving.yaml

Podの起動を確認します。

kubectl get pods --namespace knative-serving

activatorとautoscalerがエラーになります。これを解消する必要があります。

NAME                          READY     STATUS             RESTARTS   AGE
activator-6f7d494f55-sdhcw    1/2       CrashLoopBackOff   3          1m
autoscaler-5cb4d56d69-xng46   1/2       CrashLoopBackOff   3          1m
controller-6d65444c78-wrnnc   1/1       Running            0          1m
webhook-55f88654fb-tndgw      1/1       Running            0          1m

以下で問題が報告されています。解決方法も記載されています。
詳しくは書かれていませんがistio側に問題があるようです。

Cannot install Knative serving
https://github.com/knative/serving/issues/2878
Requests don’t make it through the activator on AKS
https://github.com/knative/serving/issues/3026
Internal Kubernetes API Calls Blocked by Istio
https://github.com/istio/istio/issues/8696

最初にクラスターのFQDNを取得します。

az aks show -n $CLUSTER_NAME -g $RESOURCE_GROUP -o table
Name             Location    ResourceGroup    KubernetesVersion    ProvisioningState    Fqdn
---------------  ----------  ---------------  -------------------  -------------------  -------------------------------------------------------------
knative-cluster  eastus      knative-group    1.11.8               Succeeded            knative-cl-knative-group-630e95-44db6d79.hcp.eastus.azmk8s.io

次にFQDNをもとに以下のマニフェストを作成します。
それぞれ自分の環境に合わせて変更します。

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: azmk8s-ext
spec:
  hosts:
  - "knative-cl-knative-group-630e95-44db6d79.hcp.eastus.azmk8s.io"
  location: MESH_EXTERNAL
  ports:
  - number: 443
    name: https
    protocol: HTTPS
  resolution: DNS
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: tls-routing
spec:
  hosts:
  - knative-cl-knative-group-630e95-44db6d79.hcp.eastus.azmk8s.io
  tls:
  - match:
    - port: 443
      sniHosts:
      - knative-cl-knative-group-630e95-44db6d79.hcp.eastus.azmk8s.io
    route:
    - destination:
        host: knative-cl-knative-group-630e95-44db6d79.hcp.eastus.azmk8s.io

istioの設定が完了したらPodを再度確認します。

kubectl get pods --namespace knative-serving
NAME                          READY     STATUS    RESTARTS   AGE
activator-6f7d494f55-sdhcw    2/2       Running   8          16m
autoscaler-5cb4d56d69-xng46   2/2       Running   8          16m
controller-6d65444c78-wrnnc   1/1       Running   0          16m
webhook-55f88654fb-tndgw      1/1       Running   0          16m

すべてRunningしたことを確認します。

buildを展開します。

kubectl apply --filename https://github.com/knative/build/releases/download/v0.4.0/build.yaml

Podを確認します。

kubectl get pods --namespace knative-build
NAME                                READY     STATUS    RESTARTS   AGE
build-controller-68dfb74954-vx4rb   1/1       Running   0          12s
build-webhook-866fd64885-dsmdn      1/1       Running   0          12s

eventingを展開します。

kubectl apply --filename https://github.com/knative/eventing/releases/download/v0.4.0/release.yaml

Podを確認します。

kubectl get pods --namespace knative-eventing
NAME                                            READY     STATUS    RESTARTS   AGE
eventing-controller-756d56fc7-t64lq             1/1       Running   0          35s
in-memory-channel-controller-79ccbb59c-87cnr    1/1       Running   0          22s
in-memory-channel-dispatcher-5c864b94f4-x5jgk   2/2       Running   1          20s
webhook-85f7f4fb6-tdk46                         1/1       Running   0          34s

eventing-sourcesを展開します。

kubectl apply --filename https://github.com/knative/eventing-sources/releases/download/v0.4.0/release.yaml

Podを確認します。

kubectl get pods --namespace knative-sources
NAME                   READY     STATUS    RESTARTS   AGE
controller-manager-0   1/1       Running   0          18m

monitoringを展開します。

kubectl apply --filename https://github.com/knative/serving/releases/download/v0.4.0/monitoring.yaml

Podを確認します。

kubectl get pods --namespace knative-monitoring
NAME                                  READY     STATUS    RESTARTS   AGE
elasticsearch-logging-0               1/1       Running   0          18m
elasticsearch-logging-1               1/1       Running   0          17m
grafana-754bc795bb-cm82c              1/1       Running   0          17m
kibana-logging-7f7b9698bc-pnbp9       1/1       Running   0          18m
kube-state-metrics-768dfff9c5-c4mf2   4/4       Running   0          17m
node-exporter-2snzs                   2/2       Running   0          17m
node-exporter-7tnjp                   2/2       Running   0          17m
node-exporter-95k29                   2/2       Running   0          17m
prometheus-system-0                   1/1       Running   0          17m
prometheus-system-1                   1/1       Running   0          17m

clusterroleを展開します。

kubectl apply --filename https://raw.githubusercontent.com/knative/serving/v0.4.0/third_party/config/build/clusterrole.yaml

以上で全てインストールが完了です。

動作確認

動作確認をドキュメント通り進めます。
https://www.knative.dev/docs/install/getting-started-knative-app/

以下を展開します。

apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  runLatest:
    configuration:
      revisionTemplate:
        spec:
          container:
            image: gcr.io/knative-samples/helloworld-go 
            env:
              - name: TARGET
                value: "Go Sample v1"

INGRESSGATEWAYを指定します。

INGRESSGATEWAY=knative-ingressgateway
if kubectl get configmap config-istio -n knative-serving &> /dev/null; then
    INGRESSGATEWAY=istio-ingressgateway
fi

Gatewayを指定しSVCを確認します。

kubectl get svc $INGRESSGATEWAY --namespace istio-system
NAME                   TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)                                                                                                                   AGE
istio-ingressgateway   LoadBalancer   10.0.101.139   104.41.153.79   80:31380/TCP,443:31390/TCP,31400:31400/TCP,15011:30458/TCP,8060:31092/TCP,853:30754/TCP,15030:30403/TCP,15031:30798/TCP   53m

IPを取得します。

export IP_ADDRESS=$(kubectl get svc $INGRESSGATEWAY --namespace istio-system --output 'jsonpath={.status.loadBalancer.ingress[0].ip}')

URLを確認します。

kubectl get ksvc helloworld-go  --output=custom-columns=NAME:.metadata.name,DOMAIN:.status.domain
NAME            DOMAIN
helloworld-go   helloworld-go.default.example.com

「Hello Go Sample v1!」が帰ってくることを確認します。

curl -H "Host: helloworld-go.default.example.com" http://${IP_ADDRESS}
Hello Go Sample v1!

以上で動作確認は完了です。

まとめ

Azureでもknativeが動作するようになりました。
今後、knativeを利用したアプリケーションも増えてくることでしょう。
また、Knative Lambda Runtime を利用すると Lambda on Azureなんてことも出来るようになると思います。
楽しみですね。