お題
前回は、GKEに乗せるサンプルアプリをGoで実装した。
ローカルでDockerコンテナとしてrunしてアクセスできるところまでは確認したので、今回こそはGKEでといきたいところだけど、
このアプリをどうやってGKEに乗せる?
というわけで、最近レイアウト(及びラインナップ)の変わったGCPの「プロダクトとサービス」を見てみる。
GKEもだけど、SpannerやStackdriver Kubernetes Monitoringというのがアピールされていて、ものすごく気になる。
が、今日のお題はそこではないので、デベロッパーツールのカテゴリを見る。
はい、↓このあたりが使えそう。
- Container Registry ... Docker コンテナ イメージを保存、管理、保護します。
- Cloud Build ... 継続的なビルド、テスト、デプロイを実現します。
- Cloud Source Repositories ...チームが一元的にコードを保存、管理、追跡できる場所。
想定だけど、今GitHubに置いてあるリポジトリをCloud Source Repositories(以後、「CSR」と略す)に移動し、
Cloud Build(以後、「GCB」と略す)を使ってdocker buildして、出来たイメージをContainer Registry(以後、「GCR」と略す)に保存。
GCRにイメージがあれば、GKEではdeploymentを書くことでGCRからイメージをpullしてきて、それをPodに入れることができた、はず。
※GCB使うとGitHubにソースがあるままでビルドできるようだけど、せっかくだからCSRも使う。
環境
前回と同じ。
前提
- 自前でGCPプロジェクトは契約済み
- gcloudをローカルで使える状態になっている
実践
Cloud Source Repositories
単純にCSR上にGitHubにあるものと同じリポジトリを作ってソースをコピーしようかと思ったけど、↓によると、うまいこと連携できる様子。
https://cloud.google.com/source-repositories/docs/connecting-hosted-repositories
(1)まずCSR上にリポジトリを作る
(2)次にGitHubの自分のアカウントに接続
(3)連携したいリポジトリを選択
GitHub上のリポジトリと同じファイル群が並ぶ
Dockerfileの中身も見れる
(4)ローカルでGitHubのリポジトリのソースを修正してGitHubにプッシュ
(5)すると、CSR上にも変更内容が反映されている
Cloud Build
CSRにソースは入ったので、CSRへのプッシュをトリガーに、docker buildしてGCRにイメージをプッシュするビルドを作る。
Dockerを扱う手順は下記を参考にする。
https://cloud.google.com/cloud-build/docs/quickstart-docker
(1)まずはもともとリポジトリに用意してあるDockerfileを使ってビルド、そしてGCRにプッシュ
これは、ローカル上。
※↓の【PROJECT_ID】の部分は自分のGCPプロジェクトのプロジェクトIDを入れる。
$ pwd
$ ls -la
合計 104
drwxr-xr-x 4 koge koge 4096 9月 15 02:49 .
drwxr-xr-x 11 koge koge 4096 9月 12 23:19 ..
drwxr-xr-x 8 koge koge 4096 9月 15 03:08 .git
-rw-r--r-- 1 koge koge 202 9月 13 00:04 .gitignore
-rw-r--r-- 1 koge koge 555 9月 15 02:49 Dockerfile
-rw-r--r-- 1 koge koge 2047 9月 13 00:03 Gopkg.lock
-rw-r--r-- 1 koge koge 790 9月 13 00:03 Gopkg.toml
-rw-r--r-- 1 koge koge 3472 9月 13 00:49 README.md
-rw-rw-r-- 1 koge koge 644 9月 13 00:27 main.go
-rw-rw-r-- 1 koge koge 63491 9月 13 00:46 postman.png
drwxr-xr-x 5 koge koge 4096 9月 13 00:03 vendor
$
$ gcloud builds submit --tag gcr.io/【PROJECT_ID】/go-webapi-for-gke-study .
Creating temporary tarball archive of 6 file(s) totalling 69.3 KiB before compression.
Some files were not included in the source upload.
Check the gcloud log [/home/koge/.config/gcloud/logs/2018.09.15/03.13.11.394727.log] to see which files and the contents of the
default gcloudignore file used (see `$ gcloud topic gcloudignore` to learn
more).
Uploading tarball of [.] to [gs://【PROJECT_ID】_cloudbuild/source/1536948791.71-72d2e1ad5c3749c3b2bcaf294dfdb49e.tgz]
ERROR: (gcloud.builds.submit) FAILED_PRECONDITION: service account "806987825204@cloudbuild.gserviceaccount.com" has insufficient permission to execute the build on project "【PROJECT_ID】"
ん? サービスアカウント「806987825204@cloudbuild.gserviceaccount.com」にビルド権限が付いていないとのこと。
(2)サービスアカウントにビルド権限を付与
はい、付いた。
(3)気を取り直して、もう一度、ビルド
$ gcloud builds submit --tag gcr.io/【PROJECT_ID】/go-webapi-for-gke-study .
Creating temporary tarball archive of 6 file(s) totalling 69.3 KiB before compression.
Some files were not included in the source upload.
Check the gcloud log [/home/koge/.config/gcloud/logs/2018.09.15/03.33.27.646782.log] to see which files and the contents of th
default gcloudignore file used (see `$ gcloud topic gcloudignore` to learn
more).
Uploading tarball of [.] to [gs://【PROJECT_ID】_cloudbuild/source/1536950007.68-48339507e1154a88812b584b2401ff9f.tgz]
Created [https://cloudbuild.googleapis.com/v1/projects/【PROJECT_ID】/builds/681880cd-5725-4589-93f4-09248a2f8fbb].
Logs are available at [https://console.cloud.google.com/gcr/builds/681880cd-5725-4589-93f4-09248a2f8fbb?project=806987825204].
---------------------------------------------------------------------------- REMOTE BUILD OUTPUT ----------------------------------------------------------------------------
starting build "681880cd-5725-4589-93f4-09248a2f8fbb"
FETCHSOURCE
Fetching storage object: gs://【PROJECT_ID】_cloudbuild/source/1536950007.68-48339507e1154a88812b584b2401ff9f.tgz#1536950013656896
Copying gs://【PROJECT_ID】_cloudbuild/source/1536950007.68-48339507e1154a88812b584b2401ff9f.tgz#1536950013656896...
/ [1 files][ 62.5 KiB/ 62.5 KiB]
Operation completed over 1 objects/62.5 KiB.
BUILD
Already have image (with digest): gcr.io/cloud-builders/docker
Sending build context to Docker daemon 76.8kB
Step 1/9 : FROM "sky0621dhub/dockerfile-gowithdep" AS builder
latest: Pulling from sky0621dhub/dockerfile-gowithdep
c73ab1c6897b: Pulling fs layer
1ab373b3deae: Pulling fs layer
〜省略〜
f64db6c96f10: Pull complete
629e65f65eb5: Pull complete
Digest: sha256:64a905eeacc62530de17940039c6a65096cc2b2568feb42b4cfaa5b0f12e5ba9
Status: Downloaded newer image for sky0621dhub/dockerfile-gowithdep:latest
---> 34ac64e9d330
Step 2/9 : COPY . /go/src/github.com/sky0621/go-webapi-for-gke-study
---> 598877980113
Step 3/9 : WORKDIR /go/src/github.com/sky0621/go-webapi-for-gke-study
Removing intermediate container 3437c261bdbf
---> 38d20f9acc31
Step 4/9 : RUN dep ensure
---> Running in b59bd35db687
Removing intermediate container b59bd35db687
---> 46706ce5e6ac
Step 5/9 : RUN CGO_ENABLED=0 go build -o go-webapi-for-gke-study github.com/sky0621/go-webapi-for-gke-study
---> Running in c0c554f1476a
Removing intermediate container c0c554f1476a
---> e827ea3a214b
Step 6/9 : FROM scratch
--->
Step 7/9 : COPY --from=builder /go/src/github.com/sky0621/go-webapi-for-gke-study/ .
---> f6eaed172133
Step 8/9 : EXPOSE 80
---> Running in 9802fc7cbf7a
Removing intermediate container 9802fc7cbf7a
---> a5f60d73eae9
Step 9/9 : ENTRYPOINT [ "./go-webapi-for-gke-study" ]
---> Running in d57c6d17a055
Removing intermediate container d57c6d17a055
---> 4d0f24ae4c0a
Successfully built 4d0f24ae4c0a
Successfully tagged gcr.io/【PROJECT_ID】/go-webapi-for-gke-study:latest
PUSH
Pushing gcr.io/【PROJECT_ID】/go-webapi-for-gke-study
The push refers to repository [gcr.io/【PROJECT_ID】/go-webapi-for-gke-study]
50928a922a9b: Preparing
50928a922a9b: Pushed
latest: digest: sha256:bed118ff9ee50c422013c044e7f2370466a05250f81be4aa077977b343d47f1a size: 528
DONE
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ID CREATE_TIME DURATION SOURCE IMAGES STATUS
681880cd-5725-4589-93f4-09248a2f8fbb 2018-09-14T18:33:34+00:00 59S gs://【PROJECT_ID】_cloudbuild/source/1536950007.68-48339507e1154a88812b584b2401ff9f.tgz gcr.io/【PROJECT_ID】/go-webapi-for-gke-study (+1 more) SUCCESS
はい、今度は成功。
(4)もうひとつの手順であるCloud Build設定ファイルを使ってのビルドも試す
設定ファイルはこんな感じ。
$ cat cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/docker'
args: [ 'build', '-t', 'gcr.io/$PROJECT_ID/go-webapi-for-gke-study', '.' ]
images:
- 'gcr.io/$PROJECT_ID/go-webapi-for-gke-study'
で、この設定ファイルを使ってビルドしてみる。
$ gcloud builds submit --config cloudbuild.yaml .
Creating temporary tarball archive of 7 file(s) totalling 69.5 KiB before compression.
Some files were not included in the source upload.
〜省略〜
latest: digest: sha256:76fa6d2ebe904dbe6fbfb65acf7cbc7cfc59d38e3e53428382495b0d3fb103de size: 528
DONE
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ID CREATE_TIME DURATION SOURCE IMAGES STATUS
802fc106-c0aa-40c5-8dff-e1c3017767be 2018-09-14T19:04:37+00:00 56S gs://【PROJECT_ID】_cloudbuild/source/1536951874.48-aa62a35281c4492c85123de5cfe999d8.tgz gcr.io/【PROJECT_ID】/go-webapi-for-gke-study (+1 more) SUCCESS
成功。
Container Registry
コンソール上では成功のログは出ていたので、実際にコンテナイメージが格納されているか確認
ちゃんと2回分、入ってる。
まとめ
そういえば、ビルドはソースのプッシュをトリガーにしたいと思っていたんだった。
https://cloud.google.com/cloud-build/docs/running-builds/automate-builds
↑でできるようだけど、ベータ版。いったん静観。というか、今日は時間切れ。
次回こそは、GKE。。。