GitHub + Cloud Build + ArgoCD でGKEにデプロイする

以下の仕組みを実現します。

  1. アプリケーションのコードを GitHub にプッシュすると、GCP の Cloud Build が自動で実行されます
  2. GCP の Cloud Build の処理でアプリケーションの Docker イメージを作成します
  3. GCP の Cloud Build の処理で GCP の Container Registry に作成した Docker イメージをプッシュします
  4. GCP の Cloud Build の処理で GitHub のマニフェストリポジトリの Docker イメージタグを更新してプッシュします
  5. ArgoCD がマニフェストリポジトリの変更を検知して自動で Sync します

準備

アプリケーション用のリポジトリを GitHub に用意しておきます

ArgoCD のマニフェスト用のリポジトリを GitHub に用意しておきます

go-hello/base/kustomization.yaml
1
2
3
4
5
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- deployment.yaml
go-hello/base/deployment.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: apps/v1
kind: Deployment
metadata:
name: go-hello
spec:
replicas: 1
selector:
matchLabels:
app: go-hello
template:
metadata:
labels:
app: go-hello
spec:
containers:
- name: go-hello
image: gcr.io/cocotola/go-hello:latest
imagePullPolicy: Always
ports:
- name: http-server
containerPort: 8080
go-hello/overlays/develop/deployment.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: apps/v1
kind: Deployment
metadata:
name: go-hello
spec:
replicas: 1
template:
spec:
containers:
- name: go-hello
env:
- name: APP_ENV
value: develop
go-hello/overlays/develop/kustomization.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: cocotola

resources:
- ../../base

patchesStrategicMerge:
- deployment.yaml

images:
- name: gcr.io/cocotola/go-hello
newName: gcr.io/cocotola/go-hello
newTag: latest

GKE に ArgoCD をインストールしておきます

https://argoproj.github.io/argo-cd/

admin のパスワードの確認方法
1
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
ポートフォワードでアクセスする方法
1
kubectl port-forward svc/argocd-server -n argocd 8080:443

本題

GitHub と Cloud Build の連携

GitHub マーケットプレイスで Google Cloud Build を有効にします
https://github.com/marketplace/google-cloud-build

GCP のトリガーリストビューでCONNECT REPOSITORY(リポジトリを接続)をクリックしてトリガーを設定します
https://console.cloud.google.com/cloud-build/triggers

Cloud Build の処理で Docker イメージを作成して ContainerRegistry にプッシュします

1
2
3
4
5
6
7
8
9
10
11
12
13
steps:
- name: gcr.io/cloud-builders/go
env: ["PROJECT_ROOT=app"]
args: ["build", "-o", "app"]

- name: "gcr.io/cloud-builders/docker"
args: ["build", "-t", "gcr.io/$PROJECT_ID/go-hello:$SHORT_SHA", "."]

- name: "gcr.io/cloud-builders/docker"
id: Push
args:
- "push"
- "gcr.io/$PROJECT_ID/go-hello:$SHORT_SHA"

Cloud Build の処理でマニフェストリポジトリのイメージタグを更新してプッシュします

まずは CloudBuild 上で GitHub のリポジトリをアクセスできるように設定します
https://cloud.google.com/build/docs/access-private-github-repos#costs

手順の流れは以下の通り

  1. ローカルで SSH Key を作成する
  2. 作成した公開鍵を GitHub のマニフェストリポジトリに設定する。このとき書き込み権限を設定すること
  3. 作成した秘密鍵を GCP の Secret Manager に設定する。シークレット名をメモしておく
  4. GCP に登録したシークレットの設定を cloudbuild.yaml に追記する

Secret Manager はこちら
https://console.cloud.google.com/security/secret-manager

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
steps:
- name: gcr.io/cloud-builders/go
env: ["PROJECT_ROOT=app"]
args: ["build", "-o", "app"]

- name: "gcr.io/cloud-builders/docker"
args: ["build", "-t", "gcr.io/$PROJECT_ID/go-hello:$SHORT_SHA", "."]

- name: "gcr.io/cloud-builders/docker"
id: Push
args:
- "push"
- "gcr.io/$PROJECT_ID/go-hello:$SHORT_SHA"

- name: "gcr.io/cloud-builders/git"
secretEnv: ["SSH_KEY"]
entrypoint: "bash"
args:
- -c
- |
echo "$$SSH_KEY" >> /root/.ssh/id_rsa
chmod 400 /root/.ssh/id_rsa
cp known_hosts.github /root/.ssh/known_hosts
volumes:
- name: "ssh"
path: /root/.ssh

- name: "gcr.io/cloud-builders/git"
entrypoint: "bash"
args:
- -c
- |
git config --global user.email "cloudbuild@kujilabo.com"
git config --global user.email "cloudbuild"

- name: "gcr.io/cloud-builders/git"
args:
- clone
- --recurse-submodules
- git@github.com:kujilabo/kujilabo-manifests.git
volumes:
- name: "ssh"
path: /root/.ssh

- name: "gcr.io/cloud-builders/git"
dir: "kujilabo-manifests"
args:
- checkout
- master

- name: "gcr.io/cloud-builders/git"
entrypoint: "bash"
args:
- -c
- |
ls

- name: "gcr.io/cloud-builders/git"
dir: "kujilabo-manifests/go-hello/overlays/develop"
entrypoint: "bash"
args:
- -c
- |
ls

- name: "gcr.io/$PROJECT_ID/kustomize"
dir: "kujilabo-manifests/go-hello/overlays/develop"
args:
- "edit"
- "set"
- "image"
- "gcr.io/cocotola/go-hello=gcr.io/$PROJECT_ID/go-hello:$SHORT_SHA"
env:
- "APPLY=false"
- "CLOUDSDK_COMPUTE_ZONE=asia-northeast1-a"
- "CLOUDSDK_CONTAINER_CLUSTER=k8s-cluster"
- "GCLOUD_PROJECT=cocotola"

- name: "gcr.io/cloud-builders/git"
dir: "kujilabo-manifests"
args:
- add
- .

- name: "gcr.io/cloud-builders/git"
dir: "kujilabo-manifests"
args:
- commit
- -m
- "Update $SHORT_SHA"

- name: "gcr.io/cloud-builders/git"
dir: "kujilabo-manifests"
args:
- push
- origin
- master
volumes:
- name: "ssh"
path: /root/.ssh

availableSecrets:
secretManager:
- versionName: projects/$PROJECT_ID/secrets/go-hello-secret/versions/latest
env: "SSH_KEY"

ArgoCD の自動 Sync

ENABLE AUTO-SYNC すればよいだけなので省略します

参考にさせてもらったページ

https://qiita.com/hayashiki/items/c7ee780f8b4afde38a53

https://cloud.google.com/build/docs/access-private-github-repos#costs