ç§ãã¡ã®æ°ãã翻蚳ãããèšäºã®èè ã¯ã Knativeã圌ããå®å®ã§èããããšãã§ããæé«ã®ãã®ã§ãããšäž»åŒµããŠããŸãïŒåæããŸããïŒ
ãã§ã«Kubernetesã䜿çšããŠããå Žåã¯ããµãŒããŒã¬ã¹ã¢ãŒããã¯ãã£ã«ã€ããŠèããããšãããã§ãããã KubernetesãšKnativeã®äž¡æ¹ã®ãã©ãããã©ãŒã ã¯ã¹ã±ãŒã©ãã«ã§ãããã€ã³ãã©ã¹ãã©ã¯ãã£ã®åé¡ã«ç ©ããããããšãªãéçºè ã«å®çšçãªã³ãŒããæäŸããããã«æåãå°œããã®ã¯ãµãŒããŒã¬ã¹ã¢ãŒããã¯ãã£ã§ãããŸããã¢ããªã±ãŒã·ã§ã³ã€ã³ã¹ã¿ã³ã¹ãæåããä»®æ³çã«ã¹ã±ãŒãªã³ã°ããããšã«ãããã€ã³ãã©ã¹ãã©ã¯ãã£ã®ã³ã¹ããåæžããŸãã
äžæ¹ãåŸæ¥ã®ãã¹ãã£ã³ã°ã¢ãã«ãšé«åºŠãªãã©ãã£ãã¯ç®¡çææ³ã«åŸãããšã§ãKubernetesãç¡å¶éã«å©çšã§ããŸãããã®ãããã§ãéç·è²ã®å±éãA / Bãã¹ããªã©ãããŸããŸãªæ©äŒãéãããŸãã
Knativeã¯ãäž¡æ¹ã®é·æã掻ããããã®åãçµã¿ã§ãããªãŒãã³ãœãŒã¹ã®ã¯ã©ãŠããã©ãããã©ãŒã ã§ããKnativeã䜿çšãããšãKubernetesã®æ©èœã掻çšããŠããµãŒããŒã¬ã¹ã¢ããªã±ãŒã·ã§ã³ãKubernetesã§å®è¡ã§ãããµãŒããŒã¬ã¹ã¢ãŒããã¯ãã£ã®ã·ã³ãã«ããšæè»æ§ã確ä¿ã§ããŸãã
ãã®ããã«ãéçºè ã¯1ã€ã®ã³ãã³ãã§ã³ã³ããã®ã³ãŒââãã£ã³ã°ãšKubernetesãžã®ãããã€ã«éäžã§ããKnativeã¯ãããã¯ãŒã¯ã®ãã¥ã¢ã³ã¹ããŒããžã®èªåã¹ã±ãŒãªã³ã°ãããŒãžã§ã³ãã©ããã³ã°ãåŠçããªããã¢ããªã±ãŒã·ã§ã³ã管çããŸãã
ãŸããKnativeã¯ãéçºè ãç·©ãèšè¿°ããããšãã§ããŸã æ¥ç¶ããããŠãããŒãµã«ãµãã¹ã¯ãªãã·ã§ã³ãé ä¿¡ãããã³ã€ãã³ã管çãæäŸãããã¬ãŒã ã¯ãŒã¯ãæ±ã圌ãã®ã€ãã³ãããšã®ã³ãŒãããããã¯ãã€ãã³ãæ¥ç¶ã宣èšã§ããã¢ããªã±ãŒã·ã§ã³ãç¹å®ã®ããŒã¿ã¹ããªãŒã ã«ãµãã¹ã¯ã©ã€ãã§ããããšãæå³ããŸãã
Googleãäž»å°ãããªãŒãã³ãœãŒã¹ãã©ãããã©ãŒã ã¯ãCloud Native ComputingFoundationã«å«ãŸããŠããŸããããã¯ããã³ããŒã®ããã¯ã€ã³ããªãããšãæå³ããŸãããã以å€ã®å Žåã¯ãçŸåšã®ã¯ã©ãŠããµãŒããŒã¬ã¹FaaSãœãªã¥ãŒã·ã§ã³ã®é倧ãªå¶éã§ããKnativeã¯ä»»æã®Kubernetesã¯ã©ã¹ã¿ãŒã§å®è¡ã§ããŸãã
Knativeã¯èª°ã®ããã®ãã®ã§ããïŒ
Knativeã¯ããããããç¬èªã®ç¥èãçµéšã責任ãæã€ããŸããŸãªå°éå®¶ãæ¯æŽããŸãã
ãšã³ãžãã¢ã¯kubernetesã¯ã©ã¹ã¿ãŒã®ç®¡çãšãkubectlã䜿çšããKnativeã€ã³ã¹ã¿ã³ã¹ã®ã€ã³ã¹ããŒã«ãšä¿å®ã«éäžã§ããéçºè ã¯KnativeAPIã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããã³ãããã€ã§ããŸãã
ããã¯ãããŸããŸãªããŒã ãäºãã«å¹²æžããããšãªãåé¡ã解決ã§ãããããã©ã®çµç¹ã«ãšã£ãŠã倧ããªãã©ã¹ã§ãã
ãªãKnativeã䜿çšããå¿ èŠãããã®ã§ããïŒ
Kubernetesã䜿çšããŠããã»ãšãã©ã®çµç¹ã«ã¯ãã¯ãŒã¯ããŒãã®å±éãšä¿å®ã管çããããã®è€éãªããã»ã¹ããããŸããããã«ãããéçºè ã¯å¿é ããå¿ èŠã®ãªãè©³çŽ°ã«æ³šæãæãããã«ãªããŸããéçºè ã¯ãã¢ã»ã³ããªãå±éã«ã€ããŠèããã®ã§ã¯ãªããã³ãŒãã£ã³ã°ã«éäžããå¿ èŠããããŸãã
Kubelessã¯ãéçºè ãKubernetesã®å éšã§äœãèµ·ãã£ãŠãããã«ã€ããŠããŸãç¥ããªããŠããã³ãŒããç°¡åã«å®è¡ã§ããããã«ããã®ã«åœ¹ç«ã¡ãŸãã
Kubernetesã¯ã©ã¹ã¿ãŒã¯ããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã«å°ãªããšã1ã€ã®å®è¡äžã®ã³ã³ãããŒãå¿ èŠãªãããã€ã³ãã©ã¹ãã©ã¯ãã£ãªãœãŒã¹ãæ¶è²»ããŸãã Knativeã¯ãã®åŽé¢ã管çããã¯ã©ã¹ã¿ãŒå ã®ã³ã³ãããŒã®èªåã¹ã±ãŒãªã³ã°ãæåããåŠçããŸããããã«ãããKubernetes管çè ã¯è€æ°ã®ã¢ããªã±ãŒã·ã§ã³ãåäžã®ã¯ã©ã¹ã¿ãŒã«ããã±ãŒãžåã§ããŸãã
ããŒã¯æéãç°ãªãè€æ°ã®ã¢ããªã±ãŒã·ã§ã³ãããå ŽåããŸãã¯ã¯ãŒã«ãŒããŒãã®èªåã¹ã±ãŒãªã³ã°ãåããã¯ã©ã¹ã¿ãŒãããå Žåã¯ãããŠã³ã¿ã€ã äžã«ãããã倧ããªã¡ãªãããåŸãããšãã§ããŸãã
ç¹å®ã®æéã«å®è¡ããããã€ã¯ããµãŒãã¹ãå¿ èŠãšããªãå¯èœæ§ããããã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ã¢ããªã±ãŒã·ã§ã³ã®çã®éé±ãããã«ããããªãœãŒã¹ãããå¹ççã«äœ¿çšã§ããããã«ãªããéããããªãœãŒã¹ã§ããå€ãã®ããšãã§ããããã«ãªããŸãã
ããã«ãEventingãšã³ãžã³ãšéåžžã«ããçµ±åãããŠãããç¡é¢ä¿ãªã·ã¹ãã ã®èšèšã容æã«ããŸããã¢ããªã±ãŒã·ã§ã³ã³ãŒãã¯ãšã³ããã€ã³ãæ§æããå®å šã«è§£æŸããããŸãŸã§ãããKubernetesã¬ãã«ã§æ§æã宣èšããããšã«ãããã€ãã³ããå ¬éããã³ãµãã¹ã¯ã©ã€ãã§ããŸããããã¯ãè€éãªãã€ã¯ããµãŒãã¹ã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠå€§ããªå©ç¹ã§ãã
Knativeã¯ã©ã®ããã«æ©èœããŸããïŒ
KnativeãæäŸ KNã®KubernetesãšCRDã®æŒç®åã䜿çšããŠAPIãããããã䜿çšãããšãã³ãã³ãã©ã€ã³ã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãå±éã§ããŸããããã¯ã°ã©ãŠã³ãã§ãKnativeã¯ãKubernetesãã¢ããªã±ãŒã·ã§ã³ãå®è¡ããããã«å¿ èŠãªãã¹ãŠã®ãã®ïŒãããã€ã¡ã³ãããµãŒãã¹ãã€ã³ããŠã³ãããŒã¿ãªã©ïŒããå¿é ããããšãªãäœæããŸãã
Knativeãããã«ããããäœæããããã§ã¯ãªãããšã«æ³šæããŠãã ããã代ããã«ãã¢ããªã±ãŒã·ã§ã³ã«ä»®æ³ãšã³ããã€ã³ããæäŸãããããããªãã¹ã³ããŸãããªã¯ãšã¹ãããããã®ãšã³ããã€ã³ãã«ããããããšãKnativeã¯å¿ èŠãªããããå®è¡ããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³ãæåããå¿ èŠãªæ°ã®ã€ã³ã¹ã¿ã³ã¹ã«æ¡åŒµã§ããŸãã
Knativeã¯ãç¬èªã®ãã¡ã€ã³ã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãšã³ããã€ã³ããæ¬¡ã®åœ¢åŒã§æäŸããŸã [ã¢ããªå]ã[åå空é]ã[ã«ã¹ã¿ã ãã¡ã€ã³]ã
ããã¯ãã¢ããªã±ãŒã·ã§ã³ãäžæã«èå¥ããã®ã«åœ¹ç«ã¡ãŸããKubernetesããµãŒãã¹ãåŠçããæ¹æ³ãšäŒŒãŠããŸãããIstioå ¥åã²ãŒããŠã§ã€ãæãç¬èªã®ãã¡ã€ã³Aã¬ã³ãŒããäœæããå¿ èŠããããŸããIstioã¯ãã¯ã©ã¹ã¿ãŒãééãããã¹ãŠã®ãã©ãã£ãã¯ãããã¯ã°ã©ãŠã³ãã§ç®¡çããŸãã
Knativeã¯ãKubernetesãIstioãPrometheusãGrafanaãªã©ã®å€ãã®CNCFãšãªãŒãã³ãœãŒã¹è£œåãããã³KafkaãGoogle Pub / Subãªã©ã®ã€ãã³ãã¹ããªãŒãã³ã°ãšã³ãžã³ãçµ±åãããã®ã§ãã
Knativeã®ã€ã³ã¹ããŒã«
Knativeã¯åççãªã¢ãžã¥ã©ãŒæ§é ãåããŠãããå¿ èŠãªã³ã³ããŒãã³ãã®ã¿ãã€ã³ã¹ããŒã«ã§ããŸãã Knativeã¯ãã€ãã³ãããµãŒãã¹ãããã³ç£èŠã³ã³ããŒãã³ããæäŸããŸããã«ã¹ã¿ã CRDã䜿çšããŠã€ã³ã¹ããŒã«ã§ããŸãã
Knativeã«ã¯ããã¹ãŠã®ã³ã³ããŒãã³ãã«å€éšã®äŸåé¢ä¿ãšèŠä»¶ããããŸããããšãã°ããµãŒãã¹ã³ã³ããŒãã³ããã€ã³ã¹ããŒã«ããå Žåã¯ãIstioãšDNSã¢ããªã³ãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã
Knativeã®ã€ã³ã¹ããŒã«ã¯ããªãè€éã§ãå¥ã®èšäºã«å€ããŸãããã ãããã¢ã³ã¹ãã¬ãŒã·ã§ã³ã®ããã«ããµãŒãã¹ã³ã³ããŒãã³ããã€ã³ã¹ããŒã«ããããšããå§ããŸãããã
ãããè¡ãã«ã¯ãåäœããKubernetesã¯ã©ã¹ã¿ãŒãå¿ èŠã§ãã
ServiceCRDãšãµãŒãã³ã°ã³ã¢ã³ã³ããŒãã³ããã€ã³ã¹ããŒã«ããŸãã
kubectl apply -f https://github.com/knative/serving/releases/download/v0.17.0/serving-crds.yaml kubectl apply -f https://github.com/knative/serving/releases/download/v0.17.0/serving-core.yaml
Istio forKnativeãã€ã³ã¹ããŒã«ããŸãã
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.7.0 sh - &&
cd istio-1.7.0 && export PATH=$PWD/bin:$PATH
istioctl install --set profile=demo
kubectl label namespace knative-serving istio-injection=enabled
Kubernetesãå€éšIPã¢ãã¬ã¹ãIstioIngressã²ãŒããŠã§ã€ã«å²ãåœãŠãŠãããã©ããã確èªããŠãIstioã®æºåãæŽãã®ãåŸ ã¡ãŸãã
kubectl -n istio-system get service istio-ingressgateway
ç¬èªã®ãã¡ã€ã³ãå®çŸ©ããIstioå ¥åã²ãŒããŠã§ã€ã®IPã¢ãã¬ã¹ãæãããã«DNSãæ§æããŸãã
kubectl patch configmap/config-domain --namespace knative-serving --type merge -p "{\"data\":{\"$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}').xip.io\":\"\"}}"
kubectl apply -f https://github.com/knative/net-istio/releases/download/v0.17.0/release.yaml
kubectl apply -f https://github.com/knative/serving/releases/download/v0.17.0/serving-default-domain.yaml
IstioHPAã¢ããªã³ãã€ã³ã¹ããŒã«ããŸãã
kubectl apply -f https://github.com/knative/serving/releases/download/v0.17.0/serving-hpa.yaml
KnativeCLIã®ã€ã³ã¹ããŒã«
KnativeCLIã®ã€ã³ã¹ããŒã«ã¯ç°¡åã§ããKnative CLIãã€ããªã®ææ°ããŒãžã§ã³ãbinãã©ã«ããŒã«ããŠã³ããŒãããããé©åãªãã¹ãæå®ããå¿ èŠããããŸãã
sudo wget https://storage.googleapis.com/knative-nightly/client/latest/kn-linux-amd64 -O /usr/local/bin/kn
sudo chmod +x /usr/local/bin/kn
kn version
HelloãWorldïŒã¢ããªã±ãŒã·ã§ã³ã®èµ·å
ããã§ã¯ãæåã®ãHelloãWorldïŒããå®è¡ããŠã¿ãŸããããKnativeã䜿çšããŠå±éããã®ãããã«ç°¡åãã確èªããã¢ããªã
HelloãWorldïŒãµã³ãã«ã¢ããªã±ãŒã·ã§ã³ã䜿çšããŠã¿ãŸããã ãã¢ã®ããã«Goã§ãããã¯ãHello $ TARGETãè¿ãåçŽãª RESTAPIã§ããããã§ã $ TARGETã¯ãã³ã³ãããŒã«èšå®ã§ããç°å¢å€æ°ã§ãã
次ã®ã³ãã³ããå®è¡ããŠéå§ããŸãã
$ kn service create helloworld-go --image gcr.io/knative-samples/helloworld-go --env TARGET="World" --annotation autoscaling.knative.dev/target=10
Creating service 'helloworld-go' in namespace 'default':
0.171s Configuration "helloworld-go" is waiting for a Revision to become ready.
6.260s ...
6.324s Ingress has not yet been reconciled.
6.496s Waiting for load balancer to be ready
6.637s Ready to serve.
Service 'helloworld-go' created to latest revision 'helloworld-go-zglmv-1' is available at URL:
http://helloworld-go.default.34.71.125.175.xip.io
kubectl get pod
No resources found in default namespace.
helloworldãµãŒãã¹ã éå§ããŸãããã
$ curl http://helloworld-go.default.34.71.125.175.xip.io Hello World!
ãããŠãã°ãããããšçããè¿ã£ãŠããŸããããããèŠãŠã¿ãŸãããã
$ kubectl get pod NAME READY STATUS RESTARTS AGE helloworld-go-zglmv-1-deployment-6d4b7fb4f-ctz86 2/2 Running 0 50s
ã芧ã®ãšãããKnativeã¯ããã¯ã°ã©ãŠã³ãã§1åã®ç§»åã§å±éãããŸããæåéããŒãããã¹ã±ãŒãªã³ã°ããããšãããããŸããã
å°ãæéããšããšããããã宿ãå§ããŠããããšãããããŸããäœãèµ·ãã£ãŠããã®ãèŠãŠã¿ãŸãããã
$ kubectl get pod -w NAME READY STATUS RESTARTS AGE helloworld-go-zglmv-1-deployment-6d4b7fb4f-d9ks6 2/2 Running 0 7s helloworld-go-zglmv-1-deployment-6d4b7fb4f-d9ks6 2/2 Terminating 0 67s helloworld-go-zglmv-1-deployment-6d4b7fb4f-d9ks6 1/2 Terminating 0 87s
äžèšã®äŸã¯ãKnativeãèŠä»¶ã«åŸã£ãŠãããã管çããããšã瀺ããŠããŸããKnativeã¯ãããåŠçããããã®ã¯ãŒã¯ããŒããäœæãããããæåã®èŠæ±ã¯é ããªããŸãããåŸç¶ã®èŠæ±ã¯ããéãå®è¡ãããŸããèŠä»¶ã«å¿ããŠããŸãã¯SLAãå³ããå Žåã¯ããããã®ã¹ããŒããŠã³æéã埮調æŽã§ããŸãã
ããå°ãé²ãã§ã¿ãŸããããæ³šéãèŠããšãåŠçäžã®å泚éã¯10åã®åæèŠæ±ã«å¶éãããŠããŸããã§ã¯ããã®äžã«é¢æ°ãããŒããããšã©ããªãã§ãããããä»èª¿ã¹ãŠã¿ãŸãããïŒ hey
ãŠãŒãã£ãªãã£ã䜿çšã ãŠã¢ããªã±ãŒã·ã§ã³ãããŒãããŸããæ¬¡ã®ã³ãã³ãã¯ã30ç§ä»¥å ã«50ã®åæèŠæ±ããšã³ããã€ã³ãã«éä¿¡ããŸãã
$ hey -z 30s -c 50 http://helloworld-go.default.34.121.106.103.xip.io
Average: 0.1222 secs
Requests/sec: 408.3187
Total data: 159822 bytes
Size/request: 13 bytes
Response time histogram:
0.103 [1] |
0.444 [12243] |â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â â
0.785 [0] |
1.126 [0] |
1.467 [0] |
1.807 [0] |
2.148 [0] |
2.489 [0] |
2.830 [0] |
3.171 [0] |
3.512 [50] |
Latency distribution:
10% in 0.1042 secs
25% in 0.1048 secs
50% in 0.1057 secs
75% in 0.1077 secs
90% in 0.1121 secs
95% in 0.1192 secs
99% in 0.1826 secs
Details (average, fastest, slowest):
DNS+dialup: 0.0010 secs, 0.1034 secs, 3.5115 secs
DNS-lookup: 0.0006 secs, 0.0000 secs, 0.1365 secs
req write: 0.0000 secs, 0.0000 secs, 0.0062 secs
resp wait: 0.1211 secs, 0.1033 secs, 3.2698 secs
resp read: 0.0001 secs, 0.0000 secs, 0.0032 secs
Status code distribution:
[200] 12294 responses
ããã§ã¯ãããããèŠãŠã¿ãŸãããã
$ kubectl get pod NAME READY STATUS RESTARTS AGE helloworld-go-thmmb-1-deployment-77976785f5-6cthr 2/2 Running 0 59s helloworld-go-thmmb-1-deployment-77976785f5-7dckg 2/2 Running 0 59s helloworld-go-thmmb-1-deployment-77976785f5-fdvjn 0/2 Pending 0 57s helloworld-go-thmmb-1-deployment-77976785f5-gt55v 0/2 Pending 0 58s helloworld-go-thmmb-1-deployment-77976785f5-rwwcv 2/2 Running 0 59s helloworld-go-thmmb-1-deployment-77976785f5-tbrr7 2/2 Running 0 58s helloworld-go-thmmb-1-deployment-77976785f5-vtnz4 0/2 Pending 0 58s helloworld-go-thmmb-1-deployment-77976785f5-w8pn6 2/2 Running 0 59s
ã芧ã®ãšãããKnativeã¯ã颿°ã®è² è·ãå¢å ãããšããããã¹ã±ãŒãªã³ã°ããè² è·ããªããªããšãããã®é床ãäœäžãããŸãã
çµè«
Knativeã¯ããµãŒããŒã¬ã¹ã¢ãŒããã¯ãã£ã®æé«ã®æ©èœãšKubernetesã®æ©èœãçµã¿åããããã®ã§ããFaaSãå®è£ ããæšæºçãªæ¹æ³ã«åŸã ã«ç§»è¡ããŠããŸããKnativeã¯CNCFã®äžéšã§ããããŸããŸãæè¡çãªé¢å¿ãéããŠãããããã¯ã©ãŠããããã€ããŒããµãŒããŒã¬ã¹è£œåã«Knativeãæ¡çšããŠããããšã«ããã«æ°ä»ããããããŸããã
ç§ã®èšäºãèªãã§ãããŠããããšãïŒæ¥œããã§ããã ããã§ããããã