容器运行时合同

本页面列出了 Knative serving 中容器的主要要求和行为。

支持的语言和映像

您的容器映像可以运行以您选择的编程语言编写的代码并使用任何基础映像,前提是该映像遵循本页面中列出的限制条件。

必须针对 Linux 64 位编译容器映像中的可执行文件。Knative serving 明确支持 Linux x86_64 ABI 格式。

侦听正确的端口上的请求

容器必须在目标所发端口上的 0.0.0.0 上侦听请求。默认情况下,请求将发送到 8080,但您可以配置 Knative serving 以将请求发送到您选择的端口。

在 Knative serving 容器实例内部,PORT 环境变量的值始终反映请求发送到的端口。默认值为 8080

传输层加密 (TLS)

容器不应直接实现任何传输层安全。应由 Knative serving 为 HTTPS 和 gRPC 终止 TLS,之后将请求以 HTTP 或 gRPC 形式通过代理转发到不具备 TLS 的容器。

响应

容器实例必须在收到请求(包括容器实例启动时间)后的请求超时设置中指定的时间内发送响应。否则,请求将结束并返回 504 错误。

环境变量

以下环境变量会自动添加到正在运行的容器中:

名称 说明 示例
PORT 您的 HTTP 服务器应侦听的端口。 8080
K_SERVICE 正在运行的 Knative serving 服务的名称。 hello-world
K_REVISION 正在运行的 Knative serving 修订版本的名称。 hello-world.1
K_CONFIGURATION 创建了修订版本的 Knative serving 配置的名称。 hello-world

文件系统访问

容器的文件系统是可写的,并且受以下行为的约束:

  • 这是一个内存中文件系统,因此向其中写入数据会使用容器实例的内存。
  • 停止容器实例时,写入文件系统的数据不会保留。

容器实例生命周期

为响应传入请求,服务会自动扩缩到特定数量的容器实例,每个实例都运行已部署的容器映像。

当修订版本未收到任何流量时,它会缩减为配置的容器实例数下限(默认为零)。

启动

您的容器实例必须在启动后的 4 分钟内侦听请求。在此启动期间,系统会向容器实例分配 CPU。

计算范围限定在请求范围内

启动后,您只希望能够在请求范围内执行计算:容器实例在未处理请求时不会分配任何 CPU。

关停

容器实例可以随时关停。

当需要关停容器实例时,新的传入请求将被路由到其他实例,并且当前正在处理的请求有时间完成。然后,容器实例会收到 SIGTERM 信号,指示在关闭前 10 秒的开始时间(使用 SIGKILL 信号)。在此期间,系统会为容器实例分配 CPU 并计费。如果容器实例未捕获 SIGTERM 信号,则会立即关闭。

除非容器实例因容器实例数下限配置设置而必须保持空闲状态,否则它将保持空闲状态超过 15 分钟。

容器实例资源

容器实例的资源请求会安排在 GKE 集群的节点中。每个节点共享您的 GKE 集群可用的计算资源总量。

因此,Knative serving 服务可用的计算资源量仅受该节点中可用资源的数量限制。详细了解请求计算资源

例如,如果您为某个容器分配了 512MiB 的内存,并且该容器在具有 8GiB 内存的节点内的唯一 Pod 中运行,则该容器可以尝试使用更多 RAM。

CPU

默认情况下,队列代理边车代理预留 25 milliCPU,而 Knative serving 服务可以使用的 vCPU 数量不受限制。队列代理的资源消耗情况取决于队列中的请求数量以及请求的大小。

vCPU 是底层硬件的抽象,可提供可变 CPU 平台上单个硬件超线程的大致等效 CPU 时间。容器实例可以同时在多个核心上执行。仅在容器实例启动和请求处理期间分配 vCPU,否则予以限制。

如需分配不同的 vCPU 值,请参阅有关分配 CPU 的文档。

内存

默认情况下,队列代理边车代理不会预留任何内存,并且您的 Knative serving 服务可以使用的内存量不受限制。如果需要,您可以为 Knative serving 服务配置内存限制。如需详细了解 GKE 如何处理内存,请参阅可分配的内存和 CPU 资源

内存的典型用途包括:

  • 将代码加载到内存中以运行服务
  • 写入文件系统
  • 在容器中运行的额外进程(例如 nginx 服务器)
  • PHP OpCache 等内存缓存系统
  • 每个请求的内存用量

并发

默认情况下,每个 Knative serving 容器实例被设置为多个并发,其中每个容器实例可以同时接收多个请求。如需更改此设置,您可以设置并发

容器实例沙盒

Knative serving 不使用容器沙盒。

容器实例元数据服务器

Knative serving 容器实例公开一个元数据服务器,您可以使用该服务器检索容器实例的详细信息,例如项目 ID、区域、实例 ID 或服务账号。

您可以使用具有 Metadata-Flavor: Google 标头的 http://metadata.google.internal/ 端点进行简单的 HTTP 请求,从元数据服务器访问此数据:不需要客户端库。如需了解详情,请参阅获取元数据

下表列出了部分可用的元数据服务器信息:

路径 说明
/computeMetadata/v1/project/project-id 此 Knative serving 服务的项目 ID
/computeMetadata/v1/instance/region 此 Knative serving 服务的区域
/computeMetadata/v1/instance/id 容器实例的唯一标识符(也可在日志中提供)。
/computeMetadata/v1/instance/service-accounts/default/token 为此 Knative 服务的运行时服务账号生成令牌