Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Google container builderと友だちになるまで

2,864 views

Published on

GCPUG Tokyo February 2018

Published in: Internet
  • Be the first to comment

Google container builderと友だちになるまで

  1. 1. Google Container Builder と 友だちになるまで GCPUG Tokyo Container Builder Day February2018 Daisuke Maki @lestrrat (HDE inc)
  2. 2. • @lestrrat • Perl/Go hacker, author, father • Author of github.com/peco/peco • Organizer for builderscon
  3. 3. <宣伝> http://blog.builderscon.io/entry/call-for-sponsors-2018 スポンサー募集中!!!
  4. 4. Google Container Builder(GCB)
  5. 5. Google Cloud Container Builder を使用すると、Google Cloud Storage、Google Cloud Source Repositories、 GitHub、BitBucket にあるアプリケーション ソースコード から Docker コンテナ イメージを作成できます。 Container Builder で作成したコンテナ イメージは Google Container Registry に自動的に格納されます
  6. 6. 「なるほどわからん」
  7. 7. GCBとは? ソースコード step 1 step 2 … step N Google Container Registry Google Source Repository その他 …
  8. 8. GCBとは? • ソースコードを送る • 指定された「ステップ」実行する • ステップから成果物をどこか(例:gcr.io)に送る
  9. 9. 「これ知ってる」 CIサービスだ!
  10. 10. 補足 • GCP的にはCIサービスではない • やろうと思えばテストもある程度できる • あくまで「構造が似ている」という意味
  11. 11. Should I Use GCB いきなりですが…
  12. 12. GCBを使うべき理由 • コンテナイメージをビルドしたい • GCP上にリソースが全部ある • もうリモートデバッグしたくない (後述)
  13. 13. GCBを使わない理由 • コンテナを使ってない • テストを(真面目に)走らせたい • GCPのサービスを使っていない
  14. 14. 実践!GCB
  15. 15. 背景 • ソースコードはGitlabにあるmonorepo • テストは別で行う • イメージデプロイ先はasia.gcr.io
  16. 16. GCBリクエスト gcloud container builds submit … GCBビルドは「リクエスト」から始まる
  17. 17. GCBリクエスト • docker buildコマンドのようにコンテキストを受け取る gcloud container builds submit source
  18. 18. GCBリクエスト • コンテキストはGoogle Storageに保存される • GSRからのキックの場合は、clone結果が保存 される?(試してない)
  19. 19. ソースコード step 1 step 2 … step N Google Container Registry Google Source Repository … GitlabはGSRでサポートされない…
  20. 20. ソースコード step 1 step 2 … step N Google Container Registry Google Source Repository … GitlabはGSRでサポートされない…
  21. 21. GCBリクエスト • 毎回monorepoを全部Google Storageに保存す るの… 嫌だ… • → 後述
  22. 22. ステップ • リクエストを受け取った後、cloudbuild.yaml 内のステップを順番に実行する
  23. 23. ステップ https://cloud.google.com/container-builder/docs/api/build-steps https://cloud.google.com/container-builder/docs/how-to/writing-build-requests
  24. 24. ステップ https://cloud.google.com/container-builder/docs/api/build-steps https://cloud.google.com/container-builder/docs/how-to/writing-build-requests 「わかるよーな…わからんよーな…」
  25. 25. ステップ • CIサービスでは「コマンド」を指定していく スタイルが多い • GCBは「コンテナ」を指定してく
  26. 26. GCBステップの「原理」 for step in config.steps docker run step.image step.args done
  27. 27. ステップ実行のイメージ • git clone コンテナ • go build コンテナ • docker push コンテナ
  28. 28. ステップのコンテナイメージ • よく使うものについてはGoogleが用 意してくれている → https://github.com/ GoogleCloudPlatform/cloud-builders • gcloud, git, go等
  29. 29. ステップ詳細
  30. 30. ソースの取得 • Gitlabからプライベートなレポジトリを クローンする(コードをアップロードしない) • Gitlabの認証を行う必要がある
  31. 31. 認証 • 認証トークンのようなデータはレポジト リに入れたくない • Google Key Management Services (KMS) • KMSについては… 詳しくはWebで!
  32. 32. KMSからキーを得る - name: 'gcr.io/cloud-builders/gcloud' args: - kms - decrypt - --ciphertext-file=gitlab-deploy.enc - --plaintext-file=/root/.ssh/id_ed25519 - --location=global - --keyring=cloudbuild - --key=gitlab volumes: - name: 'ssh' path: /root/.ssh
  33. 33. KMSからキーを得る - name: 'gcr.io/cloud-builders/gcloud' args: - kms - decrypt - --ciphertext-file=gitlab-deploy.enc - --plaintext-file=/root/.ssh/id_ed25519 - --location=global - --keyring=cloudbuild - --key=gitlab volumes: - name: 'ssh' path: /root/.ssh gcloudを使うための コンテナを指定じゃ
  34. 34. KMSからキーを得る - name: 'gcr.io/cloud-builders/gcloud' args: - kms - decrypt - --ciphertext-file=gitlab-deploy.enc - --plaintext-file=/root/.ssh/id_ed25519 - --location=global - --keyring=cloudbuild - --key=gitlab volumes: - name: 'ssh' path: /root/.ssh gcloudコマンドの引数 じゃ。/root/.ssh以下 に解読結果を残すぞ!
  35. 35. KMSからキーを得る - name: 'gcr.io/cloud-builders/gcloud' args: - kms - decrypt - --ciphertext-file=gitlab-deploy.enc - --plaintext-file=/root/.ssh/id_ed25519 - --location=global - --keyring=cloudbuild - --key=gitlab volumes: - name: 'ssh' path: /root/.ssh 解読結果を残すためのスト レージじゃ。あとでマウン トして読み込めるぞい
  36. 36. .ssh/configを設定する • .ssh/configで gitlab.comで使うキーを 設定する • 諸事情により、後ほど説明
  37. 37. キーを使ってgit cloneする - name: 'gcr.io/cloud-builders/git' args: - clone - —depth=1 - —branch=master - --single-branch - git@gitlab.com:myaccount/myrepo.git volumes: - name: 'ssh' path: /root/.ssh
  38. 38. キーを使ってgit cloneする - name: 'gcr.io/cloud-builders/git' args: - clone - —depth=1 - —branch=master - --single-branch - git@gitlab.com:myaccount/myrepo.git volumes: - name: 'ssh' path: /root/.ssh gitを使うためのコ ンテナじゃ
  39. 39. キーを使ってgit cloneする - name: 'gcr.io/cloud-builders/git' args: - clone - —depth=1 - —branch=master - --single-branch - git@gitlab.com:myaccount/myrepo.git volumes: - name: 'ssh' path: /root/.ssh 前のステップで作ったキー を読み込むためにボリュー ムをマウントするぞ
  40. 40. キーを使ってgit cloneする - name: 'gcr.io/cloud-builders/git' args: - clone - —depth=1 - —branch=master - --single-branch - git@gitlab.com:myaccount/myrepo.git volumes: - name: 'ssh' path: /root/.ssh git コマンドの引数 じゃ。~/.sshのキーを 勝手に使ってくれるぞ
  41. 41. 依存関係 • まだ glide •
  42. 42. 公式イメージ - name: gcr.io/cloud-builders/glide id: glide:myrepo waitFor: - checkout-done env: - PROJECT_ROOT=myproject/myrepo # おまじない args: - install 注:公式イメージからコミュニティレポジトリに移動されているので、 多分イメージはそのうちなくなる
  43. 43. 公式イメージ使えば簡単だと思った? 残念でした!
  44. 44. 問題 • 我々はmonorepoを使っている • つまり、ワークスペース直下にglide.yamlがあるわけで はない) • オフィシャルのステップは、コマンドそ のものではなく、ラッパースクリプトをかま している
  45. 45. 問題 • 正しいディレクトリにcdできれば… • あれ、どうやって任意のコマンドを実行 するの? • まさか… イメージをそのために作る?
  46. 46. そもそも…
  47. 47. デバッグどうするの • lsしたりenvしたり、環境を確認したい • 適時echoをはさんだりしたい • 主コマンド以外どうやって実行するの?
  48. 48. entrypoint - name: gcr.io/cloud-builders/glide entrypoint: …
  49. 49. entrypoint - name: gcr.io/cloud-builders/glide entrypoint: …
  50. 50. entrypoint docker run —entrypoint=… image
  51. 51. entrypoint docker run —entrypoint=… image
  52. 52. 愚痴 • entrypointについて、ビルドステップの ドキュメントに一切説明がない (https:// cloud.google.com/container-builder/docs/build-config) • APIの説明まで行くと解説がある (https:// cloud.google.com/container-builder/docs/api/reference/ rest/v1/projects.builds#Build)
  53. 53. entrypoint=bash - name: gcr.io/cloud-builders/glide entrypoint: bash args: — -c — | echo “Hello, World!”
  54. 54. entrypoint=bash - name: gcr.io/cloud-builders/glide entrypoint: bash args: — -c — | echo “Hello, World!” bash -cを通して任意 のスクリプトを実行で きるのじゃ!
  55. 55. cd && glide installでいいと思った? 残念でした!
  56. 56. 問題 • cd … && glide install はだめ • 「正しいGoのファイル配置」をゴニョゴニョして あげる必要がある
  57. 57. OSS FTW
  58. 58. glide Dockerfile FROM gcr.io/cloud-builders/go:debian RUN GOPATH=/go && curl https://glide.sh/get | sh COPY glide.bash /builder/bin/ ENV PATH=/builder/bin:$PATH ENTRYPOINT ["glide.bash"]
  59. 59. glide Dockerfile FROM gcr.io/cloud-builders/go:debian RUN GOPATH=/go && curl https://glide.sh/get | sh COPY glide.bash /builder/bin/ ENV PATH=/builder/bin:$PATH ENTRYPOINT ["glide.bash"]
  60. 60. glide Dockerfile . /builder/prepare_workspace.inc prepare_workspace || exit /go/bin/glide "$@"
  61. 61. glide Dockerfile . /builder/prepare_workspace.inc prepare_workspace || exit /go/bin/glide "$@"
  62. 62. 問題 • cd … && glide.bashもだめ • /workspace直下にいる事を前提としたスクリプト になっている…
  63. 63. 正解 - name: gcr.io/cloud-builders/glide id: glide:myrep env: - PROJECT_ROOT=myproject/myrepo entrypoint: bash args: - '-c' - | . /builder/prepare_workspace.inc prepare_workspace || exit cd subdirectory /go/bin/glide install
  64. 64. 正解 - name: gcr.io/cloud-builders/glide id: glide:myrep env: - PROJECT_ROOT=myproject/myrepo entrypoint: bash args: - '-c' - | . /builder/prepare_workspace.inc prepare_workspace || exit cd subdirectory /go/bin/glide install glide.bashをバラして 自分で記述したの じゃ!
  65. 65. ここまでのおさらい • ステップはイメージ • 認証関連は KMS 使おう • イメージの中では主コマンド実行以外にも色々やっている • デバッグはentrypoint=bash • 主コマンド以外色々やりたかったらentrypoint=bash
  66. 66. これだけでやりたい事は ほぼ全てできるはずです
  67. 67. その他細かいこと
  68. 68. 変数 • 全てのユーザ変数は “_”で始まる必要がある • 展開がわかりにくいので、「なるたけ使わな い」が吉と見た。
  69. 69. .ssh/configを設定する - name: 'gcr.io/cloud-builders/git' entrypoint: bash args: - '-c' - | chmod 600 /root/.ssh/id_ed25519 cat <<EOF >/root/.ssh/config Hostname gitlab.com IdentityFile /root/.ssh/id_ed25519 EOF mv known_hosts /root/.ssh/known_hosts volumes: - name: 'ssh' path: /root/.ssh
  70. 70. .ssh/configを設定する - name: 'gcr.io/cloud-builders/git' entrypoint: bash args: - '-c' - | chmod 600 /root/.ssh/id_ed25519 cat <<EOF >/root/.ssh/config Hostname gitlab.com IdentityFile /root/.ssh/id_ed25519 EOF mv known_hosts /root/.ssh/known_hosts volumes: - name: 'ssh' path: /root/.ssh このコンテナを使う 意味は特にないぞ い。
  71. 71. .ssh/configを設定する - name: 'gcr.io/cloud-builders/git' entrypoint: bash args: - '-c' - | chmod 600 /root/.ssh/id_ed25519 cat <<EOF >/root/.ssh/config Hostname gitlab.com IdentityFile /root/.ssh/id_ed25519 EOF mv known_hosts /root/.ssh/known_hosts volumes: - name: 'ssh' path: /root/.ssh よくあるヤツじゃ。
  72. 72. .ssh/configを設定する - name: 'gcr.io/cloud-builders/git' entrypoint: bash args: - '-c' - | chmod 600 /root/.ssh/id_ed25519 cat <<EOF >/root/.ssh/config Hostname gitlab.com IdentityFile /root/.ssh/id_ed25519 EOF mv known_hosts /root/.ssh/known_hosts volumes: - name: 'ssh' path: /root/.ssh このファイルも/root/.ssh で後ほど使うのでマウント じゃ。
  73. 73. スクリプトで複数ステップ • デプロイは gcloud, gsutil, helm, kubectlをいっぺんに 使ったスクリプトを使いたい • GCBには個別のイメージはあるが、全部一緒のものはない
  74. 74. 自分で作ればよし!
  75. 75. スクリプト実行 - name: asia.gcr.io/$PROJECT_ID/cloud-sdk entrypoint: bash args: - -c - | cd myrepo ./deploy/scripts/deploy.sh
  76. 76. スクリプト実行 - name: asia.gcr.io/$PROJECT_ID/cloud-sdk entrypoint: bash args: - -c - | cd myrepo ./deploy/scripts/deploy.sh 自分で作ったイメー ジじゃ
  77. 77. スクリプト実行 - name: asia.gcr.io/$PROJECT_ID/cloud-sdk entrypoint: bash args: - -c - | cd myrepo ./deploy/scripts/deploy.sh この中で色々使うの じゃ。
  78. 78. イメージの準備 FROM alpine:3.6 AS helm RUN apk add --update --no-cache ca-certificates git ENV FILENAME helm-v2.7.2-linux-amd64.tar.gz RUN apk add --update -t deps curl tar gzip RUN curl -L http://storage.googleapis.com/kubernetes-helm/${FILENAME} | tar zxv -C /tmp FROM google/cloud-sdk:alpine COPY --from=helm /tmp/linux-amd64/helm /bin/helm RUN gcloud components install kubectl docker-credential-gcr gsutil
  79. 79. イメージの準備 FROM alpine:3.6 AS helm RUN apk add --update --no-cache ca-certificates git ENV FILENAME helm-v2.7.2-linux-amd64.tar.gz RUN apk add --update -t deps curl tar gzip RUN curl -L http://storage.googleapis.com/kubernetes-helm/${FILENAME} | tar zxv -C /tmp FROM google/cloud-sdk:alpine COPY --from=helm /tmp/linux-amd64/helm /bin/helm RUN gcloud components install kubectl docker-credential-gcr gsutil マルチステージDockerfile でまずhelmを取得しておい て、あとでコピーじゃ
  80. 80. イメージの準備 FROM alpine:3.6 AS helm RUN apk add --update --no-cache ca-certificates git ENV FILENAME helm-v2.7.2-linux-amd64.tar.gz RUN apk add --update -t deps curl tar gzip RUN curl -L http://storage.googleapis.com/kubernetes-helm/${FILENAME} | tar zxv -C /tmp FROM google/cloud-sdk:alpine COPY --from=helm /tmp/linux-amd64/helm /bin/helm RUN gcloud components install kubectl docker-credential-gcr gsutil こちらではすでにビル ドされているcloud- sdkをまるっと使うぞ
  81. 81. イメージの準備 FROM alpine:3.6 AS helm RUN apk add --update --no-cache ca-certificates git ENV FILENAME helm-v2.7.2-linux-amd64.tar.gz RUN apk add --update -t deps curl tar gzip RUN curl -L http://storage.googleapis.com/kubernetes-helm/${FILENAME} | tar zxv -C /tmp FROM google/cloud-sdk:alpine COPY --from=helm /tmp/linux-amd64/helm /bin/helm RUN gcloud components install kubectl docker-credential-gcr gsutil kubectl等もこのタイ ミングでgcloudからイ ンストールじゃ
  82. 82. イメージの準備 FROM alpine:3.6 AS helm RUN apk add --update --no-cache ca-certificates git ENV FILENAME helm-v2.7.2-linux-amd64.tar.gz RUN apk add --update -t deps curl tar gzip RUN curl -L http://storage.googleapis.com/kubernetes-helm/${FILENAME} | tar zxv -C /tmp FROM google/cloud-sdk:alpine COPY --from=helm /tmp/linux-amd64/helm /bin/helm RUN gcloud components install kubectl docker-credential-gcr gsutil gcr.ioにpushするなら これをいれておくとよ いぞ!
  83. 83. GCB奥義
  84. 84. ローカル環境で実行
  85. 85. CIで開発の憂鬱 • ジョブを送る → 待つ • 失敗する • 手元に環境がないので適当にあたりをつ けてデバッグ用コードをしこむ • 最初に戻る
  86. 86. 待つの辛い (一度gitlabで10時間待たされた…)
  87. 87. GCB • ほとんど待ち時間はない • が、リソースを消費する • デバッグならローカルでてきたほうが嬉しい
  88. 88. ローカルで動くGCB gcloud components install container-builder-local
  89. 89. ここまで説明してきた事が 全部ローカルで実行可能! 最高です
  90. 90. まとめ
  91. 91. The Good Parts • ローカル環境で爆速で開発できる • ローカル環境で爆速で開発できる(2回目) • 下手にCIサービスのキャッシュとかに振り 回されるより効率的な環境を作れる • Googleのサービスと絡めやすい
  92. 92. The Bad Parts • Moving Partsが増える • コンテナイメージの管理等 • UIとはなんだったのか • ドキュメントとはなんだったのか • entrypointのトリックを知らないとデバッグ が無理
  93. 93. Questions?
  94. 94. 参考 • https://medium.com/@lestrrat/taming-google- container-builder-22a6dded155c

×