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. 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. 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. Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • フロント1名

    • サーバー・インフラ1名 開発チーム εϞʔϧελʔτ 3
  4. Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. 4 •

    機能開発以外のやることを減らしたい • 運⽤業務をシンプルにしたい ػೳ։ൃʹूத͢ΔͨΊʹ
  5. Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. 5 ࠓճ͓࿩͢Δ಺༰

    https://builderscon.io/tokyo/2018/session/b87465f5-4a05-4a6b-85c6-a50ab205dc27
  6. Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. 6 •

    モノリシックな作り • APIファースト • 本番環境と同じ開発環境 • サービスのコンテンツデータの運⽤ ࠓճ͓࿩͢Δ಺༰
  7. Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • 環境のギャップをなくす

    w Dockerを使ったイメージベースの成果物 w 設定ファイルの管理 w 反映⽅法 • 構成のギャップをなくす w Kubernetes(GKE) w その他 • まとめ ໨࣍ 
  8. Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. コードベースを同じに

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

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

    検証環境はQA専任チームなど別チームも閲覧・操作する w 本番環境は開発者のみ wこの2つを⾏き来できるのはDockerのイメージのみ w アプリケーションのデータ運⽤(マスターデータ・アセット)は 最初から考えておく 検証環境と本番環境でGCPのプロジェクトをわける ίʔυϕʔεΛಉ͡ʹ 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
  12. Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • TUSFUDIϕʔε

    /05BMQJOF w glibcがなくて、stackdriver(の中のgrpc)のgemがビルドできない Dockerのイメージの構成 ίʔυϕʔεΛಉ͡ʹ 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
  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
  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
  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}"
  17. Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. 17 •

    Container BuilderではDockerfile指定だけ w ڽͬͨ͜ͱ͸ಛʹ͍ͯ͠ͳ͍ w ϓϩδΣΫτ͋ͨΓ݅ͷಉ࣌Ϗϧυ͕Մೳ w ຊϓϩδΣΫτͰ͸ͭ͸ಉ࣌ʹϏϧυ͍ͨ͠ Dockerのイメージ作成 ίʔυϕʔεΛಉ͡ʹ
  18. Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • 検証環境でテストしたイメージを

    そのまま本番環境に移⾏ w HDMPVEίϚϯυͰ($1ͷϓϩδΣΫτΛ௒͍͚͑ͯ࣋ͬͯΔ w HDMPVE DPOUBJOFSJNBHFTBEEUBH 本番環境へのイメージの移⾏ ίʔυϕʔεΛಉ͡ʹ 18
  19. Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • RAILS_ENV

    w 検証環境・本番環境はproductionで統⼀ w 環境を規定するために別の環境変数を⽤意 w Docker起動時に設定を読み込む Rails ίʔυϕʔεΛಉ͡ʹ 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" ]
  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
  22. Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. 22 3BJMT

    ίʔυϕʔεΛಉ͡ʹ
  23. Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. 構成を同じに

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

    w Dockerのイメージの動作環境という視点でまずは選定 • その上で w 構成をそろえやすい w 少⼈数でも管理・運⽤しやすい サーバーの構成を同じに ߏ੒Λಉ͡ʹ 24
  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
  26. Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • ConfigMapとSecret

    w 環境変数(ConfigMap、Secret)とアプリ内でもつ設定の分離 w 秘密情報は全てSecretを使って環境変数経由で受け渡す w アプリケーションの設定情報はコードに含め環境変数で受け渡すことは基 本的にしない w unicornのworker数などこまめに調整する数値のみ環境変数で管理 kubernetesの構成 ߏ੒Λಉ͡ʹ 26
  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
  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
  29. Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • バージョン

    w v1.10.5を利⽤ w stackdriver monitoring v2を利⽤したかった GKEの設定 ߏ੒Λಉ͡ʹ 29
  30. Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • 本番環境ではマスター承認済みのネットワークを設定

    w 社内のgatewayサーバーからのみアクセスできる deployサーバー(GCE)を⽤意してそこからのみkubectlが打てる w gatewayサーバーにはttyrecが仕込んであり 監査⽤にログが残してある w 検証環境はローカルマシンからkubectlを打てる GKEの設定 ߏ੒Λಉ͡ʹ 30
  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
  32. Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • ノードの⾃動スケーリングは

    開発環境はon 本番環境はoff w スケールするときにサービス断の可能性あり GKEの設定 ߏ੒Λಉ͡ʹ 32
  33. Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • 権限管理

    w google group + IAMで管理が基本 w 本番環境と検証環境を分けており、本番環境には⼊れる⼈を絞っている w kubernetesのRBACはまだ使ってない GKEの設定 ߏ੒Λಉ͡ʹ 33
  34. Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • Preemptible

    VM w ݕূ؀ڥ͸શͯPreemptible w ίετμ΢ϯͱ΋ʹɺ؀ڥ͕ৗʹ৽͘͠disposableͰ͋Δ͜ͱͷ֬ೝ͕Մ ೳ GKEの設定 ߏ੒Λಉ͡ʹ 34
  35. Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • DNSの管理からの開放

    w MyDNSと決別 • プロセスがおちたら⾃動的に再起動 w daemontoolsと決別 kubernetesを使ったメリット ߏ੒Λಉ͡ʹ 35
  36. Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • Horizonatal

    Pod Autoscaler w ⾃動でpodの数を調整してくれる w 負荷試験ではテストしているが、リリース後からは発動してない kubernetesを使ったメリット ߏ੒Λಉ͡ʹ 36
  37. Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • ⽐較になるが、GAE/Goほどシンプルではないかも…

    w 管理するものが多い印象 kubernetesのデメリット ߏ੒Λಉ͡ʹ 37
  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
  39. Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • DBスキーマの適⽤

    w スキーマ管理はridgepoleを採⽤ w スキーマ適⽤⽤のpodを上げてそこのpodに⼊ってコマンドを打つ ハマったこと ߏ੒Λಉ͡ʹ 39
  40. Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • 検証環境のクラスターをまとめる

    w 検証環境毎にクラスターを作っているので、ここをまとめて環境を作りや すくする 改善したいポイント ߏ੒Λಉ͡ʹ 40
  41. Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • CloudSQL

    • stackdriver • dataflow • BigQuery • GCS • CloudFunction GCPで使っているサービス(GKE以外) ߏ੒Λಉ͡ʹ 41
  42. Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • AWS

    w SES w メールだけはどうしようもなかった。。 • Fastly w CDNとimage optimizer w image optimizerで画像の配信を柔軟に⾏っている GCP以外に使っているサービス ߏ੒Λಉ͡ʹ 42
  43. Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • コードの差によるバグ

    w 1件:デバッグ機能をoffにする条件分岐 • 構成の差によるバグ w なし • 運⽤は今の所⼀⼈でも⼤丈夫 実績 ·ͱΊ 43
  44. Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved. • Dockerやkubernetesを使って簡単に⼀貫性のある環境

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