构建和部署 Python 服务

了解如何创建简单的 Hello World 应用,将该应用打包到容器映像中,然后将该映像上传到 Container Registry 并部署到 Cloud Run。除了所示语言之外,您还可以使用其他语言。


如需在 Cloud Shell Editor 中直接获取有关此任务的分步指导,请点击操作演示

操作演示


以下部分将引导您完成与点击操作演示相同的步骤。

准备工作

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Install the Google Cloud CLI.
  5. To initialize the gcloud CLI, run the following command:

    gcloud init
  6. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  7. Make sure that billing is enabled for your Google Cloud project.

  8. Install the Google Cloud CLI.
  9. To initialize the gcloud CLI, run the following command:

    gcloud init

编写示例应用

如需使用 Python 编写应用,请执行以下操作:

  1. 创建名为 helloworld 的新目录,并转到此目录中:

    mkdir helloworld
    cd helloworld
    
  2. 创建名为 main.py 的文件,并将以下代码粘贴到其中:

    import os
    
    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route("/")
    def hello_world():
        name = os.environ.get("NAME", "World")
        return "Hello {}!".format(name)
    
    if __name__ == "__main__":
        app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))

    此代码使用我们的“Hello World”问候语响应请求。HTTP 处理由容器中的 Gunicorn Web 服务器进行。当直接调用以供本地使用时,此代码会创建一个基本 Web 服务器,该服务器侦听 PORT 环境变量定义的端口。

  3. 创建名为 requirements.txt 的文件,并将以下代码粘贴到其中:

    Flask==2.0.2
    gunicorn==20.1.0
    

    这会添加示例所需的软件包。

  4. 添加包含以下内容的 Dockerfile。

    
    # Use the official lightweight Python image.
    # https://hub.docker.com/_/python
    FROM python:3.10-slim
    
    # Allow statements and log messages to immediately appear in the Knative logs
    ENV PYTHONUNBUFFERED True
    
    # Copy local code to the container image.
    ENV APP_HOME /app
    WORKDIR $APP_HOME
    COPY . ./
    
    # Install production dependencies.
    RUN pip install --no-cache-dir -r requirements.txt
    
    # 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.
    # Timeout is set to 0 to disable the timeouts of the workers to allow Cloud Run to handle instance scaling.
    CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app
    

    这将启动 Gunicorn 网络服务器,该服务器会侦听 PORT 环境变量定义的端口。

  5. 添加一个 .dockerignore 文件,以从容器映像中排除文件。

    Dockerfile
    README.md
    *.pyc
    *.pyo
    *.pyd
    __pycache__
    .pytest_cache
    

您的应用已编写完毕,可以进行部署。

从源代码部署到 Cloud Run

重要提示:本快速入门假定您在快速入门中使用的项目中拥有所有者或编辑者角色。否则,请参阅 Cloud Run 部署权限Cloud Build 权限Artifact Registry 权限,获取需要的权限。

从源代码部署会自动从源代码构建容器映像并进行部署。

如需从源代码部署,请执行以下操作:

  1. 在源代码目录中,使用以下命令从源代码进行部署:

    gcloud run deploy

    如果系统提示您启用 API,请回复 y 进行启用。

    1. 当系统提示您输入源代码位置时,请按 Enter 键部署当前文件夹。

    2. 当系统提示您输入服务名称时,请按 Enter 键接受默认名称 helloworld

    3. 如果系统提示您启用 Artifact Registry API,请按 y 响应。

    4. 当系统提示您输入区域时:请选择您选择的区域,例如 us-central1

    5. 系统会提示您允许未通过身份验证的调用:响应 y

    然后等待部署完成。成功完成时,命令行会显示服务网址。

  2. 在 Web 浏览器中打开该服务网址,访问部署的服务。

Cloud Run 位置

Cloud Run 是地区级的,这意味着运行 Cloud Run 服务的基础架构位于特定地区,并且由 Google 代管,以便在该地区内的所有区域以冗余方式提供。

选择用于运行 Cloud Run 服务的地区时,主要考虑该地区能否满足您的延迟时间、可用性或耐用性要求。通常,您可以选择距离用户最近的地区,但除此之外,您还应该考虑 Cloud Run 服务使用的其他 Google Cloud 产品的位置。跨多个位置使用 Google Cloud 产品可能会影响服务的延迟时间和费用。

Cloud Run 可在以下地区使用:

基于层级 1 价格

基于层级 2 价格

  • asia-east2(香港)
  • asia-northeast3(韩国首尔)
  • asia-southeast1(新加坡)
  • asia-southeast2 (雅加达)
  • asia-south1(印度孟买)
  • asia-south2(印度德里)
  • australia-southeast1(悉尼)
  • australia-southeast2(墨尔本)
  • europe-central2(波兰,华沙)
  • europe-west2(英国伦敦)
  • europe-west3(德国法兰克福)
  • europe-west6(瑞士苏黎世) 叶形图标 二氧化碳排放量低
  • northamerica-northeast1(蒙特利尔) 叶形图标 二氧化碳排放量低
  • northamerica-northeast2(多伦多) 叶形图标 二氧化碳排放量低
  • southamerica-east1(巴西圣保罗) 叶形图标 二氧化碳排放量低
  • southamerica-west1(智利圣地亚哥)
  • us-west2(洛杉矶)
  • us-west3(盐湖城)
  • us-west4(拉斯维加斯)

如果您已创建 Cloud Run 服务,则可以在 Cloud Console 的 Cloud Run 信息中心查看相应的地区。

恭喜!您刚刚将源代码从容器映像部署到了 Cloud Run。Cloud Run 会在需要处理收到的请求时自动横向扩容您的容器映像,并在需要处理的请求数量减少时自动横向缩容您的容器映像。您只需为在处理请求期间消耗的 CPU、内存和网络付费。

清理

移除测试项目

虽然 Cloud Run 不会对未在使用中的服务计费,但您可能仍然需要支付将容器映像存储在 Artifact Registry 中而产生的相关费用。为避免产生费用,您可以删除映像或删除 Cloud 项目。删除 Cloud 项目后,系统即会停止对该项目中使用的所有资源计费。

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

后续步骤

如需详细了解如何使用代码源构建容器并推送到代码库,请参阅: