使用映像檔串流來提取容器映像檔

本頁面說明如何在 Google Kubernetes Engine (GKE) 使用映像檔串流功能,在應用程式需要時串流映像檔資料,藉此提取容器映像檔。

Autopilot 叢集會自動使用映像檔串流功能提取符合資格的映像檔。本頁面中有關啟用和停用映像檔串流的操作說明,適用於 Standard 叢集。

總覽

映像檔串流是一種提取容器映像檔的方法,GKE 會根據應用程式的要求,從符合資格的映像檔串流傳輸資料。您可以使用映像檔串流功能,不必等待整個映像檔下載完畢,即可初始化工作負載,大幅縮短初始化時間。縮短提取時間可帶來下列好處:

  • 自動調度資源速度更快
  • 縮短提取大型映像檔的延遲時間
  • 加快 Pod 啟動速度

啟用映像檔串流功能後,GKE 會將遠端檔案系統,做為任何使用合格容器映像檔的容器根檔案系統。GKE 會根據工作負載的需求,從遠端檔案系統串流傳輸映像檔資料。如果未啟用映像檔串流功能,GKE 會將整個容器映像檔下載到各個節點,並做為工作負載的根檔案系統。

串流映像檔資料時,GKE 會在背景將整個容器映像檔下載到本機磁碟,並加以快取。之後,GKE 會從快取的映像檔提供資料讀取要求。

部署工作負載時,如果需要讀取容器映像檔中的特定檔案,映像檔串流後端只會提供要求的檔案。

需求條件

您必須符合下列規定,才能在 GKE Autopilot 和 Standard 叢集中使用映像檔串流:

  • 必須啟用 Container File System API。

    啟用 Container File System API

  • 您必須使用含有 containerd 的節點映像檔。支援的選項包括:

    • 採用 containerd 的 Container-Optimized OS (COS_CONTAINERD):支援 GKE 1.30.1-gke.1329000 以上版本。這是 Autopilot 節點的預設值。進一步瞭解 COS。
    • UBUNTU_CONTAINERD (搭載 containerd 的 Ubuntu):支援 GKE 1.35.0-gke.1403000 以上版本。進一步瞭解 Ubuntu 節點映像檔。
  • 容器映像檔必須儲存在 Artifact Registry 的標準或遠端存放區,或 Docker Hub 的公開註冊資料庫。

  • 如果您在叢集上啟用私人節點,則必須在子網路上啟用私人 Google 存取權,節點才能存取映像檔串流服務。

  • 如果 VPC Service Controls 保護容器映像檔,且您使用映像檔串流,則必須在 service perimeter 中加入映像檔串流 API (containerfilesystem.googleapis.com)。

  • 如果叢集中的 GKE 節點未使用預設服務帳戶,您必須確保自訂服務帳戶在託管容器映像檔的專案中,具備服務使用情形消費者 (roles/serviceusage.serviceUsageConsumer) IAM 角色。

限制

  • 使用 V2 映像檔資訊清單、結構定義第 1 版的容器映像檔不符合資格。
  • 不支援含有重複層的容器映像檔。GKE 會下載這些映像檔,不會串流傳輸資料。檢查容器映像檔是否有空白層或重複層。
  • 如果工作負載在初始化期間讀取映像檔中的多個檔案,初始化時間可能會因遠端檔案讀取作業增加的延遲時間而增加。
  • 如果工作負載需要先提供大部分的映像檔,才能執行程式碼,那麼從 kubelet 啟動容器到容器實際開始傳送記錄之間,可能會出現延遲。
  • 第一次提取符合條件的映像檔時,您可能不會注意到映像檔串流的優點。不過,映像檔串流快取映像檔後,日後在任何叢集提取映像檔時,都能享有映像檔串流的好處。
  • GKE Standard 叢集會根據叢集層級設定,判斷是否要為使用節點集區自動建立功能建立的新節點集區啟用映像檔串流。不過,如果叢集層級已停用映像檔串流功能,您就無法使用工作負載分隔功能,建立啟用映像檔串流功能的節點集區。
  • Kubernetes 使用者命名空間:如果大型容器映像檔啟用映像檔串流功能,則設定使用者命名空間 (spec.hostUsers: false) 的 Pod 可能無法在 GKE 上啟動。這是因為預設快照器不支援 ID 對應掛接,無法重新對應使用者 ID (UID) 和群組 ID (GID),導致容器建立作業在遞迴變更檔案擁有權時逾時。如要解決這個問題,請使用 --node-labels="cloud.google.com/gke-gcfs-v2-forbid=true" 旗標建立新的節點集區。這個旗標會停用預設快照器,並使用先前的快照器行為。

事前準備

開始之前,請確認您已執行下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果先前已安裝 gcloud CLI,請執行 gcloud components update 指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。

啟用叢集的映像檔串流功能

您可以使用 gcloud CLI --enable-image-streaming 旗標或Google Cloud 控制台,在新的或現有的 Standard 叢集上啟用映像檔串流功能。使用 --enable-image-streaming 旗標建立叢集時,系統會在預設節點集區中啟用映像檔串流功能。除非您在建立節點集區時停用映像檔串流,否則新建立的節點集區也會啟用這項功能。

所有 Autopilot 叢集都會使用映像檔串流功能提取符合資格的映像檔。如需操作說明,請參閱「設定新 Autopilot 叢集的版本和發布管道」。下列操作說明僅適用於 GKE Standard 叢集。

您可以使用 gcloud CLI 或 Google Cloud 控制台,在符合規定的現有叢集上啟用映像檔串流。

gcloud

如要更新現有叢集以使用映像檔串流,請使用 gcloud CLI 執行下列指令:

gcloud container clusters update CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --enable-image-streaming

更改下列內容:

  • CLUSTER_NAME:叢集名稱。
  • CONTROL_PLANE_LOCATION:叢集控制層的位置。

控制台

  1. 前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。

    前往「Google Kubernetes Engine」

  2. 按一下您要修改的叢集名稱。

  3. 在「Clusters」(叢集) 頁面的「Features」(功能) 區段中,按一下「Image streaming」(映像檔串流) 旁的 。

  4. 在「Edit Image streaming」(編輯映像檔串流) 對話方塊中,勾選「Enable Image streaming」(啟用映像檔串流) 核取方塊。

  5. 按一下 [儲存變更]。

修改叢集後,GKE 預設會自動在現有節點集區啟用映像檔串流功能。如果您明確啟用或停用個別節點集區的映像檔串流功能,這些節點集區不會沿用叢集層級設定的變更。

在叢集層級更新映像檔串流設定時,會考量維護作業的可用性,但在節點集區層級則不會。

這項變更需要重新建立節點,可能會中斷執行中的工作負載。如要進一步瞭解這項特定變更,請在「手動變更:使用節點升級策略重新建立節點,並遵循維護政策」表格中,找出對應的資料列。如要進一步瞭解節點更新,請參閱「規劃節點更新中斷」。

確認叢集已啟用映像檔串流

您可以使用 gcloud CLI 或 Google Cloud 控制台,檢查是否已在叢集層級啟用映像檔串流功能。

gcloud

執行下列指令:

gcloud container clusters describe CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --flatten "nodePoolDefaults.nodeConfigDefaults"

更改下列內容:

  • CLUSTER_NAME:叢集名稱。
  • CONTROL_PLANE_LOCATION:叢集控制層的位置。

如果輸出內容與下列內容相似,則表示設定已啟用:

gcfsConfig:
  enabled: true
...

如果輸出內容與下列內容相似,則表示設定已停用:

gcfsConfig: {}
...

控制台

  1. 前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。

    前往「Google Kubernetes Engine」

  2. 按一下要檢查的叢集名稱。

  3. 在「Clusters」(叢集) 頁面的「Features」(功能) 區段中,「Image streaming」(映像檔串流) 旁會顯示是否已啟用這項設定。

啟用節點集區的映像檔串流功能

根據預設,節點集區會繼承叢集層級的映像檔串流設定。您可以使用 gcloud CLI,在特定節點集區啟用或停用映像檔串流功能。

在新節點集區上

如要建立已啟用映像檔串流功能的新節點集區,請執行下列指令:

gcloud container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --image-type=IMAGE_TYPE \
    --enable-image-streaming

更改下列內容:

  • NODE_POOL_NAME:新節點集區的名稱。
  • CLUSTER_NAME:節點集區所在叢集的名稱。
  • CONTROL_PLANE_LOCATION:叢集控制層的 Compute Engine 位置。提供區域叢集的區域,或可用區叢集的可用區。
  • IMAGE_TYPE:映像檔類型,可以是 COS_CONTAINERD (Container-Optimized OS) 或 UBUNTU_CONTAINERD (Ubuntu)。

在現有節點集區上

您可以為符合規定的現有節點集區啟用映像檔串流功能。

如要更新現有節點集區,以便使用映像檔串流,請執行下列指令:

gcloud container node-pools update POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --enable-image-streaming

更改下列內容:

  • POOL_NAME:節點集區的名稱。
  • CLUSTER_NAME:節點集區所在叢集的名稱。
  • CONTROL_PLANE_LOCATION:叢集控制層的位置。

在叢集層級更新映像檔串流設定時,會考量維護作業的可用性,但在節點集區層級則不會。

這項變更需要重新建立節點,可能會中斷執行中的工作負載。如要進一步瞭解這項特定變更,請在「手動變更:使用節點升級策略重新建立節點,不遵循維護政策」表格中,找出對應的資料列。如要進一步瞭解節點更新,請參閱「規劃節點更新中斷」。

確認節點集區已啟用映像檔串流功能

檢查節點集區是否已啟用映像檔串流功能:

gcloud container node-pools describe POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION

更改下列內容:

  • POOL_NAME:節點集區的名稱。
  • CLUSTER_NAME:節點集區所在叢集的名稱。
  • CONTROL_PLANE_LOCATION:叢集控制層的位置。

如果輸出內容與下列內容相似,則表示設定已啟用:

gcfsConfig:
  enabled: true
...

如果輸出內容與下列內容相似,則表示設定已停用:

gcfsConfig: {}
...

使用映像檔串流功能排定工作負載

在叢集啟用映像檔串流功能後,GKE 會自動使用映像檔串流功能,從 Artifact Registry 提取符合資格的容器映像檔,不需進一步設定。

GKE 會將 cloud.google.com/gke-image-streaming: "true" 標籤新增至已啟用映像檔串流功能的節點集區中的節點。在 GKE Standard 中,如果您在特定節點集區啟用或停用映像檔串流,導致叢集同時包含使用和不使用映像檔串流的節點,則可在部署作業中使用節點選取器,控管 GKE 是否在使用映像檔串流的節點上排定工作負載。

在以下範例中,您會在已啟用映像檔串流功能的叢集上,排定使用大型容器映像檔的 Deployment。接著,您可以選擇比較效能與未啟用映像檔串流的映像檔提取。

  1. 建立已啟用映像檔串流的新叢集:

    gcloud container clusters create CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --enable-image-streaming \
        --image-type=IMAGE_TYPE
    
  2. 取得叢集的憑證:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION
    
  3. 將下列資訊清單儲存為 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。

  4. 將資訊清單套用至叢集:

    kubectl apply -f frontend-deployment.yaml
    
  5. 確認 GKE 已建立 Deployment:

    kubectl get pods -l app=guestbook
    

    輸出結果會與下列內容相似:

    NAMESPACE    NAME                          READY    STATUS       RESTARTS    AGE
    default      frontend-64bcc69c4b-pgzgm     1/1      Completed    0           3s
    
  6. 取得 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,以便與映像檔串流比較效能。

  1. 建立新的叢集,並停用映像檔串流功能:

    gcloud container clusters create CLUSTER2_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --image-type=IMAGE_TYPE
    
  2. 取得叢集的憑證:

    gcloud container clusters get-credentials CLUSTER2_NAME \
        --location=CONTROL_PLANE_LOCATION
    
  3. 部署上一個範例中的 frontend Deployment:

    kubectl apply -f frontend-deployment.yaml
    
  4. 取得 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 \
    --location=CONTROL_PLANE_LOCATION

更改下列內容:

  • CLUSTER_NAME:第一個叢集的名稱。
  • CLUSTER2_NAME:第二個叢集的名稱。
  • CONTROL_PLANE_LOCATION:叢集控制層的位置。

停用映像檔串流

如果您使用 GKE Autopilot,則無法停用個別叢集的映像檔串流功能。不過,您可以為整個專案停用 Container File System API,這樣就會還原為標準映像檔提取作業,並停用映像檔串流功能。

如果您使用 GKE Standard 叢集,可以停用個別叢集或特定節點集區的映像檔串流功能,詳情請參閱下列各節。

停用 GKE Standard 叢集的映像檔串流功能

您可以使用 gcloud CLI 或Google Cloud 控制台,在現有的 GKE Standard 叢集上停用映像檔串流功能。

gcloud

如要停用現有叢集的映像檔串流功能,請執行下列指令:

gcloud container clusters update CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --no-enable-image-streaming

更改下列內容:

  • CLUSTER_NAME:叢集名稱。
  • CONTROL_PLANE_LOCATION:叢集控制層的位置。

控制台

  1. 前往 Google Cloud 控制台的「Google Kubernetes Engine」頁面。

    前往「Google Kubernetes Engine」

  2. 按一下您要修改的叢集名稱。

  3. 在「Clusters」(叢集) 頁面的「Features」(功能) 下方,按一下「Image streaming」(映像檔串流) 旁的 。

  4. 在「Edit Image streaming」(編輯映像檔串流) 對話方塊中,取消勾選「Enable Image streaming」(啟用映像檔串流) 核取方塊。

  5. 按一下 [儲存變更]。

在叢集層級更新映像檔串流設定時,會考量維護作業的可用性,但在節點集區層級則不會。

這項變更需要重新建立節點,可能會中斷執行中的工作負載。如要進一步瞭解這項特定變更,請在手動變更表格中,找出對應的資料列。如要進一步瞭解節點更新,請參閱「規劃節點更新中斷」。

在新節點集區

如要在建立新的節點集區時停用映像檔串流,請指定 --no-enable-image-streaming 旗標,例如下列指令:

gcloud container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --no-enable-image-streaming

自動建立的節點集區

GKE Standard 叢集會使用叢集層級設定,判斷是否要為透過節點集區自動建立功能建立的新節點集區啟用映像檔串流。

在 GKE 1.34.1-gke.1279000 以上版本中,您也可以指定 spec.nodePoolConfig.imageStreaming 屬性,個別控管由 ComputeClass 建立的節點集區映像檔串流:

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: image-streaming-class
spec:
  nodePoolConfig:
    imageStreaming
      enabled: true
  priorities:
  - machineFamily: n4
  nodePoolAutoCreation:
    enabled: true

在現有節點集區上

如要停用現有節點集區的映像檔串流功能,請執行下列指令:

gcloud container node-pools update NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --no-enable-image-streaming

更改下列內容:

  • NODE_POOL_NAME:節點集區的名稱。
  • CLUSTER_NAME:節點集區所在叢集的名稱。
  • CONTROL_PLANE_LOCATION:叢集控制層的位置。

在叢集層級更新映像檔串流設定時,會考量維護作業的可用性,但在節點集區層級則不會。

這項變更需要重新建立節點,可能會中斷執行中的工作負載。如要進一步瞭解這項特定變更,請在「手動變更:使用節點升級策略重新建立節點,不遵循維護政策」表格中,找出對應的資料列。如要進一步瞭解節點更新,請參閱「規劃節點更新中斷」。

映像檔串流的記憶體預留

除了為節點系統元件預留的記憶體外,GKE 還會為映像檔串流預留記憶體資源。GKE 不會為映像檔串流保留額外的 CPU 資源。在 GKE Standard 叢集中,這項預留作業會變更 Pod 中可要求的記憶體資源。在 GKE Autopilot 中,GKE 會管理系統分配,因此不會影響工作負載排程。

如要進一步瞭解 GKE 為節點元件保留的記憶體,請參閱「Standard 叢集架構」。

在使用映像檔串流的節點中,GKE 會為新的預留項目額外預留下列記憶體:

  • 記憶體小於 1 GiB 的機器沒有額外記憶體
  • 前 4 GiB 記憶體的 1%
  • 接下來 4 GiB 記憶體的 0.8% (最多 8 GiB)
  • 接下來 8 GiB 記憶體的 0.4% (最多 16 GiB)
  • 後續 112 GiB 記憶體 (最多 128 GiB) 的 0.24%
  • 128 GiB 以上記憶體的 0.08%

疑難排解

以下各節提供映像檔串流疑難排解的建議。如需排解標準映像檔提取問題的建議,請參閱「排解映像檔提取問題」。

GKE 不會使用映像檔串流檔案系統

如果 GKE 事件記錄未顯示映像檔串流事件,表示映像檔並非由遠端檔案系統支援。如果 GKE 先前已在節點上提取映像檔,這是預期行為,因為 GKE 會使用映像檔的本機快取進行後續提取,而非使用映像檔串流。如要驗證,請在 Pod Pulled 事件的 Message 欄位中尋找 Container image IMAGE_NAME already present on machine。

如果在節點上首次提取映像檔時,未看到映像檔串流事件,請確認您符合映像檔串流的需求條件。如果符合規定,您可以檢查映像檔串流服務 (名為 gcfsd) 的記錄,診斷問題:

  1. 前往 Google Cloud 控制台的「Logs Explorer」頁面:

    前往 Logs Explorer

  2. 在「Query」(查詢) 欄位中,指定下列查詢:

    logName="projects/PROJECT_ID/logs/gcfsd"
    resource.labels.cluster_name="CLUSTER_NAME"
    

    更改下列內容:

    • PROJECT_ID:專案名稱。
    • CLUSTER_NAME:叢集名稱。
  3. 點選「執行查詢」。

您也可以使用 Logs Explorer 查看 gcfsd 記錄:

  1. 前往 Google Cloud 控制台的「Logs Explorer」:

    前往 Logs Explorer

  2. 在「Query」(查詢) 欄位中,指定下列查詢:

    logName="projects/PROJECT_ID/logs/gcfsd"
    

    將 PROJECT_ID 替換為 Google Cloud 專案 ID。

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=IMAGE_TYPE \
    --enable-image-streaming \
    --scopes="https://www.googleapis.com/auth/devstorage.read_only"

FailedPrecondition

如果看到含有 code = FailedPrecondition 的錯誤訊息,表示映像檔未匯入映像檔串流遠端檔案系統。

如果您嘗試將映像檔串流功能與現有節點集區搭配使用,可能會看到這則錯誤訊息。如果節點集區中的節點磁碟上已有容器映像檔,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

這項錯誤表示專案已超出從遠端容器檔案系統服務讀取檔案所需的配額。如要解決這個問題,請申請調整配額,提高下列配額值:

  • 每項專案每分鐘在各區域的內容要求數
  • 每個專案在各區域的內容要求數

服務重新啟動後,檔案控制代碼過時

如果映像檔串流服務 (gcfsd) 在節點上重新啟動,使用映像檔串流的執行中容器在嘗試存取容器映像檔中的檔案時,可能會發生磁碟 I/O 錯誤,例如 stale file handle。

如要解決這個問題,請重新啟動受影響的 Pod 或容器。容器重新啟動時,GKE 會重新建立與映像檔串流服務的連線。服務重新啟動後,排定至節點的新 Pod 不會受到影響。

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 系統呼叫的程式碼。如果無法修改程式碼,請停用節點集區的映像檔串流功能,以緩解問題。

後續步驟