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 与标准版本比对表详述)是不可变的,其他可选设置则可以开启或关闭。

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

以下是您可能需要使用标准操作模式取代 Autopilot 的一些原因:

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

扩缩

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

允许的资源范围

Autopilot 允许您为工作负载请求 CPU、内存和临时存储资源。允许的范围取决于您是要在默认的通用计算平台上还是在计算类上运行 Pod。如需了解默认容器资源请求和允许的资源范围,请参阅 Autopilot 中的资源请求

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"

在 GKE 1.21 及更高版本中,还支持工作负载的 "SYS_PTRACE" 功能。

节点选择器和节点亲和性

支持地区相似性拓扑。节点亲和性节点选择器仅适用于以下键: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 仅支持操作系统和架构的所有值。

您还可以将节点选择器和节点亲和性用于以下用途:

无特权 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 共存。

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

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

Autopilot 中的安全限制

容器隔离

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 PodSecurityPolicy。在 1.21 之前的 GKE 版本中,也不支持 OPA 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 中的其他限制

证书签名请求

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

外部监控工具

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

外部服务

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

托管式命名空间

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

没有更改节点

如果工作负载具有特定的计算要求,则您无法更改 Autopilot 节点,例如更改底层机器类型。

无转化

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

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

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

无 Pod 爆发

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

无法通过 SSH 连接到节点

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

您仍然可以使用 Kubernetes exec 功能远程连接到正在运行的容器,以在容器中执行调试命令,包括连接到交互式 shell(例如使用 kubectl exec -it deploy/YOUR_DEPLOYMENT -- sh.

资源限制

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

串行端口日志记录

Autopilot 集群需要启用串行端口日志记录以支持调试节点并进行问题排查。如果您的 Google Cloud 组织具有强制执行 compute.disableSerialPortLogging 限制条件的组织政策,则新节点可能不会预配。

请要求组织政策管理员在包含 Autopilot 集群的项目中移除此限制条件。

网络钩子限制

在 GKE 1.21 及更高版本中,您还可以创建变更动态准入网络钩子。但是,Autopilot 会修改变更网络钩子对象来添加命名空间选择器,以防止代管式命名空间中的资源(例如 kube-system)被拦截。此外,在规则中指定以下一个或多个资源(及其任何子资源)的网络钩子会被拒绝:

- group: ""
  resource: nodes
- group: ""
  resource: persistentvolumes
- group: certificates.k8s.io
  resource: certificatesigningrequests
- group: authentication.k8s.io
  resource: tokenreviews

您不能使用 resourcesgroups 字段中代表所有值的 * 标记来允许上述资源。

用户模拟限制

GKE 1.22.4-gke.1501 及更高版本支持针对所有用户定义的用户和群组的用户模拟。无法模拟系统用户和群组(例如 kube-apiserver 用户和 system:masters 群组)。

无法安装 Google Cloud Marketplace 应用

您无法在 Autopilot 集群中安装 Cloud Marketplace 应用。

问题排查

如需了解问题排查步骤,请参阅排查 Autopilot 集群问题

后续步骤