Slide 1

Slide 1 text

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


Slide 2

Slide 2 text

自己紹介
 ● 杉田 寿憲
 ○ Toshinori Sugita
 ○ toshi0607
 ○ toshi0607
 ○ toshi0607
 ○   toshi0607
 ● Software Engineer@メルペイ
 ○ Backend
 ● 本
 ○ 『Knativeの歩き方 KubernetesからServerlessを訪ねて』
 ○ 『GoとSAMで学ぶAWS Lambda』
 ○ 『Extensive Xamarin(共著)』


Slide 3

Slide 3 text

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


Slide 4

Slide 4 text

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


Slide 5

Slide 5 text

Knativeとは?
 Kubernetes-based platform to build, deploy, and manage modern serverless workloads
 ※https://github.com/knative

Slide 6

Slide 6 text

Knativeとは?
 ● Kubernetesのリソースを抽象化する
 ○ 開発者から見てよりシンプルに
 ● 独自のPaaS/FaaSを構築するためのパーツを提供
 ○ Serving、Build、Eventingから構成される
 ● よくあるが難しい課題を解決
 ○ コンテナのデプロイ
 ○ ソースコードからURLでアクセスできるアプリケーションへ
 ○ ブルー/グリーンデプロイを伴うルーティングとトラフィック管理
 ○ オートスケーリングと需要に基づくワークロードのサイズ設定
 ○ 実行中のサービスをイベントエコシステムに結び付ける
 ※https://github.com/knative/docs

Slide 7

Slide 7 text

Knativeの構成要素
 ※https://github.com/knative/docs Kubernetes
 Istio
 Serving
 Build
 Eventing
 Knative

Slide 8

Slide 8 text

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


Slide 9

Slide 9 text

Servingの構成要素
 ※https://github.com/knative/docs/tree/master/serving ● Revision: コードと設定のスナップショット
 ● Configuration: 最新のRevision
 ● Route: Revisionにルーティング
 ● Service: RouteとConfigurationを管理。k8sのServiceと別


Slide 10

Slide 10 text

Servingの構成要素
 ※https://github.com/knative/docs/tree/master/serving ● Revision: コードと設定のスナップショット
 ● Configuration: 最新のRevision
 ● Route: Revisionにルーティング
 ● Service: RouteとConfigurationを管理。k8sのServiceと別
 Deployment
 k8s Service
 ReplicaSet
 Pod


Slide 11

Slide 11 text

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


Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

Buildの役割と構成要素
 ※https://github.com/knative/docs/tree/master/build ● ソースコードをコンテナイメージに変換する
 ● ビルドパイプラインは複数のstepで構成される
 ○ 各stepはコンテナイメージ
 ○ クラスタのコンテナ内で実行される
 ● BuildTemplateを利用しパラメタを渡して実行できる
 ● Service(Configuration)で具体的なイメージの代わりにBuildを 指定できる


Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

Eventingの役割
 ※https://github.com/knative/docs/tree/master/eventing ● イベントドリブンなアーキテクチャをサポート
 ● イベントの発行元と受け手を抽象化
 ● 既存の発行元、受け手の変更なく他サービスを接続
 ● CNCF Serverless WGのCloudEventsに則りサービス間の相互 運用性を保証


Slide 16

Slide 16 text

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


Slide 17

Slide 17 text

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


Slide 18

Slide 18 text

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


Slide 19

Slide 19 text

Knativeのユースケース
 ※https://github.com/knative/docs Kubernetes
 Serving
 Build
 Eventing
 Knative Cloud Run
 riff
 GitLab Serverless
 Pivotal Function Service
 Knative Lambda Runtimes
 OpenFaaS functions


Slide 20

Slide 20 text

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


Slide 21

Slide 21 text

Kubernetesとは?
 Kubernetes (K8s) is an open-source system for automating deployment, scaling, and management of containerized applications.
 ※https://kubernetes.io/

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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/

Slide 24

Slide 24 text

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/

Slide 25

Slide 25 text

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


Slide 26

Slide 26 text

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


Slide 27

Slide 27 text

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


Slide 28

Slide 28 text

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


Slide 29

Slide 29 text

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


Slide 30

Slide 30 text

コントローラーとリソース
 Deployment
 Controller
 Deployment
 ReplicaSet
 Pod
 ReplicaSet
 Controller
 Scheduler
 kubelet
 create
 create
 assign to node


Slide 31

Slide 31 text

コントローラーとリソース
 Deployment
 Controller
 Deployment
 ReplicaSet
 Pod
 ReplicaSet
 Controller
 Scheduler
 kubelet
 create
 create
 assign to node


Slide 32

Slide 32 text

コントローラーとリソース
 Deployment
 Controller
 Deployment
 ReplicaSet
 Pod
 ReplicaSet
 Controller
 Scheduler
 kubelet
 create
 create
 assign to node
 update


Slide 33

Slide 33 text

カスタムリソース
 ● 独自のリソースを追加できる
 ○ CustomResourceDefinition
 ○ API server aggrigation
 ● バリデーションやその他メタ情報を定 義
 ● CRDで定義したカスタムリソースに対 するCRUDが可能になる
 ※https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/

Slide 34

Slide 34 text

カスタムコントローラー
 ● 独自のコントローラーを追加できる
 ● 既存のリソースやカスタムリソースの変更を検知し、理想状態にな るよう調整する
 ● カスタムコントローラーのDockerイメージをDeploymentで Kubernetesクラスター上にデプロイする
 ※https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/

Slide 35

Slide 35 text

Operator
 ※https://operatorhub.io/

Slide 36

Slide 36 text

ライブラリと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


Slide 37

Slide 37 text

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


Slide 38

Slide 38 text

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


Slide 39

Slide 39 text

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


Slide 40

Slide 40 text

※https://cloudnativedays.jp/cndt2019/

Slide 41

Slide 41 text

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


Slide 42

Slide 42 text

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


Slide 43

Slide 43 text

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


Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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


Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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


Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

コントローラーとコード生成
 ● deepcopy
 ● client
 ● informer
 ● lister


Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

コントローラーとコード生成
 ● deepcopy
 ○ リソースのイミュータブルな更新を実現
 ● client
 ○ kube-apiserverのクライアント
 ● informer
 ○ リソースの監視とworkqueueへのエンキュー
 ● lister
 ○ インメモリキャッシュからオブジェクトを取得


Slide 62

Slide 62 text

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


Slide 63

Slide 63 text

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


Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

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


Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

湧き上がる思いたち
 ● 自分のペースで追いたい
 ● コード見ながら追いたい
 ● client-goの実装もっと詳しく!
 ● インキャッシュメモリにはどうやってわたすの?
 ● Pod 0にするために何を何で監視してどう反映するの?
 ● Pod 0のときは何がリクエストを受けるの?
 ● BuildやEventingはどうなってるの?


Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

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


Slide 72

Slide 72 text

参考資料 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


Slide 73

Slide 73 text

参考資料 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


Slide 74

Slide 74 text

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