這次想做到的是:推code後,可以直接更新GKE裡面的pod
所以流程應該是這樣
推code[1] → Source Repository[2] → trigger Cloud Build[3] → push to Container Registry[4] → kubectl set image(rolling update)[5]
以上若有不懂可以拉到最下面有名詞解釋
事前準備&環境說明
本篇用到的資訊都可以在
https://github.com/sasapan33/gcp-test/tree/master/CloudBuildNode 找到
環境
run一個node express的Hello World
用webpack Build
事前設定
請先確認你所在的環境可以使用gcloud指令。
若無法使用請參考 https://cloud.google.com/sdk/docs/initializing?hl=zh-tw 去做設定
或可以直接使用cloud shell做你的環境也可以。
須先開啟一個GKE cluster,可利用 deploy1.yaml
直接作部署
參考語法(當然也可以直接到console去點點點做設定)
#create clustergcloud container clusters create "YOUR_CLUSTER_NAME"
--region "YOUR_REGION"
--machine-type "g1-small" --num-nodes "1" --enable-ip-alias
完成後就可以透過 deploy1.yaml
去部署pod
記得部署後要expose
參考語法
#grant權限後才能用kubectl指令gcloud container clusters get-credentials YOUR_CLUSTER_NAMEkubectl create -f deploy1.yamlkubectl expose deployment hello-cloud-build-1
--type=LoadBalancer --port 3000 --target-port 3000
步驟說明
[1] 推code
將上方的source code clone下來後推進source repositories
#create repogcloud source repos create hello-cloudbuild-app#git initgit remote add google "https://source.developers.google.com/p/YOUR_PROJECT_ID/r/hello-cloudbuild-app"git add .git commit -m "xx"git push google master:master
[2] Source Repositories
到專案內的source repositories裡面看有沒有推上去
[3] trigger Cloud Build
到console的 Cloud Build > Triggers
去create一個trigger
設定如下
Event:你什麼時候要觸發trigger
Source:若是直接使用source repositories,就可以直接從下拉式選單選
若要用github,則點選Connect new repository去做設定
Branch:針對哪個branch去做trigger
location:這裏要填的是你要cloud build的yaml的位址
因此如果你的yaml的位置跟我一樣不是在根目錄下的
則寫出整個路徑
ex: 以我的repo為例,就應該要寫成 /CloudBuildNode/CloudBuild.yaml
[4] push to Container Registry
yaml檔參數的詳細說明可以看這裡
https://cloud.google.com/cloud-build/docs/build-config
來解釋一下 CloudBuild.yaml
主要有五個步驟:
- npm install : 若跟我的repo一樣,package.json不是在根目錄的,必須設定
dir
屬性告訴Cloud Build你的設定檔放在哪個目錄裡面。 - npm build
- docker build (docker file在repo裡面有)
- docker push : 這裡直接用docker push是因為我接下來還要做kubectl set image,否則可以直接宣告
images
這個屬性就可以做docker push。 - kubectl set image:這裡有用到一個
waitFor
的屬性,意思是上面四個steps都做完後,這個steps才要做。
這個yaml檔滿容易理解的
比較困難的是找出每個step裡面正確的 name
來讓指令正確的跑
且這裡的step其實只要是bash的指令 Cloud Build都可以吃進去
算是十分強大 但沒有很好上手
[5] kubectl set image
最後就是透過kubectl set image來強制kubernetes刷新image
(其實這step不用做)
但提醒一個,node有一個權限要打開喲(如下圖)
這個設定在 Kubernetes Engine > Clusters > 點進去的 Node pool
在 Security > Access scopes
的 service control
請改為 Enabled
這個設定要打開後,才吃得到kubectl set image的異動唷~
然後更新pod囉~~~
使用心得
其實Cloud Build算是滿強大的
看起來是只要有辦法用指令去做的,都有辦法幫你build或deploy
但是有 先天上的硬限制,就是他的trigger機制
Cloud Build的trigger目前看起來只有三種:
- Github
- Bitbucket
- 當然還有自己家的Source Repositories
所以如果你是自己架Gitlab等等的其他種source code control工具
很抱歉你必須另外想辦法
名詞解釋
Cloud Build
這是對應AWS的Code Build+Code Deploy
原先以為只有Build的功能(因為他就叫Cloud Build咩)
後來實際上進去玩了之後發現他其實也有Deploy的功能
但很陽春,他只能用yaml或json檔控制
並沒有圖形化介面給你操作
Source Repository
GCP上的git,對應AWS的Code Commit
Container Registry
GCP上的docker hub,對應AWS的ECR Registry
以上為學習筆記,若有誤刊,或觀念不清楚的地方,請通知我!
謝謝