Skip to content

Instantly share code, notes, and snippets.

@ytooyama
Last active December 13, 2022 07:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ytooyama/9becb07aeabe60b100cdcee70f8b6e0a to your computer and use it in GitHub Desktop.
Save ytooyama/9becb07aeabe60b100cdcee70f8b6e0a to your computer and use it in GitHub Desktop.
Ubuntu + microk8sでKnative Servingを触ってみる

Knative Quickstart with microk8s

参考にした情報

以下の手順は全てamd64なUbuntu Serverで実行することを前提にしている。

周辺のソフトウェアなどの準備

Ubuntu Server 20.04最新版を入れてアップデート、再起動

sudo apt update && sudo apt upgrade && sudo reboot

microk8sを入れる

sudo snap install microk8s --channel=stable --classic 
sudo snap install kubectl --channel=stable --classic 
sudo microk8s enable dns rbac

type:LoadBalancerを使うため、MetalLBを有効化(オプション)

指定するIPアドレスはホストのIPアドレス(多くの場合一つしか設定されていないはずなので次のような指定方法)を設定する。

microk8s enable metallb
Enter each IP address range delimited by comma: 192.168.0.49-192.168.0.49

kubeconfigを書き込み

mkdir ~/.kube/ && touch ~/.kube/config
microk8s config > ~/.kube/config

kn CLIを入れる

curl -Lo ./kn https://github.com/knative/client/releases/download/knative-v1.3.1/kn-linux-amd64
chmod +x ./kn
sudo mv ./kn /usr/local/bin/kn

Knative Servingのセットアップ

Knative Servingのインストール

kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.3.0/serving-crds.yaml

Knative Serving Core Componentのインストール

kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.3.0/serving-core.yaml

ネットワーク・レイヤーのインストール KnativeのネットワークレイヤはIstioだったが、Kourierという軽量なIngressが使えるらしい。今回はこれを使ってみる。

curl -Lo kourier.yaml https://github.com/knative/net-kourier/releases/download/knative-v1.3.0/kourier.yaml

以下の設定部分を書き換える (MetalLBを使う場合は設定書換えは不要)。

...
apiVersion: v1
kind: Service
metadata:
  name: kourier
  namespace: kourier-system
  labels:
    networking.knative.dev/ingress-provider: kourier
    app.kubernetes.io/component: net-kourier
    app.kubernetes.io/version: "1.3.0"
    app.kubernetes.io/name: knative-serving
    serving.knative.dev/release: "v1.3.0"
spec:
  ports:
    - name: http2
      port: 80
      protocol: TCP
      targetPort: 8080
      nodePort: 31080                # 追加
    - name: https
      port: 443
      protocol: TCP
      targetPort: 8443
      nodePort: 31443                # 追加
  selector:
    app: 3scale-kourier-gateway
  type: NodePort                     # LoadBalancerから変更
...

設定を適用

kubectl apply -f kourier.yaml

Knative ServingがKourierを使用するように構成

kubectl patch configmap/config-network --namespace knative-serving --type merge --patch '{"data":{"ingress-class":"kourier.ingress.networking.knative.dev"}}'

DNSの構成 ここではワイルドカードDNSサービスであるsslip.ioを使用するよう構成します(ファイル内に「args: ["-magic-dns=sslip.io"]」みたいな記述がある)。

kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.3.0/serving-default-domain.yaml

config-domainに以下を追加して、カスタムドメイン*.192.168.0.49.sslip.io192.168.0.49に解決します(IPアドレスは環境に合わせて置き換えるか、もしくは127.0.0.1を設定してください)。

kubectl patch configmap/config-domain --namespace knative-serving --type merge --patch '{"data":{"192.168.0.49.sslip.io":""}}'

この設定により、例えばPodの名前がhelloで名前空間がdefaultのPodへはhttp://hello.default.192.168.0.49.sslip.ioのようなアドレスが払い出されます。

サービスを確認します。NodePortでアクセスする場合は、URLにポート番号をつけてアクセスしてください。

kubectl get svc kourier -n kourier-system

NAME      TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
kourier   NodePort   10.152.183.112   <none>        80:31080/TCP,443:31443/TCP   27m

or

NAME      TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)                      AGE
kourier   LoadBalancer   10.152.183.182   192.168.0.49   80:32083/TCP,443:31470/TCP   9m56s

これ以降では、MetalLBを使った場合の実行例と結果例を記述します。NodePortでアクセスする場合はhttpアクセスは31080ポートをつけてアクセスしてください。

Knative Servingを触ってみる

試しにこれを作ってみよう

kn service create hello --image gcr.io/knative-samples/helloworld-go --port 8080 --env TARGET=World
Creating service 'hello' in namespace 'default':

  0.010s The Route is still working to reflect the latest desired specification.
  0.080s ...
  0.096s Configuration "hello" is waiting for a Revision to become ready.
167.698s ...
167.970s Ingress has not yet been reconciled.
168.128s Waiting for load balancer to be ready
168.287s Ready to serve.

Service 'hello' created to latest revision 'hello-00001' is available at URL:
http://hello.default.192.168.0.49.sslip.io

URLにアクセスしてみます。正常に動いていれば次のように表示されます。

MettalLBを使ったLBアクセス

curl http://hello.default.192.168.0.49.sslip.io
Hello World!

KnativeにはKnative EventingというEvent-Driven用のコンポーネントもありますが、 とりあえずRequest-Replyモデルのアプリケーションが動く、Knative Servingだけ動くのを確認しました。

kn service list
NAME    URL                                       LATEST        AGE   CONDITIONS   READY   REASON
hello   http://hello.default.192.168.0.49.sslip.io   hello-00001   26m   3 OK / 3     True 

Scaling to Zero

そして、2分経過したら縮退するのを確認

kubectl get deployment -l serving.knative.dev/service=hello -w
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
hello-00001-deployment   1/1     1            1           118s
hello-00001-deployment   1/0     1            1           2m
hello-00001-deployment   1/0     1            1           2m
hello-00001-deployment   0/0     0            0           2m1s
...

縮退するけど、アクセスするとPodが再作成され復活する

curl hello.default.192.168.0.49.sslip.io
Hello World!

kubectl get deployment -l serving.knative.dev/service=hello -w
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
hello-00001-deployment   1/1     1            1           3m15s

Basics of Traffic Splitting

現在のサービスの状態を確認

kn service list
NAME    URL                                       LATEST        AGE   CONDITIONS   READY   REASON
hello   http://hello.default.192.168.0.49.sslip.io   hello-00001   47m   3 OK / 3     True  

KnativeServiceの更新されたバージョンをデプロイします。

kn service update hello --env TARGET=Knative
Updating Service 'hello' in namespace 'default':

  0.067s The Configuration is still working to reflect the latest desired specification.
  9.259s Traffic is not yet migrated to the latest revision.
  9.461s Ingress has not yet been reconciled.
  9.603s Waiting for load balancer to be ready
  9.736s Ready to serve.

Service 'hello' updated to latest revision 'hello-00002' is available at URL:
http://hello.default.192.168.0.49.sslip.io

リビジョンが変わったことが確認できる

kn service list
NAME    URL                                       LATEST        AGE     CONDITIONS   READY   REASON
hello   http://hello.default.192.168.0.49.sslip.io   hello-00002   8m30s   3 OK / 3     True    

新しいリビジョンにアクセスしてみる(普通にcurlでアクセスしても良い)

echo "Accessing URL $(kn service describe hello -o url)"
curl "$(kn service describe hello -o url)"
Hello Knative!

リビジョンを確認 現在はhello-00002のサービスに100%アクセスが振り分けられている

kn revisions list
NAME          SERVICE   TRAFFIC   TAGS   GENERATION   AGE     CONDITIONS   READY   REASON
hello-00002   hello     100%             2            2m59s   3 OK / 4     True    
hello-00001   hello                      1            51m     3 OK / 4     True 

リビジョン間でトラフィックを分割する

kn service update hello --traffic hello-00001=50 --traffic @latest=50
Updating Service 'hello' in namespace 'default':

  0.059s The Route is still working to reflect the latest desired specification.
  0.204s Ingress has not yet been reconciled.
  0.335s Waiting for load balancer to be ready
  0.432s Ready to serve.

Service 'hello' with latest revision 'hello-00002' (unchanged) is available at URL:
http://hello.default.192.168.0.49.sslip.io

kn revisions list
NAME          SERVICE   TRAFFIC   TAGS   GENERATION   AGE     CONDITIONS   READY   REASON
hello-00002   hello     50%              2            4m58s   3 OK / 4     True    
hello-00001   hello     50%              1            53m     3 OK / 4     True    

アクセスすると大体半分の確率でhello-00001とhello-00002のサービスに振り分けられた

curl http://hello.default.192.168.0.49.sslip.io
Hello World!
curl http://hello.default.192.168.0.49.sslip.io
Hello Knative!
curl http://hello.default.192.168.0.49.sslip.io
Hello World!
curl http://hello.default.192.168.0.49.sslip.io
Hello Knative!

他のサービスを作成

他のサービスを作成して、そのコンテナアプリケーションにも引き続きアクセスできることを確認する。

kn service create hello2 --image gcr.io/knative-samples/helloworld-go --port 8080 --env TARGET=World
Creating service 'hello2' in namespace 'default':
...
Service 'hello2' created to latest revision 'hello2-00001' is available at URL:
http://hello2.default.192.168.0.49.sslip.io

kn service list
NAME     URL                                           LATEST         AGE     CONDITIONS   READY   REASON
hello    http://hello.default.192.168.0.49.sslip.io    hello-00002    33m     3 OK / 3     True    
hello2   http://hello2.default.192.168.0.49.sslip.io   hello2-00001   5m41s   3 OK / 3     True   

curl http://hello.default.192.168.0.49.sslip.io
Hello World!
curl http://hello2.default.192.168.0.49.sslip.io
Hello World!

サービスの削除

最後にサービスをクリーンアップする。

kn service delete hello
kn service delete hello2
kn service list
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment