How to utilize GKE for QA environment

A2a2d96ab7fae2ccc4fb8e88cc7f8698?s=47 masudak
June 18, 2018

How to utilize GKE for QA environment

A2a2d96ab7fae2ccc4fb8e88cc7f8698?s=128

masudak

June 18, 2018
Tweet

Transcript

  1. How to utilize GKE for QA environment @masudak GCPUG Tokyo

    June 2018
  2. About me • @masudak ますだっくと呼ばれてます • 2016年4月入社 • SET(Software Engineer

    in Test) • 最近感動したもの: ルンバ(自動化素晴らし い)
  3. SET (Software Engineer in Test)

  4. About SET • 2011年にGoogleが設立 • 「開発生産性とプロダクト品質の向上」がテー マ • SDET, SWETなど色々な名称ある

    • メルカリSETは2016年10月設立 • 2017年春に出るUKアプリがトリガー • 当時作ったもの ◦ ローカル開発環境 ◦ QA環境 ◦ UIテスト自動化
  5. 開発フロー

  6. 開発フロー • PMが仕様をJIRAでFIX • エンジニア・デザイナーが「ローカル開発環 境」で実装 • PRを他のメンバーにレビューしてもらう • LGTM

    • 「QA環境」でQAエンジニアがマニュアルQA • PMがリリース承認 • エンジニアがリリース
  7. QA環境

  8. QA環境 • QAエンジニアやエンジニアがQAするところ • 共通のDBや検索データを持つ • API, Frontend, Admin, Webなどが動く

    • 他の人に影響を受けない独立した環境 • 独立したエンドポイント • トピックをデプロイ
  9. QA環境要件 • 自分専用の環境 • 共通のWebUIからデプロイ • スケールしやすい • 可能な限り本番の構成を反映

  10. 2017年春

  11. 2017年春 • USアプリの刷新をすることに • PHP -> Go • Monolithic ->

    Microservices • Kubernetes on GCP • 「いい感じ」でアプリをデプロイしたい
  12. 2017年前半 • CircleCIのビルド中にデプロイ • 新しい環境が自動的に • HTTPヘッダを見て、プロキシ

  13. CircleCI • テストだけでなくreviewdogとかカバレッジと か • gcloud SDKやDockerのインストール • 古いpods削除 •

    マニフェストファイルのテンプレートを書き換 え $ kubectl get pods --no-headers --selector='app=XXXX-api' | cut -f1 -d' ' | xargs kubectl delete pod そのあと $ make setup-branch-k8s
  14. 書き換え setup-branch-k8s: $(eval PR_NUMBER := $(shell basename ${CIRCLE_PULL_REQUEST})) sed -ie

    "s/{{ PR_NUMBER }}/$(PR_NUMBER)/gi" ./tools/kubernetes/XXX-branch.tmpl.yml sed -ie "s/{{ BUILD_NUMBER }}/$(CIRCLE_BUILD_NUM)/gi" ./tools/kubernetes/XXX-branch.tmpl.yml /google-cloud-sdk/bin/kubectl apply -f ./tools/kubernetes/
  15. Go reverse proxy director := func(req *http.Request) { xPrNumber :=

    req.Header.Get("X-FOOBAR-PR") apisPort := 4000 req.URL.Scheme = "http" if xPrNumber != "" { req.URL.Host = fmt.Sprintf("foobar-api-%s:%d", xPrNumber, apisPort) } else { req.URL.Host = fmt.Sprintf("foobar-api:%d", apisPort) }
  16. 2017年後半

  17. Spinnaker • CircleCIからはGCRにイメージをプッシュするだけ • それをトリガーにSpinnakerからデプロイ • オレオレyamlテンプレートがなくなる • とは言え、まだWebUI中心 •

    PR podsに対応できてない
  18. 2017年後半 • reconciliation loop ◦ In Kubernetes, a controller is

    a control loop that watches the shared state of the cluster through the apiserver and makes changes attempting to move the current state towards the desired state. deeeet氏: PRのstateをdesired stateとしよう!
  19. K8s Controller for PR • ループしながら、PRの状況をチェック • Openだったら、既存のRSを複製 • 環境変数などを書き換え

    • desired stateを変更 • k8sがそのdesiredに近づけていく • PR用のRS完成 • 必要に応じて、external-dnsでドメイン付与 もしかしたら、kustomizeに置き換わる運命???
  20. 終わりに • 開発生産性も品質もまだまだ追求できる • 開発環境だから、QA環境だからで終わらせない • 開発速度を上げるのはすごく大事 • たった一つのVMの時代から2年でここまで来た •

    parityなどを考えるとまだまだ課題は多い • 是非情報交換していきましょう
  21. We are hiring!! • ソフトウェアエンジニア(SET: Software Engineer in Test) •

    ソフトウェアエンジニア(SET iOS: Software Engineer in Test iOS)
  22. ご清聴 ありがとうございました