0.9K Views
April 17, 18
スライド概要
JapanContainerDays v18.04 の keynote K-1 のスライドです。
2023年10月からSpeaker Deckに移行しました。最新情報はこちらをご覧ください。 https://speakerdeck.com/lycorptech_jp
"Yahoo! JAPAN の Kubernetes-as-a-Service"で 加速する アプリケーション開発 JAPAN CONTAINER DAYS v18.04 Masaya Ozawa / Yahoo! JAPAN Kazuki Suda / @superbrothers / Z Lab
アジェンダ 1. Yahoo!ズバトク on Kubernetes (Masaya Ozawa / Yahoo! JAPAN) 2. Yahoo! JAPAN の Kubernetes-as-a-Service (Kazuki Suda / Z Lab) 3. まとめ
Yahoo!ズバトク on Kubernetes YAHOO! ズバトク JAPAN IDでもっと便利に新規取 ログイン 毎日ワク おトクが当たる& 毎日引けるくじや、キャンペー 最大2,000 ポイ ント 当たる! 毎 Yahoo!ズバトク
Masaya Ozawa / m3y@github ▶ ヤフー株式会社 コマースカンパニー 決済金融統括本部 ▶ 経歴 + 2008: 新卒入社 + 2008 - 2016: 主に決済金融周りのシステム開発・運用を担当 + 2017: Yahoo!ズバトクを Kubernetes-as-a-Service 上への再構築を担当 YAHOO! JAPAN
Yahoo! ズバトク ▶ “毎日ワクワク! おトクが当たる&もらえる” + くじやキャンペーンを掲載するための、キャンペーンプラットフォーム YAHOO! ズバトク IDでもっと便利に新規取得 JAPAN ログイン 毎日ワクワク! おトクが当たる&もらえる 毎日引けるくじや、キャンペーンに参加してトクしよう! YAHOO! JAPAN
社内の技術スタック PHP Java Node.js GitHub Enterprise CHEF JFrog ARTIFACTORY Jenkins Screwdriver openstack. YAHOO! JAPAN
Yahoo!ズバトクの技術スタック PHP 社内独自パッケージシステム GitHub Enterprise Jenkins openstack. YAHOO! JAPAN
Yahoo!ズバトクでの課題 ▶ いい買物の日くじなど、通常時の数倍〜数十倍程度アクセスがくるキャンペーン があるなか、簡単にスケールアウト、スケールアップできなかった ▶ リリース周りの自動化が進んでおらず、頻繁にリリースできる状況ではなかった ▶ パフォーマンステスト環境など、新たな環境の用意が難しかった ▶ VM障害などがあるたびに、手動で再構築する必要があった ▶ サービス要件 > システム YAHOO! JAPAN
YAHOO! JAPAN
Yahoo!ズバトクの技術スタック(再掲) PHP 社内独自パッケージシステム GitHub Enterprise Jenkins openstack. YAHOO! JAPAN
Kubernetes 導入後 開発言語 Java CI / CD Concourse CI GitHub Enterprise アプリケーションコンテナ Docker コンテナオーケストレーション Kubernetes openstack. YAHOO! JAPAN
導入後の実績 1111買物の日 YAHOO! JAPAN
導入前後での変化 ▶ 開発フローの変化 ▶ リリース周り ▶ 障害発生時の対応 ▶ ログ周り YAHOO! JAPAN
今までの開発フロー 4. テスト 5. パッケージング 社内独自パッケージ システム 1. git clone 3. プルリクエスト 開発 6. 開発環境デプロイ 7. 動作確認 2. 開発/テスト 社内構成 管理ツール 8. ステージングデプロイ ステージング 9. 本番デプロイ プロダクション YAHOO! JAPAN
Kubernetes 導入後の開発フロー 7. マージ 4. テスト/ビルド 5. パブリッシュ Docker レジストリ 1. git clone 6. プルリクエスト 3. プルリクエスト デプロイ 2. 開発/テスト ステージング プロダクション 西データセンター 開発 ステージング プロダクション 東データセンター YAHOO! JAPAN
開発フローの変化 ▶ Github 上の操作で完結するようなフローを導入 + 開発着手からリリースまでにかかる時間なども簡単に取得できるように ▶ Dockerコンテナ/Kubernetes の特性有りきのフロー + Master マージからリリースまで同じイメージを利用 + Kubernetes を利用することで、デプロイが容易になった YAHOO! JAPAN
リリースにかかる時間の変化 これまで ▶ 修正完了後、パッケージングからサービスアウトなどを含むリリース作業の 完了まで数時間 Kubernetes 導入後 ▶ 修正完了の PR のマージ後、各ブランチへのプルリクエストの確認を含め 10分程度でデプロイ完了 YAHOO! JAPAN
障害発生時の対応の変化 これまで ▶ OpenStack の親機のダウン + Hypervisorダウン (サービスダウン) + アラート検知 (架電) + 手動でサービスアウト + 復旧を待つ or 別環境で再構築 + 手動でサービスイン YAHOO! JAPAN
障害発生時の対応の変化 Kubernetes の導入後 ▶ OpenStack の親機のダウン + Hypervisorダウン (≠ サービスダウン) + メトリクス情報からの検知 (社内チャットツールでの通知) + Pod 再配置 / ノードのセルフヒーリング 復旧作業を行うことなく、復旧完了! YAHOO! JAPAN
障害調査などによるログの確認の変化 これまで ▶ 全サーバのログを集め障害調査 Kubernetes 導入後 ▶ Kubernetes-as-a-Service の機能により、自動でログ集約 ▶ Splunk によりログ検索やグラフ化、レポート作成まで可能 YAHOO! JAPAN
Kubernetes 移行に当たり大変だったこと 利用している内製プラットフォームのスイッチ ▶ Kubernetes 上から利用するために内製プラットフォーム側にも対応してもらった + 認証方式など ▶ インターフェイスや利用方法のすり合わせから実施 利用技術のスイッチ ▶ パッケージングやCI/CD パイプライン、利用言語も含め変更することした ▶ 社内の有識者の方に聞いたり、自分らで勉強会を開くなど少しづつ慣れていった YAHOO! JAPAN
Kubernetes 移行に当たり大変だったこと 考え方/設計方針のスイッチ ▶ 既存の考え方や設計方針のままでは、Kubernetes の恩恵に預かれない ▶ いわゆる Cloud Native な考え方に変えていくために、チームメンバー間での勉 強会などを実施しながら、プロジェクトを遂行していきました ▶ 既存システムをそのままKubernetes上に載せるのではなく、機能毎にシステム を分割し Kubernetes 上に構築していく + 切り出しては、統合したり、まだ最適な解を模索中 YAHOO! JAPAN
今後実施していきたいこと ▶ ワーカーノードの適正数の自動算出 ▶ 共通機能の切り出し + シングルノード・マルチコンテナ・パターン ▶ リリース手段の検討 + カナリアリリース + Feature toggles YAHOO! JAPAN
Yahoo! JAPAN の Kubernetes-as-a-Service
Kazuki Suda / @superbrothers ▶ ゼットラボ株式会社 ソフトウェアエンジニア ▶ 2009年にヤフー株式会社に新卒入社、2015年ゼットラボ株式会社に出向 ▶ Kubernetes Meetup Tokyo Co-Organizer ▶ Software Design 18年3月号「Kubernetes入門」の第1章を寄稿 Z Lab
Z Lab ゼットラボ株式会社 / Z Lab Corporation ▶ 2015年に設立されたヤフー株式会社の100%子会社 ▶ インフラ基盤の開発および技術研究 ▶ ヤフー株式会社向けの Kubernetes-as-a-Service の開発 ▶ https://zlab.co.jp/
Kubernetes-as-a-Service (KaaS) Kubernetes クラスタの作成、削除、アップグレードなどの運用を簡単に行えるよ うにするマネージドサービス。 ▶ クラウドプロバイダが提供するサービス + Google Kubernetes Engine + Azure Container Service + Amazon EKS ▶ オンプレミスでも + CoreOS Tectonic + Pivotal Container Service (PKS) aws Z Lab
Yahoo! JAPAN の Kubernetes-as-a-Service ヤフー株式会社向けにゼットラボが開発するマネージド Kubernetes サービス。 オンプレミスの OpenStack 環境に Kubernetes クラスタを作成、管理する。 2016年7月頃から開発を始め、2017年10月頃からヤフーの一部サービスでプロダク ション利用開始。 ▶ セルフサービス ▶ マネージド ▶ スケーラブル ▶ シングルテナント YAHOO! JAPAN Z Lab
Yahoo! JAPAN の Kubernetes-as-a-Service ▶ セルフサービス + 開発者が自由にクラスタを作成、削除、設定変更することができる ▶ マネージド + 障害や問題のあるノードの修復 (セルフヒーリング) + クラスタを安全にゼロダウンタイムでアップグレードできる + モニタリングサービスとの連携 + データストア (etcd) のバックアップ、リストア ▶ スケーラブル + 開発者の要求に基づいてクラスタサイズを自由に変更できる Z Lab
障害や問題のあるノードの修復 (セルフヒーリング) 作成と管理 ノードB ノードA Kubernetes-as-a-Service ノードAに障害 作成と管理 ノードC ノードB 削除 Kubernetes-as-a-Service
ゼロダウンタイムのアップグレード ▶ 利用可能なノード数を一定に保つことでサービス断なしに達成する。 ▶ 全ノードの更新が必要な脆弱性対応にも即座に自動で対応できる。 ノード数 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
クラスタアドオン ▶ 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
Kubernetes-as-a-Service の価値 煩雑なKubernetesのオペレーションから運用者を解放する ▶ クラスタの作成、削除、設定変更 ▶ ノード (VM) の追加・削除 ▶ クラスタのゼロダウンタイムアップグレード ▶ 障害や問題のあるノードの修復 ▶ データストア (etcd) のバックアップ、リストア Kubernetes はコンテナ化されたアプリケーションの運用に大きなメリットがある 一方でそれ自体の運用には多くのオペレーションが必要になる。 Z Lab
煩雑な Kubernetes クラスタのオペレーション ▶ ほとんどは決まりきった作業の繰り返し ▶ Yahoo! JAPAN は国内外に複数のデータセンタを持ち、数万台規模のサーバのオ ペレーションが必要になる 人間のおる仕事じゃない。 ソフトウェア・Kubernetes-as-a-Serviceにやらせる。 Z Lab
AUTOMATE ALL THE THINGS
Kubernetes-as-a-Service の要件 ▶ スケーラブル + 管理対象が数万台でも問題なく動作する ▶ 非同期モデル + マシン (VM) の準備など処理が完了するまで時間がかかる ▶ 堅牢性 + 処理が失敗しても再開できる + システムの一部が壊れても、全体が障害を起こすことは許されない 複雑な分散システムとして実装する必要があるが、近くに優れた分散システムの 基盤があることに気付く Z Lab
分散システム基盤としての Kubernetes 分散システムの開発に必要な機能を備えている。 ▶ Kubernetes API を拡張する + CustomResourceDefinition: カスタムリソースの定義 ▶ ライブラリ: k8s.io/client-go + Clientset: API クライアント + Informer: オブジェクトの変更検知 + workqueue: goroutine セーフなキューの実装 + Leader election: リーダー選出 Z Lab
分散システム基盤としての Kubernetes Kubernetes の拡張機能を用いて Kubernetes-as-a-Service を開発する。 👉 Kubernetes-as-a-Service on Kubernetes Z Lab
Kubernetes-as-a-Service on Kubernetes ゼロダウンタイムアップグレードやノードのセルフヒーリングなどの Kubernetes 固有の運用ノウハウをカスタムリソースとコントローラで実装する。 👉 Kubernetes Operator ▶ Kubernetes の分散システムの開発に必要な多くの機能を利用することで、 本質的なビジネスロジックの実装に集中できる ▶ もちろん実装したコントローラは Kubernetes クラスタ上にデプロイできる Z Lab
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
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
カスタムコントローラの実装 k8s.io/client-go コントローラの実装 ▶ コントローラは現在の状態を望ましい状態に近づける ▶ reconciliation loop / 調整ループ リソースのリストとウォッチ kube-apiserver CRUD Controller Informer Callbacks OnAdd OnUpdate OnDelete workqueue Workers Clientset Z Lab
カスタムリソースとカスタムコントローラ master ノード ノードX kube-apiserver KubernetesClusters Kuberneteses MachineDeployments MachineSets Machines リストとウォッチ KubernetesCluster Controller Kubernetes Controller 作成と管理 MachineDeployment Controller MachineSet Controller Machine Controller
アーキテクチャ openstack. Kubernetes-as-a-Service クラスタ master ノード kube-apiserver Custom Resources ノードX Custom Controllers ウォッチ クラスタの作成と管理 CLI kubectl クラスタの操作 openstack. 作成と管理
まとめ
まとめ Yahoo! ズバトク on Kubernetes ▶ Kubernetes-as-a-Service の導入により + 開発フローや障害対応などの自動化も進み、よりビジネスロジックに集中で きるようになった! + 変化し続けられる環境の上で開発していけるようになった! Yahoo! JAPAN の Kubernetes-as-a-Service ▶ AUTOMATE ALL THE THINGS / 全てを自動化する + Kubernetes-as-a-Service on Kubernetes + 運用ノウハウをソフトウェアとして実装し、ソフトウェアに仕事をさせる