本日重點與方向 (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
在 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
# 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
這邊沒有帶版本號的話,會是用
latest
當版本號,Container Image 可以用 Local 端進行 Docker 的環境進行 Building,後面再上傳到 GCP 的 Container Registry,也可以安裝 gcloud-cli 到具有 Dockerfile 的路徑之下,建制之後就可以直接送到 GCP 的 Container Registry,兩個做法就差在對於 Dockerfile 的熟悉性質,避免一直用 gcloud-cli 進行建置 Container Image 的行為。
docker build -t gcr.io/<project_id>/<image-name>:<version> -f ./Dockerfile .
gcloud docker -- push gcr.io/<project_id>/<image-name>:<version>
gcloud builds submit --tag gcr.io/<project_id>/<image-name>:<version>
gcr.io/<project_id>/:
這個是他會推上去存放 Container Image 的區域、名稱、版本的配置
詳細的就去看一下參考網站吧。
gcloud run deploy --image gcr.io/<project_id>/<container-image-name> --platform managed
Cloud Run 服務可以提供更新,但是你的擺放位置跟服務名稱要相同,若是你的 Region 位置修改,或是名稱不同的話,他就會變成一個新的獨立的服務,此外,若是你的服務需要更快的搭建,可以先配置一些設定在部署指令裡面,這樣就可以一行指令搞定一切了。
gcr.io
、asia.gcr.io
......)gcloud run deploy <service-name> --image <place-region>/<project-id>/<image-name>:<version> --region <region-name> --platform managed
基本上跟 進階服務部署指令 相同,但是你要記得你的服務名稱跟擺放位置,重新讓他部署即可。
gcloud run deploy <service-name> --image <place-region>/<project-id>/<image-name>:<version> --region <region-name> --platform managed
gcloud run services update <service-name> --platform managed
Cloud Run 在服務更新時,預設 6位數更新+編號隨機編碼,但是我們可以自訂版本的名稱。
--revision-suffix <suffix-text>
基本上這就是對應你內部服務的端口設定,他會以一個
$PORT
變數帶入,程式碼可以去吃它做設定連結,預設 8080。
--port <port-number>
這東西就是你的 Container Image 啟動後接收執行的指令。
Entrypoint: --command <command>
Args: --args <args-command>
這邊印象中是服務可以自動拓展,但是你可以設定她長大的上限值,預設 1000 的樣子。
--max-instances <instance-count>
神奇的設定,雖然說你可以只部署服務上去,但是 Cloud Run 還是可以讓你設定基底的硬體配置,預設值是
1 vCPU/256 MiB
。
--cpu <cpu-count>
--memory <memory-size>Mi
這邊就是配置你的 Cloud Run 設定的連線並行數,預設給 80。
--concurrency <concurrency-size>
回饋延遲這跟 http 的相關配置有關係,詳細地看一下別人寫的文章,預設是給 900 秒。
--timeout <timeout-sec>
大家 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>