一隻箱子裡的貓,看著電腦螢幕

Schrödinger's Programmer

奔跑吧工程師,趁年輕跑得越遠越好

伸縮自在的伺服器 01 自動配置 Auto Scaling

設定 GCP 上的 Auto Scaling 讓伺服器更加彈性

Ray

server

建立映像檔

首先要把指定的 VM 停止
接著在側邊欄找到儲存空間->映像檔點進去選擇建立映像檔
不要選成虛擬機器->機器映像檔不然等等就會鬼打牆選不到!
一開始自作聰明從 VM 那邊按建立機器映像檔就被送到這個異世界,卡了一下午

gcp create vm image

最簡單的判斷方式就是第一步的 VM 不要停止
建立映像檔的時候如果沒有提醒你要停止就是錯的

gcp vm image settings

照著提示把映像檔建立完成就可以進行下一步

建立執行個體範本 Instance templates

進入執行個體範本按下建立執行個體範本

硬體規則選擇

這邊是決定未來在執行個體群組內,每次啟動新的執行個體所需要的規格
所以設定的畫面長得跟在建立 VM 的時候的畫面很像
底下也有防火牆,如果是會用到 80 跟 443 port 的網路服務會就開起來

gcp instance template

選擇 VM 映像檔作為開機範本

不同的是這次我們要用剛剛建立過的映像檔作為範本!
所以在開機磁碟的地方按下變更->自訂映像檔並選擇剛剛建立的映像檔

gcp create instance template

啟動時自動執行指令

有些時候我們在新的 VM 啟動時需要運行一些指令把服務開啟,例如 docker
如果沒有再啟動時運行,你的 VM 就只是開了一台機器起來而不會運行 docker daemon

點開管理的摺疊內容,可以看到自動化的說明

您可以指定會在執行個體開機或重新啟動時執行的開機指令碼。開機指令碼可用來安裝軟體和更新項目,以及確保服務可在虛擬機器中順利運作

gcp instance start script

所以我們在區塊中加入指令,讓 VM 在使用範本啟動時將服務啟動

#! /bin/bash
sudo systemctl start docker
sudo docker start laravel-app nginx redis

sudo docker exec -i laravel-app /var/www/html/artisan migrate
sudo docker exec -i laravel-app /var/www/html/artisan l5-swagger:generate --all
sudo docker exec -i laravel-app /usr/bin/supervisord -c ./builds/docker/beta/php81/horizon.conf
sudo docker exec -i laravel-app /var/www/html/artisan queue:work &

官方文件:Using startup scripts on Linux VMs

建立執行個體群組 Instance Group

在觸發條件時,執行個體群組會依照剛剛設定的執行個體範本自動配置機器

首先開啟執行個體群組,按下建立執行個體群組

gcp create instance group

介面會看到左邊有三個選項,和網路上現有的文章都不一樣,大概是又改畫面了

  • New managed instance group (stateless)
  • New managed instance group (stateful)
  • New unmanaged instance group

其中只有managed instance group的兩個有 Auto Scaling 的功能
unmanaged instance group可以加入既有的 VM 執行個體,不需要先建立執行個體範本

參考文件:Using managed instance groups

選擇要使用的執行個體範本並制定 Auto Scaling 規則 完成後按下最下方建立就完成執行個體群組的建立以及 Auto Scaling 設定

gcp instance group settings

設定執行個體群組健康狀態檢查與自動修復

啟動新的執行個體我們要確定他是可用的
自動讓不可使用的執行個體關閉,並且開新的執行個體取代之

開啟執行個體群組的編輯頁面,下滑到自動修復區塊

gcp instance group health check

選擇建立健康健康狀態檢查並設定名稱以及其他設定
例如通訊協定選擇HTTP的話可以針對特定路由發送請求,預設的TCP則是單純確認傳輸正常

gcp instance group health check detail

完成之後就等他跑一下,接著回到執行個體群組詳細頁去查看
可以看到健康報告,沒意外是一切健康

gcp instance group health check result

輪動式更新 Rolling Update

當有新的映像檔建立後,需要先建立新的執行個體範本(Instance template)
我們需要回到執行個體群組編輯所使用的執行個體範本,這樣未來啟動新執行個體才會使用新的範本

修改後並不會直接重啟已經存在的執行個體,若是要達到線上服務無痛轉移
就是輪動式更新上場的時候!

執行個體群組選擇新建立的執行個體群組,並且按下UPDATE VMS
這個按鈕名字換來換去,就差不多位置找看看

gcp rolling update

接著選擇新的執行個體範本,並且更新設定中的Update type要選擇自動
否則只會在新啟動的 VM 套用新的範例,但是我們想要的是把既有的 VM 也替換成新的!

gcp instance group update

可以看到會使用新的執行個體範本啟動一個新的執行個體

gcp instance updating

當新的執行個體範本開啟完成之後,才會把舊的執行個體刪除
如此就達到不影響線上服務而達到無痛升級!

gcp instance update done

但是現在服務還不完整,執行個體群組還是個別的獨立主機
雖然具有自動擴展的能力可以增加主機數量,但也就只是增加可以個別連線的主機而已,並不能自動對請求作分流

如下圖所示,目前只做完了 Instance Group 以及後面的部分

gpc server infra

我們還需要使用 Load Balance 服務,提供一組負責接收所有請求的固定 IP 位址
並透過 Load Balance 將流量分流到執行個體群組內個別的主機處理
這就留到伸縮自在的伺服器 02 自動配置 Load Balancing 中說明

最新文章

Category

Tag