首页  >  文章  >  后端开发  >  在 Google Cloud Run 上部署无服务器应用程序

在 Google Cloud Run 上部署无服务器应用程序

Susan Sarandon
Susan Sarandon原创
2024-11-19 18:23:02491浏览

介绍

在本指南中,我将从 Twitch 的 TeoMeWhy 系统(当前位于 AWS 上)部署容器,并将其放置在 GCP 上。

AWS 的当前结构
Implantando Aplicações Serverless no Google Cloud Run

GCP 架构

Implantando Aplicações Serverless no Google Cloud Run

不会使用复杂的自动化工具,一切都将通过控制台完成,与 Github 集成并在每次提交到 main 时部署映像。
我们将使用:

  • Cloud Run - 适用于 Web 应用程序
  • Cloud SQL - 适用于 MySQL 数据库
  • GCE - 运行 Teomebot
  • 云存储 - 对象存储 (S3)
  • Cloud Build - 创建应用程序部署
  • 秘密管理器 - 安全地保存应用程序凭据。

获取应用程序

  1. 访问 TeoMeWhy 的 GitHub 和 fork 与该项目相关的应用程序。
  2. 在存储库页面上,单击已加星标,然后单击分叉Implantando Aplicações Serverless no Google Cloud Run
  3. 分叉页面上,为分叉命名,然后单击创建分叉Implantando Aplicações Serverless no Google Cloud Run
  4. 如果您想复制整个环境,请对项目中的其他存储库重复此过程。
  5. 制作 分叉 克隆 ,以便在将应用程序发送到 GCP 之前根据需要调整应用程序。
git clone git@github.com:cslemes/points-to-go.git

创建 Dockerfile 以创建容器镜像

导航到克隆的存储库文件夹。该存储库已包含为 Docker 设计的 Dockerfile。我们来分析一下:

```
FROM golang:latest
WORKDIR /app/
COPY . .
RUN go build main.go
CMD ["./main"]
```

这个 Dockerfile 是可用的,但我们将使用 多阶段构建 来优化它,以减少最终镜像的大小。由于 Go 不需要外部依赖项,因此我们可以使用最小的基础镜像,例如 scratch.

  1. 构建镜像替换为更轻的版本,并命名以供其他阶段参考。

    FROM golang:1.23.1-alpine3.20 AS build
    
  2. 添加 go mod download 命令来缓存依赖项并进行 go mod 验证以确保它们与 go.sum. 文件中的 checksums
    匹配

    RUN go mod download && go mod verify
    
  3. 要优化生产二进制文件,请添加以下参数:

    • CGO_ENABLED=0:禁用 CGO 支持。 CGO 是 Go 中的功能,允许您调用 C 代码,但是当您禁用它时,您将获得完全静态的二进制文件,不依赖于外部库。
    • GOARCH=amd64:设置编译的目标架构。 amd64 是具有 64 位处理器的机器上使用的架构,例如大多数现代服务器和台式机。
    • GOOS=linux:定义编译的目标操作系统。这里是针对 Linux 进行配置的,这意味着生成的二进制文件将在 Linux 系统上可执行。
    • go build -o /app/points:编译代码并将二进制文件保存到指定路径(/app/points)。
    • -a:强制重新编译所有包,包括依赖项,即使它们没有更改。确保使用新标志和设置重新编译所有内容可能很有用。
    • -ldflags="-s -w":这些是大小优化标志。
    • -s 从二进制文件中删除调试符号表。
    • -w 删除堆栈跟踪信息。这些选项减少了最终二进制文件的大小。
    • -installsuffix cgo:向安装目录添加后缀,以区分禁用了 CGO 的二进制文件。这可以避免与使用 CGO 的二进制文件发生冲突。
    git clone git@github.com:cslemes/points-to-go.git
    
  4. (可选)为了使镜像更小,我们可以使用upx来压缩二进制文件,upx(Ultimate Packer for eXecutables)是一个压缩可执行二进制文件以减少文件大小的工具,例如Go二进制文件。将会有更长的构建时间,以及容器启动的更长延迟,因此必须评估哪一个对其实施最有利。由于目标是在已经具有冷启动功能的 Cloud Run 中使用它,它会在不使用容器时暂停容器,我们不会使用它,因为它会增加容器的初始化时间。

    ```
    FROM golang:latest
    WORKDIR /app/
    COPY . .
    RUN go build main.go
    CMD ["./main"]
    ```
    
  • upx --ultra-brute -qq 点:使用所有可能的压缩选项,积极压缩点二进制文件,并且不显示输出消息。
  • upx -t 点:测试压缩的二进制文件以确保它仍然正常工作。
  • 现在二进制文件准备好了,让我们进行第二阶段,即将二进制文件复制到干净的图像。

    FROM golang:1.23.1-alpine3.20 AS build
    
    • scrap 是 Docker 中的一个特殊基础镜像,它代表一个完全空的镜像,没有任何操作系统或依赖项。在 Go 应用程序的极简图像中使用 FROM scrap 很常见,静态二进制文件就足够了。
  • 完整文件

    git clone git@github.com:cslemes/points-to-go.git
    
  1. 比较构建
  2. Dockerfile 优化和使用 upx 可使图像缩小 3 倍。
  3. 使用 Trivy 分析原始图像显示有 904 个 CVE,而暂存图像没有 CVE。
Imagem Tipo Tamanho
points-to-go Otimizado 14MB
points-to-go Com upx 5.77MB
points-to-go original 1.76GB

Implantando Aplicações Serverless no Google Cloud Run

  1. 对其他存储库重复这些设置。

部署数据库

  1. 在控制台中,访问侧面菜单中的SQLImplantando Aplicações Serverless no Google Cloud Run
  2. 或者在搜索栏中搜索“SQL”,然后从列表中选择 SQL。 Implantando Aplicações Serverless no Google Cloud Run
  3. 在 Cloud SQL 页面上,点击创建实例并选择 MySQL。 Implantando Aplicações Serverless no Google Cloud Run
  4. 选择正在编辑的企业
  5. 在“编辑预设”下,选择沙盒
  6. 将数据库版本保留为MySQL 8.0Implantando Aplicações Serverless no Google Cloud Run
  7. 实例 ID 下为实例命名并设置密码。
  8. 您可以通过扩展密码策略来指定密码策略 Implantando Aplicações Serverless no Google Cloud Run
  9. 定义区域和区域,我们将把它留在一个区域中。 Implantando Aplicações Serverless no Google Cloud Run
  10. 在自定义实例中我们可以根据需要调整硬件,选项会根据我们选择的版本而有所不同。
  11. 根据需要将CPU调整为1,磁盘调整为10GB。 Implantando Aplicações Serverless no Google Cloud Run
  12. 在连接中,取消选中公共 IP 并选中私有 IP。
  13. 在私人访问连接中单击配置连接
  14. 选择使用自动分配的范围
  15. 点击继续
  16. 点击创建连接 Implantando Aplicações Serverless no Google Cloud Run
  17. 点击创建实例并等待创建。 Implantando Aplicações Serverless no Google Cloud Run
  18. 要连接到实例,请激活 Cloud Shell 并运行:

    git clone git@github.com:cslemes/points-to-go.git
    

Implantando Aplicações Serverless no Google Cloud Run

  1. 输入上一步中分配的密码。
  2. 然后您将收到连接错误,因为 Cloud shell 无权访问您的私有 VPC。 Implantando Aplicações Serverless no Google Cloud Run
  3. 为了简化通过Cloud shell的连接,让我们编辑实例并标记公共IP,在附录中我将展示如何创建VPC对等以通过云贝壳 Implantando Aplicações Serverless no Google Cloud Run
  4. 再次尝试连接。
  5. Implantando Aplicações Serverless no Google Cloud Run
  6. 创建应用程序数据库:


    ```
    FROM golang:latest
    WORKDIR /app/
    COPY . .
    RUN go build main.go
    CMD ["./main"]
    ```
    
  7. Cloud Shell仍然有一个基于VSCode的文本编辑器,你可以直接通过它做一些活动,它在你的 /home 中有 5GB 的持久卷,硬件是具有 1vCPU 和 1.7GB RAM 的 e2-small VM。
    Implantando Aplicações Serverless no Google Cloud Run

在 Cloud Run 中创建容器

    在 Google Cloud 控制台中,通过侧面菜单或搜索栏访问
  1. Cloud Run Implantando Aplicações Serverless no Google Cloud Run
  2. 在 Cloud Run 页面上,单击
  3. 部署容器 并选择 服务 选项。 Implantando Aplicações Serverless no Google Cloud Run
  4. 选择部署方法
  5. 部署服务有三个选项:
    • 使用注册表中的容器映像。
    • 直接连接到存储库。
    • 创建一个函数(使用
    • 云函数,与 Run 集成)。
  6. 对于本指南,选择
  7. 使用 GitHub 进行持续部署,允许 Google 自动配置 CI/CD 管道。
  8. 单击

    使用 Cloud Build 配置
    Implantando Aplicações Serverless no Google Cloud Run

  9. 配置与 GitHub 的连接

  10. 单击

    身份验证以启用 Google 与您的 GitHub 集成。

  11. 授权访问,选择允许访问所有存储库或仅允许访问特定存储库。

  12. 登录完成后,点击下一步
    Implantando Aplicações Serverless no Google Cloud Run

  13. 选择构建类型

  14. 在构建步骤中,选择使用 Dockerfile 或受支持的应用程序以及来自 GCP 的 Buildpacks

  15. 选择Dockerfile并根据需要调整路径/文件名
    Implantando Aplicações Serverless no Google Cloud Run

  16. 服务设置

  17. 配置以下参数:

    • 身份验证:选择允许未经身份验证的呼叫
    • CPU 分配:选择 CPU 仅在请求处理期间分配
    • 输入控制:选择内部Implantando Aplicações Serverless no Google Cloud Run
  18. 根据应用需要调整容器端口。
    Implantando Aplicações Serverless no Google Cloud Run

  19. 在安全选项卡中的服务帐户下,单击创建新服务帐户
    Implantando Aplicações Serverless no Google Cloud Run

  20. 添加角色

    • 存储对象管理员
    • Cloud Run 管理员
    • 秘密经理秘密顾问
    • Cloud SQL 客户端
    • 云构建服务帐户
    • 工件注册表记录器
    • 服务帐户用户 Implantando Aplicações Serverless no Google Cloud Run
  21. 分析应用程序代码,我们需要将环境变量传递给数据库。

    git clone git@github.com:cslemes/points-to-go.git
    
  22. 我们必须将应用程序代码更改为使用 Unix 套接字的 Cloud Sql 标准,并且 Cloud Run 不直接访问数据库,它使用 Cloud SQL Auth Proxy

    ```
    FROM golang:latest
    WORKDIR /app/
    COPY . .
    RUN go build main.go
    CMD ["./main"]
    ```
    
  23. 在容器中,转到“变量和秘密”选项卡,然后单击“添加变量”。

  24. 添加必要的变量。

  25. 银行地址遵循以下模式:PROJECT_ID:REGION:INSTANCE_NAME,您还可以在第 16 项中获取下面的名称。
    Implantando Aplicações Serverless no Google Cloud Run

  26. 我们将在“参考秘密”中输入的银行密码

  27. 如果创建新密钥选项被禁用,那是因为您需要激活 Api。

  28. 点击创建新秘密
    Implantando Aplicações Serverless no Google Cloud Run

  29. 定义密钥名称并单击创建密钥
    Implantando Aplicações Serverless no Google Cloud Run

  30. 在 Cloud SQL Connections 中,我们将添加我们创建的银行的 URL
    Implantando Aplicações Serverless no Google Cloud Run

  31. 要创建应用程序架构,代码要求我们传递参数migrations=true。

  32. 我们将向函数参数添加migrations=true,然后在下一个容器版本中将其删除。
    Implantando Aplicações Serverless no Google Cloud Run

  33. 其他字段保留默认,然后单击“创建”
    Implantando Aplicações Serverless no Google Cloud Run

  34. 使用 Thunder 客户端测试应用程序。

  35. 创建客户端
    Implantando Aplicações Serverless no Google Cloud Run

  36. 阅读注册客户
    Implantando Aplicações Serverless no Google Cloud Run

创建 Teomebot 服务

聊天机器人不会部署在 Cloud Run 上,而是安装在 Google Compute Engine (GCE) 上。与 Cloud Run 不同,Compute Engine 非常理想,因为聊天机器人需要持续活跃才能与聊天交互。

此外,我们还将介绍如何使用容器、秘密管理和 Cloud Build 配置来实现部署自动化。

在 Google Compute Engine (GCE) 上创建虚拟机

  1. 在 GCP Console 侧面菜单中访问 Compute Engine
  2. 单击创建实例Implantando Aplicações Serverless no Google Cloud Run
  3. 输入实例的名称(例如 teomebot-instance)。
  4. 根据需要配置区域区域并记下此信息以供以后使用。 Implantando Aplicações Serverless no Google Cloud Run
  5. 机器设置中,选择E2类型,并在预设中,选择e2-micro。 Implantando Aplicações Serverless no Google Cloud Run
  6. 单击容器选项卡,然后单击部署容器
  7. 暂时使用nginx:latest镜像来完成初始配置。
  8. 添加环境变量:
    • TWITCH_BOT:机器人名称。
    • TWITCH_CHANNEL:Twitch 频道名称。
    • HOST_DB:Cloud SQL 数据库的私有 IP。
    • USER_DB:银行用户。
    • PORT_DB:银行端口。
    • URL_POINTS:服务端点Points-to-Go
  9. 单击选择 Implantando Aplicações Serverless no Google Cloud Run
  10. 身份和 API 访问下,选择为此项目配置的服务帐户。 Implantando Aplicações Serverless no Google Cloud Run
  11. 其余设置保留默认值,然后单击创建

使用 Secret Manager 添加 Secret

  1. 您可能已经注意到,我们没有传递秘密,在计算引擎中没有像在云运行中那样简单的方法来传递它们。我的解决方案是在应用程序代码中添加一个函数,以直接从秘密管理器读取信息。
  2. 在 GCP Console 中访问 Secret Manager
  3. 点击创建秘密
  4. 输入描述性名称(例如 twitch-token)并添加相应的值。
  5. 复制生成的密钥的路径(例如:projects/123456/secrets/twitch-token/versions/latest)。 Implantando Aplicações Serverless no Google Cloud Run
    1. 创建一个新的 utils/gcp.go 文件
  6. 更改 utils/db.go 来调用该函数,并将秘密管理器路径作为参数传递。

    git clone git@github.com:cslemes/points-to-go.git
    
  7. 更改 main.go 以获取 Twitch 凭据

    ```
    FROM golang:latest
    WORKDIR /app/
    COPY . .
    RUN go build main.go
    CMD ["./main"]
    ```
    

   migration := flag.Bool("migrations", false, "执行数据库迁移")

    flag.Parse()

    godotenv.Load()
    用户 := os.Getenv("TWITCH_BOT")
    // 改变
    oauth := utils.AccessSecretVersion("projects/551619572964/secrets/twitch-token/versions/latest")

    频道 := os.Getenv("TWITCH_CHANNEL")
``

云构建

配置云构建

Cloud Build 将用于自动创建容器映像并将其部署到 Compute Engine。

  1. 在存储库的根目录中创建一个 cloudbuild.yaml 文件,内容如下:
  2. 替换

    FROM golang:1.23.1-alpine3.20 AS build
    

_VERSION 变量设置为与 v1.0 匹配的值。与当前提交的哈希值 (${COMMIT_SHA})。这会为每个构建创建一个唯一的版本,确保每个镜像都可以通过版本和提交来识别。

  • 步骤
    步骤部分定义 Cloud Build 必须执行的步骤。在这里,我们有四个步骤:构建、推送(两次)和更新。

  • 第 1 步:构建 Docker 镜像

    RUN go mod download && go mod verify
    

此步骤运行 Docker 映像的构建:

  • “--no-cache”:强制构建而不使用缓存。
  • “-t”:为创建的图像定义标签:
    • gcr.io/$PROJECT_ID/teomebot:$_VERSION:带有使用提交哈希的标签的图像。
    • gcr.io/$PROJECT_ID/teomebot:latest: 带有最新标签的图像。
  • “.”:将当前目录定义为构建上下文。

id: Build 标签是步骤的可选标识符,对于参考和调试很有用。

  • 第二步:带版本标签的镜像推送
RUN CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build -o /app/points -a -ldflags="-s -w" -installsuffix cgo

此步骤将带有特定标签 ($_VERSION) 的镜像推送到 Google 容器注册表,从而允许将构建中生成的版本存储在存储库中。

  • 第三步:带标签最新的图片推送

    RUN apk add --no-cache curl upx
    RUN upx --ultra-brute -qq points && upx -t points
    

此步骤将带有最新标签的镜像推送到 Google Container Registry,用最新版本更新最新镜像。

  • 第 4 步:GCE 实例上的容器更新

     FROM scratch AS prod
     WORKDIR /app
     COPY --from=build /app/points /
     CMD ["./points"]
    

此步骤使用 gcloud 命令更新 Google Compute Engine 实例上的容器:

  • “teomebot-instance”:指定运行容器的实例的名称。
  • --container-image:定义实例应使用的容器映像。在这里,使用最新版本的图像。
  • --zone=$_DEPLOY_ZONE:使用变量指定部署区域。
  • --container-restart-policy=always:将容器重启策略设置为在失败时始终重新启动。
  • 选项

    git clone git@github.com:cslemes/points-to-go.git
    

logging: CLOUD_LOGGING_ONLY 选项指定 Cloud Build 应仅记录到 Cloud Logging,保存数据并专注于 GCP 日志。

  • 最终文件

    ```
    FROM golang:latest
    WORKDIR /app/
    COPY . .
    RUN go build main.go
    CMD ["./main"]
    ```
    

创建容器镜像创建触发器

设置服务帐户

  1. 转到 Google Cloud 控制台中的 Cloud Build
  2. 前往设置
  3. 单击服务帐户权限
  4. 找到为Cloud Run创建的服务帐户。
  5. 激活选项设置为首选服务帐户
  6. 为服务帐户启用计算实例管理员角色。 Implantando Aplicações Serverless no Google Cloud Run 创建触发器
  7. 在侧面菜单中,单击触发器,然后单击创建触发器Implantando Aplicações Serverless no Google Cloud Run
  8. 输入触发器的描述性名称。
  9. 存储库中,单击连接存储库并选择Teomebot存储库。 Implantando Aplicações Serverless no Google Cloud Run
  10. 配置中,选择选项云构建配置文件
  11. 添加 _DEPLOY_ZONE 替换变量,其值与创建实例的区域相对应。
  12. 在服务帐户中,检查所选帐户是否符合步骤 6 中的配置。 Implantando Aplicações Serverless no Google Cloud Run
  13. 点击保存运行触发器
  14. 在概述屏幕上,在新创建的触发行中,单击“执行”以手动运行该流程。 Implantando Aplicações Serverless no Google Cloud Run
  15. 在流程详细信息中,按照镜像构建步骤检查可能存在的错误。 Implantando Aplicações Serverless no Google Cloud Run

测试应用程序

  1. 在 Compute Engine 面板中,复制 ssh 命令来访问实例,或使用 ssh Web 客户端,然后连接实例。
  2. 连接到实例并运行以下命令来检查容器的状态:

    git clone git@github.com:cslemes/points-to-go.git
    

Implantando Aplicações Serverless no Google Cloud Run

解决证书问题

  1. 如果发生与证书相关的错误(由临时基础映像引起),请将其替换为 distroless 映像。在 Dockerfile 中,将定义基础镜像的行更改为:

    git clone git@github.com:cslemes/points-to-go.git
    

致:

```
FROM golang:latest
WORKDIR /app/
COPY . .
RUN go build main.go
CMD ["./main"]
```

Dockerfile 已更新:

FROM golang:1.23.1-alpine3.20 AS build

调整 Secret Manager 权限

  1. 更改服务帐户范围以访问Secret Manager
  2. 前往 Google Cloud Console。
  3. 在侧面菜单中,转到Compute Engine > > VM 实例.
  4. 找到并单击您的虚拟机实例的名称。
  5. 在虚拟机详情页面,点击停止关闭实例(此步骤是必要的,因为服务帐户范围只能在实例停止时修改)。
  6. 实例停止后,点击页面顶部的编辑
  7. 向下滚动到身份和访问 API 部分。
  8. 服务帐户下,选择您的应用程序使用的服务帐户。
  9. API 访问范围下,选择 允许完全访问所有云 API 或单击 设置特定 API 访问范围 并添加范围 https://www .googleapis.com/auth/cloud-platform.
  10. 调整范围后,单击保存应用更改。
  11. 通过单击开始重新启动实例。
  12. 或者通过命令行,停止实例,运行命令,然后启动。

    RUN go mod download && go mod verify
    

添加更多容器

其他服务遵循相同的点到去流程,对于相互通信的服务,创建环境变量来配置端点地址,该地址始终为 https 端口 443。

为了与其他服务通信,我调整了代码以接收另一个带有服务 url 的环境变量,例如,它看起来像这样:

RUN CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build -o /app/points -a -ldflags="-s -w" -installsuffix cgo

测试机器人

测试机器人与 Twitch 的通信。

Implantando Aplicações Serverless no Google Cloud Run

网络安全调整
完成测试后,将仅供内部访问的容器放置在VPC中。

Implantando Aplicações Serverless no Google Cloud Run

结论

至此,我们完成了 TeoMeWhy 系统的迁移,该指南将作为迁移其他 TeoMeWhy 服务的基础。

实现的主要目标是:

技术成果

  • 将容器化应用迁移到 Cloud Run,实现自动扩展并降低成本
  • 通过多阶段构建优化 Docker 镜像,显着减少镜像大小和漏洞
  • 使用 Cloud SQL 实施托管数据库,确保高可用性和安全性
  • 使用 Cloud Build 进行自动化 CI/CD 配置,支持从 GitHub 进行自动部署
  • 使用 Secret Manager 进行安全凭证管理

架构改进

  • 服务之间明确的职责分离
  • 使用私有连接以提高安全性
  • 实施无服务器标准以优化成本
  • 构建和部署流程的自动化
  • 与 GitHub 存储库无缝集成

获得的好处

  1. 成本:通过无服务器模型和资源优化降低成本
  2. 可维护性:通过自动化部署轻松维护
  3. 安全性:正确管理秘密和私人连接
  4. 可扩展性:能够根据需求自动扩展
  5. 监控:通过原生 GCP 工具提高基础设施可见性

附录

启用秘密管理器 API

  1. 在 Google Cloud 控制台中,搜索 Secret Manager API
  2. 点击搜索结果中的API。 Implantando Aplicações Serverless no Google Cloud Run
  3. 在详细信息屏幕上,单击激活Implantando Aplicações Serverless no Google Cloud Run

参考

  • Github TeoMeWhy
  • Twitch Teo Me Why
  • Cloud Run 文档
  • 计算引擎文档
  • 云构建文档
  • 秘密管理器文档

以上是在 Google Cloud Run 上部署无服务器应用程序的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn