Rails on GKEで運用する
Webアプリケーションの紹介/Rails on GKE

Aa777465acd82d13333678f3fc082c59?s=47 Spring_MT
August 31, 2018

Rails on GKEで運用する
Webアプリケーションの紹介/Rails on GKE

Aa777465acd82d13333678f3fc082c59?s=128

Spring_MT

August 31, 2018
Tweet

Transcript

  1. 1.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. Copyright (C)

    2018 DeNA Co.,Ltd. All Rights Reserved. Jun 9, 2018 Spring_MT 3BJMTPO(,&Ͱӡ༻͢Δ 8FCΞϓϦέʔγϣϯͷ঺հ
  2. 2.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. ࣗݾ঺հ •

    ⾃⼰紹介 2 l 2008年 DeNA⼊社 l 2010年 エンジニアになる l 2011年 DeNA退社 -> 福岡へ l 2013年 DeNAに出戻り l 2016年 ゲーム事業本部 l 2017年 コマース&インキュベーション事業本部 GitHub https://github.com/SpringMT Twitter https://twitter.com/Spring_MT @Spring_MT
  3. 3.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • フロント1名

    • サーバー・インフラ1名 開発チーム εϞʔϧελʔτ 3
  4. 4.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. 4 •

    機能開発以外のやることを減らしたい • 運⽤業務をシンプルにしたい ػೳ։ൃʹूத͢ΔͨΊʹ
  5. 5.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. 5 ࠓճ͓࿩͢Δ಺༰

    https://builderscon.io/tokyo/2018/session/b87465f5-4a05-4a6b-85c6-a50ab205dc27
  6. 6.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. 6 •

    モノリシックな作り • APIファースト • 本番環境と同じ開発環境 • サービスのコンテンツデータの運⽤ ࠓճ͓࿩͢Δ಺༰
  7. 7.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • 環境のギャップをなくす

    w Dockerを使ったイメージベースの成果物 w 設定ファイルの管理 w 反映⽅法 • 構成のギャップをなくす w Kubernetes(GKE) w その他 • まとめ ໨࣍ 
  8. 9.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. wイメージを作成したら変えない w

    ビルドは⼀回 w ddとか使ってバイナリをいじるようなことはしない w 起動時にコードを追加するなどもしない w検証環境・本番環境でも動くようなイメージの構成にする wなにも⼿を加えずに検証環境から本番環境にイメージを 移⾏させる Dockerを使ったイメージベースの成果物管理 ίʔυϕʔεΛಉ͡ʹ 9
  9. 10.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. w検証環境と本番環境を完全に分離する w

    検証環境はQA専任チームなど別チームも閲覧・操作する w 本番環境は開発者のみ wこの2つを⾏き来できるのはDockerのイメージのみ w アプリケーションのデータ運⽤(マスターデータ・アセット)は 最初から考えておく 検証環境と本番環境でGCPのプロジェクトをわける ίʔυϕʔεΛಉ͡ʹ 10
  10. 11.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. Dockerのイメージの構成 •

    コードベースを同じに • 3種類のイメージにわけて作成 • 設定ファイルなどは全てのイメージに含まれる 11 ᵓBQJ ᵓ%#@4DIFNB ᵓ؅ཧπʔϧ ᵓDPOGJH TVCUSFF ᵓTIBSFE API DB Schema 管理ツール ᵓBQJ ᵓDPOGJH TVCUSFF ᵓTIBSFE ᵓ%#4DIFNB ᵓDPOGJH TVCUSFF ᵓTIBSFE ᵓ؅ཧπʔϧ ᵓDPOGJH TVCUSFF ᵓTIBSFE
  11. 12.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • TUSFUDIϕʔε

    /05BMQJOF w glibcがなくて、stackdriver(の中のgrpc)のgemがビルドできない Dockerのイメージの構成 ίʔυϕʔεΛಉ͡ʹ 12
  12. 13.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • Dockerの社内registryは⾃前で⽤意はしない

    w Googleのパワーを借りる w Google Container Builder w Google Container Registry Docker registry ίʔυϕʔεΛಉ͡ʹ 13
  13. 14.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • Container

    Builderを使うための調整 w GitHub:Enterprise、CircleCI Enterprise、社内rubygemsがある w Container BuilderはGH:EにはアクセスできないのでGoogle Source Repositoryを経由する w 社内rubygemsは利⽤しない(社内gemは使わない) w 使う場合はレポジトリに直接subtree等で取り込むことを想定 社内リソースとの連携 ίʔυϕʔεΛಉ͡ʹ 14
  14. 15.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. 15 テストが通ったブランチは全部イメージを作る

    Dockerのイメージ作成フロー ίʔυϕʔεΛಉ͡ʹ Developers Cloud Source Repositories Container Registry Container Builder Hook Pus h ςετ実⾏ Push DeNA
  15. 16.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. %PDLFSͷΠϝʔδ࡞੒ ίʔυϕʔεΛಉ͡ʹ

    CircleCIからSource Repositoryへpush 16 deploy: machine: enabled: true steps: - checkout - run: command: echo "${LIVE_SB_NETRC}" > ~/.netrc - run: command: git remote add google https://source.developers.google.com/p/sample/r/server - run: command: git push google "${CIRCLE_BRANCH}"
  16. 17.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. 17 •

    Container BuilderではDockerfile指定だけ w ڽͬͨ͜ͱ͸ಛʹ͍ͯ͠ͳ͍ w ϓϩδΣΫτ͋ͨΓ݅ͷಉ࣌Ϗϧυ͕Մೳ w ຊϓϩδΣΫτͰ͸ͭ͸ಉ࣌ʹϏϧυ͍ͨ͠ Dockerのイメージ作成 ίʔυϕʔεΛಉ͡ʹ
  17. 18.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • 検証環境でテストしたイメージを

    そのまま本番環境に移⾏ w HDMPVEίϚϯυͰ($1ͷϓϩδΣΫτΛ௒͍͚͑ͯ࣋ͬͯΔ w HDMPVE DPOUBJOFSJNBHFTBEEUBH 本番環境へのイメージの移⾏ ίʔυϕʔεΛಉ͡ʹ 18
  18. 19.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • RAILS_ENV

    w 検証環境・本番環境はproductionで統⼀ w 環境を規定するために別の環境変数を⽤意 w Docker起動時に設定を読み込む Rails ίʔυϕʔεΛಉ͡ʹ 19
  19. 20.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. 3BJMT ίʔυϕʔεΛಉ͡ʹ

    20 ENV RAILS_ENV production # Use EntryKit ENTRYPOINT [ \ "prehook", "ruby -v", "--", \ QSFIPPL CVOEMFFYFDSVCZTIBSFETDSJQUTTFUVQSC  "switch", \ "shell=/bin/sh", \ "rails_c=bundle exec rails c", \ "rails_db=bundle exec rails db", \ "rails_s=bundle exec rails s -b 0.0.0.0", "--", \ "bundle", "exec", "unicorn_rails", "-c", "config/unicorn/production.rb" ]
  20. 21.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • サーバーの設定

    w config⽤のレポジトリを⽤意し、subtreeで取り込み • Logは標準出⼒に w stackdriver loggingで回収 -> exportして各処理へ • パフォーマンス測定 w 本番環境はstackdriver trace w 検証環境はstackdriver traceに加えてstackprofでも確認する Rails ίʔυϕʔεΛಉ͡ʹ 21
  21. 24.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • kubernetes(GKE)を使った構築

    w Dockerのイメージの動作環境という視点でまずは選定 • その上で w 構成をそろえやすい w 少⼈数でも管理・運⽤しやすい サーバーの構成を同じに ߏ੒Λಉ͡ʹ 24
  22. 25.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • 設定はyamlで管理

    w 規模感的にまだHemlとかを導⼊するほどでもない w kustomizeは検討中 w Service + HPA + Deploymentで⼀つのyamlにまとめている w 環境ごとの差分はなるべく少なく w replicasの数くらいが差分になっている kubernetesの管理 ߏ੒Λಉ͡ʹ 25
  23. 26.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • ConfigMapとSecret

    w 環境変数(ConfigMap、Secret)とアプリ内でもつ設定の分離 w 秘密情報は全てSecretを使って環境変数経由で受け渡す w アプリケーションの設定情報はコードに含め環境変数で受け渡すことは基 本的にしない w unicornのworker数などこまめに調整する数値のみ環境変数で管理 kubernetesの構成 ߏ੒Λಉ͡ʹ 26
  24. 27.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • Service、HPA、Deployment

    w API、管理ツール等ではreplicas以外の差はない w HPAの設定、deploymentのProbeの設定を忘れずに w graceful shutdownとスケーリングをちゃんと設定しておく w 負荷試験時にイメージの更新を挟むことで確認 kubernetesの構成 ߏ੒Λಉ͡ʹ 27
  25. 28.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. 28 શମͷߏ੒

    ߏ੒Λಉ͡ʹ Monitoring Logging Cloud Load Balancing Cloud SQL Trace Error Reporting Frontend "1* ؅ཧπʔϧ Cloud Storage Container Engine
  26. 29.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • バージョン

    w v1.10.5を利⽤ w stackdriver monitoring v2を利⽤したかった GKEの設定 ߏ੒Λಉ͡ʹ 29
  27. 30.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • 本番環境ではマスター承認済みのネットワークを設定

    w 社内のgatewayサーバーからのみアクセスできる deployサーバー(GCE)を⽤意してそこからのみkubectlが打てる w gatewayサーバーにはttyrecが仕込んであり 監査⽤にログが残してある w 検証環境はローカルマシンからkubectlを打てる GKEの設定 ߏ੒Λಉ͡ʹ 30
  28. 31.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • 限定公開クラスタは無効

    w CloudSQLがプライベートGoogleアクセスに対応していない w https://cloud.google.com/vpc/docs/private-google-access w アプリケーションからは結局Cloud SQL Proxy経由でアクセス GKEの設定 ߏ੒Λಉ͡ʹ 31
  29. 32.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • ノードの⾃動スケーリングは

    開発環境はon 本番環境はoff w スケールするときにサービス断の可能性あり GKEの設定 ߏ੒Λಉ͡ʹ 32
  30. 33.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • 権限管理

    w google group + IAMで管理が基本 w 本番環境と検証環境を分けており、本番環境には⼊れる⼈を絞っている w kubernetesのRBACはまだ使ってない GKEの設定 ߏ੒Λಉ͡ʹ 33
  31. 34.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • Preemptible

    VM w ݕূ؀ڥ͸શͯPreemptible w ίετμ΢ϯͱ΋ʹɺ؀ڥ͕ৗʹ৽͘͠disposableͰ͋Δ͜ͱͷ֬ೝ͕Մ ೳ GKEの設定 ߏ੒Λಉ͡ʹ 34
  32. 35.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • DNSの管理からの開放

    w MyDNSと決別 • プロセスがおちたら⾃動的に再起動 w daemontoolsと決別 kubernetesを使ったメリット ߏ੒Λಉ͡ʹ 35
  33. 36.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • Horizonatal

    Pod Autoscaler w ⾃動でpodの数を調整してくれる w 負荷試験ではテストしているが、リリース後からは発動してない kubernetesを使ったメリット ߏ੒Λಉ͡ʹ 36
  34. 37.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • ⽐較になるが、GAE/Goほどシンプルではないかも…

    w 管理するものが多い印象 kubernetesのデメリット ߏ੒Λಉ͡ʹ 37
  35. 38.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • CronJob

    w sidecarがあるとsidecarが終わらない問題 w v1.10.5未満だと失敗したjobが延々とリトライし続ける問題があった(解消 済) • graceful shutdownできていない w CloudSQL ProxyのpreStopの設定 ハマったこと ߏ੒Λಉ͡ʹ 38
  36. 39.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • DBスキーマの適⽤

    w スキーマ管理はridgepoleを採⽤ w スキーマ適⽤⽤のpodを上げてそこのpodに⼊ってコマンドを打つ ハマったこと ߏ੒Λಉ͡ʹ 39
  37. 40.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • 検証環境のクラスターをまとめる

    w 検証環境毎にクラスターを作っているので、ここをまとめて環境を作りや すくする 改善したいポイント ߏ੒Λಉ͡ʹ 40
  38. 41.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • CloudSQL

    • stackdriver • dataflow • BigQuery • GCS • CloudFunction GCPで使っているサービス(GKE以外) ߏ੒Λಉ͡ʹ 41
  39. 42.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • AWS

    w SES w メールだけはどうしようもなかった。。 • Fastly w CDNとimage optimizer w image optimizerで画像の配信を柔軟に⾏っている GCP以外に使っているサービス ߏ੒Λಉ͡ʹ 42
  40. 43.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • コードの差によるバグ

    w 1件:デバッグ機能をoffにする条件分岐 • 構成の差によるバグ w なし • 運⽤は今の所⼀⼈でも⼤丈夫 実績 ·ͱΊ 43
  41. 44.

    Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • Dockerやkubernetesを使って簡単に⼀貫性のある環境

    を構築することができた • その結果、環境起因による不具合を抑えることができて いる(と思う) まとめ ·ͱΊ 44