Drone 自動打包Laravel imgae rolling update 到GKE上

上篇提到如何將打包好的image上傳到GCR上,接著有了image我們拿來部署到Kubernetes上

如果你還沒看過之前的文章請先閱讀:

第一篇 : Drone 自動打包Laravel imgae 並上傳到docker hub上

第二篇 : Drone 自動打包Laravel imgae 並上傳到Google Cloud Registry(GCR)上

其他參考文件 :

https://kubernetes.io/docs/tasks/administer-cluster/access-cluster-api/

http://plugins.drone.io/mactynow/drone-kubernetes/

https://ithelp.ithome.com.tw/articles/10226404

https://jimmysong.io/kubernetes-handbook/guide/auth-with-kubeconfig-or-token.html

先說說今天要達成的目的有兩個

一是建立Kupernetes叢集並部署Nginx+php7.3-fpm 跑Laravel專案

二是當程式碼更新後,透過Drone重新打包image並且rolling update到Kubernetes Deployment上

一. 建立Kubernetes Laravel可運行環境

一開始先來看一下kubernetes結構會長什麼樣子

基本上就是php + nginx 分別在兩個Deployment然後架構在同一個叢集上

kubernetes laravel

建立叢集的部分就不多談,依照介面上提示選擇節點數以及機器規格就行了

Drone rolling update

接著,建立php7.3-fpm Deployment 用來Run PHP的核心

進入叢集後點選”部署”,在容器的部分選擇上一篇文章中上傳到GCR的docker_compose_php73_laravel_build 最新版

Drone rolling update

接著,下一頁編輯應用程式名稱以及namespace,namespace很重要最後在做Rolling update時會用上

Drone rolling update

等待部署完畢後,接著必須把php73-fpm建立服務才能夠給其他Deployment使用,點選”公開”

Drone rolling update

有幾個地方要注意,php-fpm預設port在9000,所以必須要把9000 port公開出來,另外因為php-fpm並沒有要提供叢集外的對外服務,因此只要服務類型選擇”叢集IP”即可,不用掛平衡器

最後命名是最重要的步驟,Nginx config中已經設定好PHP 會Pass到php73:9000,因此命名必須要正確

Drone rolling update

完成php-fpm的部署後,接著是nginx

nginx的部分跟php相同,使用上一篇上傳到GCR的image,要注意的只有namespace需要填入與php-fpm相同的值

Drone rolling update

nginx部署完成後,相同需要公開service才能夠提供服務

nginx就必須提供對外服務了,所以port的部分選擇80,服務類型選擇”負載平衡器”

Drong rolling update

最後,其實步驟都已經完成了,回過頭來看一下nginx中的config,重點是設定好root以及fastcgi_pass php73:9000

另一方面,在nginx的Dockerfile中也必須加入把config複製到image內

php-fpm 的部分也需要注意一下 dockerfile,因為git上的資料不包含 .env 檔以及 composer 資料,因此需要加入以下

以上步驟就可以透過nginx的負載平衡器IP連線到Laravel網站了

二. 透過Drone執行rolling update

概念上是這樣子的,當程式碼更新後git push到git hub後Drone會自動build image並且更新Deployment到新版的image

首先,要使用的Drone Plugin為Kubernetes Deployments

根據官方文件上的資訊,我們需要下列幾項參數

但是文件中並沒有辦法很清楚的讓我這種新手了解資訊可以從哪邊挖出來,下面我會詳細說明

1.kubernetes_server

回到叢集中把cloud shell打開,透過指令

內容中就可以找到資訊

2.kubernetes_token

第一步的指令中也可以找到kubernetes_token,但是24小時後就會失效,我們需要另外建立kubernetes_token

與第一步相同的是,在cloud sehell中執行以下指令,其中$NAMESPACE就是我們在佈建Deployment時填入的namespace

$ROLEBINDING_NAME為自定義名稱

接著用指令來顯示token

2.namespace

就是剛剛我們部署php-fpm以及nginx時所輸入的namespace

3.deployment

就是剛剛我們部署php-fpm以及nginx時所輸入的名稱

4.repo

就是要更新上去的新image,如果還記得上一篇如何推上GCR應該還可以找到

以台灣為例 : asia.gcr.io/PROJECT_NAME/IMAGE_NAME

5.container

containter名稱可以在deployment中的”詳細資料” Pod規格內找到

Drone rolling update

6.tag

要替換的image tag,這邊注意不要填lastst,每次上傳到GCR可以自訂tag,請輸入相對應的tag就行

所以.drone.yml 中的steps大概會像這樣子

如此一來,結合上一篇就可做到git push Drone 自動 Rolling update了