Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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