Share
Embed
経路探索をスケールさせるクラウドネイティブなインフラへ
2019年9月20日に開催された「ナビタイムの現場 第3経路 -ナビタイムを支える屋台骨-」にて発表した資料です。
NAVITIME JAPAN PRO
September 20, 2019
Transcript
45 slides
-
©NAVITIME JAPAN 自己紹介 清水 健司 • クラウド移行メインの インフラエンジニア • Docker/Kubernetes/Spinnaker
• たまにJavaとGo • AWS認定SAアソシエイト • 筆圧強め -
©NAVITIME JAPAN NAVITIMEのサービス概要 Our Products 公共交通 ドライブ ツーリング 外国人&海外 トラベル
& フィットネス PC / SPブラウザ NAVITIME 乗換NAVITIME バスNAVITIME こみれぽ ドライブサポーター カーナビタイム トラックカーナビ ツーリングサポーター 自転車NAVITIME NAVITIME for Japan Travel NAVITIME Transit NAVITIME Travel ALKOO PLAT -
©NAVITIME JAPAN NAVITIMEのサービス概要 Our Products ビジネスナビタイム 動態管理ソリューション ビジネスナビタイム 交通費精算パッケージ 広告
/ アライアンス オウンドメディア 交通コンサルティング 電鉄・バス事業者向け ソリューション API / SDK テレマティクスサービス -
©NAVITIME JAPAN NAVITIMEの特徴 移動の需要によってサーバの負荷が大きく変動 • GWや長期休暇 ◦ カーナビサービスはアクセス増 • 豪雨などの災害
◦ 乗換アプリなどのアクセス急増 • テレビ広告 ◦ オウンドメディアへのスパイクアクセス -
©NAVITIME JAPAN オンプレ運用時の苦しいところ • スケールできない ◦ 予想できる高トラフィックは前もって増設ができるが、 予期できない場合は現状のサーバで捌くしかない ◦ 前もって増設するのも運用コストがかかる
• サービス展開までのリードタイム ◦ 新しくサーバを調達するのに時間がかかるため、 新規サービス立ち上げに時間がかかる -
©NAVITIME JAPAN オンプレ運用時の苦しいところ • スケールできない ◦ 予想できる高トラフィックは前もって増設ができるが、 予期できない場合は現状のサーバで捌くしかない ◦ 前もって増設するのも運用コストがかかる
• サービス展開までのリードタイム ◦ 新しくサーバを調達するのに時間がかかるため、 新規サービス立ち上げに時間がかかる これらを解決するのが クラウド × コンテナ でした -
©NAVITIME JAPAN なぜコンテナに移行したか マネージドサービスが充実 している • コンテナオーケストレーションをする際に肝心な マスターノードの管理/冗長化をする必要性がない • クラウドベンダーやOSSコミュニティがものすごい
スピードで機能追加/改善を行っている → 巨人の肩に乗ってモダンな構成を組むことができる -
©NAVITIME JAPAN オンプレの構成のまま持っていけるか オンプレの構成はVM上でアプリケーションを稼働 • コンテナ化は単純にコードに起こすだけでは アプリケーションを健全に運用できない 1プロセス = 1コンテナが基本
• オンプレのサーバはstatefulかつmutable クラウドで扱うコンテナはstatelessかつimmutable -
©NAVITIME JAPAN オンプレの構成のまま持っていけるか オンプレの構成はVM上でアプリケーションを稼働 • コンテナ化は単純にコードに起こすだけでは アプリケーションを健全に運用できない 1プロセス = 1コンテナが基本
• オンプレのサーバはstatefulかつmutable クラウドで扱うコンテナはstatelessかつimmutable A. むずかしい -
©NAVITIME JAPAN コンテナ設計のデザインパターンを利用する アプリケーションのコンテナ化 ◦ シングルノードのコンポーネントを 別々のコンテナで動かす ◦ コンテナ化のゴールは境界を設けること ◦
どんな境界か ▪ リソースの境界 ▪ チームのオーナーシップの境界 ▪ 関心の分離の境界 -
©NAVITIME JAPAN ステートフルからステートレスへ データ配信方法の最適化 ◦ 地図や時刻表、インデックスデータはインスタンス もしくは コンテナ群の起 動時に取得する必要性がある ▪
EC2のユーザデータを使用してEBSをアタッチする ▪ データ取得の責務を担うコンテナを用意する サイドカーパターンを利用する gcloud solr file file file file file SDKを含むコンテナがCloud Storageから インデックスファイル群を取得 -
©NAVITIME JAPAN 構成を見直し得られたもの • リソースの境界 ◦ ベストエフォートのサービスのコンテナは割当を少なくして、 メインのコンテナのレイテンシが他サービスのリソース消費に よって増大しないようにできる 割当リソース
httpd tomcat fluentd 他... アプリケーションのPFに 直結するメインのコンテナ郡 ベスト エフォート -
©NAVITIME JAPAN 構成を見直し得られたもの • チームのオーナーシップの境界 ◦ fluentdコンテナの改善はアプリケーションコンテナを管理するPJ でなく、クラウドインフラを管轄するPJが行うことができている ▪ コンテナが分かれているので所有権が明確
例: • httpdとtomcatは開発チームが改修 • ログ転送エージェントのfluentdはインフラが改修 • 場合によってはプルリク or モブで情報共有 -
©NAVITIME JAPAN Infrastructure as Codeは達成できたか • Dockerで環境構築手順をCode化できた • 複数のコンテナの定義を管理するファイルもちゃんとGitで 管理できている
◦ Amazon ECSでのタスク定義 (json) ◦ KubernetesにおけるDeployment (yaml) 達成できた…? -
©NAVITIME JAPAN Infrastructure as Codeは達成できたか • Dockerで環境構築手順をCode化できた • 複数のコンテナの定義を管理するファイルもちゃんとGitで 管理できている
◦ Amazon ECSでのタスク定義 (json) ◦ KubernetesにおけるDeployment (yaml) 段々とGitリポジトリと実際に動いているものに 差が生まれてきてしまった -
©NAVITIME JAPAN なぜ差が出来てしまったのか • リリースした後、手でマニフェストに追いつきを かける運用になっていた ◦ この作業が抜けてしまうケースが多かったが、抜けてしまっても問題ない 状態となっていることにも原因の一端がある BitBucket
現在動いているタスク定義を 取得しタグを書き換えて適用 コンテナのタグを 指定してジョブ実行 -
©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" ], 適用するファイル 適用後に確認できる画面 適用したファイルに タスク定義の全ての項目が 追加されデフォルト値が入る -
©NAVITIME JAPAN 差が出ることで起きるデメリット • 不確実なRollbackとなってしまう ◦ AWS側でリビジョンを適用した履歴が残らない ◦ gitリポジトリのmasterを現在の状態と同期させておく必要がある •
新しくProvisionした際に古い状態になってしまう ◦ 大障害の際に新しく別のリージョンでProvisionする状況 Revision: 43 Revision: 44 Revision: 45 登録した順番に タスク定義が保存される 44 -> 43 -> 45 の順番に適用した場合に 直前に適用したものが「43」と分 からない -
©NAVITIME JAPAN デプロイフロー変更による恩恵 • どの状態にRollbackするかが明確 • プルリクエストを介して実稼働する環境を変更する ◦ Weaveworksのブログ ▪
https://www.weave.works/blog/gitops-operations-by-pull-request ◦ そのデプロイに関する関係者を明確にできる • Single Source of Truth の実現 真実は いつもひとつ -
©NAVITIME JAPAN 監視しなくてはいけないもの • コンテナ ◦ リソース(CPU/メモリ)の使用状況 ◦ 起動している数 •
インスタンス(ノード) • ロードバランサ ◦ HTTPステータスコード • アプリケーション -
©NAVITIME JAPAN 監視しなくてはいけないもの • コンテナ ◦ リソース(CPU/メモリ)の使用状況 ◦ 起動している数 •
インスタンス(ノード) • ロードバランサ ◦ HTTPステータスコード • アプリケーション ここに落とし穴 マネージドサービスを使ってい るが故の見落としが発生してし まう -
©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が古い? どちらも違いそう… -
©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 -
©NAVITIME JAPAN コンテナ用に監視ツールを入れたが課題 Prometheus / Grafana というコンテナの監視を行うための デファクトのツールを導入した が、現状は下記のようになってしまっている 監視ツールの存在・使い方を一部の人間しか知らない
◦ SlackにAlertの通知が来ても特定の人がメトリクスを見て判断する形に なっている ◦ ダッシュボード作成も運用者目線となってしまっている -
©NAVITIME JAPAN アンチパターン: 役割としての監視 監視が役割と化している • チームの中の特定の個人が監視 システムにアクセスできる状況 • 他の人のために監視の仕組みを
作って管理する この真逆の状況が 監視の民主化 -
©NAVITIME JAPAN どうやって監視の民主化を行うか もうひとりの登壇者:望月さんのいる開発チーム • PrometheusとGrafanaを導入してアプリケーションに 最適化したダッシュボード / アラートを行っていた •
本来、カスタマイズして様々なメトリクスが取得できるツールを存分に活かして いた(監視に対して非常に前向きで楽しんでいる) 開発者に監視ツールのメリットを伝え、そのメリットをかんた んに実現できるような仕組みをつくることで スキルとしての監視を実現できるのではないか