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/ で使用した資料です。

6ee833afddca37209631fb25a0cec547?s=128

Shunya Murata

July 18, 2018
Tweet

Transcript

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

  2. Shunya Murata ▶ ゼットラボ株式会社 ソフトウェアエンジニア ▶ 2010年にヤフー株式会社に新卒⼊社、2015年ゼットラボ株式会社に出向 ▶ ヤフー株式会社向けの Kubernetes

    as a Service の開発などに従事
  3. ゼットラボ株式会社 / Z Lab Corporation ▶ 2015年に設⽴されたヤフー株式会社の100%⼦会社 ▶ インフラ基盤技術の調査・研究開発 ▶

    ヤフー株式会社向けの Kubernetes-as-a-Service の開発 ▶ https://zlab.co.jp/
  4. Kubernetes-as-a-Service (KaaS) Kubernetes クラスタの作成、削除、アップグレードなどの運⽤を簡単に⾏えるよ うにするマネージドサービス。 ▶ クラウドプロバイダが提供するサービス + Google Kubernetes

    Engine + Azure Container Service + Amazon EKS ▶ オンプレミスでも + CoreOS Tectonic + Pivotal Container Service (PKS)
  5. ヤフー株式会社向けにゼットラボが開発するマネージド Kubernetes サービス。
 オンプレミスの OpenStack 環境に Kubernetes クラスタを作成、管理する。
 2016年7⽉頃から開発を始め、2017年10⽉頃からヤフーの⼀部サービスでプロダク ション利⽤開始。

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

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

    クラスタのゼロダウンタイムアップグレード ▶ 障害や問題のあるノードの修復 ▶ データストア (etcd) のバックアップ、リストア Kubernetes はコンテナ化されたアプリケーションの運⽤に⼤きなメリットがある ⼀⽅でそれ⾃体の運⽤には多くのオペレーションが必要になる。
  8. 煩雑な Kubernetes クラスタのオペレーション ▶ ほとんどは決まりきった作業の繰り返し ▶ Yahoo! JAPAN は国内外に複数のデータセンタを持ち、数万台規模のサーバのオ ペレーションが必要になる

    ⼈間のやる仕事じゃない。 ソフトウェア・Kubernetes-as-a-Serviceにやらせる。
  9. ▶ スケーラブル + 管理対象が数万台でも問題なく動作する ▶ ⾮同期モデル + マシン (VM) の準備など処理が完了するまで時間がかかる

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

    k8s.io/client-go + Clientset: API クライアント + Informer: オブジェクトの変更検知 + workqueue: goroutine セーフなキューの実装 + Leader election: リーダー選出 分散システム基盤としての Kubernetes
  11. Kubernetes の拡張機能を⽤いて Kubernetes-as-a-Service を開発する。 Kubernetes-as-a-Service on Kubernetes 分散システム基盤としての Kubernetes

  12. Kubernetes-as-a-Service on Kubernetes ゼロダウンタイムアップグレードやノードのセルフヒーリングなどの Kubernetes 固有の運⽤ノウハウをカスタムリソースとコントローラで実装する。 Kubernetes Operator ▶ Kubernetes

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

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

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

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

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

    (PodDisruptionBudget) ▶ アップグレードが失敗するようなら途中で⽌まるようにする + Machine Probe ▶ 途中で⽌まった場合ロールバックまたは再開が容易に⾏える + declarative configuration, Reconciliation Loop アップグレードコストを最⼩限にして頻繁な更新を可能に
  21. なぜ頻繁な更新が⾏える状態を作りたいか? アップグレードのコストを下げることは重要 ▶ 利⽤者はKubernetesクラスタをアップグレードするモチベーションは低い + コストが⼤きいとアップグレードされなくなる ▶ コストが低ければ頻繁なアップグレードが可能になる + 変更しやすくなる

    + 負の遺産を作りにくくなる + セキュリティやパフォーマンスも最⼤化される
  22. ゼロダウンタイムアップグレードのデモ ▶ Kubernetes クラスタのバージョンを v1.10.1 からv1.10.2にアップグレード ▶ クラスタにはサービスに⾒⽴てたnginxをreplicas 5でデプロイ +

    PodDisruptionBudget で min available を 4 に設定 ▶ クライアントからのアクセスとしてnginxに curl でpollingし続ける
  23. まとめ Yahoo! JAPAN の Kubernetes-as-a-Service ▶ 運⽤ノウハウをソフトウェアとして実装し、ソフトウェアに仕事をさせる + 運⽤コストの削減により健全なKubernetesの環境を維持 ▶

    Kubernetes をフレームワークのように利⽤することで複雑な分散システムを簡 単に実装 + Kubernetes に蓄えられた分散システムのノウハウを活⽤ + CustomResouceDefinition + Informer, workqueue, Reconciliation Loop
  24. We are hiring! 継続的な改善を当たり前にする。