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

経路探索をスケールさせるクラウドネイティブなインフラへ

 経路探索をスケールさせるクラウドネイティブなインフラへ

2019年9月20日に開催された「ナビタイムの現場 第3経路 -ナビタイムを支える屋台骨-」にて発表した資料です。

NAVITIME JAPAN

September 20, 2019
Tweet

More Decks by NAVITIME JAPAN

Other Decks in Technology

Transcript

  1. ©NAVITIME JAPAN NAVITIMEのサービス概要 Our Products 公共交通 ドライブ ツーリング 外国人&海外 トラベル

    & フィットネス PC / SPブラウザ NAVITIME 乗換NAVITIME バスNAVITIME こみれぽ ドライブサポーター カーナビタイム トラックカーナビ ツーリングサポーター 自転車NAVITIME NAVITIME for Japan Travel NAVITIME Transit NAVITIME Travel ALKOO PLAT
  2. ©NAVITIME JAPAN NAVITIMEのサービス概要 Our Products ビジネスナビタイム 動態管理ソリューション ビジネスナビタイム 交通費精算パッケージ 広告

    / アライアンス オウンドメディア 交通コンサルティング 電鉄・バス事業者向け ソリューション API / SDK テレマティクスサービス
  3. ©NAVITIME JAPAN オンプレ運用時の苦しいところ • スケールできない ◦ 予想できる高トラフィックは前もって増設ができるが、 予期できない場合は現状のサーバで捌くしかない ◦ 前もって増設するのも運用コストがかかる

    • サービス展開までのリードタイム ◦ 新しくサーバを調達するのに時間がかかるため、 新規サービス立ち上げに時間がかかる これらを解決するのが クラウド × コンテナ でした
  4. ©NAVITIME JAPAN ステートフルからステートレスへ データ配信方法の最適化 ◦ 地図や時刻表、インデックスデータはインスタンス もしくは コンテナ群の起 動時に取得する必要性がある ▪

    EC2のユーザデータを使用してEBSをアタッチする ▪ データ取得の責務を担うコンテナを用意する サイドカーパターンを利用する gcloud solr file file file file file SDKを含むコンテナがCloud Storageから インデックスファイル群を取得
  5. ©NAVITIME JAPAN Infrastructure as Codeは達成できたか • Dockerで環境構築手順をCode化できた • 複数のコンテナの定義を管理するファイルもちゃんとGitで 管理できている

    ◦ Amazon ECSでのタスク定義 (json) ◦ KubernetesにおけるDeployment (yaml) 段々とGitリポジトリと実際に動いているものに 差が生まれてきてしまった
  6. ©NAVITIME JAPAN 差が出ることで起きるデメリット • 定義した項目がAWS側のデフォルト設定なのか 意図した設定なのかがコンソールから判断できない "containerDefinitions": [ { "name":

    "web", "image": "httpd:hoge", "cpu": 128, "memoryReservation": 450, "links": [ "app:app" ], "containerDefinitions": [ { "dnsSearchDomains": null, "logConfiguration": null, "entryPoint": null, "image": "httpd:hoge", "startTimeout": null, "firelensConfiguration": null, "dependsOn": null, "disableNetworking": null, "interactive": null, "healthCheck": null, "links": [ "app:app" ], 適用するファイル 適用後に確認できる画面 適用したファイルに タスク定義の全ての項目が 追加されデフォルト値が入る
  7. ©NAVITIME JAPAN 差が出ることで起きるデメリット • 不確実なRollbackとなってしまう ◦ AWS側でリビジョンを適用した履歴が残らない ◦ gitリポジトリのmasterを現在の状態と同期させておく必要がある •

    新しくProvisionした際に古い状態になってしまう ◦ 大障害の際に新しく別のリージョンでProvisionする状況 Revision: 43 Revision: 44 Revision: 45 登録した順番に タスク定義が保存される 44 -> 43 -> 45 の順番に適用した場合に 直前に適用したものが「43」と分 からない
  8. ©NAVITIME JAPAN デプロイフロー変更による恩恵 • どの状態にRollbackするかが明確 • プルリクエストを介して実稼働する環境を変更する ◦ Weaveworksのブログ ▪

    https://www.weave.works/blog/gitops-operations-by-pull-request ◦ そのデプロイに関する関係者を明確にできる • Single Source of Truth の実現 真実は いつもひとつ
  9. ©NAVITIME JAPAN 監視しなくてはいけないもの • コンテナ ◦ リソース(CPU/メモリ)の使用状況 ◦ 起動している数 •

    インスタンス(ノード) • ロードバランサ ◦ HTTPステータスコード • アプリケーション
  10. ©NAVITIME JAPAN 監視しなくてはいけないもの • コンテナ ◦ リソース(CPU/メモリ)の使用状況 ◦ 起動している数 •

    インスタンス(ノード) • ロードバランサ ◦ HTTPステータスコード • アプリケーション ここに落とし穴 マネージドサービスを使ってい るが故の見落としが発生してし まう
  11. ©NAVITIME JAPAN ある日のGoogle Kubernetes Engine デプロイのジョブが失敗 調査しようとkubectlを打つも失敗   ※ kubectlはk8sを操作するためのコマンドライン

    $ kubectl get pods Error from server (InternalError): an error on the server ("service unavailable") has prevented the request from succeeding 認証が上手くいっていない? CLIのversionが古い? どちらも違いそう…
  12. ©NAVITIME JAPAN ある日のGoogle Kubernetes Engine kubectlをデバッグモードで打ってみる 殆どのコマンド発行時にアクセスしている APIのエンドポイントが503になっているらしい… -> kube-systemの一つmetrics-serverが死んでいる

    ※ kube-systemはGCP側が作成するKubernetesを動かすための   コンテナ群のことです $ kubectl --v=8 get pods cached_discovery.go:79] skipped caching discovery info due to an error on the server ("service unavailable") has prevented the request from succeeding..... https://xx.xx.xx.xx/apis/metrics.k8s.io/v1beta1
  13. ©NAVITIME JAPAN どうやって監視の民主化を行うか もうひとりの登壇者:望月さんのいる開発チーム • PrometheusとGrafanaを導入してアプリケーションに 最適化したダッシュボード / アラートを行っていた •

    本来、カスタマイズして様々なメトリクスが取得できるツールを存分に活かして いた(監視に対して非常に前向きで楽しんでいる) 開発者に監視ツールのメリットを伝え、そのメリットをかんた んに実現できるような仕組みをつくることで スキルとしての監視を実現できるのではないか