iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 19
0

Day 19 GCP 公有雲_雲端容器化服務實戰 - Cloud Run 組建之路

本日重點與方向 (TAG): GCP、Google Cloud Platform、Cloud Run、Container、Container Image、Docker、Docker build
今天就延續先前開始的 Google Cloud Platform (GCP) 上搭建服務的作法,今天會向 ,GCP 上的 Cloud Run 的一些設定與流程為主,Cloud Run 就是僅有容器運行為主的服務,對應到 Docker Container Image 進行會處理一下 GCP 上的 Container Registry 配置與 Container Image 組建,Cloud Run 另有一些服務對應的版本流量分攤設定,因為專案開發也有機會用到,對應到一些服務包版到 Container Image 執行即可的概念,Cloud Run 對應這些需求,就提供執行環境這樣,前幾天有搞 GKE/GCE 這邊就加減弄一下 Cloud Run 給之後有需要 Serverless on Container 的環境一些操作上的配置一下,流程就是 Dockerfile 封裝 Container Image 之後到 Cloud Run 執行,基礎操縱相同就只要連得進去就是可以開搞了,有問題就再說再看看吧。

參考網站

https://cloud.google.com/run/docs/quickstarts/build-and-deploy

基礎測試本地端驗證

測試程式

  • 本機端安裝環境
apt-get install python3 python3-pip 
pip3 install flask gunicorn
  • 建立一個專屬的專案資料夾
mkdir myapp
cd myapp
  • 程式碼
import os

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    target = os.environ.get('TARGET', 'World')
    return 'Hello {}!\n'.format(target)

if __name__ == "__main__":
    app.run(debug=True,host='0.0.0.0',port=int(os.environ.get('PORT', 8080)))
  • 測試一下能跑起來
ubuntu@sdn-k8s-server-b3-1:~/myapp$ export PORT=5000
ubuntu@sdn-k8s-server-b3-1:~/myapp$ export TARGET="LOCAL"
ubuntu@sdn-k8s-server-b3-1:~/myapp$ python3 app.py 
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 916-891-274
  • 測試一下 gunicorn 指令

gunicorn 在 python3 需要用 pip3 安裝,apt 安裝會是 python 2.7,之後需要用一下 find / | grep "gunicorn",使用胎路徑之下的 gunicorn bin 檔執行。

ubuntu@sdn-k8s-server-b3-1:~/myapp$ export PORT=5000
ubuntu@sdn-k8s-server-b3-1:~/myapp$ export TARGET="LOCAL"
ubuntu@sdn-k8s-server-b3-1:~/myapp$ /home/ubuntu/.local/bin/gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 app:app
[2020-10-03 11:55:18 +0000] [4220] [INFO] Starting gunicorn 20.0.4
[2020-10-03 11:55:18 +0000] [4220] [INFO] Listening at: http://0.0.0.0:5000 (4220)
[2020-10-03 11:55:18 +0000] [4220] [INFO] Using worker: threads
[2020-10-03 11:55:18 +0000] [4223] [INFO] Booting worker with pid: 4223
  • 執行狀態

Container Image 組建

Dockerfile

# Use the official lightweight Python image.
# https://hub.docker.com/_/python
FROM python:3.7-slim

# Copy local code to the container image.
ENV APP_HOME /app
WORKDIR $APP_HOME
COPY . ./

# Install production dependencies.
RUN pip install Flask gunicorn

ENV TARGET GCP-Cloud-Run
ENV PORT 5000

# Run the web service on container startup. Here we use the gunicorn
# webserver, with one worker process and 8 threads.
# For environments with multiple CPU cores, increase the number of workers
# to be equal to the cores available.
CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 app:app

Build / Upload Image

這邊沒有帶版本號的話,會是用 latest 當版本號,Container Image 可以用 Local 端進行 Docker 的環境進行 Building,後面再上傳到 GCP 的 Container Registry,也可以安裝 gcloud-cli 到具有 Dockerfile 的路徑之下,建制之後就可以直接送到 GCP 的 Container Registry,兩個做法就差在對於 Dockerfile 的熟悉性質,避免一直用 gcloud-cli 進行建置 Container Image 的行為。

  • Local Build / Upload
docker build -t gcr.io/<project_id>/<image-name>:<version> -f ./Dockerfile .
gcloud docker -- push gcr.io/<project_id>/<image-name>:<version>
  • gcloud Build
gcloud builds submit --tag gcr.io/<project_id>/<image-name>:<version>
  • Container Image Zone

gcr.io/<project_id>/:
這個是他會推上去存放 Container Image 的區域、名稱、版本的配置
詳細的就去看一下參考網站吧。

  • GCP Container Registry 狀態驗證

Cloud Run 組建

基礎部署指令

  • 部署 Cloud 服務基礎指令
gcloud run deploy --image gcr.io/<project_id>/<container-image-name> --platform managed
  • 配置一下 Cloud Run 生成的服務名稱、服務擺放區域

  • Cloud Run 部署後服務檢視

  • 獲取 Cloud Run 的服務呼叫方式

  • 測試一下服務

進階服務部署指令

Cloud Run 服務可以提供更新,但是你的擺放位置跟服務名稱要相同,若是你的 Region 位置修改,或是名稱不同的話,他就會變成一個新的獨立的服務,此外,若是你的服務需要更快的搭建,可以先配置一些設定在部署指令裡面,這樣就可以一行指令搞定一切了。

  • 在部署時直接設定 Cloud Run 服務名稱、擺放位置
    • service-name: Cloud Run 服務名稱
    • region-name: 服務擺放位置 (gcr.ioasia.gcr.io......)
gcloud run deploy <service-name> --image <place-region>/<project-id>/<image-name>:<version> --region <region-name> --platform managed 

更新服務

更新 Container Image 與 相關配置 (類似於重新部署)

基本上跟 進階服務部署指令 相同,但是你要記得你的服務名稱跟擺放位置,重新讓他部署即可。

  • 指令
gcloud run deploy <service-name> --image <place-region>/<project-id>/<image-name>:<version> --region <region-name> --platform managed 

不更新 Container Image,但是會更新 Cloud Run 的服務配置設定

  • 指令
gcloud run services update <service-name> --platform managed

一些神奇的設定配置

  • 更新服務的版本號設定

Cloud Run 在服務更新時,預設 6位數更新+編號隨機編碼,但是我們可以自訂版本的名稱。

--revision-suffix <suffix-text>

  • Server 的對外服務 Port 設定 (限定 1 個)

基本上這就是對應你內部服務的端口設定,他會以一個 $PORT 變數帶入,程式碼可以去吃它做設定連結,預設 8080。

--port <port-number>
  • Service 的 Container 外部啟動指令下達

這東西就是你的 Container Image 啟動後接收執行的指令。

Entrypoint: --command <command>
Args: --args <args-command>
  • Service 的 Container 自動拓展上限

這邊印象中是服務可以自動拓展,但是你可以設定她長大的上限值,預設 1000 的樣子。

--max-instances <instance-count>
  • Service 的 CPU / RAM 配置

神奇的設定,雖然說你可以只部署服務上去,但是 Cloud Run 還是可以讓你設定基底的硬體配置,預設值是 1 vCPU/256 MiB

--cpu <cpu-count>
--memory <memory-size>Mi
  • 單一 Service Container 的 最大接入請求數量

這邊就是配置你的 Cloud Run 設定的連線並行數,預設給 80。

--concurrency <concurrency-size>
  • 服務請求超時時間

回饋延遲這跟 http 的相關配置有關係,詳細地看一下別人寫的文章,預設是給 900 秒。

--timeout <timeout-sec>
  • Service 內部環境變數設置

大家 Container 有時候總需要一些環境變數來配置,這邊也是有提供這樣的設定,並且依照需求來說,這邊也提供多個 key:value 對應的 key pair 提供設定,就添加一下以下的配置即可。

--set-env-vars <key1>=<value1>,<key2>=<value2>, ……...

刪除服務

  • 指令
gcloud run services delete <service-name> --platform managed --region <region-name>

流量配置

  • 更新服務指令 (配置無流量)
gcloud run deploy --image <image> --region=<region-name> service-name  --platform managed --no-traffic

  • 網頁端配置流量

  • 更新服務指令 (配置流量)

你具有多版本的話,分攤流量就需要對應個版本名稱去設定。

gcloud run services update-traffic <service-name> --to-revisions <revision-name-1>=<flow-percent-1> --to-revisions <revision-name-2>=<flow-percent-2>  --platform managed --region <region-name>

  • 更新服務指令 (流量全部轉移到最新版本)
gcloud run services update-traffic <service-name> --to-latest --platform managed --region <region-name>


上一篇
Day 18 GCP 公有雲_雲端計算節點實戰 - GCE VM 組建之路
下一篇
Day 20 GCP 公有雲_雲端事件消息傳遞服務實戰 - Pub/Sub 組建測試之路
系列文
基於付費公有雲與開源機房自建私有雲之雲端應用服務測試兼叢集與機房託管服務實戰之勇者崎嶇波折且劍還掉在路上的試煉之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言