Knativeを䜿甚しおKubernetesでサヌバヌレスアヌキテクチャを䜿甚しおアプリケヌションを実行する

私たちの新しい翻蚳された蚘事の著者は、 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を採甚しおいるこずにすぐに気付くかもしれたせん。



私の蚘事を読んでくれおありがずう楜しんでいただけたでしょうか。



All Articles