Autopilot 概览


简介

Autopilot 是 Google Kubernetes Engine (GKE) 中的一种新操作模式,旨在降低管理集群、降低用于生产的集群的性能,以及提高工作负载可用性。“运营模式”是指您对集群具有的灵活性、责任和控制。除了全托管式控制平面和节点自动化之外,GKE 还提供两种操作模式:

  • Autopilot:GKE 预配和管理集群的底层基础架构(包括节点和节点池),为您提供一个带亲身体验的优化集群。
  • 标准:您管理集群的底层基础架构,获得节点配置灵活性。

有了 Autopilot,您无需再监控节点的运行状况,也不必计算工作负载所需的计算能力。Autopilot 支持大多数 Kubernetes API、工具及其丰富的系统。您保留在 GKE 中,无需与 Compute Engine API、CLI 或界面交互,因为节点无法通过 Compute Engine 访问,就像标准模式中的那样。您只需为 Pod 在运行时请求的 CPU、内存和存储空间付费。

Autopilot 集群进行预先配置,已准备好用于生产工作负载。此简化配置遵循集群和工作负载设置以及安全性的 GKE 最佳做法和建议。其中一些内置设置(如下表详述)是不可变的,其他可选设置可开启或关闭。

Autopilot 附带服务等级协议 (SLA),它同时涵盖控制平面和 Pod。借助 AutoPilot,由于底层基础架构抽象化,因此您可以专注于 Kubernetes API 和部署。Autopilot 使用您在 PodSpec 中定义的资源要求,并预配部署资源(如 CPU、内存和永久性磁盘)。

需要使用标准操作模式(而非 Autopilot)的主要原因如下:

  • 您需要更好地控制集群配置。
  • 您的集群必须运行不符合 Autopilot 限制条件的工作负载。

比较 AutoPilot 和 Standard 模式

借助 Autopilot,GKE 会管理集群生命周期的许多复杂性。下表显示了适用于集群的操作模式的可用选项:

  • 已预配置:此设置是内置的,您无法进行更改。
  • 默认:此设置处于开启状态,但您可以覆盖它。
  • 可选:此设置已关闭,但您可以开启。
选项 AutoPilot 模式 标准模式
基本集群类型 提供版本和版本:

预先配置区域性
默认常规发布版本
提供版本和版本:

可选
节点和节点池 由 GKE 管理。 由您管理、配置和指定。
正在预配资源 GKE 会根据您的 Pod 规范动态预配资源。 您可以手动预配其他资源并设置集群总大小。配置集群自动扩缩和节点自动预配功能,帮助自动执行该过程。
映像类型 预配置包含 Containerd 的 Container-Optimized OS 选择以下任一选项:
结算 Pod 资源请求付费(CPU、内存和临时存储空间) 节点付费(CPU、内存、启动磁盘)
安全 预配置
可选
可选
网络 预配置
默认值
  • 公共集群
  • 自动 CIDR 范围
  • 网络名称/子网
可选
可选
升级、维修和维护 预配置
可选
身份验证凭据 预配置Workload Identity可选
扩缩 预配置:Autopilot 处理节点的所有扩缩和配置。

默认值
可选
监控和日志记录 预配置适用于 GKE 的 Cloud 操作

默认:系统和工作负载日志记录

可选:系统专用日志记录
默认值
可选:系统专用日志记录
路由 预配置:基于 Pod 的路由。已启用网络端点组 (NEG)。 选择基于节点的数据包路由(默认)或基于 Pod 的路由。
集群插件 预配置
默认值
可选

1在集群上启用 Cloud NAT 需要进一步配置。

不受支持的集群功能

Autopilot 集群不支持以下 GKE 集群功能:

Compute Engine 实例

安全

插件和集成

扩缩

Autopilot 会根据您的 Pod 规范自动扩缩集群的资源,以便您可以专注于您的 Pod。要自动增加或减少 Pod 的数量,您可以使用标准 Kubernetes CPU 或内存指标来实现横向 pod 自动扩缩,也可以通过 Cloud Monitoring 使用自定义指标。

允许的资源范围

下表列出了 Autopilot Pod 允许的资源范围。除非特别注明,否则所有值都适用于 Pod 中的所有容器资源请求的总和。Pod vCPU 以 0.25 个 vCPU 为增量。除了最小值之外,CPU:内存比率必须介于 1 个 vCPU:1 GiB 到 1 个 vCPU:6.5 GiB 的范围内。超出允许比例范围的资源将会扩容。如需了解详情,请参阅资源范围和比率管理资源限制示例

资源 资源数量下限 资源数量上限
普通 Pod DaemonSet Pod 所有 Pod
CPU 250 mCPU 10 mCPU 28 vCPU2
内存 512 MiB 10 MiB 80 GiB2
临时存储 10 MiB(每个容器) 10 MiB(每个容器) 10 GiB

2正常 Pod 的 CPU 和内存上限进一步减少了所有 DaemonSet Pod 的资源请求总数。

默认容器资源请求

Autopilot 根据您在部署配置中指定的配置预配资源。如果您未在 Pod 中为任何容器指定资源请求,则 Autopilot 应用默认值。这些默认值旨在为 Pod 中的容器提供平均资源,适用于许多较小的工作负载。

Autopilot 会将这些默认值应用于 Pod 规范中未定义的资源。

资源 普通 Pod 中的容器 DaemonSet 中的容器
CPU 500 mCPU 50 mCPU
内存 2 GiB 100 MiB
临时存储 1 GiB 100 MiB

如需详细了解 Autopilot 集群限制,请参阅配额和限制

工作负载限制和限制

Autopilot 支持运行您的应用的大多数工作负载。为了使 GKE 提供节点并为您提供更流畅的运营体验,与 GKE 标准相比,存在以下限制和限制。其中一些限制是安全性方面的最佳做法,而其他限制则可让 Autopilot 集群安全管理。工作负载限制适用于所有 Pod,包括 Deployment、DaemonSet、ReplicaSet、ReplicationController、StatefulSet、Job 和 CronJob 的 Pod。

主机选项限制

不允许使用 HostPort 和 hostNetwork,因为节点管理由 GKE 处理。在写入模式下禁止使用 hostPath 卷,而只能在读取模式下使用 hostPath 卷以执行 /var/log/ 路径前缀。在工作负载中禁止使用主机命名空间

Linux 工作负载限制

Autopilot 仅支持以下工作负载的 Linux 功能

"SETPCAP", "MKNOD", "AUDIT_WRITE", "CHOWN", "DAC_OVERRIDE", "FOWNER",
"FSETID", "KILL", "SETGID", "SETUID", "NET_BIND_SERVICE", "SYS_CHROOT", "SETFCAP"

节点选择器和节点亲和性

支持地区相似性拓扑。节点亲和性节点选择器仅适用于以下键:topology.kubernetes.io/regiontopology.kubernetes.io/zonefailure-domain.beta.kubernetes.io/regionfailure-domain.beta.kubernetes.io/zonecloud.google.com/gke-os-distributionkubernetes.io/oskubernetes.io/arch。Autopilot 仅支持操作系统和架构的所有值。

无容器威胁检测

AutoPilot 不支持容器威胁检测

无特权 Pod

工作负载的容器的特权模式主要用于更改节点,例如更改 kubelet 或网络设置。使用 Autopilot 集群时,不允许更改节点,因此也不允许使用这些类型的 Pod。此限制可能会影响某些管理员工作负载。

Pod 相似性和反相似性

虽然 GKE 会为您管理 Autopilot 中的节点,但您仍可安排 Pod。Autopilot 支持 Pod 粘性,以便您可以将 Pod 放置在一个节点上,从而实现网络效率。例如,您可以使用 Pod 亲和性在带有后端 Pod 的节点上部署前端 Pod。Pod 亲和性限制仅适用于以下密钥:topology.kubernetes.io/regiontopology.kubernetes.io/zonefailure-domain.beta.kubernetes.io/regionfailure-domain.beta.kubernetes.io/zone

Autopilot 还支持反亲和性,因此您可以跨节点分散 Pod,以避免单点故障。例如,您可以使用 Pod 反相似性来防止前端 Pod 与后端 Pod 共存。

使用 Pod 反相似性时的默认设置和资源限制

Autopilot 支持 Pod 反相似性,因此您可以防止两个 Pod 共置于同一节点上。使用反亲和性时,Autopilot 必须分配额外的计算资源,以确保 Pod 分离(具体定义由 PodSpec 定义)。使用 Pod 反相似性时,默认值和最小资源限制会提高。对于 PodSpec 中列出的所有容器:

资源 默认值
CPU 0.75 vCPU
内存 2 GiB
临时存储 1 GiB

使用 Pod 反相似性时,适用相同的资源限制规则和逻辑,但 vCPU 增量更多。Pod vCPU 最少提供 0.5 个 vCPU,增量为 0.5 个 vCPU(向上舍入到最接近的增量)。例如,如果您总共请求 0.66 个 vCPU(使用反相似性的所有容器),则您的 PodSpec 将在准许期间修改,并设置为 1 个 vCPU。您的 Pod 拥有对更高资源的完整访问权限,并且额外资源会在所有容器的资源请求中分摊。

仅支持分离工作负载的容忍设置

仅支持分离工作负载的容忍设置根据需要,节点自动预配功能会自动添加污点。

资源范围和比率管理

  • Pod vCPU 增量:Pod vCPU 以 0.25 个 vCPU(以舍入为增量)提供。例如,如果您请求 0.66 个 vCPU(总计所有容器),则您的 PodSpec 将在准许期间被修改并设置为 0.75。您的 Pod 拥有对更高资源的完整访问权限,并且额外资源会在所有容器的资源请求中分摊。最小值为 250 milliCPU (mCPU)。DaemonSet vCPU 以 10 mCPU 增量(向上舍入到最接近的增量)提供。

  • 内存与 CPU 比率范围:内存与 vCPU 的比率(以 GiB 为单位)与 1 到 6.5 个 vCPU 之间。例如,您的 Pod 可以配备 1 个 vCPU 和 1 GiB 内存,或 1 个 vCPU 和 6.5 GiB 内存,但不能有 1 个 vCPU 和 7 GiB 内存。为了提供资源请求,GKE 会按比例扩展任何资源。例如,如果您请求 1 个 vCPU 和 7 GiB 内存,则系统会将 PodSpec 修改为 1.25 个 vCPU 和 7 个 GiB 内存。同样,如果您请求 1 个 vCPU 和 800 MiB 内存,则您的 PodSpec 会修改为 1 个 vCPU 和 1 GiB RAM,并在这些容器之间分配其他资源。

CPU 和内存利用率增减要求和资源纵向扩容申请在将默认资源应用到缺少资源请求的容器之后计算。

无资源请求的容器将默认最低容量为 500 mCPU 和 1 GiB 内存。对于 CPU 和内存,当 GKE 纵向扩容资源请求时(例如,为了满足最低要求或比率要求),可在容器之间均匀分配额外资源。舍入值在容器之间按比例分配。例如,如果一个容器的内存容量是其他容器的两倍,那么它的内存多倍多。

  • 临时存储空间:可用范围介于 10 MiB 到 10 GiB 之间。这会影响容器的可写入层和 emptyDir 装载。

临时存储空间是每个容器有最低请求,因此,如果容器的临时存储请求小于最小值,则“Autopilot”会将该请求增加到最小值。临时存储空间不要求每个 Pod 至少有请求。临时存储每个 Pod 的最大请求数是所有容器都会递增的。如果累积值大于此上限,则 AutoPilot 会缩减请求的最大数量,同时还可确保容器之间的请求比率保持相同。

资源限制示例

示例 1:对于少于 250 mCPU 的单个容器:

容器编号 原始资源请求 已修改的请求
1 CPU:180 mCPU
内存:0.5 GiB
临时存储:10 MiB
CPU:250 mCPU
内存:0.5 GiB
临时存储:10 MiB
Pod 资源总数 CPU:250 mCPU
内存:0.5 GiB
临时存储:10 MiB

示例 2:对于总共总计 250 mCPU 的多个容器,Autopilot 会在 Pod 的所有容器之间平均分配其余资源(最多 250 个 vCPU)。

容器编号 原始资源请求 已修改的请求
1 CPU:70 mCPU
内存:0.5 GiB
临时存储:10 MiB
CPU:84 mCPU
内存:0.5 GiB
临时存储:10 MiB
2 CPU:70 mCPU
内存:0.5 GiB
临时存储:10 MiB
CPU:83 mCPU
内存:0.5 GiB
临时存储:10 MiB
3 CPU:70 mCPU
内存:0.5 GiB
临时存储:10 MiB
CPU:83 mCPU
内存:0.5 GiB
临时存储:10 MiB
Pod 资源总数 CPU:250 mCPU
内存:1.5 GiB
临时存储:30 MiB

示例 3:对于具有总资源大于 250 mCPU 的容器,CPU 会四舍五入为 250 mCPU 的倍数,并且额外 CPU 将按其原始请求的比例分摊到所有容器中。原始的 CPU 原始 CPU 为 320 mCPU,总计为 500 mCPU。额外的 180 mCPU 可以分布在以下容器中:

容器编号 原始资源请求 已修改的请求
1 CPU:170 mCPU
内存:0.5 GiB
临时存储:10 MiB
CPU:266 mCPU
内存:0.5 GiB
临时存储:10 MiB
2 CPU:80 mCPU
内存:0.5 GiB
临时存储:10 MiB
CPU:125 mCPU
内存:0.5 GiB
临时存储:10 MiB
3 CPU:70 mCPU
内存:0.5 GiB
临时存储:10 MiB
CPU:109 mCPU
内存:0.5 GiB
临时存储:10 MiB
4 Init 容器,未定义的资源 将接收 Pod 资源
Pod 资源总数 CPU:500 mCPU
内存:1.5 GiB
临时存储空间:30 MiB

示例 4:单个容器的 CPU 容量过低(1 个 vCPU:6.5 GiB)。CPU 与内存的最大比率为 1:6.5。如果比率高于 10%,则 CPU 请求会递增,然后根据需要向上舍入:

容器编号 原始资源请求 已修改的请求
1 CPU:250 mCPU
内存:4 GiB
临时存储:10 MiB
CPU:750 mCPU
内存:4 GiB
临时存储:10 MiB
Pod 资源总数 CPU:750 mCPU
内存:4 GiB
临时存储:10 MiB

示例 5:单个容器的 CPU 数量过低(对于至少 1 个 vCPU:1 GiB)。CPU 与内存的最小允许比率为 1:1。如果比例低于此比例,则内存请求会增加。

容器编号 原始资源请求 已修改的请求
1 CPU:4 个 vCPU
内存:1 GiB
临时存储:10 MiB
CPU:4 个 vCPU
内存:4 GiB
临时存储:10 MiB
Pod 资源总数 CPU:4 mCPU
内存:4 GiB
临时存储:10 MiB

示例 6:单个容器的 CPU 容量低于下限 250 mCPU,调整后,CPU 对于内存量而言过低(1 个 vCPU 对应的内存不超过 6.5 GiB)

容器编号 原始资源请求 已修改的请求
1 CPU:100 mCPU
内存:50 MiB
临时存储:10 MiB
CPU:250 mCPU
内存:256 MiB
临时存储:10 MiB
Pod 资源总数 CPU:250 mCPU
内存:256 MiB
临时存储:10 MiB

示例 7:对于具有临时存储请求 > 10 GiB 的单个容器,允许的最大临时存储请求为 10 GiB。如果请求大于最大值,则请求会缩减为 10 GiB。

容器编号 原始资源请求 已修改的请求
1 CPU:250 mCPU
内存:256 MiB
临时存储:11 GiB
CPU:250 mCPU
内存:256 MiB
临时存储:10 GiB
Pod 资源总数 CPU:250 mCPU
内存:256 MiB
临时存储:10 GiB

示例 8:对于具有临时存储请求 > 10 GiB 的多个容器,所有容器临时存储请求都会缩减,以发出 10 GiB 的最终累计存储空间请求。

容器编号 原始资源请求 已修改的请求
1 CPU:250 mCPU
内存:256 MiB
临时存储:5 GiB
CPU:250 mCPU
内存:256 MiB
临时存储:2.94 GiB
2 CPU:250 mCPU
内存:256 MiB
临时存储:6 GiB
CPU:250 mCPU
内存:256 MiB
临时存储:3.53 GiB
3 CPU:250 mCPU
内存:256 MiB
临时存储:6 GiB
CPU:250 mCPU
内存:256 MiB
临时存储:3.53 GiB
Pod 资源总数 CPU:750 mCPU
内存:768 MiB
临时存储:10 GiB

安全限制

容器隔离

Autopilot 将对您的 Pod 实施安全强化配置,以便提供增强的安全隔离功能,并且有助于限制容器对集群漏洞漏洞的影响:

  • 默认情况下,容器运行时默认 seccomp 配置文件会应用到集群中的所有 Pod。
  • 已删除所有容器的 CAP_NET_RAW 容器权限。CAP_NET_RAW 权限通常不使用,并且是多容器转义漏洞的主题。缺少 CAP_NET_RAW 可能会导致在容器内使用 ping 失败。
  • 系统会强制执行 Workload Identity,并阻止 Pod 访问底层 Compute Engine 服务帐号和其他敏感节点元数据。
  • 设置了 spec.ExternalIPs 的服务以防止出现 CVE-2020-8554 攻击。我们很少使用这些服务。
  • 允许使用以下 StorageType。其他 StorageType 会被阻止,因为它们需要对该节点的权限:

    "configMap", "csi", "downwardAPI", "emptyDir", "gcePersistentDisk", "hostPath",
    "nfs", "persistentVolumeClaim", "projected", "secret"
    

Pod 安全政策

Autopilot 会强制执行为容器提供增强隔离的设置。Autopilot 集群不支持 Kubernetes PodSecurityPolicyOPA GatekeeperPolicy Controller

Autopilot 中的安全边界

在 Kubernetes 层,GKE AutoPilot 模式提供 Kubernetes API,但移除了使用某些高权限 Kubernetes 原语(如特权 Pod)的权限,目标是为了限制访问、修改或直接控制节点虚拟机 (VM)。

为 GKE Autopilot 模式设定上述限制,以便限制工作负载对节点虚拟机进行低级层访问,从而使 Google Cloud 能够全面管理节点以及 Pod 级层的 SLA

这样做的目的是防止意外访问节点虚拟机。我们通过 Google 漏洞奖励计划 (VRP) 接受为达到该效果提交的内容,并将根据 Google VRP 奖励面板自行决定奖励报告。

特权用户(例如集群管理员)从设计上拥有对任何 GKE 集群的完全控制权。为保证安全性,我们建议您避免广泛授予强大的 GKE/Kubernetes 特权,而是尽可能使用命名空间管理员委任,如多租户指南中所述。

Autopilot 上的工作负载将继续享受与 GKE Standard 模式相同的安全性,在该模式下,单租户虚拟机已在用户项目中预配供其专用。此外,与 Standard 一样,在每台虚拟机上,集群内的 Autopilot 工作负载可以在具有安全强化型共享核心的虚拟机上一起运行。

由于共享核心表示单个安全边界,因此 GKE 建议您在具有高度隔离需求(例如高风险或不受信任的工作负载)的情况下,在使用 GKE 沙盒以提供多层安全保护的 GKE Standard 集群上运行工作负载。

其他限制

证书签名请求

您不能在 Autopilot 内创建证书签名请求

外部监控工具

大多数外部监控工具都需要访问受限的服务。多个 Google Cloud 合作伙伴提供的解决方案可用于 Autopilot,但并非所有支持,且自定义监控工具无法在 Autopilot 集群上安装。

外部服务

Autopilot 集群不允许外部 IP 服务。如需向 Service 提供外部 IP,您可以使用 Service 的 LoadBalancer 类型,或使用 Ingress 将 Service 添加到外部 IP 地址在多个服务之间共享的 IP。

Init 容器

在应用容器启动之前,init 容器依次运行。默认情况下,GKE 将 Pod 可用的完整资源分配给每个 init 容器。

与其他容器不同,GKE 建议不为 init 容器指定资源请求,以便这些容器具有全部资源。如果设置较低的资源,则 init 容器将不受限制,并且如果您设置了更高的资源,则可以增加 Pod 的生命周期内的费用。

托管式命名空间

kube-system 命名空间是托管的,这意味着此命名空间中的所有资源无法更改,也无法创建新资源。

没有更改节点

由于 GKE 会为您管理 Autopilot 集群的节点,因此您无法更改节点。

无转化

不支持将标准集群转换为 Autopilot 模式,并且不支持 Autopilot 集群转换为标准模式。

没有专用集群的直接外部入站连接

包含专用节点的 Autopilot 集群没有外部 IP,无法直接接受入站连接。如果您在 NodePort 上部署服务,则无法从 VPC 外部(例如通过互联网)访问这些服务。如需在 Autopilot 集群中公开应用,请使用 Service。如需了解详情,请参阅使用服务公开应用

无 Pod 爆发

对于标准集群,可以将 Pod 配置为爆发到节点上的未使用容量。对于 Autopilot 集群,因为所有 Pod 对请求设置了限制,因此无法进行资源爆发。请务必确保您的 Pod 规范为资源请求定义了足够的资源,并且不依赖于爆发。

无端口转发

Autopilot 集群不支持 kubectl port-forward 命令。

无 SSH

由于您无法再在 Autopilot 中预配或管理节点,因此没有 SSH 访问。GKE 会处理节点的所有操作方面,包括节点运行状况和节点上运行的所有 Kubernetes 组件。

资源限制

在 Autopilot 集群中,每个 Pod 都被视为有保证的 QoS 类 Pod,限制等于请求。如果您未指定资源限制,Autopilot 会自动将资源限制设置为等于请求数。如果指定了资源限制,您的限制将被替换,等于等于请求量。

网络钩子限制

您无法为 Autopilot 集群创建自定义更改提交网络钩子,但可以创建自定义验证网络钩子。

问题排查

无法创建集群:已注册 0 个节点

创建 Autopilot 集群会失败,并显示以下错误:

All cluster resources were brought up, but: only 0 nodes out of 2 have registered.

若要解决此问题,请确保未停用默认 Compute Engine 服务帐号。运行以下命令进行检查:

   gcloud iam service-accounts describe SERVICE_ACCOUNT

SERVICE_ACCOUNT 替换为服务帐号数字 ID 或服务帐号电子邮件地址(例如 123456789876543212345my-iam-account@somedomain.com)。

后续步骤