在本指南中,我將從 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中文網其他相關文章!