GCPUG Tokyo DevOps Day September 2017
RocroにおけるGCP活用事例Rocro株式会社峯尾 嘉征 / 八神 貴心2017/09/27
View Slide
自己紹介■ 峯尾 嘉征 @ Rocro & Sony■ ハードウェア→組み込み→Web– CPU、コンパイラ、Webブラウザ、Webサービスなどの開発に従事■ OSS– github.com/sony■ 管理人、sonyflake/gobreaker/v8evalを公開– github.com/plenluno■ 個人アカウント、libnode(Node.jsのC++実装)などを公開© Rocro Inc. 2
Agenda■ Rocroのご紹介■ GCPのバージョン管理&デプロイ■ StackdriverによるGAE/GKEの監視© Rocro Inc. 3
Rocroのご紹介© Rocro Inc. 4
■ 開発者向けサービス群– https://rocro.com– GitHub / Bitbucketと連携■ 9/14 public beta開始– 現在、プライベートレポジトリのみサポート– 10月中にパブリックレポジトリもサポート予定■ 名前の由来– アジャイル開発:イテレーションを回しながらソフトウェアをつくる– 回転させながらものをつくる道具 → ろくろ© Rocro Inc. 5
■ 自動コードレビュー&コード修正サービス– https://inspecode.rocro.com■ 約50種類の静的解析ツールをサポート– 一部の言語でユニットテストもサポート開始■ サポート言語:C, C++, Clojure, CoffeeScript, CSS, Go, HTML, Java, JavaScript,PHP, Python, Ruby, Scala, Shell, TypeScriptなど■ Public Beta© Rocro Inc. 6Inspecode
■ 静的解析の結果を分かりやすくレポート– A, B, C, D, Fの5段階評価– Issueを様々な分類でチェック■ ファイル■ ツール■ 言語■ 重要度■ 新規/既存– トレンド■ 5段階評価■ Issue数© Rocro Inc. 7Inspecode
■ Continuous Integration– Git Push/Pull Requestの自動チェック■ ツールごとにIssue数の閾値を設定可能閾値を超えたらFail– Email/Slack/HipChat通知■ 失敗・回復時だけ通知も可能– Badge(READMEに貼るアイコン)© Rocro Inc. 8Inspecode
■ 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. 9Docstand
■ Continuous Documentation– Git Pushのたびにドキュメントを自動生成– 常に最新のドキュメントをチーム内で共有可能© Rocro Inc. 10Docstand
■ 自動負荷テストサービス– https://loadroid.rocro.com■ テストシナリオを書くだけで負荷試験を自動実行– 自動で負荷テスト環境の構築、負荷テストの実施、レポート作成■ closed test中– 参加を希望する方はご連絡ください© Rocro Inc. 11Loadroid
■ YAML&JavaScriptで簡潔&柔軟にテストシナリオを作成可能– 静的なHTTPリクエストだけならYAMLだけでOK– JavaScriptで動的にHTTPリクエストを生成可能– シンプルな文法で読み書きしやすい© Rocro Inc. 12Loadroid
Rocroの強み■ ࣗಈηοτΞοϓ■ ࣗಈमਖ਼■ ࣗಈฒྻԽユーザの⼿間を⼤幅に減らし、結果を素早く返すことにフォーカス© Rocro Inc. 13
自動セットアップ■ 強力なデフォルト設定(Inspecode/Docstand)– レポジトリ内の使用言語を検出して、適切なツールを自動実行例:Go言語を検出 → Go言語向けツールgofmt, golintなどを適用– 各ツールの設定ファイルを検出して自動適用例:Checkstyleの場合、checkstyle.xml を検出して適用■ 依存ライブラリを自動でダウンロード(Inspecode/Docstand)– 例:npm install, go get, git submoduleなど■ 負荷テストのサーバクラスタを自動構築(Loadroid)– ユーザはテストシナリオを書くだけエンジニアの各種セットアップの時間を⼤幅に削減© Rocro Inc. 14
(参考)Goの自動依存解決© Rocro Inc. 15
自動修正■ 静的解析ツールで検出したIssueを自動で修正修正内容をPull Requestとして発行(Inspecode)→ エンジニアの修正作業の時間を大幅に削減■ 修正機能を独自に実装(Inspecode)– Checkstyle, golint, gosimple– 今後も対応ツールを増やしていく予定if err != nil {return err}return nilreturn err© Rocro Inc. 16
自動並列化■ ツールレベルで自動で並列化(Inspecode/Docstand)– ツールごとにDockerコンテナ– 様々なツールを活用するチームほど実行時間を大幅に短縮可能A B CAB実⾏時間削減C© Rocro Inc. 17
入力分割による並列化A B CACBACB1B2実⾏時間削減特定のツールの実行時間が支配的な場合ツールの並列化だけでは不十分…inspecode:go-test:input: frontend/input: backend/rocro.yml設定ファイルで入力を簡単に分割可能各入力ごとに並列実行(Inspecode)© Rocro Inc. 18並列実行
GCPのバージョン管理&デプロイ© Rocro Inc. 19
構成App Engineユーザからのリクエストを処理Container EngineユーザのJobを⾮同期実⾏© Rocro Inc. 20
GAEのバージョン管理&デプロイ■ Semantic Versioning– MAJOR.MINOR.PATCHの3つの数字(x.y.z -> x-y-z)■ GAE Serviceのバージョンは全部同じ■ 同じバージョンのService間でしか通信しないImmutable Infrastructure in GAEApplication: 1-2-3Service Std: 1-2-3 Service Flex: 1-2-3Application: 1-2-4Service Std: 1-2-4 Service Flex: 1-2-4© Rocro Inc. 21
GKEのバージョン管理&デプロイ■ ローリングアップデートではなく、バージョンごとにクラスタを作成– クラスタ名:x.y.z -> cluster-x-y-z■ 同じバージョンのGAE Serviceとしか通信しないApplication: 1-2-3Service Std: 1-2-3 Service Flex: 1-2-3Application: 1-2-4Service Std: 1-2-4 Service Flex: 1-2-4cluster-1-2-3 cluster-1-2-4Immutable Infrastructure in GAE/GKE© Rocro Inc. 22
メリット&デメリット■ メリット– GAEのバージョン切り替えにGKEも自動で追従– 問題があったときに元のバージョンにすぐに戻せる– 内部Web APIの互換性を保つ必要がない■ デメリット– バージョン切り替え時に複数バージョンが同時に存在→コスト増■ ただし、コスト増を最小限にすることは可能– 前バージョンのクラスタはオートスケールで縮退– GAE Cronにより不要なクラスタを自動で削除© Rocro Inc. 23
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
Dockerイメージのbuild/push高速化■ build/pushの並列化■ git revisionが同じ場合、build/pushをスキップ、タグを打つだけ– ローカルにイメージキャッシュが無くてもスキップ可能– 実際には前バージョンとrevisionが変わらないことが多いので有効LABEL revision=b451898…[image-name]:1-2-3, latestrevision: b451898…tag: 1.2.3GitLABEL revision=b451898…[image-name]:1-2-3, 1.2.4, latestrevision: b451898…tag: 1.2.3, 1.2.4GitGCRからLABEL取得revisionを比較revisionが同じならタグだけ打つ© Rocro Inc. 25
StackdriverによるGAE/GKEの監視© Rocro Inc. 26
自己紹介 ■ 八神 貴心(やがみ きしん)– ソフトウェアエンジニア@Rocro– GitHub: @ks888– Twitter: @ks888sk■ Rocroではインフラ・監視関連から開発まで色々やってます■ 最近のOSS活動– LambStatus (https://github.com/ks888/LambStatus)■ サービスのステータスページを簡単に構築・運用できるOSS– PyCon JPスタッフ© Rocro Inc. 27
利用中のStackdriverの機能 ■ Stackdriver Monitoring– GAE・GKE関連メトリクスの収集・監視– ダッシュボード■ Stackdriver Logging– GAE・GKEのログを集約– ログからのメトリクスデータ生成■ Stackdriver Trace– APIのボトルネック発見– デバッグ時の情報源© Rocro Inc. 28
Stackdriverの良かったところ 1. GAE std envのデフォルトメトリクスが豊富 2. HTTPリクエストのトレースが便利 ✨3. デフォルトでオートスケーリング対応⚒4. 安い! © Rocro Inc. 29
GAE std envのデフォルトメトリクスが豊富■ 設定無しで75種類のメトリクスが利用可能■ とはいえ、足りないメトリクスもある → Custom Metricsで補う– https://cloud.google.com/monitoring/custom-metrics/© Rocro Inc. 30
1. Loggingで遅いリクエストを見つけたら2. その場でトレースを確認!HTTPリクエストのトレースが便利 ✨© Rocro Inc. 31
HTTPリクエストのトレースが便利 ✨■ 包括的なレポートからトレースを確認することもできる– レイテンシの分布– レイテンシのパーセンタイル© Rocro Inc. 32
デフォルトでオートスケーリング対応 ⚒■ 作成Resourceは「resource type」ごとにグループ化される■ メトリクスの可視化・監視は、 resource typeが基本単位になる■ デフォルト設定のままで、インスタンス増減に追従した監視ができる!“gce_instance” resource typeGCEインスタンスGCEインスタンス GCEインスタンスGCEインスタンスGCEインスタンスNew© Rocro Inc. 33
安い! ■ $8/M/resource– idle状態のGAEインスタンスは課金されない━ Total Instances━ Idle Instances© Rocro Inc. 34
Stackdriverで困ったところ 1. Resource groupに関する混乱 2. 監視agentがGKE、GAE flex envを未サポート 3. GKEのデフォルトメトリクスが少ない 4. Infra as codeの実践が難しい © Rocro Inc. 35
Resource groupに関する混乱 ■ 例:GKEクラスタのresource groupを作りたい– StackdriverのUIから作ってみる1. SuggestされたGroupを使ってみる2. Suggestされたグルーピング条件3. Group作れたっぽい© Rocro Inc. 36
Resource groupに関する混乱 ■ 例:GKEクラスタのresource groupを作りたい– 作成したGKE resource groupのCPU使用率メトリクスのグラフを出す3. !??2. 作成したGroupでフィルタ1. CPU使⽤率メトリクスを選択© Rocro Inc. 37
Resource groupに関する混乱 ■ なぜこうなってしまったか?– 「Resource type」が鍵になる■ gce_instance、gke_containerなどのタイプがある■ Metricsは、resource typeに紐づくgke_containerResource typeCPU Usage / ContainerMetricsUsed Memorygce_instance CPU Usage / InstanceDisk Read I/O© Rocro Inc. 38
作成したgroupResource groupに関する混乱 ■ なぜこうなってしまったか?(続き)– 作成したグループは、gce_instanceタイプのリソースしか含んでいなかったgke_containerResource typeCPU Usage / ContainerMetricsUsed Memorygce_instance CPU Usage / InstanceDisk Read I/O指定したメトリクス指定したグループグラフ作成画⾯© Rocro Inc. 39
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
監視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 StackdriverAPIを叩く収集したデータを送信© Rocro Inc. 41
GKEのデフォルトメトリクスが少ない ■ 現在のデフォルトメトリクス– コンテナごとのCPU使用率、メモリ使用量、ディスク使用量■ k8s特有のメトリクスもあると助かる– ジョブ数– 失敗したジョブ数– 実行待ち状態のジョブ数■ こちらも、Custom metricsで対応中Cron GAE flex envStackdriverAPIを叩く収集したデータを送信GKEK8s APIでデータ収集© Rocro Inc. 42
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
Stackdriverによる監視のまとめ ■ デフォルト設定が充実していて助かる– メトリクス– リクエストのトレース– オートスケーリング対応■ ドキュメントの充実、GKE対応はもっと進んでほしい– 使い始め当初(一年前)と比べると良くなってきた印象© Rocro Inc. 44
End© Rocro Inc. 45