Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
RocroにおけるGCP活用事例
Search
Yoshiyuki Mineo
September 27, 2017
Technology
0
910
RocroにおけるGCP活用事例
GCPUG Tokyo DevOps Day September 2017
Yoshiyuki Mineo
September 27, 2017
Tweet
Share
More Decks by Yoshiyuki Mineo
See All by Yoshiyuki Mineo
GCP を活用してスケーラブルな CI サービスを作った話
yoshiyukimineo
0
130
開発者向けSaaS Rocro
yoshiyukimineo
0
710
Rocro Inspecode Hands On with Bitbucket
yoshiyukimineo
0
97
Rocro Inspecode Hands On
yoshiyukimineo
0
420
Other Decks in Technology
See All in Technology
複雑な構成要素を持つUIとの向き合い方 〜新・支出グラフでの実例〜 / B43 TECH TALK
nakamuuu
0
140
生産性向上チームの紹介
cybozuinsideout
PRO
1
870
非同期推論システムによるコスト削減と信頼性向上
koki_nishihara
0
210
APIファーストなプロダクトマネジメントの実践 〜SaaSus Platformでの例〜 / "Practicing API-First Product Management - An Example with SaaSus Platform
oztick139
0
100
開発パフォーマンスを最大化するための開発体制
ham0215
2
260
チームでロジカルシンキングに改めて向き合っている話 〜学習環境と実践⽅法〜
sansantech
PRO
2
2.1k
Next'24 事例セッションの紹介とクラウド資格を活用したキャリア形成について語りMuscle
yasumuusan
1
430
自己改善からチームを動かす! 「セルフエンジニアリングマネージャー」のすゝめ
shoota
6
340
AOAI をきっかけに 社内の Azure 管理を見直した話
recruitengineers
PRO
1
260
家族アルバム みてねにおけるGrafana活用術 / Grafana Meetup Japan Vol.1 LT
isaoshimizu
1
480
長期運用プロジェクトでのMySQLからTiDB移行の検証
colopl
2
840
データベース02: データベースの概念
trycycle
0
150
Featured
See All Featured
How to train your dragon (web standard)
notwaldorf
73
5.2k
What's in a price? How to price your products and services
michaelherold
237
11k
Code Review Best Practice
trishagee
55
15k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
30
6k
It's Worth the Effort
3n
180
27k
Art, The Web, and Tiny UX
lynnandtonic
289
19k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
14
1.6k
Music & Morning Musume
bryan
41
5.6k
RailsConf 2023
tenderlove
4
540
Mobile First: as difficult as doing things right
swwweet
216
8.6k
Rails Girls Zürich Keynote
gr2m
91
13k
The Pragmatic Product Professional
lauravandoore
25
5.8k
Transcript
RocroにおけるGCP活用事例 Rocro株式会社 峯尾 嘉征 / 八神 貴心 2017/09/27
自己紹介 ▪ 峯尾 嘉征 @ 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. 6 Inspecode
▪ 静的解析の結果を分かりやすくレポート – A, B, C, D, Fの5段階評価 – Issueを様々な分類でチェック
▪ ファイル ▪ ツール ▪ 言語 ▪ 重要度 ▪ 新規/既存 – トレンド ▪ 5段階評価 ▪ Issue数 © Rocro Inc. 7 Inspecode
▪ Continuous Integration – Git Push/Pull Requestの自動チェック ▪ ツールごとにIssue数の閾値を設定可能 閾値を超えたらFail
– Email/Slack/HipChat通知 ▪ 失敗・回復時だけ通知も可能 – Badge(READMEに貼るアイコン) © Rocro Inc. 8 Inspecode
▪ 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
▪ Continuous Documentation – Git Pushのたびにドキュメントを自動生成 – 常に最新のドキュメントをチーム内で共有可能 © Rocro
Inc. 10 Docstand
▪ 自動負荷テストサービス – https://loadroid.rocro.com ▪ テストシナリオを書くだけで負荷試験を自動実行 – 自動で負荷テスト環境の構築、負荷テストの実施、レポート作成 ▪ closed
test中 – 参加を希望する方はご連絡ください © Rocro Inc. 11 Loadroid
▪ YAML&JavaScriptで簡潔&柔軟にテストシナリオを作成可能 – 静的なHTTPリクエストだけならYAMLだけでOK – JavaScriptで動的にHTTPリクエストを生成可能 – シンプルな文法で読み書きしやすい © Rocro
Inc. 12 Loadroid
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 nil return err © Rocro Inc. 16
自動並列化 ▪ ツールレベルで自動で並列化 (Inspecode/Docstand) – ツールごとにDockerコンテナ – 様々なツールを活用するチームほど 実行時間を大幅に短縮可能 A
B C A B 実⾏時間削減 C © Rocro Inc. 17
入力分割による並列化 A B C A C B A C B1
B2 実⾏時間削減 特定のツールの実行時間が支配的な場合 ツールの並列化だけでは不十分… 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 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
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
メリット&デメリット ▪ メリット – 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, 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
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 type GCEインスタンス 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_container Resource type CPU Usage / Container Metrics Used Memory gce_instance CPU Usage / Instance Disk Read I/O © Rocro Inc. 38
作成した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
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 Stackdriver APIを叩く 収集した データを送信 © Rocro Inc. 41
GKEのデフォルトメトリクスが少ない ▪ 現在のデフォルトメトリクス – コンテナごとのCPU使用率、メモリ使用量、ディスク使用量 ▪ k8s特有のメトリクスもあると助かる – ジョブ数 –
失敗したジョブ数 – 実行待ち状態のジョブ数 ▪ こちらも、Custom metricsで対応中 Cron GAE flex env Stackdriver APIを叩く 収集した データを送信 GKE K8s 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