Slide 1

Slide 1 text

RocroにおけるGCP活用事例 Rocro株式会社 峯尾 嘉征 / 八神 貴心 2017/09/27

Slide 2

Slide 2 text

自己紹介 ■ 峯尾 嘉征 @ Rocro & Sony ■ ハードウェア→組み込み→Web – CPU、コンパイラ、Webブラウザ、Webサービスなどの開発に従事 ■ OSS – github.com/sony ■ 管理人、sonyflake/gobreaker/v8evalを公開 – github.com/plenluno ■ 個人アカウント、libnode(Node.jsのC++実装)などを公開 © Rocro Inc. 2

Slide 3

Slide 3 text

Agenda ■ Rocroのご紹介 ■ GCPのバージョン管理&デプロイ ■ StackdriverによるGAE/GKEの監視 © Rocro Inc. 3

Slide 4

Slide 4 text

Rocroのご紹介 © Rocro Inc. 4

Slide 5

Slide 5 text

■ 開発者向けサービス群 – https://rocro.com – GitHub / Bitbucketと連携 ■ 9/14 public beta開始 – 現在、プライベートレポジトリのみサポート – 10月中にパブリックレポジトリもサポート予定 ■ 名前の由来 – アジャイル開発:イテレーションを回しながらソフトウェアをつくる – 回転させながらものをつくる道具 → ろくろ © Rocro Inc. 5

Slide 6

Slide 6 text

■ 自動コードレビュー&コード修正サービス – https://inspecode.rocro.com ■ 約50種類の静的解析ツールをサポート – 一部の言語でユニットテストもサポート開始 ■ サポート言語: C, C++, Clojure, CoffeeScript, CSS, Go, HTML, Java, JavaScript, PHP, Python, Ruby, Scala, Shell, TypeScriptなど ■ Public Beta © Rocro Inc. 6 Inspecode

Slide 7

Slide 7 text

■ 静的解析の結果を分かりやすくレポート – A, B, C, D, Fの5段階評価 – Issueを様々な分類でチェック ■ ファイル ■ ツール ■ 言語 ■ 重要度 ■ 新規/既存 – トレンド ■ 5段階評価 ■ Issue数 © Rocro Inc. 7 Inspecode

Slide 8

Slide 8 text

■ Continuous Integration – Git Push/Pull Requestの自動チェック ■ ツールごとにIssue数の閾値を設定可能 閾値を超えたらFail – Email/Slack/HipChat通知 ■ 失敗・回復時だけ通知も可能 – Badge(READMEに貼るアイコン) © Rocro Inc. 8 Inspecode

Slide 9

Slide 9 text

■ APIドキュメント生成&ホスティングサービス – https://docstand.rocro.com ■ 各言語の代表的なAPIドキュメントツールをサポート – Javadoc, GoDoc, Sphinxなど ■ サポート言語: C, C++, Clojure, CoffeeScript, Go, Java, JavaScript, PHP, Python, Ruby, Scala, TypeScriptなど ■ Public Beta © Rocro Inc. 9 Docstand

Slide 10

Slide 10 text

■ Continuous Documentation – Git Pushのたびにドキュメントを自動生成 – 常に最新のドキュメントをチーム内で共有可能 © Rocro Inc. 10 Docstand

Slide 11

Slide 11 text

■ 自動負荷テストサービス – https://loadroid.rocro.com ■ テストシナリオを書くだけで負荷試験を自動実行 – 自動で負荷テスト環境の構築、負荷テストの実施、レポート作成 ■ closed test中 – 参加を希望する方はご連絡ください © Rocro Inc. 11 Loadroid

Slide 12

Slide 12 text

■ YAML&JavaScriptで簡潔&柔軟にテストシナリオを作成可能 – 静的なHTTPリクエストだけならYAMLだけでOK – JavaScriptで動的にHTTPリクエストを生成可能 – シンプルな文法で読み書きしやすい © Rocro Inc. 12 Loadroid

Slide 13

Slide 13 text

Rocroの強み ■ ࣗಈηοτΞοϓ ■ ࣗಈमਖ਼ ■ ࣗಈฒྻԽ ユーザの⼿間を⼤幅に減らし、結果を素早く返すことにフォーカス © Rocro Inc. 13

Slide 14

Slide 14 text

自動セットアップ ■ 強力なデフォルト設定(Inspecode/Docstand) – レポジトリ内の使用言語を検出して、適切なツールを自動実行 例:Go言語を検出 → Go言語向けツールgofmt, golintなどを適用 – 各ツールの設定ファイルを検出して自動適用 例:Checkstyleの場合、checkstyle.xml を検出して適用 ■ 依存ライブラリを自動でダウンロード(Inspecode/Docstand) – 例:npm install, go get, git submoduleなど ■ 負荷テストのサーバクラスタを自動構築(Loadroid) – ユーザはテストシナリオを書くだけ エンジニアの各種セットアップの時間を⼤幅に削減 © Rocro Inc. 14

Slide 15

Slide 15 text

(参考)Goの自動依存解決 © Rocro Inc. 15

Slide 16

Slide 16 text

自動修正 ■ 静的解析ツールで検出したIssueを自動で修正 修正内容をPull Requestとして発行(Inspecode) → エンジニアの修正作業の時間を大幅に削減 ■ 修正機能を独自に実装(Inspecode) – Checkstyle, golint, gosimple – 今後も対応ツールを増やしていく予定 if err != nil { return err } return nil return err © Rocro Inc. 16

Slide 17

Slide 17 text

自動並列化 ■ ツールレベルで自動で並列化 (Inspecode/Docstand) – ツールごとにDockerコンテナ – 様々なツールを活用するチームほど 実行時間を大幅に短縮可能 A B C A B 実⾏時間削減 C © Rocro Inc. 17

Slide 18

Slide 18 text

入力分割による並列化 A B C A C B A C B1 B2 実⾏時間削減 特定のツールの実行時間が支配的な場合 ツールの並列化だけでは不十分… inspecode: go-test: input: frontend/ input: backend/ rocro.yml 設定ファイルで入力を簡単に分割可能 各入力ごとに並列実行(Inspecode) © Rocro Inc. 18 並列実行

Slide 19

Slide 19 text

GCPのバージョン管理&デプロイ © Rocro Inc. 19

Slide 20

Slide 20 text

構成 App Engine ユーザからの リクエストを処理 Container Engine ユーザのJobを ⾮同期実⾏ © Rocro Inc. 20

Slide 21

Slide 21 text

GAEのバージョン管理&デプロイ ■ Semantic Versioning – MAJOR.MINOR.PATCHの3つの数字(x.y.z -> x-y-z) ■ GAE Serviceのバージョンは全部同じ ■ 同じバージョンのService間でしか通信しない Immutable Infrastructure in GAE Application: 1-2-3 Service Std: 1-2-3 Service Flex: 1-2-3 Application: 1-2-4 Service Std: 1-2-4 Service Flex: 1-2-4 © Rocro Inc. 21

Slide 22

Slide 22 text

GKEのバージョン管理&デプロイ ■ ローリングアップデートではなく、バージョンごとにクラスタを作成 – クラスタ名:x.y.z -> cluster-x-y-z ■ 同じバージョンのGAE Serviceとしか通信しない Application: 1-2-3 Service Std: 1-2-3 Service Flex: 1-2-3 Application: 1-2-4 Service Std: 1-2-4 Service Flex: 1-2-4 cluster-1-2-3 cluster-1-2-4 Immutable Infrastructure in GAE/GKE © Rocro Inc. 22

Slide 23

Slide 23 text

メリット&デメリット ■ メリット – GAEのバージョン切り替えにGKEも自動で追従 – 問題があったときに元のバージョンにすぐに戻せる – 内部Web APIの互換性を保つ必要がない ■ デメリット – バージョン切り替え時に複数バージョンが同時に存在→コスト増 ■ ただし、コスト増を最小限にすることは可能 – 前バージョンのクラスタはオートスケールで縮退 – GAE Cronにより不要なクラスタを自動で削除 © Rocro Inc. 23

Slide 24

Slide 24 text

Dockerイメージの管理 ■ Container Registroyを利用 – GCPネットワーク内で高速にpull可能 ■ DockerイメージのバージョンもGAE/GKEのバージョンと同じ – Dockerイメージにバージョンタグを打つ – cluster-x-y-zは[image-name]:x-y-zだけをpull ■ RocroでサポートするツールごとにDockerイメージを作成 →現在、70超のDockerイメージを管理 →対策しないとDockerイメージのbuild/pushだけで大変... © Rocro Inc. 24

Slide 25

Slide 25 text

Dockerイメージのbuild/push高速化 ■ build/pushの並列化 ■ git revisionが同じ場合、build/pushをスキップ、タグを打つだけ – ローカルにイメージキャッシュが無くてもスキップ可能 – 実際には前バージョンとrevisionが変わらないことが多いので有効 LABEL revision=b451898… [image-name]:1-2-3, latest revision: b451898… tag: 1.2.3 Git LABEL revision=b451898… [image-name]:1-2-3, 1.2.4, latest revision: b451898… tag: 1.2.3, 1.2.4 Git GCRからLABEL取得 revisionを比較 revisionが同じなら タグだけ打つ © Rocro Inc. 25

Slide 26

Slide 26 text

StackdriverによるGAE/GKEの監視 © Rocro Inc. 26

Slide 27

Slide 27 text

自己紹介 ■ 八神 貴心(やがみ きしん) – ソフトウェアエンジニア@Rocro – GitHub: @ks888 – Twitter: @ks888sk ■ Rocroではインフラ・監視関連から開発まで色々やってます ■ 最近のOSS活動 – LambStatus (https://github.com/ks888/LambStatus) ■ サービスのステータスページを簡単に構築・運用できるOSS – PyCon JPスタッフ © Rocro Inc. 27

Slide 28

Slide 28 text

利用中のStackdriverの機能 ■ Stackdriver Monitoring – GAE・GKE関連メトリクスの収集・監視 – ダッシュボード ■ Stackdriver Logging – GAE・GKEのログを集約 – ログからのメトリクスデータ生成 ■ Stackdriver Trace – APIのボトルネック発見 – デバッグ時の情報源 © Rocro Inc. 28

Slide 29

Slide 29 text

Stackdriverの良かったところ 1. GAE std envのデフォルトメトリクスが豊富 2. HTTPリクエストのトレースが便利 ✨ 3. デフォルトでオートスケーリング対応⚒ 4. 安い! © Rocro Inc. 29

Slide 30

Slide 30 text

GAE std envのデフォルトメトリクスが豊富 ■ 設定無しで75種類のメトリクスが利用可能 ■ とはいえ、足りないメトリクスもある → Custom Metricsで補う – https://cloud.google.com/monitoring/custom-metrics/ © Rocro Inc. 30

Slide 31

Slide 31 text

1. Loggingで遅いリクエストを見つけたら 2. その場でトレースを確認! HTTPリクエストのトレースが便利 ✨ © Rocro Inc. 31

Slide 32

Slide 32 text

HTTPリクエストのトレースが便利 ✨ ■ 包括的なレポートからトレースを確認することもできる – レイテンシの分布 – レイテンシのパーセンタイル © Rocro Inc. 32

Slide 33

Slide 33 text

デフォルトでオートスケーリング対応 ⚒ ■ 作成Resourceは「resource type」ごとにグループ化される ■ メトリクスの可視化・監視は、 resource typeが基本単位になる ■ デフォルト設定のままで、インスタンス増減に追従した監視ができる! “gce_instance” resource type GCEインスタンス GCEインスタンス GCEインスタンス GCEインスタンス GCEインスタンス New © Rocro Inc. 33

Slide 34

Slide 34 text

安い! ■ $8/M/resource – idle状態のGAEインスタンスは課金されない ━ Total Instances ━ Idle Instances © Rocro Inc. 34

Slide 35

Slide 35 text

Stackdriverで困ったところ 1. Resource groupに関する混乱 2. 監視agentがGKE、GAE flex envを未サポート 3. GKEのデフォルトメトリクスが少ない 4. Infra as codeの実践が難しい © Rocro Inc. 35

Slide 36

Slide 36 text

Resource groupに関する混乱 ■ 例:GKEクラスタのresource groupを作りたい – StackdriverのUIから作ってみる 1. Suggestされた Groupを使ってみる 2. Suggestされた グルーピング条件 3. Group作れたっぽい © Rocro Inc. 36

Slide 37

Slide 37 text

Resource groupに関する混乱 ■ 例:GKEクラスタのresource groupを作りたい – 作成したGKE resource groupのCPU使用率メトリクスのグラフを出 す 3. !?? 2. 作成したGroup でフィルタ 1. CPU使⽤率メ トリクスを選択 © Rocro Inc. 37

Slide 38

Slide 38 text

Resource groupに関する混乱 ■ なぜこうなってしまったか? – 「Resource type」が鍵になる ■ gce_instance、gke_containerなどのタイプがある ■ Metricsは、resource typeに紐づく gke_container Resource type CPU Usage / Container Metrics Used Memory gce_instance CPU Usage / Instance Disk Read I/O © Rocro Inc. 38

Slide 39

Slide 39 text

作成したgroup Resource groupに関する混乱 ■ なぜこうなってしまったか?(続き) – 作成したグループは、gce_instanceタイプのリソースしか含んでい なかった gke_container Resource type CPU Usage / Container Metrics Used Memory gce_instance CPU Usage / Instance Disk Read I/O 指定した メトリクス 指定した グループ グラフ作成画⾯ © Rocro Inc. 39

Slide 40

Slide 40 text

Resource groupに関する混乱 ■ Group作成がうまく行かないときは、resource typeに注目してみ る – 一部のresource typeしか含まれていないかも。。 – Groupに含まれるresourceは、以下APIから確認できる ■ Method: projects.groups.members.list ■ 結局、どうすればGKE clusterのresource groupを作れるのか? – Stackdriver UIから作る方法はわからず。。 – 以下APIでできたけど。。 ■ Method: projects.groups.create ■ Filterを resource.type=gke_container に指定 © Rocro Inc. 40

Slide 41

Slide 41 text

監視agentがGKE、GAE flex envを未サポート ■ 監視agent – GCEインスタンスのメモリ使用率、ディスク使用率などを収集 – GKE、GAE flex envのGCEインスタンスは未サポート ■ https://cloud.google.com/monitoring/agent/#supported_vms ■ Custom Metricsである程度対応中。。 – 課題:複数インスタンスでクラスタを作っている場合、cronに呼ばれた1 インスタンスのデータしか収集されない ■ Cronに呼ばれたインスタンスが他のインスタンスのデータを収集する形な らできそうだけど複雑。。 Cron GAE flex env Stackdriver APIを叩く 収集した データを送信 © Rocro Inc. 41

Slide 42

Slide 42 text

GKEのデフォルトメトリクスが少ない ■ 現在のデフォルトメトリクス – コンテナごとのCPU使用率、メモリ使用量、ディスク使用量 ■ k8s特有のメトリクスもあると助かる – ジョブ数 – 失敗したジョブ数 – 実行待ち状態のジョブ数 ■ こちらも、Custom metricsで対応中 Cron GAE flex env Stackdriver APIを叩く 収集した データを送信 GKE K8s APIで データ収集 © Rocro Inc. 42

Slide 43

Slide 43 text

Infra as codeの実践が難しい ■ 主なサポート済みAPI ☀ – Resource groupsの作成、取得 – Custom metricsの作成、取得 – Time seriesの作成、取得 ■ 足りないAPI – Resourcesの取得 ■ Method: projects.groups.members.list を使えば間接的に取得可 ■ Resourceのmetadataを取る方法は不明 – Alerting policyの作成、取得 – Dashboardの作成、取得 © Rocro Inc. 43

Slide 44

Slide 44 text

Stackdriverによる監視のまとめ ■ デフォルト設定が充実していて助かる – メトリクス – リクエストのトレース – オートスケーリング対応 ■ ドキュメントの充実、GKE対応はもっと進んでほしい – 使い始め当初(一年前)と比べると良くなってきた印象 © Rocro Inc. 44

Slide 45

Slide 45 text

End © Rocro Inc. 45