容器執行階段合約

本頁列出 Knative 服務中容器的重要規定和行為。

支援的語言和圖片

只要遵守本頁列出的限制,您的容器映像檔就能執行以自選程式設計語言編寫的程式碼,並使用任何基礎映像檔。

容器映像檔中的可執行檔必須針對 Linux 64 位元編譯。Knative serving 支援 Linux x86_64 ABI 格式。

在正確的通訊埠上監聽要求

容器必須在 0.0.0.0 上監聽要求,並使用要求傳送至的通訊埠。根據預設,要求會傳送至 8080,但您可以設定 Knative serving,將要求傳送至您選擇的通訊埠。

在 Knative 服務容器執行個體中,PORT 環境變數的值一律會反映要求傳送的連接埠。預設值為 8080

傳輸層加密 (TLS)

容器不應直接實作任何傳輸層安全防護機制。Knative 服務會終止 HTTPS 和 gRPC 的 TLS,然後將要求以 HTTP 或 gRPC 形式 Proxy 至不含 TLS 的容器。

回應

容器執行個體收到要求後,必須在要求逾時設定指定的時間內傳送回應,包括容器執行個體啟動時間。否則要求會結束,並傳回 504 錯誤。

環境變數

下列環境變數會自動新增至執行中的容器:

名稱 說明 範例
PORT HTTP 伺服器應監聽的通訊埠。 8080
K_SERVICE 正在執行的 Knative serving 服務名稱。 hello-world
K_REVISION 正在執行的 Knative serving 修訂版本名稱。 hello-world.1
K_CONFIGURATION 建立修訂版本的 Knative 供應設定名稱。 hello-world

檔案系統存取權

容器的檔案系統可寫入,且須遵守下列行為:

  • 這是記憶體內檔案系統,因此寫入其中會使用容器執行個體的記憶體。
  • 容器執行個體停止後,寫入檔案系統的資料不會保留。

容器執行個體生命週期

為回應傳入要求,服務會自動調度特定數量的容器執行個體,每個執行個體都會執行已部署的容器映像檔。

如果修訂版本未收到任何流量,系統會將其規模縮減為設定的容器執行個體數量下限 (預設為零)。

啟動

容器執行個體啟動後,必須在 4 分鐘內監聽要求。在這段啟動時間內,系統會為容器執行個體分配 CPU。

運算範圍僅限要求

啟動後,您應該只會在要求範圍內進行運算:如果容器執行個體未處理要求,就不會分配到任何 CPU。

關閉

容器執行個體隨時可以關機。

需要關閉容器執行個體時,系統會將新的傳入要求轉送至其他執行個體,並給予目前處理中的要求時間完成作業。容器執行個體接著會收到 SIGTERM 信號,表示即將關閉 (收到 SIGKILL 信號),並開始 10 秒的緩衝期。在這段期間,系統會為容器執行個體分配 CPU,並收取費用。 如果容器執行個體未擷取 SIGTERM 信號,系統會立即關閉該執行個體。

除非容器執行個體必須因容器執行個體數量下限設定而保持閒置狀態,否則不會閒置超過 15 分鐘。

容器執行個體資源

容器執行個體的資源要求會排定在 GKE 叢集的節點中。每個節點都會共用 GKE 叢集可用的運算資源總量。

因此,Knative 服務可用的運算資源量,只會受到該節點可用資源量的限制。進一步瞭解要求的運算資源

舉例來說,如果您為容器配置 512 MiB 的記憶體,而該容器是在節點中唯一一個 Pod 內執行,且該節點有 8 GiB 的記憶體,則該容器可以嘗試使用更多 RAM。

CPU

根據預設,佇列 Proxy Sidecar 會保留 25 毫 CPU,且 Knative 服務可使用的 vCPU 數量沒有限制。佇列 Proxy 的資源耗用量取決於排入佇列的要求數量和要求大小。

vCPU 是基礎硬體的抽象化實作,可在不同 CPU 平台上提供單一硬體超執行緒的約略 CPU 時間。容器執行個體可能會同時在多個核心上執行。只有在容器執行個體啟動和處理要求時,系統才會分配 vCPU,否則會受到節流。

如要分配不同的 vCPU 值,請參閱分配 CPU 的說明文件。

記憶體

根據預設,佇列 Proxy Sidecar 不會保留任何記憶體,且 Knative Serving 服務可使用的記憶體量沒有限制。如要為 Knative serving 服務設定記憶體限制,如要進一步瞭解 GKE 如何處理記憶體,請參閱「可分配的記憶體和 CPU 資源」。

記憶體的常見用途包括:

  • 載入記憶體以執行服務的程式碼
  • 寫入檔案系統
  • 在容器中執行的額外程序,例如 nginx 伺服器
  • 記憶體內快取系統,例如 PHP OpCache
  • 每個要求的記憶體用量

並行

根據預設,每個 Knative 服務容器執行個體都會設為多個並行,也就是每個容器執行個體可同時接收多個要求。如要變更這項設定,請設定並行

容器執行個體沙箱

Knative serving 不會使用容器沙箱。

容器執行個體中繼資料伺服器

Knative 服務容器執行個體會公開中繼資料伺服器,您可使用該伺服器擷取容器執行個體的詳細資料,例如專案 ID、區域、執行個體 ID 或服務帳戶。

您可以使用簡單的 HTTP 要求,透過 http://metadata.google.internal/ 端點和 Metadata-Flavor: Google 標頭存取中繼資料伺服器中的資料,不需要任何用戶端程式庫。詳情請參閱取得中繼資料

下表列出部分可用的中繼資料伺服器資訊:

路徑 說明
/computeMetadata/v1/project/project-id 這項 Knative serving 服務的專案 ID
/computeMetadata/v1/instance/region 這個 Knative serving 服務的區域
/computeMetadata/v1/instance/id 容器執行個體的專屬 ID (也適用於記錄)。
/computeMetadata/v1/instance/service-accounts/default/token 為這個 Knative 服務的執行階段服務帳戶產生權杖