"Yahoo! JAPAN の Kubernetes-as-a-Service" で加速するアプリケーション開発

0.9K Views

April 17, 18

スライド概要

JapanContainerDays v18.04 の keynote K-1 のスライドです。

profile-image

2023年10月からSpeaker Deckに移行しました。最新情報はこちらをご覧ください。 https://speakerdeck.com/lycorptech_jp

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

(ダウンロード不可)

関連スライド

各ページのテキスト
1.

"Yahoo! JAPAN の Kubernetes-as-a-Service"で 加速する アプリケーション開発 JAPAN CONTAINER DAYS v18.04 Masaya Ozawa / Yahoo! JAPAN Kazuki Suda / @superbrothers / Z Lab

2.

アジェンダ 1. Yahoo!ズバトク on Kubernetes (Masaya Ozawa / Yahoo! JAPAN) 2. Yahoo! JAPAN の Kubernetes-as-a-Service (Kazuki Suda / Z Lab) 3. まとめ

3.

Yahoo!ズバトク on Kubernetes YAHOO! ズバトク JAPAN IDでもっと便利に新規取 ログイン 毎日ワク おトクが当たる& 毎日引けるくじや、キャンペー 最大2,000 ポイ ント 当たる! 毎 Yahoo!ズバトク

4.

Masaya Ozawa / m3y@github ▶ ヤフー株式会社 コマースカンパニー 決済金融統括本部 ▶ 経歴 + 2008: 新卒入社 + 2008 - 2016: 主に決済金融周りのシステム開発・運用を担当 + 2017: Yahoo!ズバトクを Kubernetes-as-a-Service 上への再構築を担当 YAHOO! JAPAN

5.

Yahoo! ズバトク ▶ “毎日ワクワク! おトクが当たる&もらえる” + くじやキャンペーンを掲載するための、キャンペーンプラットフォーム YAHOO! ズバトク IDでもっと便利に新規取得 JAPAN ログイン 毎日ワクワク! おトクが当たる&もらえる 毎日引けるくじや、キャンペーンに参加してトクしよう! YAHOO! JAPAN

6.

社内の技術スタック PHP Java Node.js GitHub Enterprise CHEF JFrog ARTIFACTORY Jenkins Screwdriver openstack. YAHOO! JAPAN

7.

Yahoo!ズバトクの技術スタック PHP 社内独自パッケージシステム GitHub Enterprise Jenkins openstack. YAHOO! JAPAN

8.

Yahoo!ズバトクでの課題 ▶ いい買物の日くじなど、通常時の数倍〜数十倍程度アクセスがくるキャンペーン があるなか、簡単にスケールアウト、スケールアップできなかった ▶ リリース周りの自動化が進んでおらず、頻繁にリリースできる状況ではなかった ▶ パフォーマンステスト環境など、新たな環境の用意が難しかった ▶ VM障害などがあるたびに、手動で再構築する必要があった ▶ サービス要件 > システム YAHOO! JAPAN

9.

YAHOO! JAPAN

10.

Yahoo!ズバトクの技術スタック(再掲) PHP 社内独自パッケージシステム GitHub Enterprise Jenkins openstack. YAHOO! JAPAN

11.

Kubernetes 導入後 開発言語 Java CI / CD Concourse CI GitHub Enterprise アプリケーションコンテナ Docker コンテナオーケストレーション Kubernetes openstack. YAHOO! JAPAN

12.

導入後の実績 1111買物の日 YAHOO! JAPAN

13.

導入前後での変化 ▶ 開発フローの変化 ▶ リリース周り ▶ 障害発生時の対応 ▶ ログ周り YAHOO! JAPAN

14.

今までの開発フロー 4. テスト 5. パッケージング 社内独自パッケージ システム 1. git clone 3. プルリクエスト 開発 6. 開発環境デプロイ 7. 動作確認 2. 開発/テスト 社内構成 管理ツール 8. ステージングデプロイ ステージング 9. 本番デプロイ プロダクション YAHOO! JAPAN

15.

Kubernetes 導入後の開発フロー 7. マージ 4. テスト/ビルド 5. パブリッシュ Docker レジストリ 1. git clone 6. プルリクエスト 3. プルリクエスト デプロイ 2. 開発/テスト ステージング プロダクション 西データセンター 開発 ステージング プロダクション 東データセンター YAHOO! JAPAN

16.

開発フローの変化 ▶ Github 上の操作で完結するようなフローを導入 + 開発着手からリリースまでにかかる時間なども簡単に取得できるように ▶ Dockerコンテナ/Kubernetes の特性有りきのフロー + Master マージからリリースまで同じイメージを利用 + Kubernetes を利用することで、デプロイが容易になった YAHOO! JAPAN

17.

リリースにかかる時間の変化 これまで ▶ 修正完了後、パッケージングからサービスアウトなどを含むリリース作業の 完了まで数時間 Kubernetes 導入後 ▶ 修正完了の PR のマージ後、各ブランチへのプルリクエストの確認を含め 10分程度でデプロイ完了 YAHOO! JAPAN

18.

障害発生時の対応の変化 これまで ▶ OpenStack の親機のダウン + Hypervisorダウン (サービスダウン) + アラート検知 (架電) + 手動でサービスアウト + 復旧を待つ or 別環境で再構築 + 手動でサービスイン YAHOO! JAPAN

19.

障害発生時の対応の変化 Kubernetes の導入後 ▶ OpenStack の親機のダウン + Hypervisorダウン (≠ サービスダウン) + メトリクス情報からの検知 (社内チャットツールでの通知) + Pod 再配置 / ノードのセルフヒーリング 復旧作業を行うことなく、復旧完了! YAHOO! JAPAN

20.

障害調査などによるログの確認の変化 これまで ▶ 全サーバのログを集め障害調査 Kubernetes 導入後 ▶ Kubernetes-as-a-Service の機能により、自動でログ集約 ▶ Splunk によりログ検索やグラフ化、レポート作成まで可能 YAHOO! JAPAN

21.

Kubernetes 移行に当たり大変だったこと 利用している内製プラットフォームのスイッチ ▶ Kubernetes 上から利用するために内製プラットフォーム側にも対応してもらった + 認証方式など ▶ インターフェイスや利用方法のすり合わせから実施 利用技術のスイッチ ▶ パッケージングやCI/CD パイプライン、利用言語も含め変更することした ▶ 社内の有識者の方に聞いたり、自分らで勉強会を開くなど少しづつ慣れていった YAHOO! JAPAN

22.

Kubernetes 移行に当たり大変だったこと 考え方/設計方針のスイッチ ▶ 既存の考え方や設計方針のままでは、Kubernetes の恩恵に預かれない ▶ いわゆる Cloud Native な考え方に変えていくために、チームメンバー間での勉 強会などを実施しながら、プロジェクトを遂行していきました ▶ 既存システムをそのままKubernetes上に載せるのではなく、機能毎にシステム を分割し Kubernetes 上に構築していく + 切り出しては、統合したり、まだ最適な解を模索中 YAHOO! JAPAN

23.

今後実施していきたいこと ▶ ワーカーノードの適正数の自動算出 ▶ 共通機能の切り出し + シングルノード・マルチコンテナ・パターン ▶ リリース手段の検討 + カナリアリリース + Feature toggles YAHOO! JAPAN

24.

Yahoo! JAPAN の Kubernetes-as-a-Service

25.

Kazuki Suda / @superbrothers ▶ ゼットラボ株式会社 ソフトウェアエンジニア ▶ 2009年にヤフー株式会社に新卒入社、2015年ゼットラボ株式会社に出向 ▶ Kubernetes Meetup Tokyo Co-Organizer ▶ Software Design 18年3月号「Kubernetes入門」の第1章を寄稿 Z Lab

26.

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

27.

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

28.

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

29.

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

30.

障害や問題のあるノードの修復 (セルフヒーリング) 作成と管理 ノードB ノードA Kubernetes-as-a-Service ノードAに障害 作成と管理 ノードC ノードB 削除 Kubernetes-as-a-Service

31.

ゼロダウンタイムのアップグレード ▶ 利用可能なノード数を一定に保つことでサービス断なしに達成する。 ▶ 全ノードの更新が必要な脆弱性対応にも即座に自動で対応できる。 ノード数 3 2 1 v1.9.6 v1.9.6 v1.10.0 v1.9.6 v1.9.6 v1.10.0 v1.10.0 v1.10.0 v1.10.0 v1.10.0 v1.9.6 v1.10.0 時間 v1.10.0 ノードの作成 v1.9.6 ノードの Podsの立ち退きと削除 v1.10.0 ノードの作成 v1.9.6 ノードの Podsの立ち退きと削除 Z Lab

32.

クラスタアドオン ▶ Ingress Controller (nghttpx-ingress-lb) ▶ Ingress ホストの DNS 自動登録 ▶ Kubernetes dashboard の OIDC による認証 ▶ Prometheus / Grafana による メトリクスの可視化とアラーティング + Cluster Overview dashboard、 Ingress Overview dashboard など Ingress Load Balancer Overview Nodes 5 13:08 13:10 13:12 13:14 13:16 Requests per second by Host 13:10 13:15 13:20 13:25 13:30

33.

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

34.

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

35.

AUTOMATE ALL THE THINGS

36.

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

37.

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

38.

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

39.

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

40.

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 Z Lab

41.

CustomResourceDefinitions (CRD) ▶ Kubernetes API を拡張 ▶ 任意のリソースを追加 + API エンドポイント + CRUD operations + Watch API 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 Z Lab

42.

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

43.

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

44.

アーキテクチャ openstack. Kubernetes-as-a-Service クラスタ master ノード kube-apiserver Custom Resources ノードX Custom Controllers ウォッチ クラスタの作成と管理 CLI kubectl クラスタの操作 openstack. 作成と管理

45.

まとめ

46.

まとめ Yahoo! ズバトク on Kubernetes ▶ Kubernetes-as-a-Service の導入により + 開発フローや障害対応などの自動化も進み、よりビジネスロジックに集中で きるようになった! + 変化し続けられる環境の上で開発していけるようになった! Yahoo! JAPAN の Kubernetes-as-a-Service ▶ AUTOMATE ALL THE THINGS / 全てを自動化する + Kubernetes-as-a-Service on Kubernetes + 運用ノウハウをソフトウェアとして実装し、ソフトウェアに仕事をさせる