はじめに
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なんてことも出来るようになると思います。
楽しみですね。