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

GKE+Istio+GitOpsで作る日経電子版の次世代マイクロサービス基盤

Ryo yasuda
January 30, 2020

 GKE+Istio+GitOpsで作る日経電子版の次世代マイクロサービス基盤

Ryo yasuda

January 30, 2020
Tweet

More Decks by Ryo yasuda

Other Decks in Technology

Transcript

  1. Google Cloud Anthos Day GKE + Istio + GitOps で作る

    日経電子版の新 Microservice 基盤 日本経済新聞社 安田 竜
  2. About me - 名前: 安田 竜 (Ryo Yasuda) - 所属

    - 2015-2016: 日本電信電話 (NTT 研究所) - 2016-: 日本経済新聞社 - やっていること - 日経電子版サービス開発 - バックエンド開発・インフラ構築 (AWS・GCP) - SRE
  3. 課題 2 - Microservices の監視・運用が大変 API Gateway Top Page Article

    Page Account API My API Search API Payment API Paper Viewer BFF for NativeApp Data Platform Mail System Ads System
  4. 課題 2 - サービスとチームがいっぱい API Gateway Top Page Article Page

    Account API My API Search API Payment API Paper Viewer BFF for NativeApp Data Platform Mail System Ads System = チーム
  5. 課題 2 - 各チーム個別にインフラ頑張ってる Infra ServiceA Prometheus Grafana Logging Monitoring

    Availability ... ServiceB Deploy Pipeline Infra ServiceC ES Kibana Logging Monitoring Availability ... ServiceD Deploy Pipeline
  6. 課題 2 - 監視や運用の手法・品質がバラバラ Infra ServiceA Prometheus Grafana Logging Monitoring

    Availability ... ServiceB Deploy Pipeline Infra ServiceC ES Kibana Logging Monitoring Availability ... ServiceD Deploy Pipeline
  7. 課題 2 - サービス横断的な監視や調査も困難 Infra ServiceA Prometheus Grafana Logging Monitoring

    Availability ... ServiceB Deploy Pipeline Infra ServiceC ES Kibana Logging Monitoring Availability ... ServiceD Deploy Pipeline どこにどんなログ・メトリクスが保存 されてるか分からない
  8. k8s/istio ServiceA 新基盤の概念図 Stackdriver ServiceB ServiceC ServiceD GitOps - k8s/istio

    による安全なリリースフロー - GitOps によるシンプルで安全な運用 - istio/stackdriver による統一された監視
  9. 今までのリリースフロー 開発環境 機能 改修 A 機能 改修 B 機能 改修

    C 本番環境 レビュー レビュー レビュー master branch release branch feature/A branch feature/B branch feature/C branch
  10. 速度と信頼性を両立させるリリースフロー 開発環境 機能検証環境 機能 改修 A 機能 改修 B 機能

    改修 C staging 環境 機能検証環境 機能検証環境 レビュー レビュー レビュー feature/A branch master branch release branch feature/B branch feature/C branch 本番環境
  11. 速度と信頼性を両立させるリリースフロー 開発環境 検証環境 staging 環境 検証環境 検証環境 レビュー 本番環境 -

    feature branch ごとに用意される独立した検証環境 - 開発初期に実環境上での挙動を確認でき、手戻り少なく修正可能 - レビュー時に実環境での挙動確認まで行えて問題を検出しやすい レビュー レビュー
  12. 1branch 1環境をどう実現するか 開発環境 機能検証環境 機能 改修 A 機能 改修 B

    機能 改修 C staging 環境 機能検証環境 機能検証環境 レビュー レビュー レビュー feature/A branch master branch release branch feature/B branch feature/C branch 本番環境
  13. 1 branch 1 環境をどう実現するか 機能検証用 VM APP - feature branch

    への push の度にインスタンスを起動す るのは時間的にもコスト的にも非効率 - もっとサクッと立ち上げたい 機能検証用 VM APP 機能検証用 VM APP
  14. 検証環境と実際の環境の差異をなくすには 開発環境 機能検証環境 機能 改修 A 機能 改修 B 機能

    改修 C staging 環境 機能検証環境 機能検証環境 レビュー レビュー レビュー feature/A branch master branch release branch feature/B branch feature/C branch 本番環境
  15. staging 環境 - 同様に、staging も本番と全く同じ環境を実現 - stagingは本番と同じ環境・条件で動いている - 開発者はリクエストヘッダをつけると staging

    へアクセスできる 本番クラスタ 本番pod ・ ・ ・ nikkei.com staging pod version: staging v1 pod v2 pod 本番 staging
  16. Rollback - 問題が起きたら Routing を戻すだけで Rollback できる - blue/green と同じ

    本番クラスタ v1 pod ・ ・ ・ nikkei.com v2 pod 本番 staging
  17. Routing 制御のための istio の設定 Header に app-version: v1 がついてたら v1

    へ Routing Header に app-version: v2 がついてたら v2 へ Routing Default で v1 へ Routing Virtual Service
  18. Routing 制御のための istio の設定 Header に app-version: v1 がついてたら v1

    へ Routing Header に app-version: v2 がついてたら v2 へ Routing Default で v2 へ Routing Virtual Service
  19. 本番クラスタ 現状の問題点と対策 - Mirroring v1 ・ ・ ・ - Request

    Mirroring で、本番と同じリクエストを staging に送る - 実際のリクエストや負荷で問題ないか、ユーザ影響なく検証できる - 更新系リクエストを Mirroring すると、データに不整合が起こる可能性がある - 裏にいるシステムに 2 倍の負荷がかかる... v2 GET /api/hoge GET /api/hoge GET /api/hoge
  20. 本番クラスタ 現状の問題点と対策 - Canary v1 ・ ・ ・ - Weighted

    Routing 使って Canary Release - 同一ユーザが常に同一グループに振り分けられるとは限らない - アクセス毎にv1に振られたりv2に振られたりする - https://github.com/istio/istio/issues/9764 v2 30% 70%
  21. 本番クラスタ 現状の問題点と対策 - Canary v1 ・ ・ ・ - Fastlyで

    weight を制御する - ユーザ ID や UA をベースに Fastly で version を振り分ける - アクセス毎に振り分け先が変わることのない安定した Canaryが実現 v2 70% version: v1 Fastly 30% version: v2
  22. GitOps - サービス A は v1・v2 が存在 - サービス B

    は v1・v2 が存在 - サービス A は v1 へ Routing - サービス B は v2 へ Routing - Rate Limit は 100req/sec Sync - クラスタ上の状態を全て Git 上で管理 - クラスタは常に Git 上の状態と同一の状態に同期される GitHub Developer CI
  23. GitOps による運用例 - リリース - リリースも PR を通じて行われる 1. staging

    環境へデプロイするPR 2. staging 環境を本番へ昇格させるPR
  24. GitOps による運用例 - リリース - 1つめの PR をマージすれば staging へデプロイ

    - 最新バージョン (v6601) の pod が作成される 本番クラスタ v6592 v6601
  25. GitOps による運用例 - リリース - 2 つめの PR をマージすれば staging

    が本番へ昇格 - 最新バージョン (v6601) へ Routing を変更する 本番クラスタ v6592 v6601
  26. GitOps による運用例 - Rollback - リリースで問題起きたら、PR を revert するだけで Rollback

    - 誰でもどこでもできるので、問題発生時の一時対応が迅速 (数十秒)
  27. GitOps を使った実際のリリースフロー Developer Source Repo Manifest Repo Push Trigger Push

    Watch Sync k8s cluster Pull Container Registry Argo CD Circle CI PR & Merge
  28. GitOps を使った実際のリリースフロー Developer Source Repo Manifest Repo Push Trigger Push

    Watch Sync k8s cluster Pull Container Registry Argo CD Circle CI PR & Merge アプリケーションコードを管 理するレポジトリ
  29. GitOps を使った実際のリリースフロー Developer Source Repo Manifest Repo Push Trigger Push

    Watch Sync k8s cluster Pull Container Registry Argo CD Circle CI PR & Merge 全サービスのk8s/istioの manifest を管理するレポジトリ
  30. GitOps を使った実際のリリースフロー Developer Source Repo Manifest Repo Push Trigger Push

    Watch Sync k8s cluster Pull Container Registry Argo CD Circle CI PR & Merge Manifest Repo とクラスタを同 期するツール
  31. GitOps を使った実際のリリースフロー Developer Source Repo Manifest Repo Push Trigger Push

    Watch Sync k8s cluster Pull Container Registry Argo CD Circle CI PR & Merge コードの変更を push
  32. GitOps を使った実際のリリースフロー Developer Source Repo Manifest Repo Push Trigger Push

    Watch Sync k8s cluster Pull Container Registry Argo CD Circle CI PR & Merge CI で Docker Image を build & push
  33. GitOps を使った実際のリリースフロー Developer Source Repo Manifest Repo Push Trigger Push

    Watch Sync k8s cluster Pull Container Registry Argo CD Circle CI PR & Merge リリース用 PR を 自動作成 & マージ
  34. GitOps を使った実際のリリースフロー Developer Source Repo Manifest Repo Push Trigger Push

    Watch Sync k8s cluster Pull Container Registry Argo CD Circle CI PR & Merge ArgoCD が manifest の変 更を検知して
  35. GitOps を使った実際のリリースフロー Developer Source Repo Manifest Repo Push Trigger Push

    Watch Sync k8s cluster Pull Container Registry Argo CD Circle CI PR & Merge クラスタに manifest の内容が反映される
  36. 基盤の安全なメンテナンス - 改善 - DNS 切り替え前に secondary の挙動を本番同様の状況で確認できると安全 Manifest Repo

    Argo CD Watch Sync blue cluster updated green cluster F a s t l y Default Routing HTTP Header cluster: secondary
  37. 旧環境からの移行状況 Fastly Service A Service B Service C Service A

    Service B Service C CI/CD 常に両環境に Deploy 移行するサービス だけ Routing 変更 旧 新
  38. 旧環境からの移行状況 - 現在移行中 API Gateway Web Apps (Microservices) BFF for

    NativeApp CMS for paper CMS for digital APIs (Microservices) PaperViewer Web Legacy Web App BFF APIGW Top Page Article Page ・・・ Search API Paper API Push API ・・・ Payment Account ・・・
  39. 旧環境からの移行状況 - 次に移行検討中 API Gateway Web Apps (Microservices) BFF for

    NativeApp CMS for paper CMS for digital APIs (Microservices) PaperViewer Web Legacy Web App BFF APIGW Top Page Article Page ・・・ Search API Paper API Push API ・・・ Payment Account ・・・
  40. 旧環境からの移行状況 GKE Other Cluster Other Cluster Service Service Service Service

    Service Service istio istio istio Stackdriver - k8s に乗せられればクラスタ上の構成や運用は再現可能 - 監視・メトリクス・運用の統一の恩恵は受けられる
  41. 旧環境からの移行状況 GKE Other Cluster Other Cluster Service Service Service Service

    Service Service istio istio istio Stackdriver - k8s に乗せられればクラスタ上の構成や運用は再現可能 - 監視・メトリクス・運用の統一の恩恵は受けられる
  42. まとめ - k8s/istio で、信頼性と開発速度を両立できるフローを実現 - GitOps で運用もシンプルかつ安全に - istio で、サービス間で統一された監視・メトリクス収集が実現

    - 監視・運用基盤を統一し開発チームの負荷削減 - 更新しやすいインフラで常に安全&管理しやすい状態に保つ