Knativeで実現するKubernetes上のサーバーレスアーキテクチャ #CNDT2019 #1E3 / serverless architecture on the top of K8s with Knative

Knativeで実現するKubernetes上のサーバーレスアーキテクチャ #CNDT2019 #1E3 / serverless architecture on the top of K8s with Knative

CloudNative Days 2019の登壇資料です。
https://cloudnativedays.jp/cndt2019/

YouTubeはこちら
https://youtu.be/rD9czFIT4Iw

C000f292a92b894afabbb352e8709667?s=128

Toshinori Sugita

July 22, 2019
Tweet

Transcript

  1. 3.

    自己紹介
 • 杉田 寿憲
 ◦ Toshinori Sugita
 ◦ toshi0607
 •

    Software Engineer@メルペイ
 ◦ Go、gPRC、GKEなマイクロサービスのバックエンド開発
 • 本
 ◦ 『Knativeの歩き方 KubernetesからServerlessを訪ねて』
 ◦ 『GoとSAMで学ぶAWS Lambda』
 ◦ 『Extensive Xamarin(共著)』
 #CNDT2019 #OSDT2019 #RoomE #1E3
  2. 7.

    Knativeとは?
 Kubernetes-based platform to build, deploy, and manage modern serverless

    workloads
 ※https://github.com/knative #CNDT2019 #OSDT2019 #RoomE #1E3
  3. 8.

    Knativeとは?
 • Kubernetesのリソースを抽象化する
 ◦ 開発者から見てよりシンプルに
 • 独自のPaaS/FaaSを構築するためのパーツを提供
 ◦ Serving、Build、Eventingから構成される
 •

    よくあるが難しい課題を解決
 ◦ コンテナのデプロイ
 ◦ ソースコードからURLでアクセスできるアプリケーションへ
 ◦ ブルー/グリーンデプロイを伴うルーティングとトラフィック管理
 ◦ オートスケーリングと需要に基づくワークロードのサイズ設定
 ◦ 実行中のサービスをイベントエコシステムに結び付ける
 ※https://github.com/knative/docs #CNDT2019 #OSDT2019 #RoomE #1E3
  4. 11.

    Servingの構成要素
 ※https://github.com/knative/docs/tree/master/serving • Revision: コードと設定のスナップショット
 • Configuration: 最新のRevision
 • Route:

    Revisionにルーティング
 • Service: RouteとConfigurationを管理。k8s のServiceとは別
 #CNDT2019 #OSDT2019 #RoomE #1E3
  5. 24.

    Kubernetesとは?
 Kubernetes (K8s) is an open-source system for automating deployment,

    scaling, and management of containerized applications.
 ※https://kubernetes.io/ #CNDT2019 #OSDT2019 #RoomE #1E3
  6. 26.

    Kubernetesのアーキテクチャ
 node2
 node1
 kubectl
 etcd
 kube-
 apiserver
 kube-
 scheduler
 kube-


    controller-
 manager
 kube-proxy
 kubelet
 kube-proxy
 kubelet
 Docker etc...
 Docker etc...
 ・・・ ※https://kubernetes.io/docs/concepts/architecture/cloud-controller/ #CNDT2019 #OSDT2019 #RoomE #1E3
  7. 27.

    カスタムリソース
 • 独自のリソースを追加できる
 ◦ CustomResourceDefinition
 ◦ API server aggrigation
 •

    バリデーションやその他メタ情報を定 義
 • CRDで定義したカスタムリソースに対 するCRUDが可能になる
 ※https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/ #CNDT2019 #OSDT2019 #RoomE #1E3
  8. 33.

    サーバーレスとは
 ※https://github.com/cncf/wg-serverless/tree/master/whitepapers/serverless-overview • サーバー管理を必要としないアプリケーション を構築および実行するという概念
 • 必要とされている正確な需要に応じて実行、 拡張、請求を行うデプロイモデル
 • サーバーレスコンピューティングの利用者は、

    サーバーのプロビジョニング、メンテナンス、 アップデート、拡張、キャパシティプランニング に時間とリソースを費やす必要がなくなる
 • 開発者がよりアプリケーションのビジネスロ ジック開発に集中できるようになる
 • 運用者がよりビジネスクリティカルなタスクに 集中できる

  9. 35.

    Knativeとは?
 • Kubernetesのリソースを抽象化する
 ◦ 開発者から見てよりシンプルに
 • 独自のPaaS/FaaSを構築するためのパーツを提供
 ◦ Serving、Build、Eventingから構成される
 •

    よくあるが難しい課題を解決
 ◦ コンテナのデプロイ
 ◦ ソースコードからURLでアクセスできるアプリケーションへ
 ◦ ブルー/グリーンデプロイを伴うルーティングとトラフィック管理
 ◦ オートスケーリングと需要に基づくワークロードのサイズ設定
 ◦ 実行中のサービスをイベントエコシステムに結び付ける
 ※https://github.com/knative/docs 開発者・運用者がよりビジネス価値に集中できるプラットフォームを構築する

  10. 36.

    Knativeによるプラットフォームの拡張
 ※https://github.com/knative/docs/tree/master/docs Kubernetes
 Istio or Gloo
 Serving
 Build
 Eventing
 Platform


    Gateway
 Primitives
 GitLab Serverless
 Your Own!
 Pivotal Function Service
 OpenFaaS functions
 Cloud Run
 Knative Lambda Runtimes
 Products

  11. 38.

    ユースケース① コンテナのデプロイ
 ※https://github.com/toshi0607/CNDT2019-Knative/tree/master/usecase1 • 課題
 ◦ URLでアクセスできるサービスをより楽に管理したい
 ◦ Deployment、Service…
 • knative/serving


    ◦ Deployment、Service(K8s)リソースなどが抽象化されたService(Knative)リ ソースを適用してURLアクセスできるアプリケーションを楽にデプロイ
 • Demo
 ◦ TARGET環境変数にセットされた文字列を使ってHello worldを出力するアプリ ケーションをService(Knative)リソースの適用でデプロイ
 #CNDT2019 #OSDT2019 #RoomE #1E3
  12. 40.

    ユースケース② オートスケール
 ※https://github.com/toshi0607/CNDT2019-Knative/tree/master/usecase2 • 課題
 ◦ リクエスト数に応じてオートスケールさせたい
 ◦ スケール具合を可視化しながら調整したい
 • knative/serving


    ◦ Pod毎の並列リクエスト数を制御・設定
 ▪ K8sのメモリベースのHPA(Horizontal Pod Autoscaler)に変更でき、カスタ ムメトリクス対応も目標の1つとされている
 ◦ servingのReleasesにモニタリング系のyamlも含まれており、メトリクス、ログ、ト レースそれぞれ選択肢がある
 ▪ kubectl apply --filename https://github.com/knative/serving/releases/download/v0.7.0/monitoring.yaml 
 • Demo

  13. 42.

    ユースケース③ トラフィック分割
 ※https://github.com/toshi0607/CNDT2019-Knative/tree/master/usecase3 • 課題
 ◦ 新実装へのトラフィックを徐々に増やし、影響を見ながら安全にデプロイしたい
 • knative/serving
 ◦ Routeを利用したブルーグリーンデプロイ


    • Demo
 ◦ Hello Worldアプリケーションに設定するTARGET環境変数を“blue”から “green”に変更(2つのRevisionを作成)
 ◦ “green”のRevisionへのトラフィックを0 -> 50 -> 100%と大きくしていく
 #CNDT2019 #OSDT2019 #RoomE #1E3
  14. 43.

    ユースケース④ イベントエコシステム
 ※https://github.com/knative/docs/tree/master/docs/eventing/samples/gcp-pubsub-source • 課題
 ◦ 特定のイベントが発生したときに処理を実行したい
 • knative/eventing
 ◦ イベントをServiceリソースへのリクエストに変換して処理を実行する


    • Demo
 ◦ Google Cloud PubSubをイベントソースとして利用
 ◦ 必要な権限は事前に準備済み
 ▪ eventing-contribのgcppubsub関連のリソースをapply
 ▪ pubsub.editor権限付きservice accountを作成
 ▪ service accountのJSONファイルからSecretリソース作成
 ◦ 受け取ったイベントをフォーマットして出力するアプリケーション
 #CNDT2019 #OSDT2019 #RoomE #1E3
  15. 45.

    ユースケース⑤ ビルドパイプライン
 • 課題
 ◦ CI/CDもK8sの世界で済ませたい
 ◦ ビルドパイプラインを共有したい
 • knative/build ->

    tektoncd/pipeline
 ◦ K8sのリソースでビルドパイプラインを定義する
 ◦ テンプレート化できるので再利用できる
 ※https://github.com/tektoncd/pipeline #CNDT2019 #OSDT2019 #RoomE #1E3
  16. 47.

    ユースケース⑥ FaaS イベントpull型
 ※https://github.com/triggermesh/knative-lambda-runtime • 課題
 ◦ イベントドリブンな関数をシュッとデプロイしたい
 • knative/serving +

    knative/build (BuildTemplate)
 ◦ triggermesh/knative-lambda-runtimeを利用するとユーザーはAWS Lambda互 換のfunctionだけ書いたらデプロイできるプラットフォームを構築できる
 ◦ Serviceでリクエストを受けfunctionに受け渡す処理(aws-custom-runtime、 bootstrap)はBuildTemplateを活用してイメージビルド時に埋め込む
 #CNDT2019 #OSDT2019 #RoomE #1E3
  17. 49.

    aws/aws-lambda-go
 AWS LambdaとRuntime Interface
 ※https://github.com/aws/aws-lambda-go Amazon API Gateway
 lambda.start(handler)
 container


    rpc server
 AWS Lambda Runtime 
 AWS Lambda Runtimeはrpcサーバーを含むコンテナを起動し、イベントを渡す
 request
 proxy
 event
 event
 http
 request
 S3
 event
 SQS
 event
 DynamoDB
 stream
 event

  18. 50.

    AWS LambdaとRuntime Interface
 ※https://qiita.com/toshi0607/items/39004c19d7361a837986 Amazon API Gateway
 container
 bootstrap
 AWS

    Lambda Custom Runtimes 
 bootstrapからRuntime APIにイベントを取得にし行くのでCOBOLも動く
 proxy
 event
 event
 http
 request
 S3
 event
 SQS
 event
 DynamoDB
 stream
 event
 Next Invocation API
 Invocation Response API
 Invocation Error API
 Initialization Error API
 response
 event
 error
 error

  19. 51.

    ユースケース⑥ FaaS イベントpull型
 ※https://github.com/triggermesh/knative-lambda-runtime • aws-custom-runtimeがAWS Runtime Interfaceとタスクキューを実装
 • bootstrapがイベントを取得し、functionをinvoke
 Route


    Service
 Build
 Build
 Template
 Pod
 aws/aws-lambda-go
 lambda.start(handler)
 tm/aws-custom-runtime
 bootstrap
 Configuratio n
 Revision
 get
 event
 exec
 bin
 exec
 bin
 rpc
 Server
 http
 request
 K8s
 request
 #CNDT2019 #OSDT2019 #RoomE #1E3
  20. 53.

    ユースケース⑦ FaaS イベントpush型
 ※https://github.com/openfaas • 課題
 ◦ イベントドリブンな関数をシュッとデプロイしたい
 • knative/serving +

    knative/build (BuildTemplate)
 ◦ OpenFaaSのwatchdogサーバーを利用するとユーザーはfunctionだけ書いたら デプロイできるプラットフォームを構築できる
 ◦ Serviceでリクエストを受けfunctionに受け渡す処理(watchdog)は BuildTemplateを活用してイメージビルド時に埋め込む
 #CNDT2019 #OSDT2019 #RoomE #1E3
  21. 60.

    ユースケース⑧ コンテナサーバーレス
 ※https://cloud.google.com/run/ • 課題
 ◦ コンテナをシュッとデプロイしたい
 • knative/serving + knative/build


    ◦ Cloud RunやCloud Run on GKEを利用し、コンテナを手軽にデプロイし、負荷 に応じてスケールさせることができるプラットフォームを構築する
 #CNDT2019 #OSDT2019 #RoomE #1E3
  22. 61.

    ユースケース⑧ コンテナサーバーレス
 ※https://twitter.com/ahmetb/status/1116041166359654400 • Cloud Runマネージドサービスもあり、コンテ ナを動かすのにK8sの運用をなくす選択肢 もある
 • Knative Serving

    APIと互換のAPIで操作す るので操作感も同じ
 • GCPのコンソールからどちらも同じように状 態や生成されたRevisionのyamlを確認でき る
 #CNDT2019 #OSDT2019 #RoomE #1E3
  23. 65.

    参考資料 Knative
 • 公式ドキュメント
 ◦ とても整理されていて図も豊富でわかりやすいです
 ◦ 主なユースケースのサンプル・解説もある
 ◦ https://github.com/knative/docs


    • 『Getting Started with Knative』
 ◦ Pivotalの方が執筆したebookが無料です
 ◦ https://content.pivotal.io/ebooks/getting-started-with-knative
 ◦ バージョンは古くなってしまったがそれでもユースケースまで載っていて楽しい
 • 『Knativeの歩き方 KubernetesからServerlessを訪ねて』
 ◦ 完全な手前味噌
 ◦ https://booth.pm/ja/items/1309468
 #CNDT2019 #OSDT2019 #RoomE #1E3
  24. 67.

    参考資料 Knative
 • 8/29 ServerlessDays Melbourne 2019
 ◦ Build serverless

    application on the top of Kubernetes
 • 10/21、22 ServerlessDays Tokyo 2019
 ◦ Knativeのハンズオンをする可能性あり
 ◦ プロポーザル募集中!
 ▪ https://tokyo.serverlessdays.io/
 • 12/13、14 ServerlessDays Fukuoka 2019
 ◦ Knativeで作るDIY FaaSの話をすべく準備します
 #CNDT2019 #OSDT2019 #RoomE #1E3