Slide 1

Slide 1 text

Kubernetes-as-a-Service in Yahoo! JAPAN
 Deep Dive

Slide 2

Slide 2 text

Shunya Murata ▶ ゼットラボ株式会社 ソフトウェアエンジニア ▶ 2010年にヤフー株式会社に新卒⼊社、2015年ゼットラボ株式会社に出向 ▶ ヤフー株式会社向けの Kubernetes as a Service の開発などに従事

Slide 3

Slide 3 text

ゼットラボ株式会社 / Z Lab Corporation ▶ 2015年に設⽴されたヤフー株式会社の100%⼦会社 ▶ インフラ基盤技術の調査・研究開発 ▶ ヤフー株式会社向けの Kubernetes-as-a-Service の開発 ▶ https://zlab.co.jp/

Slide 4

Slide 4 text

Kubernetes-as-a-Service (KaaS) Kubernetes クラスタの作成、削除、アップグレードなどの運⽤を簡単に⾏えるよ うにするマネージドサービス。 ▶ クラウドプロバイダが提供するサービス + Google Kubernetes Engine + Azure Container Service + Amazon EKS ▶ オンプレミスでも + CoreOS Tectonic + Pivotal Container Service (PKS)

Slide 5

Slide 5 text

ヤフー株式会社向けにゼットラボが開発するマネージド Kubernetes サービス。
 オンプレミスの OpenStack 環境に Kubernetes クラスタを作成、管理する。
 2016年7⽉頃から開発を始め、2017年10⽉頃からヤフーの⼀部サービスでプロダク ション利⽤開始。 ▶ セルフサービス ▶ マネージド ▶ スケーラブル ▶ シングルテナント Yahoo! JAPAN の Kubernetes-as-a-Service

Slide 6

Slide 6 text

Yahoo! JAPAN の Kubernetes-as-a-Service ▶ セルフサービス + 開発者が⾃由にクラスタを作成、削除、設定変更することができる ▶ マネージド + 障害や問題のあるノードの修復(セルフヒーリング) + クラスタを安全にゼロダウンタイムでアップグレードできる + モニタリングサービスとの連携 + データストア (etcd) のバックアップ、リストア ▶ スケーラブル + 開発者の要求に基づいてクラスタサイズを⾃由に変更できる

Slide 7

Slide 7 text

Kubernetes-as-a-Service の価値 煩雑なKubernetesのオペレーションから運⽤者を解放する ▶ クラスタの作成、削除、設定変更 ▶ ノード (VM) の追加・削除 ▶ クラスタのゼロダウンタイムアップグレード ▶ 障害や問題のあるノードの修復 ▶ データストア (etcd) のバックアップ、リストア Kubernetes はコンテナ化されたアプリケーションの運⽤に⼤きなメリットがある ⼀⽅でそれ⾃体の運⽤には多くのオペレーションが必要になる。

Slide 8

Slide 8 text

煩雑な Kubernetes クラスタのオペレーション ▶ ほとんどは決まりきった作業の繰り返し ▶ Yahoo! JAPAN は国内外に複数のデータセンタを持ち、数万台規模のサーバのオ ペレーションが必要になる ⼈間のやる仕事じゃない。 ソフトウェア・Kubernetes-as-a-Serviceにやらせる。

Slide 9

Slide 9 text

▶ スケーラブル + 管理対象が数万台でも問題なく動作する ▶ ⾮同期モデル + マシン (VM) の準備など処理が完了するまで時間がかかる ▶ 堅牢性 + 処理が失敗しても再開できる + システムの⼀部が壊れても、全体が障害を起こすことは許されない 複雑な分散システムとして実装する必要があるが、近くに優れた分散システムの 基盤があることに気付く Kubernetes-as-a-Service の要件

Slide 10

Slide 10 text

分散システムの開発に必要な機能を備えている。 ▶ Kubernetes API を拡張する + CustomResourceDefinition: カスタムリソースの定義 ▶ ライブラリ: k8s.io/client-go + Clientset: API クライアント + Informer: オブジェクトの変更検知 + workqueue: goroutine セーフなキューの実装 + Leader election: リーダー選出 分散システム基盤としての Kubernetes

Slide 11

Slide 11 text

Kubernetes の拡張機能を⽤いて Kubernetes-as-a-Service を開発する。 Kubernetes-as-a-Service on Kubernetes 分散システム基盤としての Kubernetes

Slide 12

Slide 12 text

Kubernetes-as-a-Service on Kubernetes ゼロダウンタイムアップグレードやノードのセルフヒーリングなどの Kubernetes 固有の運⽤ノウハウをカスタムリソースとコントローラで実装する。 Kubernetes Operator ▶ Kubernetes の分散システムの開発に必要な多くの機能を利⽤することで、
 本質的なビジネスロジックの実装に集中できる ▶ Kuberentesに蓄えられた分散システムのノウハウを利⽤できる ▶ もちろん実装したコントローラは Kubernetes クラスタ上にデプロイできる

Slide 13

Slide 13 text

CustomResourceDefinitions (CRD) ▶ Kubernetes API を拡張 ▶ 任意のリソースを追加 + API エンドポイント + CRUD operations + Watch API apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: kubernetesclusters.kubernetes.zlab.co.jp spec: group: kubernetes.zlab.co.jp version: v1alpha1 scope: Namespaced names: plural: kubernetesclusters singular: kubernetescluster kind: KubernetesCluster shortNames: - kc

Slide 14

Slide 14 text

CustomResourceDefinitions (CRD) apiVersion: kubernetes.zlab.co.jp/v1alpha1 kind: KubernetesCluster metadata: name: mycluster namespace: mynamespace spec: version: “1.10.0" etcdVersion: "3.1.10" masterReplicas: 3 masterFlavor: large workerReplicas: 5 workerFlavor: large ingressReplicas: 3 ingressFlavor: large ▶ Kubernetes API を拡張 ▶ 任意のリソースを追加 + API エンドポイント + CRUD operations + Watch API

Slide 15

Slide 15 text

▶ コントローラは現在の状態を望ましい状態に近づける + Reconciliation Loop / 調整ループ Controller カスタムコントローラの実装 Informer kube-apiserver リソースのリストとウォッチ Callbacks OnAdd OnUpdate OnDelete workqueue CRUD k8s.io/client-go コントローラの実装 Reconciliation Loop ⋆ Clientset

Slide 16

Slide 16 text

kube-apiserver Machines Status ▶ 現在の状態(Status)を望ましい状態(Spec)に近づける Reconciliation Loop Spec Status Flavor: large Image: coreos-xxx userdata: xxxxx instanceID: nil Phase: nil ip: nil instanceID: xxxxxx Phase: Running ip: 10.0.0.1 リストと ウォッチ Statusの更新 VM作成 Machines Controller

Slide 17

Slide 17 text

master ノード ノード X kube-apiserver KubernetesClusters MachineDeployments MachineSets Kuberneteses Machines KubernetesCluster Controller MachineDeployment Controller MachineSet Controller Kubernetes Controller リストとウォッチ カスタムリソースとカスタムコントローラ 作成と管理 Machine Controller

Slide 18

Slide 18 text

Kubernetesクラスタ作成デモ ▶ KaaS を使ってOpenStack上にKubernetesクラスタを⼀つ作成 + CLIツールを⽤意しているのでそれを使って KubernetesCluster リソースを作 成 + CRDリソースを可視化するための簡易的なツールで作成の様⼦を表⽰ + 作成には時間がかかるため事前に録画して待ち時間を取り除いた映像を⽤意 しています ▶ Worker ノードを3台にスケールアウト

Slide 19

Slide 19 text

Kubernetes-as-a-Service ノード C ノード B ノード A drain 追加 Kubernetesクラスタのアップグレード ▶ ダウンタイムなくアップグレードするには + 安全なノードの削除(kubectl drain) ▶ リソースを減らさないようにアップグレード + Nodeを追加して削除を繰り返していく + Nodeの数に⽐例して時間がかかる

Slide 20

Slide 20 text

クラスタのアップグレードを実現する上で注意したこと ▶ 全体のリソースが減らないようにする + リソースを追加してから削除するローリングアップグレード ▶ ダウンタイムなくアップグレードできるようにする + kubectl drain, (PodDisruptionBudget) ▶ アップグレードが失敗するようなら途中で⽌まるようにする + Machine Probe ▶ 途中で⽌まった場合ロールバックまたは再開が容易に⾏える + declarative configuration, Reconciliation Loop アップグレードコストを最⼩限にして頻繁な更新を可能に

Slide 21

Slide 21 text

なぜ頻繁な更新が⾏える状態を作りたいか? アップグレードのコストを下げることは重要 ▶ 利⽤者はKubernetesクラスタをアップグレードするモチベーションは低い + コストが⼤きいとアップグレードされなくなる ▶ コストが低ければ頻繁なアップグレードが可能になる + 変更しやすくなる + 負の遺産を作りにくくなる + セキュリティやパフォーマンスも最⼤化される

Slide 22

Slide 22 text

ゼロダウンタイムアップグレードのデモ ▶ Kubernetes クラスタのバージョンを v1.10.1 からv1.10.2にアップグレード ▶ クラスタにはサービスに⾒⽴てたnginxをreplicas 5でデプロイ + PodDisruptionBudget で min available を 4 に設定 ▶ クライアントからのアクセスとしてnginxに curl でpollingし続ける

Slide 23

Slide 23 text

まとめ Yahoo! JAPAN の Kubernetes-as-a-Service ▶ 運⽤ノウハウをソフトウェアとして実装し、ソフトウェアに仕事をさせる + 運⽤コストの削減により健全なKubernetesの環境を維持 ▶ Kubernetes をフレームワークのように利⽤することで複雑な分散システムを簡 単に実装 + Kubernetes に蓄えられた分散システムのノウハウを活⽤ + CustomResouceDefinition + Informer, workqueue, Reconciliation Loop

Slide 24

Slide 24 text

We are hiring! 継続的な改善を当たり前にする。