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然後架構在同一個叢集上
建立叢集的部分就不多談,依照介面上提示選擇節點數以及機器規格就行了
接著,建立php7.3-fpm Deployment 用來Run PHP的核心
進入叢集後點選”部署”,在容器的部分選擇上一篇文章中上傳到GCR的docker_compose_php73_laravel_build 最新版
接著,下一頁編輯應用程式名稱以及namespace,namespace很重要最後在做Rolling update時會用上
等待部署完畢後,接著必須把php73-fpm建立服務才能夠給其他Deployment使用,點選”公開”
有幾個地方要注意,php-fpm預設port在9000,所以必須要把9000 port公開出來,另外因為php-fpm並沒有要提供叢集外的對外服務,因此只要服務類型選擇”叢集IP”即可,不用掛平衡器
最後命名是最重要的步驟,Nginx config中已經設定好PHP 會Pass到php73:9000,因此命名必須要正確
完成php-fpm的部署後,接著是nginx
nginx的部分跟php相同,使用上一篇上傳到GCR的image,要注意的只有namespace需要填入與php-fpm相同的值
nginx部署完成後,相同需要公開service才能夠提供服務
nginx就必須提供對外服務了,所以port的部分選擇80,服務類型選擇”負載平衡器”
最後,其實步驟都已經完成了,回過頭來看一下nginx中的config,重點是設定好root以及fastcgi_pass php73:9000
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 |
server { listen 80 default_server; server_name _; root /var/project/public; index index.html index.htm index.php; charset utf-8; location / { try_files $uri $uri/ /index.php?$query_string; } access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; error_page 404 /index.php; sendfile off; location ~\.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass php73:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #fastcgi_param DB_HOST mysql56; } location ~ /\.ht { deny all; } client_max_body_size 120M; } |
另一方面,在nginx的Dockerfile中也必須加入把config複製到image內
1 2 3 4 |
FROM virtualorz/dev_compose_nginx COPY . /var/project COPY ./dockerfiles/dockerfile_for_nginx/default.conf /etc/nginx/conf.d/default.conf |
php-fpm 的部分也需要注意一下 dockerfile,因為git上的資料不包含 .env 檔以及 composer 資料,因此需要加入以下
1 2 3 4 5 6 7 |
COPY ./.env.example /var/project/.env RUN cd /var/project && composer install RUN cd /var/project && php artisan key:generate RUN chown -R www-data:www-data \ /var/project/storage \ /var/project/bootstrap/cache |
以上步驟就可以透過nginx的負載平衡器IP連線到Laravel網站了
二. 透過Drone執行rolling update
概念上是這樣子的,當程式碼更新後git push到git hub後Drone會自動build image並且更新Deployment到新版的image
首先,要使用的Drone Plugin為Kubernetes Deployments
根據官方文件上的資訊,我們需要下列幾項參數
1 2 3 4 5 6 7 |
kubernetes_server kubernetes_token namespace deployment repo container tag |
但是文件中並沒有辦法很清楚的讓我這種新手了解資訊可以從哪邊挖出來,下面我會詳細說明
1.kubernetes_server
回到叢集中把cloud shell打開,透過指令
1 |
kubectl config view |
內容中就可以找到資訊
2.kubernetes_token
第一步的指令中也可以找到kubernetes_token,但是24小時後就會失效,我們需要另外建立kubernetes_token
與第一步相同的是,在cloud sehell中執行以下指令,其中$NAMESPACE就是我們在佈建Deployment時填入的namespace
$ROLEBINDING_NAME為自定義名稱
1 |
kubectl create rolebinding $ROLEBINDING_NAME --clusterrole=admin --serviceaccount=$NAMESPACE:default --namespace=$NAMESPACE |
接著用指令來顯示token
1 |
kubectl describe secret $ROLEBINDING_NAME |
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規格內找到
6.tag
要替換的image tag,這邊注意不要填lastst,每次上傳到GCR可以自訂tag,請輸入相對應的tag就行
所以.drone.yml 中的steps大概會像這樣子
1 2 3 4 5 6 7 8 9 10 |
- name: k8s_nginx_deployee image: quay.io/honestbee/drone-kubernetes settings: kubernetes_server: https://XX.XX.XX.XX kubernetes_token: YOUR_TOKEN namespace: laravel deployment: nginx-1 repo: asia.gcr.io/PROJECT_NAME/docker_compose_nginx_build container: docker-compose-nginx-build-sha256-1 tag: 0.888 |
如此一來,結合上一篇就可做到git push Drone 自動 Rolling update了