本頁說明如何在 Google Kubernetes Engine (GKE) 中使用映像檔串流,在應用程式需要時串流映像檔資料,藉此提取容器映像檔。
Autopilot 叢集 (1.25.5 以上版本) 會自動使用映像檔串流功能,提取符合資格的映像檔。本頁的操作說明僅適用於標準叢集。
總覽
「映像檔串流」是一種提取容器映像檔的方法,GKE 會按照應用程式的要求從符合條件的映像檔中串流資料。有了映像檔串流,您不必等待整個映像檔下載完畢即可初始化工作負載,進而大幅縮短初始化的時間。縮短提取時間可帶來下列好處:
- 加快自動調度資源速度
- 拉取大型圖片時延遲時間縮短
- 加快 Pod 啟動速度
使用映像檔串流時,GKE 會將遠端檔案系統做為根檔案系統,供使用符合資格容器映像檔的容器使用。GKE 會在工作負載需要時,從遠端檔案系統串流處理映像檔資料。如果沒有映像檔串流功能,GKE 會將整個容器映像檔下載到每個節點,並做為工作負載的根檔案系統。
串流處理映像檔資料時,GKE 會在背景將整個容器映像檔下載到本機磁碟並快取。GKE 接著會從快取映像檔提供未來的資料讀取要求。
部署需要讀取容器映像檔中特定檔案的工作負載時,映像檔串流後端只會提供所要求的檔案。
需求條件
如要在 GKE Autopilot 和 Standard 叢集中使用圖片串流,必須符合下列條件:
您必須啟用 Container File System API。
您必須使用 Container-Optimized OS 搭配 containerd 節點映像檔。Autopilot 節點一律會使用這個節點映像檔。
容器映像檔必須儲存在 Artifact Registry 的標準或遠端存放區,或是 Docker Hub 的公開註冊資料庫。
如果您在叢集上啟用私人節點,就必須在子網路上啟用私人 Google 存取權,節點才能存取影像串流服務。
如果 VPC Service Controls 會保護容器映像檔,且您使用映像檔串流,則必須在服務範圍內加入 Image streaming API (
containerfilesystem.googleapis.com
)。如果叢集中的 GKE 節點未使用預設服務帳戶,請務必確認自訂服務帳戶在代管容器映像檔的專案中,具備「服務使用情形個人使用者」(
roles/serviceusage.serviceUsageConsumer
) IAM 角色。
限制
- 使用映像檔資訊清單 V2,結構定義版本 1的容器映像檔不符合資格。
- 以客戶管理的加密金鑰 (CMEK) 加密的容器映像檔,適用於 GKE 1.25.3-gke.1000 以上版本的映像檔串流功能。在舊版中,GKE 會下載這些映像檔,但不會串流資料。您仍可使用 CMEK,保護使用映像檔串流的叢集中所連結的永久磁碟和自訂開機磁碟。
- 系統不支援含有重複圖層的容器映像檔。GKE 會下載這些映像檔,不會串流資料。檢查容器映像檔是否有空白或重複的層。
- 如果工作負載在初始化期間讀取映像檔中的許多檔案,您可能會發現初始化時間變長,這是因為遠端檔案讀取作業增加了延遲。
- 在第一次提取符合資格的圖片時,您可能不會注意到圖片串流的優點。不過,在映像檔串流快取映像檔後,任何叢集日後提取映像檔時,都能享有映像檔串流的優勢。
- GKE Standard 叢集會使用叢集層級的設定,判斷是否要在透過節點自動佈建建立的新節點集區中啟用映像檔串流。不過,如果叢集層級停用了映像檔串流功能,您就無法使用工作負載分離功能,建立啟用映像檔串流功能的節點集區。
事前準備
開始之前,請確認你已完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update
,取得最新版本。
啟用 Container File System API。
在叢集上啟用映像檔串流
您可以使用 gcloud CLI --enable-image-streaming
標記,或使用Google Cloud 控制台,在新的或現有的標準叢集上啟用映像檔串流功能。根據預設,叢集中的節點集區會沿用叢集層級的「映像檔串流」設定。如要變更這項行為,請在叢集中啟用或停用節點集區的映像檔串流。
所有Autopilot叢集 (1.25.5 以上版本) 都會使用映像檔串流功能,提取符合資格的映像檔。如需操作說明,請參閱設定新 Autopilot 叢集的版本和發布版本。下列操作說明僅適用於 GKE Standard 叢集。
於新叢集
您可以使用 gcloud CLI 或 Google Cloud 控制台,在新叢集上啟用映像檔串流功能。
gcloud
如要建立啟用影像串流功能的新叢集,請執行下列指令:
gcloud container clusters create CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--image-type="COS_CONTAINERD" \
--enable-image-streaming
更改下列內容:
CLUSTER_NAME
:新叢集的名稱。CONTROL_PLANE_LOCATION
:叢集控制層的 Compute Engine 位置。為地區叢集提供地區,或為區域叢集提供區域。 確認區域或可用區與包含映像檔的 Artifact Registry 存放區位於同一區域,或位於該存放區的多區域內。
控制台
- 在 Google Cloud 控制台中,前往「建立 Kubernetes 叢集」頁面。
- 在導覽窗格的「Cluster」(叢集) 底下,按一下「Features」(功能)。
- 在「其他」部分中,勾選「啟用圖片串流」核取方塊。
- 視需要設定叢集,然後按一下「建立」。
於現有叢集
如要為符合需求的現有叢集啟用映像檔串流功能,請使用 gcloud CLI 或 Google Cloud 控制台。
gcloud
如要更新現有叢集以使用映像檔串流,請使用 gcloud CLI 執行下列指令:
gcloud container clusters update CLUSTER_NAME \
--enable-image-streaming
控制台
前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。
按一下您要修改的叢集名稱。
在「叢集」頁面的「功能」部分,按一下「影像串流」旁的 edit。
在「編輯映像檔串流」對話方塊中,勾選「啟用映像檔串流」核取方塊。
按一下 [儲存變更]。
修改叢集後,GKE 預設會自動在現有節點集區中啟用映像檔串流功能。如果您在個別節點集區中明確啟用或停用映像檔串流功能,這些節點集區就不會沿用叢集層級設定的變更。
在叢集層級更新「映像檔串流」設定時,系統會遵守維護可用性,但在節點集區層級則不會。
這項變更需要重新建立節點,可能會導致執行中的工作負載中斷。如要瞭解這項特定變更的詳細資料,請在「manual changes that recreate the nodes using a node upgrade strategy and respecting maintenance policies」(手動變更,使用節點升級策略重建節點,並遵守維護政策) 表格中找到對應的資料列。如要進一步瞭解節點更新,請參閱「規劃節點更新中斷」。
確認叢集已啟用映像檔串流
您可以使用 gcloud CLI 或 Google Cloud 控制台,檢查叢集層級是否已啟用映像檔串流。
gcloud
執行下列指令:
gcloud container clusters describe CLUSTER_NAME \
--flatten "nodePoolDefaults.nodeConfigDefaults"
如果輸出內容類似下列內容,表示這項設定已啟用:
gcfsConfig:
enabled: true
...
如果輸出內容類似下列內容,表示這項設定已停用:
gcfsConfig: {}
...
控制台
前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。
按一下要檢查的叢集名稱。
在「叢集」頁面的「功能」部分,旁邊會顯示「影像串流」設定是否已啟用。
在節點集區上啟用映像檔串流
根據預設,節點集區會沿用叢集層級的「映像檔串流」設定。您可以使用 gcloud CLI,在特定節點集區上啟用或停用映像檔串流功能。
在新節點集區中
如要建立啟用映像檔串流功能的新節點集區,請執行下列指令:
gcloud container node-pools create NODE_POOL_NAME \
--cluster=CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--image-type="COS_CONTAINERD" \
--enable-image-streaming
更改下列內容:
NODE_POOL_NAME
:新節點集區的名稱。CLUSTER_NAME
:節點集區的叢集名稱。CONTROL_PLANE_LOCATION
:叢集控制層的 Compute Engine 位置。為地區叢集提供地區,或為區域叢集提供區域。
現有節點集區
您可以在符合規定的現有節點集區上啟用映像檔串流功能。
如要更新現有節點集區以使用映像檔串流,請執行下列指令:
gcloud container node-pools update POOL_NAME \
--cluster=CLUSTER_NAME \
--enable-image-streaming
在叢集層級更新「映像檔串流」設定時,系統會遵守維護可用性,但在節點集區層級則不會。
這項變更需要重新建立節點,可能會導致執行中的工作負載中斷。如要瞭解這項特定變更的詳細資訊,請在「手動變更,使用節點升級策略重建節點,但不遵守維護政策」表格中,找到對應的資料列。如要進一步瞭解節點更新,請參閱「規劃節點更新中斷」。
確認節點集區已啟用映像檔串流功能
檢查節點集區是否已啟用映像檔串流功能:
gcloud container node-pools describe POOL_NAME \
--cluster=CLUSTER_NAME \
如果輸出內容類似下列內容,表示這項設定已啟用:
gcfsConfig:
enabled: true
...
如果輸出內容類似下列內容,表示這項設定已停用:
gcfsConfig: {}
...
使用映像檔串流排定工作負載
在叢集上啟用映像檔串流後,GKE 會自動從 Artifact Registry 提取符合資格的容器映像檔,並使用映像檔串流,不需進一步設定。
GKE 會將 cloud.google.com/gke-image-streaming: "true"
標籤新增至已啟用映像檔串流功能的節點集區中的節點。在 GKE Standard 中,如果您在特定節點集區啟用或停用映像檔串流,讓叢集同時有使用映像檔串流的節點和未使用映像檔串流的節點,您可以在部署作業中使用節點選取器,控管 GKE 是否要將工作負載排程至使用映像檔串流的節點。
在下列範例中,您會在啟用映像檔串流的叢集上,排定使用大型容器映像檔的 Deployment。然後,您可以選擇比較啟用映像檔串流與未啟用時的映像檔提取效能。
建立啟用映像檔串流的新叢集:
gcloud container clusters create CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --enable-image-streaming \ --image-type="COS_CONTAINERD"
取得叢集的憑證:
gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION
將下列資訊清單儲存為
frontend-deployment.yaml
:apiVersion: apps/v1 kind: Deployment metadata: name: frontend spec: replicas: 1 selector: matchLabels: app: guestbook tier: frontend template: metadata: labels: app: guestbook tier: frontend spec: containers: - name: php-redis image: us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5 env: - name: GET_HOSTS_FROM value: "dns" resources: requests: cpu: 100m memory: 100Mi ports: - containerPort: 80
gb-frontend
容器映像檔的大小為 327 MB。將資訊清單套用至叢集:
kubectl apply -f frontend-deployment.yaml
確認 GKE 是否已建立 Deployment:
kubectl get pods -l app=guestbook
輸出結果會與下列內容相似:
NAMESPACE NAME READY STATUS RESTARTS AGE default frontend-64bcc69c4b-pgzgm 1/1 Completed 0 3s
取得 Kubernetes 事件記錄檔,查看映像檔提取事件:
kubectl get events --all-namespaces
輸出結果會與下列內容相似:
NAMESPACE LAST SEEN TYPE REASON OBJECT MESSAGE default 11m Normal Pulling pod/frontend-64bcc69c4b-pgzgm Pulling image "us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5" default 11m Normal Pulled pod/frontend-64bcc69c4b-pgzgm Successfully pulled image "us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5" in 1.536908032s default 11m Normal ImageStreaming node/gke-riptide-cluster-default-pool-f1552ec4-0pjv Image us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5 is backed by image streaming. ...
輸出內容如下:
Pulled
事件會顯示圖片串流提取圖片所用的時間。ImageStreaming
事件顯示節點使用映像檔串流來提供容器映像檔。
與標準圖片提取功能比較成效
在這個選用範例中,您會建立停用影像串流的新叢集,並部署 frontend
Deployment,以便比較影像串流的效能。
建立停用映像檔串流的新叢集:
gcloud container clusters create CLUSTER2_NAME\ --location=CONTROL_PLANE_LOCATION \ --image-type="COS_CONTAINERD"
取得叢集的憑證:
gcloud container clusters get-credentials CLUSTER2_NAME \ --location=CONTROL_PLANE_LOCATION
部署上一個範例中的
frontend
Deployment:kubectl apply -f frontend-deployment.yaml
取得 Kubernetes 事件記錄檔:
kubectl get events --all-namespaces
輸出結果會與下列內容相似:
NAMESPACE LAST SEEN TYPE REASON OBJECT MESSAGE default 87s Normal Pulled pod/frontend-64bcc69c4b-qwmfp Successfully pulled image "us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5" in 23.929723476s
請注意 GKE 提取整個映像檔所花費的時間。在本範例輸出內容中,GKE 需要將近 24 秒。啟用映像檔串流後,GKE 只需要 1.5 秒,即可提取工作負載啟動所需的映像檔資料。
清除所用資源
為避免產生費用,請刪除您在先前範例中建立的叢集:
gcloud container clusters delete CLUSTER_NAME CLUSTER2_NAME
停用映像檔串流
如果您使用 GKE Autopilot,就無法在個別叢集上停用映像檔串流。您可以停用 Container File System API,這樣整個專案的映像檔串流功能就會停用。
如果您使用 GKE Standard 叢集,可以停用個別叢集或特定節點集區的映像檔串流功能,詳情請參閱下列章節。
在 GKE Standard 叢集上停用映像檔串流
您可以使用 gcloud CLI 或Google Cloud console,在現有的 GKE Standard 叢集上停用映像檔串流功能。
gcloud
如要停用現有叢集的映像檔串流功能,請執行下列指令:
gcloud container clusters update CLUSTER_NAME \
--no-enable-image-streaming
控制台
前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。
按一下您要修改的叢集名稱。
在「叢集」頁面的「功能」下方,按一下「影像串流」旁的 edit。
在「編輯映像檔串流」對話方塊中,取消勾選「啟用映像檔串流」核取方塊。
按一下 [儲存變更]。
在叢集層級更新「映像檔串流」設定時,系統會遵守維護可用性,但在節點集區層級則不會。
這項變更需要重新建立節點,可能會導致執行中的工作負載中斷。如要瞭解這項特定變更的詳細資料,請在「manual changes that recreate the nodes using a node upgrade strategy and respecting maintenance policies」(手動變更,使用節點升級策略重建節點,並遵守維護政策) 表格中找到對應的資料列。如要進一步瞭解節點更新,請參閱「規劃節點更新中斷」。
在新節點集區中
如要在建立新節點集區時停用映像檔串流,請指定 --no-enable-image-streaming
標記,如下列指令所示:
gcloud container node-pools create NODE_POOL_NAME \
--cluster=CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--no-enable-image-streaming
現有節點集區
如要停用現有節點集區的映像檔串流功能,請執行下列指令:
gcloud container node-pools update NODE_POOL_NAME \
--cluster=CLUSTER_NAME \
--no-enable-image-streaming
在叢集層級更新「映像檔串流」設定時,系統會遵守維護可用性,但在節點集區層級則不會。
這項變更需要重新建立節點,可能會導致執行中的工作負載中斷。如要瞭解這項特定變更的詳細資訊,請在「手動變更,使用節點升級策略重建節點,但不遵守維護政策」表格中,找到對應的資料列。如要進一步瞭解節點更新,請參閱「規劃節點更新中斷」。
映像檔串流的記憶體預留
除了保留給節點系統元件執行的記憶體外,GKE 還會保留記憶體資源供影像串流使用。GKE 不會為影像串流保留額外的 CPU 資源。在 GKE Standard 叢集中,這項預留作業會變更您可在 Pod 中要求的記憶體資源。在 GKE Autopilot 中,GKE 會管理系統分配作業,因此排定工作負載時不會受到影響。
如要進一步瞭解 GKE 為節點元件保留的記憶體,請參閱「標準叢集架構」。
在採用映像檔串流的節點中,GKE 會為新預留項目額外預留下列記憶體:
- 記憶體容量小於 1 GiB 的機器,不需要額外的記憶體
- 前 4 GiB 記憶體的 1%
- 下一個 4 GiB 記憶體的 0.8% (最高 8 GiB)
- 下一個 8 GiB 記憶體的 0.4% (最高 16 GiB)
- 下一個 112 GiB 記憶體的 0.24% (最高 128 GiB)
- 如果記憶體大小超過 128 GiB,則保留任何記憶體的 0.08%
疑難排解
以下各節提供圖片串流的疑難排解建議。如需排解標準映像檔提取問題的建議,請參閱排解映像檔提取問題。
GKE 不會使用映像檔串流檔案系統
如果 GKE 事件記錄未顯示映像檔串流事件,表示映像檔並未由遠端檔案系統支援。如果 GKE 先前在節點上提取映像檔,這是預期行為,因為 GKE 會使用映像檔的本機快取,進行後續提取作業,而不是使用映像檔串流。如要驗證這點,請在 Pod Pulled
事件的 Message
欄位中尋找 Container image IMAGE_NAME already present on machine
。
如果在節點上首次提取映像檔時,沒有看到映像檔串流事件,請確認您符合映像檔串流的規定。如果符合規定,您可以檢查影像串流服務 (名為 gcfsd
) 的記錄,診斷問題:
前往 Google Cloud 控制台的「Logs Explorer」頁面:
在「Query」(查詢) 欄位中,指定下列查詢:
logName="projects/PROJECT_ID/logs/gcfsd" resource.labels.cluster_name="CLUSTER_NAME"
更改下列內容:
PROJECT_ID
:專案名稱。CLUSTER_NAME
:叢集名稱。
點選「執行查詢」
您也可以使用記錄檔探索工具檢查 gcfsd
記錄:
前往 Google Cloud 控制台的「Logs Explorer」:
在「Query」(查詢) 欄位中,指定下列查詢:
logName="projects/PROJECT_ID/logs/gcfsd"
並將
PROJECT_ID
改成您的專案 ID。 Google Cloud
PermissionDenied
如果 gcfsd
記錄顯示類似下列內容的錯誤訊息,表示節點的 API 範圍不正確。GKE 會提取工作負載的容器映像檔,但不會使用映像檔串流。
level=fatal msg="Failed to create a Container File System client: rpc error:
code = PermissionDenied desc = failed to probe endpoint: rpc error: code = PermissionDenied
desc = Request had insufficient authentication scopes."
如要修正這個問題,請授予節點正確的範圍,允許節點使用影像串流。將 devstorage.read_only
範圍新增至叢集或節點集區,類似於下列指令:
gcloud container node-pools create NODE_POOL_NAME \
--cluster=CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--image-type="COS_CONTAINERD" \
--enable-image-streaming \
--scopes="https://www.googleapis.com/auth/devstorage.read_only"
FailedPrecondition
如果看到含有 code = FailedPrecondition
的錯誤訊息,表示圖片未匯入 Image streaming 遠端檔案系統。
如果您嘗試在現有節點集區中使用影像串流,可能會看到這則錯誤訊息。如果節點集區中的節點已在磁碟上儲存容器映像檔,GKE 會使用本機映像檔,而不是透過映像檔串流取得映像檔。
如要修正這個問題,請嘗試下列方法:
- 請稍候幾分鐘,然後再次嘗試部署工作負載。
- 新增節點或節點集區,並在這些節點上排定工作負載。
InvalidArgument
如果看到含有 code=InvalidArgument
的錯誤訊息,表示工作負載使用的容器映像檔不符合映像檔串流資格。確認圖片符合規定。如果映像檔不在 Artifact Registry 中,請嘗試遷移至 Artifact Registry。
backend.FileContent failed
啟用圖片串流功能後,讀取容器檔案時可能會出現下列錯誤:
level=error msg="backend.FileContent failed" error="rpc error: code = ResourceExhausted desc = Quota exceeded for quota metric 'Content requests per project per region' and limit 'Content requests per project per region per minute per region' of service 'containerfilesystem.googleapis.com' for consumer 'project_number:PROJECT_NUMBER'." layer_id="sha256:1234567890" module=gcfs_backend offset=0 path=etc/passwd size=4096
這項錯誤表示專案已超過從遠端容器檔案系統服務讀取檔案所需的配額。如要解決這個問題,請要求調整配額,以提高下列配額值:
- 每個專案每分鐘每個區域的內容要求數
- 每個區域每項專案的內容要求數
GKE 會下載映像檔,不會串流處理資料
使用客戶自行管理的加密金鑰 (CMEK) 的容器映像檔,僅適用於 GKE 1.25.3-gke.1000 以上版本的映像檔串流。如果容器映像檔含有重複圖層,就不符合映像檔串流資格。詳情請參閱「限制」一節。
檢查是否有空白圖層或重複圖層
如要檢查容器映像檔是否有空白層或重複層,請執行下列指令:
docker inspect IMAGE_NAME
將 IMAGE_NAME
替換為容器映像檔的名稱。
在指令輸出內容中,檢查 "Layers"
下的項目。
如果其中一個項目與下列 "sha256"
輸出內容完全相符,表示容器映像檔含有空白層,因此不符合映像檔串流資格。
"Layers": [ ... "sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4", ... ]
如果出現重複項目 (如下例所示),容器映像檔就會有重複的層,因此不符合映像檔串流資格。
"Layers": [
"sha256:28699c71935fe3ffa56533db44ad93e5a30322639f7be70d5d614e06a1ae6d9b",
...
"sha256:28699c71935fe3ffa56533db44ad93e5a30322639f7be70d5d614e06a1ae6d9b",
...
]
mv
指令和 renameat2
系統呼叫在符號連結檔案上失敗
如果 GKE 節點執行的是 1.25 以上版本,且啟用映像檔串流功能,則 mv
指令和 renameat2
系統呼叫可能會在容器映像檔中的符號連結檔案上失敗,並顯示「No such device or address」(沒有這類裝置或位址) 錯誤訊息。這個問題是由近期 Linux 核心的迴歸所導致。
這些系統呼叫並不常見,因此大多數圖片都不會受到這個問題影響。這個問題通常發生在容器初始化階段,也就是準備執行應用程式和移動檔案時。您無法在本機測試映像檔,因此 GKE 建議在測試環境中使用映像檔串流,以便在映像檔用於正式環境前找出問題。
下列 GKE 修補程式版本提供修正措施:
- 1.25:1.25.14-gke.1351000 以上版本
- 1.26:1.26.9-gke.1345000 以上版本
- 1.27:1.27.6-gke.100 以上版本
- 1.28:1.28.1-gke.1157000 以上版本
或者,如要針對任何受影響的工作負載減輕這個問題,可以嘗試替換導致 renameat2
系統呼叫的程式碼。如果無法修改程式碼,請務必在節點集區停用圖片串流,以解決問題。