在本指南中,我将从 Twitch 的 TeoMeWhy 系统(当前位于 AWS 上)部署容器,并将其放置在 GCP 上。
AWS 的当前结构
GCP 架构
不会使用复杂的自动化工具,一切都将通过控制台完成,与 Github 集成并在每次提交到 main 时部署映像。
我们将使用:
git clone git@github.com:cslemes/points-to-go.git
导航到克隆的存储库文件夹。该存储库已包含为 Docker 设计的 Dockerfile。我们来分析一下:
``` FROM golang:latest WORKDIR /app/ COPY . . RUN go build main.go CMD ["./main"] ```
这个 Dockerfile 是可用的,但我们将使用 多阶段构建 来优化它,以减少最终镜像的大小。由于 Go 不需要外部依赖项,因此我们可以使用最小的基础镜像,例如 scratch.
将构建镜像替换为更轻的版本,并命名以供其他阶段参考。
FROM golang:1.23.1-alpine3.20 AS build
添加 go mod download 命令来缓存依赖项并进行 go mod 验证以确保它们与 go.sum. 文件中的 checksums
匹配
RUN go mod download && go mod verify
要优化生产二进制文件,请添加以下参数:
git clone git@github.com:cslemes/points-to-go.git
(可选)为了使镜像更小,我们可以使用upx来压缩二进制文件,upx(Ultimate Packer for eXecutables)是一个压缩可执行二进制文件以减少文件大小的工具,例如Go二进制文件。将会有更长的构建时间,以及容器启动的更长延迟,因此必须评估哪一个对其实施最有利。由于目标是在已经具有冷启动功能的 Cloud Run 中使用它,它会在不使用容器时暂停容器,我们不会使用它,因为它会增加容器的初始化时间。
``` FROM golang:latest WORKDIR /app/ COPY . . RUN go build main.go CMD ["./main"] ```
现在二进制文件准备好了,让我们进行第二阶段,即将二进制文件复制到干净的图像。
FROM golang:1.23.1-alpine3.20 AS build
完整文件
git clone git@github.com:cslemes/points-to-go.git
Imagem | Tipo | Tamanho |
---|---|---|
points-to-go | Otimizado | 14MB |
points-to-go | Com upx | 5.77MB |
points-to-go | original | 1.76GB |
部署数据库
要连接到实例,请激活 Cloud Shell 并运行:
git clone git@github.com:cslemes/points-to-go.git
``` FROM golang:latest WORKDIR /app/ COPY . . RUN go build main.go CMD ["./main"] ```
Cloud Shell仍然有一个基于VSCode的文本编辑器,你可以直接通过它做一些活动,它在你的 /home 中有 5GB 的持久卷,硬件是具有 1vCPU 和 1.7GB RAM 的 e2-small VM。
使用 Cloud Build 配置。
身份验证以启用 Google 与您的 GitHub 集成。
授权访问,选择允许访问所有存储库或仅允许访问特定存储库。
登录完成后,点击下一步。
选择构建类型
在构建步骤中,选择使用 Dockerfile 或受支持的应用程序以及来自 GCP 的 Buildpacks。
选择Dockerfile并根据需要调整路径/文件名
服务设置
配置以下参数:
根据应用需要调整容器端口。
在安全选项卡中的服务帐户下,单击创建新服务帐户
添加角色
分析应用程序代码,我们需要将环境变量传递给数据库。
git clone git@github.com:cslemes/points-to-go.git
我们必须将应用程序代码更改为使用 Unix 套接字的 Cloud Sql 标准,并且 Cloud Run 不直接访问数据库,它使用 Cloud SQL Auth Proxy 。
``` FROM golang:latest WORKDIR /app/ COPY . . RUN go build main.go CMD ["./main"] ```
在容器中,转到“变量和秘密”选项卡,然后单击“添加变量”。
添加必要的变量。
银行地址遵循以下模式:PROJECT_ID:REGION:INSTANCE_NAME,您还可以在第 16 项中获取下面的名称。
我们将在“参考秘密”中输入的银行密码
如果创建新密钥选项被禁用,那是因为您需要激活 Api。
点击创建新秘密
定义密钥名称并单击创建密钥
在 Cloud SQL Connections 中,我们将添加我们创建的银行的 URL
要创建应用程序架构,代码要求我们传递参数migrations=true。
我们将向函数参数添加migrations=true,然后在下一个容器版本中将其删除。
其他字段保留默认,然后单击“创建”
使用 Thunder 客户端测试应用程序。
创建客户端
阅读注册客户
聊天机器人不会部署在 Cloud Run 上,而是安装在 Google Compute Engine (GCE) 上。与 Cloud Run 不同,Compute Engine 非常理想,因为聊天机器人需要持续活跃才能与聊天交互。
此外,我们还将介绍如何使用容器、秘密管理和 Cloud Build 配置来实现部署自动化。
更改 utils/db.go 来调用该函数,并将秘密管理器路径作为参数传递。
git clone git@github.com:cslemes/points-to-go.git
更改 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。
替换
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 映像的构建:
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 实例上的容器:
选项
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"] ```
设置服务帐户
测试应用程序
连接到实例并运行以下命令来检查容器的状态:
git clone git@github.com:cslemes/points-to-go.git
解决证书问题
如果发生与证书相关的错误(由临时基础映像引起),请将其替换为 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 权限
或者通过命令行,停止实例,运行命令,然后启动。
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 的通信。
网络安全调整
完成测试后,将仅供内部访问的容器放置在VPC中。
至此,我们完成了 TeoMeWhy 系统的迁移,该指南将作为迁移其他 TeoMeWhy 服务的基础。
实现的主要目标是:
以上是在 Google Cloud Run 上部署无服务器应用程序的详细内容。更多信息请关注PHP中文网其他相关文章!