Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

Toshinori Sugita

June 14, 2019
Tweet

More Decks by Toshinori Sugita

Other Decks in Technology

Transcript

  1. Goで学ぶKnative

    2019/6/14 mercari.go #8 


    View Slide

  2. 自己紹介

    ● 杉田 寿憲

    ○ Toshinori Sugita

    ○ toshi0607

    ○ toshi0607

    ○ toshi0607

    ○   toshi0607

    ● Software [email protected]メルペイ

    ○ Backend

    ● 本

    ○ 『Knativeの歩き方 KubernetesからServerlessを訪ねて』

    ○ 『GoとSAMで学ぶAWS Lambda』

    ○ 『Extensive Xamarin(共著)』


    View Slide

  3. 今日のお話

    ● Knativeの概要

    ● KnativeとKuberentes

    ● Goで学ぶKnative

    ● さいごに


    View Slide

  4. 今日のお話

    ● Knativeの概要

    ● KnativeとKuberentes

    ● Goで学ぶKnative

    ● さいごに


    View Slide

  5. Knativeとは?

    Kubernetes-based platform to build, deploy, and manage modern
    serverless workloads

    ※https://github.com/knative

    View Slide

  6. Knativeとは?

    ● Kubernetesのリソースを抽象化する

    ○ 開発者から見てよりシンプルに

    ● 独自のPaaS/FaaSを構築するためのパーツを提供

    ○ Serving、Build、Eventingから構成される

    ● よくあるが難しい課題を解決

    ○ コンテナのデプロイ

    ○ ソースコードからURLでアクセスできるアプリケーションへ

    ○ ブルー/グリーンデプロイを伴うルーティングとトラフィック管理

    ○ オートスケーリングと需要に基づくワークロードのサイズ設定

    ○ 実行中のサービスをイベントエコシステムに結び付ける

    ※https://github.com/knative/docs

    View Slide

  7. Knativeの構成要素

    ※https://github.com/knative/docs
    Kubernetes

    Istio

    Serving
 Build
 Eventing

    Knative

    View Slide

  8. Servingの役割

    ※https://github.com/knative/docs/tree/master/serving
    ● コンテナの迅速なデプロイ

    ● オートスケールアウト・イン(0まで)

    ● Istio向けのトラフィック・ネットワーク設定

    ● コードと設定のバージョン管理


    View Slide

  9. Servingの構成要素

    ※https://github.com/knative/docs/tree/master/serving
    ● Revision: コードと設定のスナップショット

    ● Configuration: 最新のRevision

    ● Route: Revisionにルーティング

    ● Service: RouteとConfigurationを管理。k8sのServiceと別


    View Slide

  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


    View Slide

  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


    View Slide

  12. Istioは必須?

    ※https://knative.dev/docs/install/index.html

    View Slide

  13. Buildの役割と構成要素

    ※https://github.com/knative/docs/tree/master/build
    ● ソースコードをコンテナイメージに変換する

    ● ビルドパイプラインは複数のstepで構成される

    ○ 各stepはコンテナイメージ

    ○ クラスタのコンテナ内で実行される

    ● BuildTemplateを利用しパラメタを渡して実行できる

    ● Service(Configuration)で具体的なイメージの代わりにBuildを
    指定できる


    View Slide

  14. BuildTemplate

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

    View Slide

  15. Eventingの役割

    ※https://github.com/knative/docs/tree/master/eventing
    ● イベントドリブンなアーキテクチャをサポート

    ● イベントの発行元と受け手を抽象化

    ● 既存の発行元、受け手の変更なく他サービスを接続

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


    View Slide

  16. Eventingの構成要素

    ※https://github.com/knative/docs/tree/master/eventing
    ● Source: イベントソース。種類毎にリソースを定義

    ● Broker: イベントを受け取り、フィルタリングされたものをService
    (subscriber)に渡す

    ● Trigger: subscriberにわたすイベントのフィルター

    Broker
 Service

    Trigger

    ✓ ✓ ✓
    filter
 subscriber

    broker


    View Slide

  17. Eventingの構成要素(〜v0.3)

    ※https://github.com/knative/docs/tree/master/eventing
    ● Source: イベントソース。種類毎にリソースを定義

    ● Channel: イベントのバッファリング、Serviceへの到達保証

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


    View Slide

  18. Event Source

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


    View Slide

  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


    View Slide

  20. 今日のお話

    ● Knativeの概要

    ● KnativeとKuberentes

    ● Goで学ぶKnative

    ● さいごに


    View Slide

  21. Kubernetesとは?

    Kubernetes (K8s) is an open-source system for automating
    deployment, scaling, and management of containerized
    applications.

    ※https://kubernetes.io/

    View Slide

  22. Kubernetesのコンセプト

    ● クラスタに宣言的なリソース設定を適
    用する

    ● Kubernetesは現在の状態を理想の状
    態に調整し続ける

    →故障時の復旧や高負荷時のオートス
    ケールなどで運用負荷を低減できる

    ※https://kubernetes.io/docs/concepts/workloads/controllers/deployment/

    View Slide

  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/

    View Slide

  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/

    View Slide

  25. コントローラーとリソース

    Deployment

    Controller

    Deployment

    ReplicaSet

    Pod

    ReplicaSet

    Controller

    Scheduler

    kubelet


    View Slide

  26. コントローラーとリソース

    Deployment

    Controller

    Deployment

    ReplicaSet

    Pod

    ReplicaSet

    Controller

    Scheduler

    kubelet

    create


    View Slide

  27. コントローラーとリソース

    Deployment

    Controller

    Deployment

    ReplicaSet

    Pod

    ReplicaSet

    Controller

    Scheduler

    kubelet

    create


    View Slide

  28. コントローラーとリソース

    Deployment

    Controller

    Deployment

    ReplicaSet

    Pod

    ReplicaSet

    Controller

    Scheduler

    kubelet

    create

    create


    View Slide

  29. コントローラーとリソース

    Deployment

    Controller

    Deployment

    ReplicaSet

    Pod

    ReplicaSet

    Controller

    Scheduler

    kubelet

    create

    create


    View Slide

  30. コントローラーとリソース

    Deployment

    Controller

    Deployment

    ReplicaSet

    Pod

    ReplicaSet

    Controller

    Scheduler

    kubelet

    create

    create

    assign to node


    View Slide

  31. コントローラーとリソース

    Deployment

    Controller

    Deployment

    ReplicaSet

    Pod

    ReplicaSet

    Controller

    Scheduler

    kubelet

    create

    create

    assign to node


    View Slide

  32. コントローラーとリソース

    Deployment

    Controller

    Deployment

    ReplicaSet

    Pod

    ReplicaSet

    Controller

    Scheduler

    kubelet

    create

    create

    assign to node

    update


    View Slide

  33. カスタムリソース

    ● 独自のリソースを追加できる

    ○ CustomResourceDefinition

    ○ API server aggrigation

    ● バリデーションやその他メタ情報を定
    義

    ● CRDで定義したカスタムリソースに対
    するCRUDが可能になる

    ※https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/

    View Slide

  34. カスタムコントローラー

    ● 独自のコントローラーを追加できる

    ● 既存のリソースやカスタムリソースの変更を検知し、理想状態にな
    るよう調整する

    ● カスタムコントローラーのDockerイメージをDeploymentで
    Kubernetesクラスター上にデプロイする

    ※https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/

    View Slide

  35. Operator

    ※https://operatorhub.io/

    View Slide

  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


    View Slide

  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


    View Slide

  38. 今日のお話

    ● Knativeの概要

    ● KnativeとKuberentes

    ● Goで学ぶKnative

    ● さいごに


    View Slide

  39. 実装を追うモチベーション

    ● 機能実装に一層集中するための基盤作りに興味がある(趣
    味)

    ● コントローラーの1実装として詳しく知りたい

    ● あわよくばコントリビューションしたい


    View Slide

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

    View Slide

  41. 実装を追う上でのポイント

    ● CRD

    ○ yaml

    ○ runtime.Object

    ● コントローラー

    ○ コード生成

    ○ Knative共通ライブラリ

    ○ Reconcile()

    ● Knative概要で触れたコンポーネントを中心にCRDが組み合わ
    さってできている

    ● メインのロジックはReconcile()内のreconcile()に書いてある


    View Slide

  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


    View Slide

  43. 実装を追う上でのポイント

    ● CRD

    ○ yaml

    ○ runtime.Object

    ● コントローラー

    ○ コード生成

    ○ Knative共通ライブラリ

    ○ Reconcile()

    ● Knative概要で触れたコンポーネントを中心にCRDが組み合わ
    さってできている

    ● メインのロジックはReconcile()内のreconcile()に書いてある


    View Slide

  44. knative/servingのCRDのyaml

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

    View Slide

  45. 実装を追う上でのポイント

    ● CRD

    ○ yaml

    ○ runtime.Object

    ● コントローラー

    ○ コード生成

    ○ Knative共通ライブラリ

    ○ Reconcile()

    ● Knative概要で触れたコンポーネントを中心にCRDが組み合わ
    さってできている

    ● メインのロジックはReconcile()内のreconcile()に書いてある


    View Slide

  46. Serviceのruntime.Object

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

    View Slide

  47. runtime.Object interface

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

    View Slide

  48. Serviceのruntime.Object

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

    View Slide

  49. 実装を追う上でのポイント

    ● CRD

    ○ yaml

    ○ runtime.Object

    ● コントローラー

    ○ コード生成

    ○ Knative共通ライブラリ

    ○ Reconcile()

    ● Knative概要で触れたコンポーネントを中心にCRDが組み合わ
    さってできている

    ● メインのロジックはReconcile()内のreconcile()に書いてある


    View Slide

  50. コントローラーとコード生成

    ※https://github.com/knative/serving/blob/master/hack/update-codegen.sh

    View Slide

  51. コントローラーとコード生成

    ● deepcopy

    ● client

    ● informer

    ● lister


    View Slide

  52. ServiceのDeepCopyObject

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

    View Slide

  53. knative/servingのclientset

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

    View Slide

  54. serviceのclientのinterface

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

    View Slide

  55. serviceのinformer

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

    View Slide

  56. serviceのlister

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

    View Slide

  57. cache.Indexer interface

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

    View Slide

  58. cache.Store interface

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

    View Slide

  59. cache.store interface

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

    View Slide

  60. cache.ThreadSafeStore interface

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

    View Slide

  61. コントローラーとコード生成

    ● deepcopy

    ○ リソースのイミュータブルな更新を実現

    ● client

    ○ kube-apiserverのクライアント

    ● informer

    ○ リソースの監視とworkqueueへのエンキュー

    ● lister

    ○ インメモリキャッシュからオブジェクトを取得


    View Slide

  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


    View Slide

  63. 実装を追う上でのポイント

    ● CRD

    ○ yaml

    ○ runtime.Object

    ● コントローラー

    ○ コード生成

    ○ Knative共通ライブラリ

    ○ Reconcile()

    ● Knative概要で触れたコンポーネントを中心にCRDが組み合わ
    さってできている

    ● メインのロジックはReconcile()内のreconcile()に書いてある


    View Slide

  64. knative/pkg

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

    View Slide

  65. knative/pkg

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

    View Slide

  66. 実装を追う上でのポイント

    ● CRD

    ○ yaml

    ○ runtime.Object

    ● コントローラー

    ○ コード生成

    ○ Knative共通ライブラリ

    ○ Reconcile()

    ● Knative概要で触れたコンポーネントを中心にCRDが組み合わ
    さってできている

    ● メインのロジックはReconcile()内のreconcile()に書いてある


    View Slide

  67. ServiceのReconciler struct

    ※https://github.com/knative/serving/blob/master/pkg/reconciler/service/service.go

    View Slide

  68. ServiceのReconcile()とreconcile()

    読んでみましょう!
    https://github.com/knative/serving/blob/master//pkg/reconciler/service/service.go

    View Slide

  69. 湧き上がる思いたち

    ● 自分のペースで追いたい

    ● コード見ながら追いたい

    ● client-goの実装もっと詳しく!

    ● インキャッシュメモリにはどうやってわたすの?

    ● Pod 0にするために何を何で監視してどう反映するの?

    ● Pod 0のときは何がリクエストを受けるの?

    ● BuildやEventingはどうなってるの?


    View Slide

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

    View Slide

  71. 今日のお話

    ● Knativeの概要

    ● KnativeとKuberentes

    ● Goで学ぶKnative

    ● さいごに


    View Slide

  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


    View Slide

  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


    View Slide

  74. ご清聴ありがとうございました!

    Goで学ぶKnative


    View Slide