1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GKE試行(その2:「GitHub -> CSR へ。そしてGCBによりGCRへ」)

Last updated at Posted at 2018-09-14

お題

前回は、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上にリポジトリを作る

01.png
02.png

(2)次にGitHubの自分のアカウントに接続

03.png
04.png
05.png
06.png

(3)連携したいリポジトリを選択

07.png
GitHub上のリポジトリと同じファイル群が並ぶ
08.png
Dockerfileの中身も見れる
09.png

(4)ローカルでGitHubのリポジトリのソースを修正してGitHubにプッシュ

10.png

(5)すると、CSR上にも変更内容が反映されている

11.png

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)サービスアカウントにビルド権限を付与

01.png
02.png
03.png
04.png

はい、付いた。

(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

コンソール上では成功のログは出ていたので、実際にコンテナイメージが格納されているか確認
05.png
ちゃんと2回分、入ってる。

まとめ

そういえば、ビルドはソースのプッシュをトリガーにしたいと思っていたんだった。
https://cloud.google.com/cloud-build/docs/running-builds/automate-builds
↑でできるようだけど、ベータ版。いったん静観。というか、今日は時間切れ。
次回こそは、GKE。。。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?