参考にした情報
- https://ubuntu.com/blog/getting-started-with-knative-1
- https://knative.dev/docs/getting-started/first-service/#knative-service-hello-world
以下の手順は全て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のインストール
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.io
を192.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ポートをつけてアクセスしてください。
試しにこれを作ってみよう
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にアクセスしてみます。正常に動いていれば次のように表示されます。
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
そして、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
現在のサービスの状態を確認
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