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

180715-line-meetup.pdf

 180715-line-meetup.pdf

タイトル: Kubernetes as a Service in Yahoo! JAPAN Deep Dive
LINE Developer Meetup #40 https://line.connpass.com/event/92049/ で使用した資料です。

Shunya Murata

July 18, 2018
Tweet

More Decks by Shunya Murata

Other Decks in Programming

Transcript

  1. Yahoo! JAPAN の Kubernetes-as-a-Service ▶ セルフサービス + 開発者が⾃由にクラスタを作成、削除、設定変更することができる ▶ マネージド

    + 障害や問題のあるノードの修復(セルフヒーリング) + クラスタを安全にゼロダウンタイムでアップグレードできる + モニタリングサービスとの連携 + データストア (etcd) のバックアップ、リストア ▶ スケーラブル + 開発者の要求に基づいてクラスタサイズを⾃由に変更できる
  2. Kubernetes-as-a-Service の価値 煩雑なKubernetesのオペレーションから運⽤者を解放する ▶ クラスタの作成、削除、設定変更 ▶ ノード (VM) の追加・削除 ▶

    クラスタのゼロダウンタイムアップグレード ▶ 障害や問題のあるノードの修復 ▶ データストア (etcd) のバックアップ、リストア Kubernetes はコンテナ化されたアプリケーションの運⽤に⼤きなメリットがある ⼀⽅でそれ⾃体の運⽤には多くのオペレーションが必要になる。
  3. ▶ スケーラブル + 管理対象が数万台でも問題なく動作する ▶ ⾮同期モデル + マシン (VM) の準備など処理が完了するまで時間がかかる

    ▶ 堅牢性 + 処理が失敗しても再開できる + システムの⼀部が壊れても、全体が障害を起こすことは許されない 複雑な分散システムとして実装する必要があるが、近くに優れた分散システムの 基盤があることに気付く Kubernetes-as-a-Service の要件
  4. 分散システムの開発に必要な機能を備えている。 ▶ Kubernetes API を拡張する + CustomResourceDefinition: カスタムリソースの定義 ▶ ライブラリ:

    k8s.io/client-go + Clientset: API クライアント + Informer: オブジェクトの変更検知 + workqueue: goroutine セーフなキューの実装 + Leader election: リーダー選出 分散システム基盤としての Kubernetes
  5. Kubernetes-as-a-Service on Kubernetes ゼロダウンタイムアップグレードやノードのセルフヒーリングなどの Kubernetes 固有の運⽤ノウハウをカスタムリソースとコントローラで実装する。 Kubernetes Operator ▶ Kubernetes

    の分散システムの開発に必要な多くの機能を利⽤することで、
 本質的なビジネスロジックの実装に集中できる ▶ Kuberentesに蓄えられた分散システムのノウハウを利⽤できる ▶ もちろん実装したコントローラは Kubernetes クラスタ上にデプロイできる
  6. 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
  7. 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
  8. ▶ コントローラは現在の状態を望ましい状態に近づける + Reconciliation Loop / 調整ループ Controller カスタムコントローラの実装 Informer

    kube-apiserver リソースのリストとウォッチ Callbacks OnAdd OnUpdate OnDelete workqueue CRUD k8s.io/client-go コントローラの実装 Reconciliation Loop ⋆ Clientset
  9. 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
  10. master ノード ノード X kube-apiserver KubernetesClusters MachineDeployments MachineSets Kuberneteses Machines

    KubernetesCluster Controller MachineDeployment Controller MachineSet Controller Kubernetes Controller リストとウォッチ カスタムリソースとカスタムコントローラ 作成と管理 Machine Controller
  11. Kubernetesクラスタ作成デモ ▶ KaaS を使ってOpenStack上にKubernetesクラスタを⼀つ作成 + CLIツールを⽤意しているのでそれを使って KubernetesCluster リソースを作 成 +

    CRDリソースを可視化するための簡易的なツールで作成の様⼦を表⽰ + 作成には時間がかかるため事前に録画して待ち時間を取り除いた映像を⽤意 しています ▶ Worker ノードを3台にスケールアウト
  12. Kubernetes-as-a-Service ノード C ノード B ノード A drain 追加 Kubernetesクラスタのアップグレード

    ▶ ダウンタイムなくアップグレードするには + 安全なノードの削除(kubectl drain) ▶ リソースを減らさないようにアップグレード + Nodeを追加して削除を繰り返していく + Nodeの数に⽐例して時間がかかる
  13. クラスタのアップグレードを実現する上で注意したこと ▶ 全体のリソースが減らないようにする + リソースを追加してから削除するローリングアップグレード ▶ ダウンタイムなくアップグレードできるようにする + kubectl drain,

    (PodDisruptionBudget) ▶ アップグレードが失敗するようなら途中で⽌まるようにする + Machine Probe ▶ 途中で⽌まった場合ロールバックまたは再開が容易に⾏える + declarative configuration, Reconciliation Loop アップグレードコストを最⼩限にして頻繁な更新を可能に
  14. まとめ Yahoo! JAPAN の Kubernetes-as-a-Service ▶ 運⽤ノウハウをソフトウェアとして実装し、ソフトウェアに仕事をさせる + 運⽤コストの削減により健全なKubernetesの環境を維持 ▶

    Kubernetes をフレームワークのように利⽤することで複雑な分散システムを簡 単に実装 + Kubernetes に蓄えられた分散システムのノウハウを活⽤ + CustomResouceDefinition + Informer, workqueue, Reconciliation Loop