谷歌雲帳號購買:基於GCP ArtifactRegistry與GKE構建Docker部署實例
玩過雲原生、折腾過 K8s 的朋友,大多都體驗過被「容器鏡像分發」和「集群部署」折磨的痛苦。
傳統的自建流程通常是這樣的:本地寫完代碼,打包成 Docker 鏡像,然後推送到一個開源的私有 Harbor 或者 Docker Hub 上。接著,你得自己維護 K8s 節點的拉流憑證(Secret),一旦憑證過期,GKE(Google Kubernetes Engine)集群就會瘋狂報錯。
鏡像拉取失敗
(鏡像拉取失敗)的靈異錯誤。 更別提由於鏡像倉庫和計算集群不在同一個機房,跨地域拉取幾個 GB 的大鏡像時,那高昂的公網流量費和慢到讓人抓狂的拉流延遲。
在 Google Cloud(GCP,谷歌雲)的現代化生態中,有一個堪稱教科書級別的企业級黃金組合:
利用 Artifact Registry 管理容器資產,配合 GKE 進行全自動的容器編排調度。
它們兩者的無敵之處在於
底層權限天然打通(基於 IAM)
。 你不需要配置任何繁瑣的 K8s Secret,GKE 節點就能以極高的安全內網頻寬,秒級拉取鏡像並完成滾動更新。
今天我們不談複雜的分佈式理論,拒絕任何官方黑話。 直接從零開始,手把手帶你打包一個 Web 應用,並以大廠的生產標準將其穩穩地部署到 GKE 生產叢集中。
第一階段:深度拆解,雲原生交付的「三維立體世界模型」
在動手敲命令之前,你必須在腦海裡把從代碼到公網上線的完整生命週期給理清楚。 整套企業級流水線由以下三個核心陣地焊死組成:
貨櫃碼頭(Artifact Registry):GCP 新一代的專用製品庫(全面取代了老舊的 GCR)。它負責存放你打包好的 Docker 鏡像版本,並內建谷歌大廠級別的漏洞掃描功能。
計算引擎(GKE 集群):由 Google 托管的 Kubernetes 服務。你不需要管底層的 Master 節點,只需要通過聲明式的 YAML 文件告訴它:「我要跑 3 個副本的 Web 容器」,它就會在後台自動幫你維穩。
安全大閘(IAM 角色):這是無密鑰打通的關鍵。我們會為 GKE 的節點掛上一個特定的身份(服務帳戶),讓它天生就擁有讀取 Artifact Registry 鏡像的權限。
第二階段:環境準備--在 GCP 上開闢基礎設施疆土
請確保你本地已經安裝並配置
好了
谷歌雲CLI
CLI(Google Cloud 命令列工具)和 Docker 引擎。
1. 激活核心 API(開荒第一步)
在終端里敲下這行命令,把我們要用的谷歌雲底層發動機給全部激活:
貝殼腳本
Gcloud services enable container.googleapis.com artifactregistry.googleapis.com
2. 創建私有鏡像倉庫(Artifact Registry)
我們在中國台灣地區(
亞洲東部1
,國內訪問延遲極低)建一個 Docker 專屬倉庫,項目 ID 假設叫
我的-GKE專案
:
貝殼腳本
Gcloud artifacts repositories create gke-repo \
--倉儲格式=docker
--位置=亞洲東部1區
--Description="GKE Production Images Repository"
3. 創建託管式 GKE 集群(Autopilot 模式)
對於中小企業或不想被 K8s 複雜調優折磨的團隊,
強烈建議選擇 Autopilot(自動駕駛)模式
。你不需要管節點的 CPU 和記憶體分配,谷歌會根據你的 Pod 聲明自動進行彈性伸縮,且只按你運行的 Pod 實際消耗來計費。
貝殼腳本
gcloud container clusters create-auto 產品-GKE叢集
--位置=亞洲東部1區
(創建集群大約需要 3~ 5 分鐘,喝杯咖啡耐心等待。)
第三階段:實戰演練一——本地代碼的「容器化」與推流上雲
我們假設你本地有一個極其簡單的 Web 應用(不管是 Node.js 還是 Python),它在本地監聽
八千零八十
端口。
1. 編寫硬核生產級 Dockerfile
在項目根目錄下,新建一個
Dockerfile
:
Dockerfile
# 使用官方輕量級基礎鏡像
來自 alpine:3.18
# 安裝運行時依賴(以 Python 為例)
RUN apk add --no-cache python3 py3-pip
工作目錄 /app
CO
派伊。 /應用程式
# 暴露業務端口
暴露 8080
# 啟動 Web 服務
CMD ["python3", "-m", "http.server", "8080"]
2. 綁定暗號:配置本地 Docker 與 GCP 的身份認證
很多人在這裡推流會報錯,因為 Docker 默認不認識 GCP 的倉庫。 我們需要讓
谷歌雲CLI
把安全憑證直接注入到本地的 Docker 配置檔案中:
貝殼腳本
gcloud auth configure-docker asia-east1-docker.pkg.dev
3. 編譯、打標籤並強力推流
按照 Artifact Registry 的標準規範,為鏡像取一個帶有雲端路徑的規範名稱,然後推上去做:
貝殼腳本
# 編譯打包成 v1.0 版本
docker build -t asia-east1-docker.pkg.dev/my-gke-project/gke-repo/my-web-app:v1.0 .
# 全力推流上雲
docker push asia-east1-docker.pkg.dev/my-gke-project/gke-repo/my-web-app:v1.0
進度條走完後,進入 GCP 控制台的 Artifact Registry 页面,你會發現鏡像已經穩穩地存放在雲端,並且谷歌已在後台自動為其進行作業系統漏洞掃描。
第四階段:實戰演練二——聲明式 YAML 部署 GKE 群集
鏡像已經上傳到雲端了,要如何讓 GKE 將其拉取並啟動,變成真正能夠提供服務的容器(Pod)? 在 K8s 的世界里,我們不敲擊指令,我們寫
YAML 配置檔案
。
本地連接到剛剛建好的 GKE 集群,拉取認證憑證:
貝殼腳本
gcloud 容器叢集取得憑證 prod-gke-cluster --位置=asia-east1
在本地新建一個叫
部署.yaml
的檔案,貼入以下符合大廠跨國架構規範的宣告式代碼:
YAML
API 版本:apps/v1
型別:部署
元數據:
名稱:網頁應用程式部署
標籤:
App: web-se
服務
規格:
複本數量:3 # 焊死高可用防線:常駐 3 個容器複本,有一個故障時會自動啟動新的
選擇器:
匹配標籤:
應用程式:網路服務
範本:
元數據:
標籤:
應用程式:網路服務
規格:
容器:
-名稱:網路容器
# 精準指向你剛才推送到 Artifact Registry 的鏡像路徑
影像:asia-east1-docker.pkg.dev/my-gke-project/gke-repo/my-web-app:v1.0
運動:
-容器端口:8080
資源:# 嚴格限制資源規格,防止被流氓代碼榨乾集群
限制:
中央處理器:「500m」
記憶體:「512Mi」
請求:
中央處理器:「200m」
記憶體:「256Mi」
---
API 版本:v1
型別:服務
元數據:
名稱:web-app-lb-service
規格:
類型:LoadBalancer # 讓 GKE 自動向谷歌網絡底層申請一個具備高防能力的全球公共負載均衡 IP
選擇器:
應用程式:網路服務
運動:
-傳輸協定:TCP
端口:80 # 前端公網入口端口
目標端口:8080 # 對應容器內部的真實端口
在終端裡執行一鍵部署命令,把這份設計圖紙丟給 GKE:
貝殼腳本
kubectl apply -f deployment.yaml
第五階段:見證奇蹟的時刻——上線驗證與故障熔斷演練
部署完後,我們用 K8s 的「天眼命令」來監控基礎設施的誕生:
貝殼腳本
kubectl 獲取 p
歐迪斯
你會看到屏幕上亮起 3 個綠色的
Running
狀態的 Pod。
重點來了:在這個過程中,我們沒有配任何的鏡像拉取密碼(ImagePullSecret),GKE 依託原生的 IAM 權限,直接 將Artifac tRegistr y中的私有鏡像安全地拉取下來!
接著,查看谷歌為我們分配的公網負載均衡外網入口:
貝殼腳本
Kubectl get service web-app-lb-service
你會看到
外部 IP
欄裡出現了一個金子般的公網靜態 IP(比如
34.120.x.x
)。 在瀏覽器裡輸入這個 IP,網頁秒開,你的雲原生 Web 服務正式名震公網!
模擬生產環境的「肉身熔斷演練」
為了體驗 GKE 的自愈能力,我們故意在後台進行破壞。手動刪除其中一個正在運行的容器(Pod):
貝殼腳本
kubectl 刪除 pod web-app-deployment-xxxxxx-xxxxx
刪掉的瞬間,你再次去刷新網頁,網站
完全沒有卡頓和中斷
(因為另外 2 個副本在扛著流量)。 更神奇的是,當你再次執行
kubectl 顯示 Pod
時,你會發現一個嶄新的 Pod 已經在幾秒鐘內被自動拉起並進入健康狀態了。 這就是 GKE 自動維護聲明式副本集(ReplicaSet)的王牌威力。
第六階段:跨國雲原生業務的避坑血淚史
這套方案跑通了,你就已經跨過了雲原生最硬的一道門檻。但要在真正的企業級高併發環境裡活下來,作為架構師,你必須立刻對配置進行二次加固,防範以下兩個隱形的大坑:
1. 絕不使用
最新
標籤(發版管理的萬惡之源)
很多團隊圖省事,每次本地編譯鏡像都打上
我的網路應用程式:最新版
標籤推上去。 在 YAML 里也寫著
圖片:. ..:最新
。
災難發生:當線上代碼出現 Bug 需要緊急回滾時,你會發現所有的歷史版本都被 latest 給覆蓋掉了。而且 K8s 底層有鏡像緩存機制,如果它發現本地已經有一個 latest 鏡像,即使你推了新代碼,它也可能偷懶直接復用本地的老鏡像,導致你的新版本根本發佈不上去。
大廠標準解法:堅決砍掉 latest 的使用。 每次推流,必須使用帶語義的版本號(如 v1.0、v1.1),或者
直接使用 Git 的 Commit ID。 發布新版本時,修改 YAML 里的版本號,讓 GKE 進行完美的 滾動更新(Rolling Update),實現業務零停機發版。
2. 卡死 Artifact Registry 的自動斷舍離(生命周期管理)
開發團隊如果配置了 CI/CD 自動化流水線(如 GitHub Actions、gitLab CI),每次代碼合併都會自動產生一個幾個 GB 的鏡像往 Artifact Registry 塞。 如果不管不顧,幾個月後倉庫裡就會堆積成千上萬個歷史死鏡像,月底的谷歌雲存儲賬單能直接讓老闆肉疼。
硬核省錢操作:在 Artifact Registry 倉庫設置里,開啟 「清理策略(Cleanup Policies)」。
冷資產自動抹除規則:配置一條規則:「對於没有任何標籤(Untagged)的臨時中間鏡像,只要超過7天即直接物理銷毀」;或者「對於帶有版本標籤的鏡像,只保留最近最新的20個版本,舊的自動抹除」。讓系統幫你自動斷捨離,能為公司的雲端資產省下高昂的閒置儲存費用。
總結
基於 GCP Artifact Registry 與 GKE 構建雲原生部署實例,核心的工業級精髓其實就在於十六個字:
鏡像版本落鎖,無密安全拉流,副本聲明維穩,倉庫自動清理
。
通過這套閉環的黃金組合,你徹底從繁瑣的伺服器環境配置、複雜的網絡負載均衡搭建以及親自盯防宕機的苦海中解脫了。把所有的精力交還給代碼和業務本身,在谷歌全球頂級的雲原生基礎設施之上,你的應用將擁有無限彈性、自動容災的頂級大廠底氣。
gcloud services 啟用 container.googleapis.com artifactregistry.googleapis.com
2. 創建私有鏡像倉庫(Artifact Registry)
我們在中國台灣地區(
亞洲東部1
,國內訪問延遲極低)建立一個 Docker 專屬倉庫,項目 ID 假設叫
我的-GKE專案
:
貝殼腳本
gcloud artifacts repositories create gke-repo
--倉儲格式=docker
--位置=亞洲東部1區
--Descri
選項=「GKE 生產映像庫」
3. 創建託管式 GKE 集群(Autopilot 模式)
對於中小企業或不想被 K8s 複雜調優折磨的團隊,
強烈建議選擇 Autopilot(自動駕駛)模式
。你不需要管節點的 CPU 和記憶體分配,谷歌會根據你的 Pod 聲明自動進行彈性伸縮,且只按你運行的 Pod 實際消耗來計費。
貝殼腳本
gcloud container clusters create-auto 產品-GKE叢集
--位置=亞洲東部1區
(創建集群大約需要 3~ 5 分鐘,喝杯咖啡耐心等待。)
第三階段:實戰演練一——本地代碼的「容器化」與推流上雲
我們假設你本地有一個極其簡單的 Web 應用(不管是 Node.js 還是 Python),它在本地監聽
八千零八十
端口。
1. 編寫硬核生產級 Dockerfile
在項目根目錄下,新建一個
Dockerfile
:
# 使用官方輕量級基礎鏡像
來自 alpine:3.18
# 安裝運行時依賴(以 Python 為例)
RUN apk add --no-cache python3 py3-pip
工作目錄 /app
複製。 /應用程式
# 暴露業務端口
暴露 8080
# 啟動 Web 服務
CMD ["python3", "-m", "http.server", "8080"]
2. 綁定暗號:配置本地 Docker 與 GCP 的身份認證
很多人在這裡推流會報錯,因為 Docker 默認不認識 GCP 的倉庫。 我們需要讓
谷歌雲CLI
把安全憑證直接注入到本地的 Docker 配置檔案中:
貝殼腳本
gcloud auth configure-docker asia-east1-docker.pkg.dev
3. 編譯、打標籤並強力推流
按照 Artifact Registry 的標準規範,為鏡像取一個帶有雲端路徑的規範名稱,然後推上去做:
貝殼腳本
# 編譯打包成 v1.0 版本
docker build -t asia-east1-docker.pkg.dev/my-gke-project/gke-repo/my-web-app:
1.0版 。
# 全力推流上雲
docker push asia-east1-docker.pkg.dev/my-gke-project/gke-repo/my-web-app:v1.0
進度條走完後,進入 GCP 控制台的 Artifact Registry 页面,你會發現鏡像已經穩穩地存放在雲端,並且谷歌已在後台自動為其進行作業系統漏洞掃描。
第四階段:實戰演練二——聲明式 YAML 部署 GKE 群集
鏡像已經上傳到雲端了,要如何讓 GKE 將其拉取並啟動,變成真正能夠提供服務的容器(Pod)? 在 K8s 的世界里,我們不敲擊指令,我們寫
YAML 配置檔案
。
本地連接到剛剛建好的 GKE 集群,拉取認證憑證:
貝殼腳本
gcloud 容器叢集取得憑證 prod-gke-cluster --位置=asia-east1
在本地新建一個叫
部署.yaml
的檔案,貼入以下符合大廠跨國架構規範的宣告式代碼:
YAML
API 版本:apps/v1
型別:部署
元數據:
名稱:網頁應用程式部署
標籤:
應用程式:網路服務
規格:
複本數量:3 # 焊死高可用防線:常駐 3 個容器複本,有一個故障時會自動啟動新的
選擇器:
匹配標籤:
應用程式:網路服務
範本:
元數據:
標籤:
應用程式:網路服務
規格:
容器:
-名稱:網路容器
# 精準指向你剛才推送到 Artifact Registry 的鏡像路徑
影像:asia-east1-docker.pkg.dev/my-gke-project/gke-repo/my-web-app:v1.0
運動:
-容器端口:8080
資源:# 嚴格限制資源規格,防止被流氓代碼榨取
幹集群
限制:
中央處理器:「500m」
記憶體:「512Mi」
請求:
中央處理器:「200m」
記憶體:「256Mi」
---
API 版本:v1
型別:服務
元數據:
名稱:web-app-lb-service
規格:
類型:LoadBalancer # 讓 GKE 自動向谷歌網絡底層申請一個具備高防能力的全球公共負載均衡 IP
選擇器:
應用程式:網路服務
運動:
-傳輸協定:TCP
端口:80 # 前端公網入口端口
目標端口:8080 # 對應容器內部的真實端口
在終端裡執行一鍵部署命令,把這份設計圖紙丟給 GKE:
貝殼腳本
kubectl apply -f deployment.yaml
第五階段:見證奇蹟的時刻——上線驗證與故障熔斷演練
部署完後,我們用 K8s 的「天眼命令」來監控基礎設施的誕生:
貝殼腳本
kubectl 顯示 Pod
你會看到屏幕上亮起 3 個綠色的
Running
狀態的 Pod。
重點來了:在這個過程中,我們沒有配任何的鏡像拉取密碼(ImagePullSecret),GKE 依託原生的 IAM 權限,直接 將Artifac tRegistr y中的私有鏡像安全地拉取下來!
接著,查看谷歌為我們分配的公網負載均衡外網入口:
貝殼腳本
Kubectl get service web-app-lb-service
你會看到
外部 IP
欄裡出現了一個金子般的公網靜態 IP(比如
34.120.x.x
)。 在瀏覽器裡輸入這個 IP,網頁秒開,你的雲原生 Web 服務正式名震公網!
模擬生產環境的「肉身熔斷演練」
為了體驗 GKE 的自愈能力,我們故意在後台進行破壞。手動刪除其中一個正在運行的容器(Pod):
貝殼腳本
kubectl 刪除 pod web-app-deployment-xxxxxx-xxxxx
刪掉的瞬間,你再次去刷
新網頁,網站
完全沒有卡頓和中斷
(因為另外 2 個副本在扛著流量)。 更神奇的是,當你再次執行
kubectl 顯示 Pod
此時,你會發現一個全新的 Pod 已經在幾秒鐘內被自動啟動並進入健康狀態了。這就是 GKE 自動維護聲明式副本集(ReplicaSet)的王牌威力。
第六階段:跨國雲原生業務的避坑血淚史
這套方案跑通了,你就已經跨過了雲原生最硬的一道門檻。但要在真正的企業級高併發環境裡活下來,作為架構師,你必須立刻對配置進行二次加固,防範以下兩個隱形的大坑:
1. 絕不使用
最新
標籤(發版管理的萬惡之源)
很多團隊圖省事,每次本地編譯鏡像都打上
我的網路應用程式:最新版
標籤推上去。 在 YAML 里也寫著
圖片:. ..:最新
。
災難發生:當線上代碼出現 Bug 需要緊急回滾時,你會發現所有的歷史版本都被 latest 給覆蓋掉了。而且 K8s 底層有鏡像緩存機制,如果它發現本地已經有一個 latest 鏡像,即使你推了新代碼,它也可能偷懶直接復用本地的老鏡像,導致你的新版本根本發佈不上去。
大廠標準解法:堅決砍掉 latest 的使用。每次推流,必須使用帶語義的版本號(如 v1.0、v1.1),或者直接使用 Git 的 Commit ID。發布新版本時,修改 YAML 檔案中的版本號,讓 GKE 進行完美的滾動更新(Rolling Update),實現業務零停機的發佈。
2. 卡死 Artifact Registry 的自動斷捨離(生命週期管理)
開發團隊如果配置了 CI/CD 自動化流水線(如 GitHub Actions、GitLab CI),每次代碼合併都會自動產生一個幾個 GB 的鏡像,並存入 Artifact Registry。如果不管不顧,幾個月後倉庫裡就會堆積成千上萬個歷史死鏡像,月底的谷歌雲儲存帳單能直接讓老闆肉疼。
硬核省錢操作:在 Artifact Registry 倉庫設定中,開啟 「清理策略(Cleanup Policies)」。
冷資產自動抹除規則:配置一條規則:「對於没有任何標籤(Untagged)的臨時中間鏡像,只要超過7天即直接物理銷毀」;或者「對於帶有版本標籤的鏡像,只保留最近最新的20個版本,舊的自動抹除」。讓系統幫你自動斷捨離,能幫公司的雲端資產省
下高昂的閒置存儲費。
總結
基於 GCP Artifact Registry 與 GKE 構建雲原生部署實例,核心的工業級精髓其實就在於十六個字:
鏡像版本落鎖,無密安全拉流,副本聲明維穩,倉庫自動清理
。
通過這套閉環的黃金組合,你徹底從繁瑣的伺服器環境配置、複雜的網絡負載均衡搭建以及親自盯防宕機的苦海中解脫了。把所有的精力交還給代碼和業務本身,在谷歌全球頂級的雲原生基礎設施之上,你的應用將擁有無限彈性、自動容災的頂級大廠底氣。

