谷歌雲帳號購買:基於GCP ArtifactRegistry與GKE構建Docker部署實例

雲端 2026-05-30 阅读 16
1

玩過雲原生、折腾過 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 構建雲原生部署實例,核心的工業級精髓其實就在於十六個字:

鏡像版本落鎖,無密安全拉流,副本聲明維穩,倉庫自動清理

通過這套閉環的黃金組合,你徹底從繁瑣的伺服器環境配置、複雜的網絡負載均衡搭建以及親自盯防宕機的苦海中解脫了。把所有的精力交還給代碼和業務本身,在谷歌全球頂級的雲原生基礎設施之上,你的應用將擁有無限彈性、自動容災的頂級大廠底氣。

3
← 返回新闻中心