使用 Cloud Deployment Manager 部署 Python Bookshelf 应用

本教程介绍如何使用 Cloud Deployment Manager 部署 Python Bookshelf 示例应用。

借助 Deployment Manager,您可以通过声明性的可重复流程,创建必要的 Google Cloud 资源,实现一步部署。 借助 Deployment Manager,您可以更新部署、跟踪随时间的修改、使用 Jinja 或 Python 创建模板,以及对模板进行参数化以便在类似部署中使用同一模板。

目标

  • 克隆并配置 Bookshelf 示例应用。
  • 创建 Deployment Manager 配置和模板。
  • 创建 Deployment Manager 部署。
  • 使用 Deployment Manager 部署 Bookshelf 示例应用。

费用

本教程使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用量来估算费用。 Google Cloud 新用户可能有资格申请免费试用

完成本教程后,您可以删除所创建的资源以避免继续计费。如需了解详情,请参阅清理

准备工作

  1. 登录您的 Google 帐号。

    如果您还没有 Google 帐号,请注册新帐号

  2. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到项目选择器页面

  3. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  4. 启用 Datastore API, Cloud Storage API, Pub/Sub API API。

    启用 API

  5. 安装并初始化 Cloud SDK
  6. 在系统上安装 Python(pipvirtualenv)。如需查看说明,请参阅为 Google Cloud 设置 Python 开发环境

创建 Cloud Storage 存储分区

以下说明详细介绍了如何创建 Cloud Storage 存储分区。 存储分区是 Cloud Storage 中用于存放数据的基本容器。

  1. 在终端窗口中,创建一个 Cloud Storage 存储分区,其中 YOUR_BUCKET_NAME 表示存储分区的名称:

    gsutil mb gs://YOUR_BUCKET_NAME
    
  2. 如需在 Bookshelf 应用中查看上传的图片,请将该存储分区的默认访问控制列表 (ACL) 设置为 public-read

    gsutil defacl set public-read gs://YOUR_BUCKET_NAME
    

克隆示例应用

示例应用可在 GitHub 上的 GoogleCloudPlatform/getting-started-python 下找到。

  1. 克隆代码库:

    git clone https://github.com/GoogleCloudPlatform/getting-started-python.git -b steps
    
  2. 转到示例目录:

    cd getting-started-python/7-gce
    

配置应用

  1. 打开 config.py 进行修改。

    • PROJECT_ID 的值设置为您的项目 ID。

    • 将值 CLOUD_STORAGE_BUCKET 设置为您的 Cloud Storage 存储分区的名称。

  2. 保存并关闭 config.py

在本地计算机上运行应用

  1. 创建一个独立的 Python 环境,并安装依赖项:

    Linux/macOS

    virtualenv -p python3 env
    source env/bin/activate
    pip install -r requirements.txt
    

    Windows

    virtualenv -p python3 env
    env\scripts\activate
    pip install -r requirements.txt
    

  2. 运行应用:

    python main.py
    
  3. 在浏览器中,输入以下地址:

    http://localhost:8080

要停止本地 Web 服务器,请按 Control+C。如果您要退出虚拟环境,请输入 deactivate

部署示例应用

将代码推送到代码库

您可以通过多种方式将代码添加到正在运行的 Compute Engine 实例。其中一种方法是使用 Cloud Source Repositories。 每个项目都包含可供 Compute Engine 实例使用的 Git 代码库。然后,您的实例可以在启动过程中拉取应用代码的最新版本。这样,当您更新应用时,就不需要配置新映像或实例;您只需重启现有实例或创建一个新实例,因此使用 Git 代码库非常方便。

  1. 首次使用 Git 时,请使用 git config --global 设置您的身份

  2. 在 Cloud Console 中,创建代码库:

    创建代码库

  3. 然后,将您的应用代码推送到您项目的代码库,其中 [YOUR_PROJECT_ID] 是您的项目 ID,[YOUR_REPO] 是代码库的名称:

    git commit -am "Updating configuration"
    git config credential.helper gcloud.sh
    git remote add cloud https://source.developers.google.com/p/[YOUR_PROJECT_ID]/r/[YOUR_REPO]
    git push cloud master
    

创建部署

提交配置并将代码上传到 Cloud Source Repositories 后,您就可以使用 Deployment Manager 来创建部署:

  1. 转到 deployment_manager 目录:

    cd getting-started-python/7-gce/gce/deployment_manager
    
  2. 创建部署:

    gcloud deployment-manager deployments create my-deployment --config config.yaml
    
  3. 查看所有部署的列表:

    gcloud deployment-manager deployments list
    
  4. 获取部署的描述和其所创建的资源:

    gcloud deployment-manager deployments describe my-deployment
    

查看您的应用

创建转发规则后,可能需要几分钟时间,您的配置传播才能完成,流量开始路由到您的实例。

  1. 如需检查进度,请执行以下操作:

    gcloud compute backend-services get-health bookshelf-my-deployment-frontend --global
    
  2. 当至少有一个实例报告 HEALTHY 时,获取负载平衡器的转发 IP 地址:

    gcloud compute forwarding-rules list --global
    

    您的转发规则 IP 地址位于 IP_ADDRESS 列中。

  3. 在浏览器中,输入列表中的 IP 地址。

    您的应用现在正在 Google Cloud 上运行。

理解代码

配置部署

您可以查看如何在 config.yaml 中配置部署:

imports:
- name: bookshelf.jinja
  path: ./bookshelf.jinja

resources:
- name: bookshelf
  type: bookshelf.jinja
  properties:
    zone: us-central1-f
    machine-type: n1-standard-1
    machine-image: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/family/debian-9
    min-instances: 1
    max-instances: 10
    target-utilization: 0.6
    scopes:
    - https://www.googleapis.com/auth/cloud-platform

配置文件将模板文件作为资源导入,并使用它来定义名为 bookshelf 的资源。该模板接受多个属性作为参数。如需详细了解如何创建 Deployment Manager 配置文件,请参阅创建配置

配置部署模板的架构

查看架构文件 bookshelf.jinja.schema,该文件定义并记录部署应在其配置文件中提供的参数。如需详细了解配置架构,请参阅使用架构


info:
  title: Bookshelf GCE Deploy
  author: Google Inc.
  description: Creates a GCE Deployment

imports:
- name: startup-script
  path: ../startup-script.sh

required:
- zone
- machine-type
- min-instances
- max-instances
- scopes

properties:
  zone:
    description: Zone to create the resources in.
    type: string
  machine-type:
    description: Type of machine to use
    type: string
  machine-image:
    description: The OS image to use on the machines
    type: string
  min-instances:
    description: The minimum number of VMs the autoscaler will create
    type: integer
  max-instances:
    description: The maximum number of VMs the autoscaler will create
    type: integer
  target-utilization:
    description: The target CPU usage for the autoscaler to base its scaling on
    type: number
  scopes:
    description: A list of scopes to create the VM with
    type: array
    minItems: 1
    items:
      type: string

配置部署模板

模板定义创建自动扩缩、负载平衡的托管实例组所需的一些资源。如需了解所创建的资源的完整说明,请参阅模板中的注释并查看 Compute Engine 上的 Bookshelf 教程。

请注意,Deployment Manager 提供了一种以声明方式定义资源的方法,但是指定资源的大多数配置都是由其 API 定义的。例如,可以在 Compute Engine API 参考文档的实例模板资源定义中找到实例模板资源的大多数配置选项。

该模板是使用 Jinja 模板语言编写的。您可以使用 Jinja 或 Python 编写 Deployment Manager 模板。其中,Jinja 有更具声明式的优点,它比 Python 更具可读性、更容易理解。对于一些复杂的部署,Python 的完整表现力可能会让事情变得更简单些。在本示例中,使用 Jinja 足以创建所需的资源。

在模板中,系统会自动设置某些环境变量,您可以使用 env 字典访问这些变量。在本示例中,部署名称被引用作为在命名所创建的资源时可重复使用的名称。如需详细了解可用的环境变量,请参阅 Deployment Manager 文档中的使用环境变量部分:

{% set NAME = "bookshelf-" + env["deployment"] %}
{% set SERVICE = "bookshelf-" + env["deployment"] + "-frontend" %}

该模板使用 Compute Engine 教程中使用的相同启动脚本。 脚本内容插入到模板中,Jinja 缩进指令正确缩进内容:

            value: |
{{imports['startup-script']|indent(14, true)}}

在 Deployment Manager Jinja 模板中,您还可以引用在模板中其他位置创建的资源。在以下示例中,后端服务使用托管实例组的引用来获取它应指向的实例组:

- group: $(ref.{{ NAME }}-frontend-group.instanceGroup)
  zone: {{ properties['zone'] }}

可在模板中使用 config.yaml 中指定的属性:

minNumReplicas: {{ properties['min-instances'] }}
maxNumReplicas: {{ properties['max-instances'] }}
loadBalancingUtilization:
  utilizationTarget: {{ properties['target-utilization'] }}

清理

为避免因本教程中使用的资源导致您的 Google Cloud 帐号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

删除项目

为了避免产生费用,最简单的方法是删除您为本教程创建的项目。

要删除项目,请执行以下操作:

  1. 在 Cloud Console 中,转到管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

删除部署

如需删除部署,请输入以下命令。此命令会删除负载平衡器以及与您的部署关联的所有 Compute Engine 实例:

gcloud deployment-manager deployments delete my-deployment

后续步骤