介绍
在本指南中,我将从 Twitch 的 TeoMeWhy 系统(当前位于 AWS 上)部署容器,并将其放置在 GCP 上。
AWS 的当前结构
GCP 架构
不会使用复杂的自动化工具,一切都将通过控制台完成,与 Github 集成并在每次提交到 main 时部署映像。
我们将使用:
- Cloud Run - 适用于 Web 应用程序
- Cloud SQL - 适用于 MySQL 数据库
- GCE - 运行 Teomebot
- 云存储 - 对象存储 (S3)
- Cloud Build - 创建应用程序部署
- 秘密管理器 - 安全地保存应用程序凭据。
获取应用程序
- 访问 TeoMeWhy 的 GitHub 和 fork 与该项目相关的应用程序。
- 在存储库页面上,单击已加星标,然后单击分叉。
- 在分叉页面上,为分叉命名,然后单击创建分叉。
- 如果您想复制整个环境,请对项目中的其他存储库重复此过程。
- 制作 分叉 的 克隆 ,以便在将应用程序发送到 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.
-
将构建镜像替换为更轻的版本,并命名以供其他阶段参考。
FROM golang:1.23.1-alpine3.20 AS build
-
添加 go mod download 命令来缓存依赖项并进行 go mod 验证以确保它们与 go.sum. 文件中的 checksums
匹配RUN go mod download && go mod verify
-
要优化生产二进制文件,请添加以下参数:
- 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
-
(可选)为了使镜像更小,我们可以使用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
- 比较构建
- Dockerfile 优化和使用 upx 可使图像缩小 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 |
- 对其他存储库重复这些设置。
部署数据库
- 在控制台中,访问侧面菜单中的SQL。
- 或者在搜索栏中搜索“SQL”,然后从列表中选择 SQL。
- 在 Cloud SQL 页面上,点击创建实例并选择 MySQL。
- 选择正在编辑的企业。
- 在“编辑预设”下,选择沙盒。
- 将数据库版本保留为MySQL 8.0。
- 在实例 ID 下为实例命名并设置密码。
- 您可以通过扩展密码策略来指定密码策略
- 定义区域和区域,我们将把它留在一个区域中。
- 在自定义实例中我们可以根据需要调整硬件,选项会根据我们选择的版本而有所不同。
- 根据需要将CPU调整为1,磁盘调整为10GB。
- 在连接中,取消选中公共 IP 并选中私有 IP。
- 在私人访问连接中单击配置连接
- 选择使用自动分配的范围
- 点击继续
- 点击创建连接
- 点击创建实例并等待创建。
-
要连接到实例,请激活 Cloud Shell 并运行:
git clone git@github.com:cslemes/points-to-go.git
- 输入上一步中分配的密码。
- 然后您将收到连接错误,因为 Cloud shell 无权访问您的私有 VPC。
- 为了简化通过Cloud shell的连接,让我们编辑实例并标记公共IP,在附录中我将展示如何创建VPC对等以通过云贝壳
-
- 创建应用程序数据库:
``` 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。
- 在 Google Cloud 控制台中,通过侧面菜单或搜索栏访问
- Cloud Run。
- 部署容器 并选择 服务 选项。
- 部署服务有三个选项:
-
- 使用注册表中的容器映像。
- 直接连接到存储库。
- 创建一个函数(使用
- 云函数,与 Run 集成)。
对于本指南,选择 - 使用 GitHub 进行持续部署,允许 Google 自动配置 CI/CD 管道。
- 单击
使用 Cloud Build 配置。
- 配置与 GitHub 的连接
- 单击
身份验证以启用 Google 与您的 GitHub 集成。
授权访问,选择允许访问所有存储库或仅允许访问特定存储库。
登录完成后,点击下一步。
选择构建类型
在构建步骤中,选择使用 Dockerfile 或受支持的应用程序以及来自 GCP 的 Buildpacks。
选择Dockerfile并根据需要调整路径/文件名
服务设置
-
配置以下参数:
- 身份验证:选择允许未经身份验证的呼叫。
- CPU 分配:选择 CPU 仅在请求处理期间分配。
-
输入控制:选择内部。
根据应用需要调整容器端口。
在安全选项卡中的服务帐户下,单击创建新服务帐户
-
添加角色
- 存储对象管理员
- Cloud Run 管理员
- 秘密经理秘密顾问
- Cloud SQL 客户端
- 云构建服务帐户
- 工件注册表记录器
- 服务帐户用户
-
分析应用程序代码,我们需要将环境变量传递给数据库。
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 客户端测试应用程序。
创建客户端
阅读注册客户
创建 Teomebot 服务
聊天机器人不会部署在 Cloud Run 上,而是安装在 Google Compute Engine (GCE) 上。与 Cloud Run 不同,Compute Engine 非常理想,因为聊天机器人需要持续活跃才能与聊天交互。
此外,我们还将介绍如何使用容器、秘密管理和 Cloud Build 配置来实现部署自动化。
在 Google Compute Engine (GCE) 上创建虚拟机
- 在 GCP Console 侧面菜单中访问 Compute Engine。
- 单击创建实例。
- 输入实例的名称(例如 teomebot-instance)。
- 根据需要配置区域和区域并记下此信息以供以后使用。
- 在机器设置中,选择E2类型,并在预设中,选择e2-micro。
- 单击容器选项卡,然后单击部署容器。
- 暂时使用nginx:latest镜像来完成初始配置。
- 添加环境变量:
- TWITCH_BOT:机器人名称。
- TWITCH_CHANNEL:Twitch 频道名称。
- HOST_DB:Cloud SQL 数据库的私有 IP。
- USER_DB:银行用户。
- PORT_DB:银行端口。
- URL_POINTS:服务端点Points-to-Go。
- 单击选择
- 在身份和 API 访问下,选择为此项目配置的服务帐户。
- 其余设置保留默认值,然后单击创建。
使用 Secret Manager 添加 Secret
- 您可能已经注意到,我们没有传递秘密,在计算引擎中没有像在云运行中那样简单的方法来传递它们。我的解决方案是在应用程序代码中添加一个函数,以直接从秘密管理器读取信息。
- 在 GCP Console 中访问 Secret Manager。
- 点击创建秘密
- 输入描述性名称(例如 twitch-token)并添加相应的值。
- 复制生成的密钥的路径(例如:projects/123456/secrets/twitch-token/versions/latest)。
- 创建一个新的 utils/gcp.go 文件
-
更改 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。
- 在存储库的根目录中创建一个 cloudbuild.yaml 文件,内容如下:
-
替换
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"] ```
创建容器镜像创建触发器
设置服务帐户
- 转到 Google Cloud 控制台中的 Cloud Build。
- 前往设置。
- 单击服务帐户权限。
- 找到为Cloud Run创建的服务帐户。
- 激活选项设置为首选服务帐户
- 为服务帐户启用计算实例管理员角色。
创建触发器
- 在侧面菜单中,单击触发器,然后单击创建触发器。
- 输入触发器的描述性名称。
- 在存储库中,单击连接存储库并选择Teomebot存储库。
- 在配置中,选择选项云构建配置文件。
- 添加 _DEPLOY_ZONE 替换变量,其值与创建实例的区域相对应。
- 在服务帐户中,检查所选帐户是否符合步骤 6 中的配置。
- 点击保存。 运行触发器
- 在概述屏幕上,在新创建的触发行中,单击“执行”以手动运行该流程。
- 在流程详细信息中,按照镜像构建步骤检查可能存在的错误。
测试应用程序
- 在 Compute Engine 面板中,复制 ssh 命令来访问实例,或使用 ssh Web 客户端,然后连接实例。
-
连接到实例并运行以下命令来检查容器的状态:
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 权限
- 更改服务帐户范围以访问Secret Manager。
- 前往 Google Cloud Console。
- 在侧面菜单中,转到Compute Engine > > VM 实例.
- 找到并单击您的虚拟机实例的名称。
- 在虚拟机详情页面,点击停止关闭实例(此步骤是必要的,因为服务帐户范围只能在实例停止时修改)。
- 实例停止后,点击页面顶部的编辑。
- 向下滚动到身份和访问 API 部分。
- 在服务帐户下,选择您的应用程序使用的服务帐户。
- 在 API 访问范围下,选择 允许完全访问所有云 API 或单击 设置特定 API 访问范围 并添加范围 https://www .googleapis.com/auth/cloud-platform.
- 调整范围后,单击保存应用更改。
- 通过单击开始重新启动实例。
-
或者通过命令行,停止实例,运行命令,然后启动。
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 服务的基础。
实现的主要目标是:
技术成果
- 将容器化应用迁移到 Cloud Run,实现自动扩展并降低成本
- 通过多阶段构建优化 Docker 镜像,显着减少镜像大小和漏洞
- 使用 Cloud SQL 实施托管数据库,确保高可用性和安全性
- 使用 Cloud Build 进行自动化 CI/CD 配置,支持从 GitHub 进行自动部署
- 使用 Secret Manager 进行安全凭证管理
架构改进
- 服务之间明确的职责分离
- 使用私有连接以提高安全性
- 实施无服务器标准以优化成本
- 构建和部署流程的自动化
- 与 GitHub 存储库无缝集成
获得的好处
- 成本:通过无服务器模型和资源优化降低成本
- 可维护性:通过自动化部署轻松维护
- 安全性:正确管理秘密和私人连接
- 可扩展性:能够根据需求自动扩展
- 监控:通过原生 GCP 工具提高基础设施可见性
附录
启用秘密管理器 API
- 在 Google Cloud 控制台中,搜索 Secret Manager API。
- 点击搜索结果中的API。
- 在详细信息屏幕上,单击激活。
参考
- Github TeoMeWhy
- Twitch Teo Me Why
- Cloud Run 文档
- 计算引擎文档
- 云构建文档
- 秘密管理器文档
以上是在 Google Cloud Run 上部署无服务器应用程序的详细内容。更多信息请关注PHP中文网其他相关文章!

goroutinesarefunctionsormethodsthatruncurranceingo,启用效率和灯威量。1)shememanagedbodo'sruntimemultimusingmultiplexing,允许千sstorunonfewerosthreads.2)goroutinessimproverentimensImproutinesImproutinesImproveranceThroutinesImproveranceThrountinesimproveranceThroundinesImproveranceThroughEasySytaskParallowalizationAndeff

purposeoftheInitfunctionoIsistoInitializeVariables,setUpConfigurations,orperformneccesSetarySetupBeforEtheMainFunctionExeCutes.useInitby.UseInitby:1)placingitinyourcodetorunautoamenationally oneraty oneraty oneraty on inity in ofideShortAndAndAndAndForemain,2)keepitiTshortAntAndFocusedonSimImimpletasks,3)

Gointerfacesaremethodsignaturesetsthattypesmustimplement,enablingpolymorphismwithoutinheritanceforcleaner,modularcode.Theyareimplicitlysatisfied,usefulforflexibleAPIsanddecoupling,butrequirecarefulusetoavoidruntimeerrorsandmaintaintypesafety.

在Go中使用recover()函数可以从panic中恢复。具体方法是:1)在defer函数中使用recover()捕获panic,避免程序崩溃;2)记录详细的错误信息以便调试;3)根据具体情况决定是否恢复程序执行;4)谨慎使用,以免影响性能。

本文讨论了使用GO的“字符串”软件包进行字符串操作,详细介绍了共同的功能和最佳实践,以提高效率并有效地处理Unicode。

本文详细介绍了GO的“时间”包用于处理日期,时间和时区,包括获得当前时间,创建特定时间,解析字符串以及测量经过的时间。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

WebStorm Mac版
好用的JavaScript开发工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。