伸縮自在的伺服器 01 自動配置 Auto Scaling
設定 GCP 上的 Auto Scaling 讓伺服器更加彈性
建立映像檔
首先要把指定的 VM 停止
接著在側邊欄找到儲存空間
->映像檔
點進去選擇建立映像檔
不要選成虛擬機器
->機器映像檔
不然等等就會鬼打牆選不到!
一開始自作聰明從 VM 那邊按建立機器映像檔
就被送到這個異世界,卡了一下午
最簡單的判斷方式就是第一步的 VM 不要停止
建立映像檔的時候如果沒有提醒你要停止就是錯的
照著提示把映像檔建立完成就可以進行下一步
建立執行個體範本 Instance templates
進入執行個體範本
按下建立執行個體範本
硬體規則選擇
這邊是決定未來在執行個體群組內,每次啟動新的執行個體所需要的規格
所以設定的畫面長得跟在建立 VM 的時候的畫面很像
底下也有防火牆,如果是會用到 80 跟 443 port 的網路服務會就開起來
選擇 VM 映像檔作為開機範本
不同的是這次我們要用剛剛建立過的映像檔作為範本!
所以在開機磁碟
的地方按下變更
->自訂映像檔
並選擇剛剛建立的映像檔
啟動時自動執行指令
有些時候我們在新的 VM 啟動時需要運行一些指令把服務開啟,例如 docker
如果沒有再啟動時運行,你的 VM 就只是開了一台機器起來而不會運行 docker daemon
點開管理
的摺疊內容,可以看到自動化
的說明
您可以指定會在執行個體開機或重新啟動時執行的開機指令碼。開機指令碼可用來安裝軟體和更新項目,以及確保服務可在虛擬機器中順利運作
所以我們在區塊中加入指令,讓 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
在觸發條件時,執行個體群組會依照剛剛設定的執行個體範本
自動配置機器
首先開啟執行個體群組
,按下建立執行個體群組
介面會看到左邊有三個選項,和網路上現有的文章都不一樣,大概是又改畫面了
- 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 設定
設定執行個體群組健康狀態檢查與自動修復
啟動新的執行個體我們要確定他是可用的
自動讓不可使用的執行個體關閉,並且開新的執行個體取代之
開啟執行個體群組的編輯頁面,下滑到自動修復
區塊
選擇建立健康健康狀態檢查
並設定名稱以及其他設定
例如通訊協定選擇HTTP
的話可以針對特定路由發送請求,預設的TCP
則是單純確認傳輸正常
完成之後就等他跑一下,接著回到執行個體群組詳細頁去查看
可以看到健康報告,沒意外是一切健康
輪動式更新 Rolling Update
當有新的映像檔建立後,需要先建立新的執行個體範本(Instance template)
我們需要回到執行個體群組
編輯所使用的執行個體範本,這樣未來啟動新執行個體才會使用新的範本
修改後並不會直接重啟已經存在的執行個體,若是要達到線上服務無痛轉移
就是輪動式更新
上場的時候!
到執行個體群組
選擇新建立的執行個體群組,並且按下UPDATE VMS
這個按鈕名字換來換去,就差不多位置找看看
接著選擇新的執行個體範本,並且更新設定
中的Update type
要選擇自動
否則只會在新啟動的 VM 套用新的範例,但是我們想要的是把既有的 VM 也替換成新的!
可以看到會使用新的執行個體範本啟動一個新的執行個體
當新的執行個體範本開啟完成之後,才會把舊的執行個體刪除
如此就達到不影響線上服務而達到無痛升級!
但是現在服務還不完整,執行個體群組還是個別的獨立主機
雖然具有自動擴展的能力可以增加主機數量,但也就只是增加可以個別連線的主機而已,並不能自動對請求作分流
如下圖所示,目前只做完了 Instance Group 以及後面的部分
我們還需要使用 Load Balance 服務,提供一組負責接收所有請求的固定 IP 位址
並透過 Load Balance 將流量分流到執行個體群組內個別的主機處理
這就留到伸縮自在的伺服器 02 自動配置 Load Balancing
中說明