$30 off During Our Annual Pro Sale. View Details »

RocroにおけるGCP活用事例

 RocroにおけるGCP活用事例

GCPUG Tokyo DevOps Day September 2017

Yoshiyuki Mineo

September 27, 2017
Tweet

More Decks by Yoshiyuki Mineo

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

  4. Rocroのご紹介
    © Rocro Inc. 4

    View Slide

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

    View Slide

  6. ■ 自動コードレビュー&コード修正サービス
    – 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

    View Slide

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

    View Slide

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

    View Slide

  9. ■ 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  21. 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

    View Slide

  22. 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

    View Slide

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

    View Slide

  24. 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

    View Slide

  25. 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  30. GAE std envのデフォルトメトリクスが豊富

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  37. Resource groupに関する混乱
    ■ 例:GKEクラスタのresource groupを作りたい
    – 作成したGKE resource groupのCPU使用率メトリクスのグラフを出

    3. !??
    2. 作成したGroup
    でフィルタ
    1. CPU使⽤率メ
    トリクスを選択
    © Rocro Inc. 37

    View Slide

  38. 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

    View Slide

  39. 作成した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

    View Slide

  40. 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

    View Slide

  41. 監視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

    View Slide

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

    View Slide

  43. 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

    View Slide

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

    View Slide

  45. End
    © Rocro Inc. 45

    View Slide