Slide 1

Slide 1 text

ThirdPartyResource を使った Kubernetes as a Service の実装 Z Lab Corporation 村⽥ 俊哉          稲津 和磨 1

Slide 2

Slide 2 text

Z Lab Corporation • 次世代インフラ基盤を調査・研究開発 • Kubernetes, Docker • Yahoo! JAPAN の⼦会社 • https://zlab.co.jp 2

Slide 3

Slide 3 text

Kubernetes as a Service • 開発者がセルフサービスでクラスタを作成できるサービス • 作成したクラスタはフルマネージド • ⾃動アップデート • ダウンタイムゼロ • ローリングアップデート • セルフヒーリング • ノード障害時に別のノードを作成して復旧 • ノードのオートスケール 3

Slide 4

Slide 4 text

Kubernetes as a Service 要件 • スケール性能 • 数万台規模まで利⽤できるようにしたい • ⾮同期 • サーバの構築などは時間がかかるため⾮同期にせざる負えない • 堅牢性 • フェイルオーバー • 処理を中断しても再開できること 4

Slide 5

Slide 5 text

実装⽅式検討 • 実装が複雑になりそうな分散システムが必要 • ノードの状態などを監視しながら、ノードの状態の変更に対応して 処理をする必要がある • 各リソースの状態を監視し、そのイベントに対応して処理を⾏うアー キテクチャが良さそう 5

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

Kubernetes のアーキテクチャ 7 Spec と Status の 差分の検知 差分の反映 差分の検知 Queue Status の同期 Resource 4QFD 4UBUVT API Server Controller Manager Other Resource Spec :あるべき状態 Status : 現在の状態

Slide 8

Slide 8 text

Kubernetes をフレームワークのように利⽤ • ThirdPartyResource • Informer Framework • RateLimitingQueue 8

Slide 9

Slide 9 text

Kubernetes をフレームワークのように利⽤ 9 Spec と Status の 差分の検知 差分の反映 差分の検知 RateLimitingQueue Status の同期 ThirdParty Resource Spec Status API Server Controller Other Resource InformerFramework アプリケーションの 実装に専念できる SyncLoop

Slide 10

Slide 10 text

apiVersion: extensions/v1beta1 kind: ThirdPartyResource metadata: name: hello-world.example.com description: "hello world object" versions: - name: v1 • Kubernetes API にユーザ独⾃のリソースの API を追加するリソー ス • Kubernetes のリソースの⼀つ • 追加される API は CRUD の操作と watch をサポート ThirdPartyResource 10 API Server Pod Service Deployments HelloWorld

Slide 11

Slide 11 text

Informer Framework 11 Resource Spec Status API Server Informer Framework watch diff cache OnAdd OnUpdate OnDelete • Kubernetes の Controller (ControllerManager) で利⽤されている • Watch API を利⽤して変更を検知してイベントハンドラを実⾏する • OnAdd, OnUpdate, OnDelete • Watch と対応した Cache をもっていて無駄な API へのアクセスを削減

Slide 12

Slide 12 text

RateLimitingQueue • RateLimiter を持つ Queue • 同じ key のオブジェクトのユニーク性を保証 • エラーの場合 Delay を持たせて enqueue (retry) などが簡単にで きる 12 Informer Framework cache OnAdd OnUpdate OnDelete Sync loop エラーなら Delay して retry RateLimitingQueue

Slide 13

Slide 13 text

SyncLoop • Spec と Status の差分を確認し、Status を Spec へ近づけていく 処理を⾏う Loop • アプリケーション⾃体の処理を実装する部分 13 • 実装時の注意した点 • いつ中断しても再開できるように • レースコンディションが発⽣しないように Spec と Status の 差分の検知 Status の同期 差分の反映

Slide 14

Slide 14 text

Controller の動作環境 • 開発した Controller は Kubernetes の Pod としてデプロイ • Kubernetes API の 認証に ServiceAccount を利⽤できる • 標準の Client と同じものを⽤意すれば特に設定せずにデフォルト のアカウントを勝⼿に使⽤してくれる 14 Kubernetes Cluster API Server TPR TPR Controller Pod ServiceAccount

Slide 15

Slide 15 text

Kubernetes as a Service の ThirdPartyResource と Controller • ThirdPartyResources • Kuberneteses • KubernetesClusters • Etcds • LoadBlancers • Machines • MachineSets • MachineDeployments • MachineImages • MachinePools 15 • Controllers • KubernetesController • KubernetesClusterController • EtcdController • LoadBlancerController • MachineController • MachineSetController • MachineDeploymentController • MachineImageController

Slide 16

Slide 16 text

DEMO

Slide 17

Slide 17 text

CaaS Kubernetes Cluster Kubernetes as a Service(CaaS) • Kubernetesクラスタを⽣成・管理するシステム 17 Create Read Update Delete API Server TPRs User Kubernetes Cluster Master Worker User Kubernetes Cluster Master Worker TPR Controllers Pods

Slide 18

Slide 18 text

ThirdPartyResource • KubernetesClusters • クラスタそのものを表す。Kubernetes リソースを管理する • Kubernetes • Master,Worker の初期化スクリプトを⽣成し MachineDeployments を 管理する • MachineDeployments • MachineSets を管理しローリングアップデートを⾏う • MachineSets • Machines を指定数に保つように管理する • Machines • IaaS のマシンを管理する 18

Slide 19

Slide 19 text

デモ内容 • Kubernetes クラスタの作成 • Kubernetes のバージョンアップ • ローリングアップデート • Worker Node のスケールアウト 19

Slide 20

Slide 20 text

まとめ • ThirdPartyResource を利⽤したアプリケーションの実装例として Kubernetes as a Service の紹介しました • Kubernetes Like なアプリケーションが ThirdPartyResource, InformerFramework, RateLimitingQueue などを利⽤することで 簡単に実装できます 20

Slide 21

Slide 21 text

技術で新しい世界へシフトする。 WE ARE HIRING!

Slide 22

Slide 22 text

参考⽂献 • ThirdPartyResource • https://kubernetes.io/docs/user-guide/thirdpartyresources/ • Informer Framework • https://github.com/kubernetes/kubernetes/blob/v1.5.2/ pkg/client/cache/controller.go • RateLimitingQueue • https://github.com/kubernetes/kubernetes/blob/v1.5.2/ pkg/util/workqueue/rate_limitting_queue.go 22