Goで学ぶKnative #mercarigo / learning Knative with Go

Goで学ぶKnative #mercarigo / learning Knative with Go

mercari.go #8
https://mercari.connpass.com/event/132114/

Knativeの仕組みを理解するにあたり次のようなことを説明します。

# Knativeの概要

## Serving
## Build
## Eventing

# KubernetesとKnativeの関係

## Kubernetesのコンセプト、アーキテクチャー
## カスタムリソースとコントローラー
##コントローラー開発のためのライブラリ

# Knativeの実装の追い方

## CRD
### yaml
### runtime.Object

## コントローラー
### コード生成
### Knative共通ライブラリ
### Reconcile

C000f292a92b894afabbb352e8709667?s=128

Toshinori Sugita

June 14, 2019
Tweet

Transcript

  1. Goで学ぶKnative
 2019/6/14 mercari.go #8 


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

    toshi0607
 ◦ toshi0607
 ◦   toshi0607
 • Software Engineer@メルペイ
 ◦ Backend
 • 本
 ◦ 『Knativeの歩き方 KubernetesからServerlessを訪ねて』
 ◦ 『GoとSAMで学ぶAWS Lambda』
 ◦ 『Extensive Xamarin(共著)』

  3. 今日のお話
 • Knativeの概要
 • KnativeとKuberentes
 • Goで学ぶKnative
 • さいごに


  4. 今日のお話
 • Knativeの概要
 • KnativeとKuberentes
 • Goで学ぶKnative
 • さいごに


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

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

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

  8. Servingの役割
 ※https://github.com/knative/docs/tree/master/serving • コンテナの迅速なデプロイ
 • オートスケールアウト・イン(0まで)
 • Istio向けのトラフィック・ネットワーク設定
 • コードと設定のバージョン管理


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

    Revisionにルーティング
 • Service: RouteとConfigurationを管理。k8sのServiceと別

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

    Revisionにルーティング
 • Service: RouteとConfigurationを管理。k8sのServiceと別
 Deployment
 k8s Service
 ReplicaSet
 Pod

  11. REVISION Servingの構成要素
 ※https://github.com/knative/serving/blob/master/docs/scaling/DEVELOPMENT.md • Autoscaler: Revisionの同時リクエスト数を監視、調整
 • Activator: RevisionがReserve State時リクエストを受ける


    ROUTE Istio Route
 Activator
 Pods
 Deployment
 Autoscaler
 metrics
 resize
 active route
 inactive route
 activate
 create
 watch
 first

  12. Istioは必須?
 ※https://knative.dev/docs/install/index.html

  13. Buildの役割と構成要素
 ※https://github.com/knative/docs/tree/master/build • ソースコードをコンテナイメージに変換する
 • ビルドパイプラインは複数のstepで構成される
 ◦ 各stepはコンテナイメージ
 ◦ クラスタのコンテナ内で実行される


    • BuildTemplateを利用しパラメタを渡して実行できる
 • Service(Configuration)で具体的なイメージの代わりにBuildを 指定できる

  14. BuildTemplate
 ※https://github.com/knative/build-templates

  15. Eventingの役割
 ※https://github.com/knative/docs/tree/master/eventing • イベントドリブンなアーキテクチャをサポート
 • イベントの発行元と受け手を抽象化
 • 既存の発行元、受け手の変更なく他サービスを接続
 • CNCF

    Serverless WGのCloudEventsに則りサービス間の相互 運用性を保証

  16. Eventingの構成要素
 ※https://github.com/knative/docs/tree/master/eventing • Source: イベントソース。種類毎にリソースを定義
 • Broker: イベントを受け取り、フィルタリングされたものをService (subscriber)に渡す
 •

    Trigger: subscriberにわたすイベントのフィルター
 Broker
 Service
 Trigger
 ✓ ✓ ✓ filter
 subscriber
 broker

  17. Eventingの構成要素(〜v0.3)
 ※https://github.com/knative/docs/tree/master/eventing • Source: イベントソース。種類毎にリソースを定義
 • Channel: イベントのバッファリング、Serviceへの到達保証
 • Subscription:

    ChannelからイベントをServiceに渡す

  18. Event Source
 ※https://github.com/knative/docs/blob/master/eventing/sources/README.md ContainerSource Event Sourceとして独自に作成も可能


  19. Knativeのユースケース
 ※https://github.com/knative/docs Kubernetes
 Serving
 Build
 Eventing
 Knative Cloud Run
 riff


    GitLab Serverless
 Pivotal Function Service
 Knative Lambda Runtimes
 OpenFaaS functions

  20. 今日のお話
 • Knativeの概要
 • KnativeとKuberentes
 • Goで学ぶKnative
 • さいごに


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

    scaling, and management of containerized applications.
 ※https://kubernetes.io/
  22. Kubernetesのコンセプト
 • クラスタに宣言的なリソース設定を適 用する
 • Kubernetesは現在の状態を理想の状 態に調整し続ける
 →故障時の復旧や高負荷時のオートス ケールなどで運用負荷を低減できる
 ※https://kubernetes.io/docs/concepts/workloads/controllers/deployment/

  23. 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/
  24. 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/
  25. コントローラーとリソース
 Deployment
 Controller
 Deployment
 ReplicaSet
 Pod
 ReplicaSet
 Controller
 Scheduler
 kubelet


  26. コントローラーとリソース
 Deployment
 Controller
 Deployment
 ReplicaSet
 Pod
 ReplicaSet
 Controller
 Scheduler
 kubelet


    create

  27. コントローラーとリソース
 Deployment
 Controller
 Deployment
 ReplicaSet
 Pod
 ReplicaSet
 Controller
 Scheduler
 kubelet


    create

  28. コントローラーとリソース
 Deployment
 Controller
 Deployment
 ReplicaSet
 Pod
 ReplicaSet
 Controller
 Scheduler
 kubelet


    create
 create

  29. コントローラーとリソース
 Deployment
 Controller
 Deployment
 ReplicaSet
 Pod
 ReplicaSet
 Controller
 Scheduler
 kubelet


    create
 create

  30. コントローラーとリソース
 Deployment
 Controller
 Deployment
 ReplicaSet
 Pod
 ReplicaSet
 Controller
 Scheduler
 kubelet


    create
 create
 assign to node

  31. コントローラーとリソース
 Deployment
 Controller
 Deployment
 ReplicaSet
 Pod
 ReplicaSet
 Controller
 Scheduler
 kubelet


    create
 create
 assign to node

  32. コントローラーとリソース
 Deployment
 Controller
 Deployment
 ReplicaSet
 Pod
 ReplicaSet
 Controller
 Scheduler
 kubelet


    create
 create
 assign to node
 update

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

    バリデーションやその他メタ情報を定 義
 • CRDで定義したカスタムリソースに対 するCRUDが可能になる
 ※https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/
  34. カスタムコントローラー
 • 独自のコントローラーを追加できる
 • 既存のリソースやカスタムリソースの変更を検知し、理想状態にな るよう調整する
 • カスタムコントローラーのDockerイメージをDeploymentで Kubernetesクラスター上にデプロイする
 ※https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/

  35. Operator
 ※https://operatorhub.io/

  36. ライブラリとSDK
 • kubernetes/gengo
 • kubernetes/client-go
 • kubernetes/code-generator
 • kubernetes-sigs/controller-runtime
 •

    kubernetes-sigs/kubebuilder
 • operator-framework/operator-sdk
 • GoogleCloudPlatform/metacontroller
 • kudobuilder/kudo
 • rook/operator-kit
 • ericchiang/k8s
 • kmodules/client-go

  37. client-goとカスタムコントローラー
 ※https://github.com/kubernetes/sample-controller/blob/master/docs/controller-client-go.md kube-
 apiserver
 informer
 callback
 workqueue
 
 
 


    reconciler
 clientset
 List & Watch
 CRUD
 indexer
 thread safe store

  38. 今日のお話
 • Knativeの概要
 • KnativeとKuberentes
 • Goで学ぶKnative
 • さいごに


  39. 実装を追うモチベーション
 • 機能実装に一層集中するための基盤作りに興味がある(趣 味)
 • コントローラーの1実装として詳しく知りたい
 • あわよくばコントリビューションしたい


  40. ※https://cloudnativedays.jp/cndt2019/

  41. 実装を追う上でのポイント
 • CRD
 ◦ yaml
 ◦ runtime.Object
 • コントローラー
 ◦

    コード生成
 ◦ Knative共通ライブラリ
 ◦ Reconcile()
 • Knative概要で触れたコンポーネントを中心にCRDが組み合わ さってできている
 • メインのロジックはReconcile()内のreconcile()に書いてある

  42. client-goとカスタムコントローラー
 ※https://github.com/kubernetes/sample-controller/blob/master/docs/controller-client-go.md kube-
 apiserver
 informer
 callback
 workqueue
 
 
 


    reconciler
 clientset
 List & Watch
 CRUD
 indexer
 thread safe store

  43. 実装を追う上でのポイント
 • CRD
 ◦ yaml
 ◦ runtime.Object
 • コントローラー
 ◦

    コード生成
 ◦ Knative共通ライブラリ
 ◦ Reconcile()
 • Knative概要で触れたコンポーネントを中心にCRDが組み合わ さってできている
 • メインのロジックはReconcile()内のreconcile()に書いてある

  44. knative/servingのCRDのyaml
 ※https://github.com/knative/serving/tree/master/config

  45. 実装を追う上でのポイント
 • CRD
 ◦ yaml
 ◦ runtime.Object
 • コントローラー
 ◦

    コード生成
 ◦ Knative共通ライブラリ
 ◦ Reconcile()
 • Knative概要で触れたコンポーネントを中心にCRDが組み合わ さってできている
 • メインのロジックはReconcile()内のreconcile()に書いてある

  46. Serviceのruntime.Object
 ※https://github.com/knative/serving/blob/master/pkg/apis/serving/v1beta1/service_types.go

  47. runtime.Object interface
 ※https://github.com/kubernetes/apimachinery/blob/master//pkg/runtime/interfaces.go

  48. Serviceのruntime.Object
 ※https://github.com/knative/serving/blob/master/pkg/apis/serving/v1beta1/service_types.go

  49. 実装を追う上でのポイント
 • CRD
 ◦ yaml
 ◦ runtime.Object
 • コントローラー
 ◦

    コード生成
 ◦ Knative共通ライブラリ
 ◦ Reconcile()
 • Knative概要で触れたコンポーネントを中心にCRDが組み合わ さってできている
 • メインのロジックはReconcile()内のreconcile()に書いてある

  50. コントローラーとコード生成
 ※https://github.com/knative/serving/blob/master/hack/update-codegen.sh

  51. コントローラーとコード生成
 • deepcopy
 • client
 • informer
 • lister


  52. ServiceのDeepCopyObject
 ※https://github.com/knative/serving/blob/master/pkg/apis/serving/v1beta1/zz_generated.deepcopy.go

  53. knative/servingのclientset
 ※https://github.com/knative/serving/blob/master/pkg/client/clientset/versioned/clientset.go

  54. serviceのclientのinterface
 ※https://github.com/knative/serving/blob/master/pkg/client/clientset/versioned/typed/serving/v1alpha1/service.go

  55. serviceのinformer
 ※https://github.com/knative/serving/blob/master/pkg/client/informers/externalversions/serving/v1alpha1/service.go

  56. serviceのlister
 ※https://github.com/knative/serving/blob/master/pkg/client/listers/serving/v1alpha1/service.go

  57. cache.Indexer interface
 ※https://github.com/kubernetes/client-go/blob/master/tools/cache/index.go

  58. cache.Store interface
 ※https://github.com/kubernetes/client-go/blob/master//tools/cache/store.go

  59. cache.store interface
 ※https://github.com/kubernetes/client-go/blob/master//tools/cache/store.go

  60. cache.ThreadSafeStore interface
 ※https://github.com/kubernetes/client-go/blob/master///tools/cache/thread_safe_store.go

  61. コントローラーとコード生成
 • deepcopy
 ◦ リソースのイミュータブルな更新を実現
 • client
 ◦ kube-apiserverのクライアント
 •

    informer
 ◦ リソースの監視とworkqueueへのエンキュー
 • lister
 ◦ インメモリキャッシュからオブジェクトを取得

  62. client-goとカスタムコントローラー
 ※https://github.com/kubernetes/sample-controller/blob/master/docs/controller-client-go.md kube-
 apiserver
 informer
 callback
 workqueue
 
 
 


    reconciler
 clientset
 List & Watch
 CRUD
 indexer
 thread safe store

  63. 実装を追う上でのポイント
 • CRD
 ◦ yaml
 ◦ runtime.Object
 • コントローラー
 ◦

    コード生成
 ◦ Knative共通ライブラリ
 ◦ Reconcile()
 • Knative概要で触れたコンポーネントを中心にCRDが組み合わ さってできている
 • メインのロジックはReconcile()内のreconcile()に書いてある

  64. knative/pkg
 ※https://github.com/knative/serving/blob/master/pkg/client/listers/serving/v1alpha1/service.go

  65. knative/pkg
 ※https://github.com/knative/serving/blob/master/pkg/client/listers/serving/v1alpha1/service.go

  66. 実装を追う上でのポイント
 • CRD
 ◦ yaml
 ◦ runtime.Object
 • コントローラー
 ◦

    コード生成
 ◦ Knative共通ライブラリ
 ◦ Reconcile()
 • Knative概要で触れたコンポーネントを中心にCRDが組み合わ さってできている
 • メインのロジックはReconcile()内のreconcile()に書いてある

  67. ServiceのReconciler struct
 ※https://github.com/knative/serving/blob/master/pkg/reconciler/service/service.go

  68. ServiceのReconcile()とreconcile()
 読んでみましょう! https://github.com/knative/serving/blob/master//pkg/reconciler/service/service.go

  69. 湧き上がる思いたち
 • 自分のペースで追いたい
 • コード見ながら追いたい
 • client-goの実装もっと詳しく!
 • インキャッシュメモリにはどうやってわたすの?
 •

    Pod 0にするために何を何で監視してどう反映するの?
 • Pod 0のときは何がリクエストを受けるの?
 • BuildやEventingはどうなってるの?

  70. ※https://techbookfest.org/event/tbf07

  71. 今日のお話
 • Knativeの概要
 • KnativeとKuberentes
 • Goで学ぶKnative
 • さいごに


  72. 参考資料 Knative
 • 公式ドキュメント
 ◦ とても整理されていて図も豊富でわかりやすいです
 ◦ https://github.com/knative/docs
 • 『Getting

    Started with Knative』
 ◦ Pivotalの方が執筆した81ページのebookが無料です
 ◦ https://content.pivotal.io/ebooks/getting-started-with-knative
 ◦ バージョンは古くなってしまったがそれでもユースケースまで載っていて楽しい
 • 『Knativeの歩き方 KubernetesからServerlessを訪ねて』
 ◦ 完全な手前味噌
 ◦ 技術書典7に向けバージョンアップやユースケースなどの章追加準備中
 ◦ https://booth.pm/ja/items/1309468

  73. 参考資料 Operator
 • リポジトリ
 ◦ https://github.com/kubernetes/client-go
 ◦ https://github.com/kubernetes/sample-controller
 ◦ https://kubernetes.io/docs/reference/using-api/client-libraries/


    • Kubernetes Operators Best Practices
 ◦ バリデーション周りの説明が詳しい
 ◦ https://blog.openshift.com/kubernetes-operators-best-practices/
 • Kubernetes Operator で実現する NoOps の世界
 ◦ すごい(語彙力)
 ◦ https://speakerdeck.com/shmurata/how-we-accomplish-noops-by-kubernetes -operator
 • 『Programming Kubernetes』
 ◦ Amazonでは9月、Safari Books Onlineでは7月発売の記載がある
 ◦ Safari Books OnlineはEarly Releaseがもう読めるがアプリでは5章までしかなく、 Webで見たら9章まであった
 ◦ https://www.amazon.co.jp/dp/1492047104

  74. ご清聴ありがとうございました!
 Goで学ぶKnative