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. 2.

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

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

  2. 6.

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

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

  4. 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

  5. 21.

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

    scaling, and management of containerized applications.
 ※https://kubernetes.io/
  6. 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/
  7. 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/
  8. 33.

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

    バリデーションやその他メタ情報を定 義
 • CRDで定義したカスタムリソースに対 するCRUDが可能になる
 ※https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/
  9. 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

  10. 41.

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

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

  11. 43.

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

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

  12. 45.

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

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

  13. 49.

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

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

  14. 61.

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

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

  15. 63.

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

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

  16. 66.

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

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

  17. 69.

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

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

  18. 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

  19. 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