

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 使用 AWS Fargate 简化计算管理
<a name="fargate"></a>

本主题讨论使用 Amazon EKS 在 AWS Fargate 上运行 Kubernetes 容器组（pod）。Fargate 是一种为[容器](https://aws.amazon.com/what-are-containers)按需提供大小合适的计算容量的技术。使用 Fargate，您不必再自己预置、配置或扩展虚拟机组即可运行容器。您无需再选择服务器类型、确定扩展节点组的时间和优化集群打包。

您可以控制要在 Fargate 上启动的容器组（pod）及其如何利用 [Fargate 配置文件](fargate-profile.md)运行。Fargate 配置文件被定义为 Amazon EKS 集群的一部分。Amazon EKS 使用由 AWS 构建的控制器（使用 Kubernetes 提供的上游可扩展模型）将 Kubernetes 与 Fargate 集成。这些控制器作为 Amazon EKS 托管的 Kubernetes 控制面板的一部分运行，负责将本机 Kubernetes 容器组（pod）调度到 Fargate 上。除了若干转换和验证准入控制器外，Fargate 控制器还包括一个与默认 Kubernetes 调度器一起运行的新调度器。在启动满足 Fargate 上的运行条件的容器组（pod）时，集群中运行的 Fargate 控制器会识别、更新容器组（pod）并将其安排到 Fargate 上。

本主题介绍 Fargate 上运行的容器组（pod）的不同组件，还列出了将 Fargate 与 Amazon EKS 结合使用时的特别注意事项。

## AWS Fargate 注意事项
<a name="fargate-considerations"></a>

以下是使用 Amazon EKS 上的 Fargate 时要考虑的一些事项。
+ 在 Fargate 上运行的每个容器组都有自己的计算边界，不与其他容器组（pod）共享底层内核、CPU 资源、内存资源或弹性网络接口。
+ 网络负载均衡器和 Application Load Balancer (ALB) 只能与具有 IP 目标的 Fargate 一起使用。有关更多信息，请参阅[创建网络负载均衡器](network-load-balancing.md#network-load-balancer)和[使用应用程序负载均衡器路由应用程序和 HTTP 流量](alb-ingress.md)。
+ Fargate 暴露的服务仅在目标类型 IP 模式下运行，而不是在节点 IP 模式下运行。推荐通过服务名称进行连接来检查托管节点上运行的服务和 Fargate 上运行服务的连接性。
+ 在对容器组（pod）进行安排时，它们必须与 Fargate 配置文件匹配，才能在 Fargate 上运行。与 Fargate 配置文件不匹配的容器组可能会卡在 `Pending` 状态。如果存在匹配的 Fargate 配置文件，您可以删除已创建的待处理容器组（pod），将之重新调度到 Fargate 上。
+ Fargate 上不支持 Daemonset。如果应用程序需要进程守护程序，则应将该进程守护程序重新配置为在容器组（pod）中作为边车容器运行。
+ Fargate 上不支持特权容器。
+ 在 Fargate 上运行的容器组（pod）无法在容器组（pod）清单中指定 `HostPort` 或 `HostNetwork`。
+ 对于 Fargate 容器组（pod），默认 `nofile` 和 `nproc` 软限制为 1024，硬限制为 65535。
+ GPU 目前在 Fargate 上不可用。
+ 在 Fargate 上运行的容器组（pod）仅在私有子网上受支持（对 AWS 服务具有 NAT 网关访问权限，但没有到互联网网关的直接路由），因此您的集群的 VPC 必须具有可用的私有子网。对于没有出站 Internet 访问的集群，请参阅 [部署具有有限互联网访问权限的私有集群](private-clusters.md)。
+ 您可以按照[使用 Vertical Pod Autoscaler 调整容器组（pod）资源](vertical-pod-autoscaler.md)来设置 Fargate 容器组（pod）的正确初始 CPU 和内存大小，然后按照[使用 Horizontal Pod Autoscaler 扩展容器组（pod）部署](horizontal-pod-autoscaler.md)来扩展那些容器组（pod）。如果希望 Vertical Pod Autoscaler 自动将容器组（pod）重新部署到具有更大 CPU 和内存组合的 Fargate，请将 Vertical Pod Autoscaler 的模式设置为 `Auto` 或 `Recreate`，确保功能正常运行。有关更多信息，请参阅 GitHub 上的 [Vertical Pod Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler#quick-start) 文档。
+ 必须为 VPC 启用 DNS 解析和 DNS 主机名。有关详细信息，请参阅[查看和更新您的 VPC 的 DNS 支持](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html#vpc-dns-updating)。
+ Amazon EKS Fargate 通过将虚拟机 (VM) 中的每个容器组隔离出来，从而为 Kubernetes 应用程序添加深度防御。此 VM 边界可防止在容器逃离情况下访问其他容器组使用的基于主机的资源，容器逃离是攻击容器化应用程序和获取容器外部资源访问权限的常见方法。

  使用 Amazon EKS 不会更改您在[责任共担模式](security.md)下的责任。您应该仔细考虑集群安全和治理控制的配置。隔离应用程序的最安全方法始终是在单独的集群中运行该程序。
+ Fargate 配置文件支持从 VPC 辅助 CIDR 块指定子网。您可能想要指定辅助 CIDR 块。这是因为子网中可用 IP 地址的数量是有限的。因此，可在集群中创建的容器组（pod）数量受到限制。对容器组（pod）使用不同的子网，您可以增加可用 IP 地址的数量。有关更多信息，请参阅[向 VPC 中添加 IPv4 CIDR 块](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html#vpc-resize)。
+ 部署到 Fargate 节点的容器组（pod）无法使用 Amazon EC2 实例元数据服务（IMDS）。如果在 Fargate 部署了需要 IAM 凭证的容器组（pod），请使用[服务账户的 IAM 角色](iam-roles-for-service-accounts.md)将之分配到容器组（pod）。如果容器组（pod）需要通过 IMDS 访问其他可用信息，则必须将此信息硬编码到容器组（pod）规范中。这包括容器组（pod）部署到的 AWS 区域或可用区。
+ 您不能将 Fargate 容器组（pod）部署到 AWS Outposts、AWS Wavelength 或 AWS Local Zones。
+ Amazon EKS 必须定期修补 Fargate 容器组（pod）来确保它们的安全。我们以减少影响的方式尝试更新，但是有时候，如果没有成功驱逐容器组（pod），必须删除它们。您可以采取一些措施来尽量减少中断。有关更多信息，请参阅 [为 AWS Fargate 操作系统补丁事件设置操作](fargate-pod-patching.md)。
+ [适用于 Amazon EKS 的 Amazon VPC CNI 插件](https://github.com/aws/amazon-vpc-cni-plugins)安装在 Fargate 节点上。您不能将[适用于 Amazon EKS 集群的 Alternate CNI 插件](alternate-cni-plugins.md)用于 Fargate 节点。
+ Fargate 上运行的容器组（pod）会自动挂载 Amazon EFS 文件系统，无需手动执行驱动程序安装步骤。您不能将动态持久性卷预置与 Fargate 节点结合使用，但可以使用静态预置。
+ Amazon EKS 不支持 Fargate Spot。
+ 您无法将 Amazon EBS 卷挂载到 Fargate 容器组（pod）。
+ 您可以在 Fargate 节点上运行 Amazon EBS CSI 控制器，但 Amazon EBS CSI 节点 DaemonSet 只能在 Amazon EC2 实例上运行。
+ 在 [Kubernetes 作业](https://kubernetes.io/docs/concepts/workloads/controllers/job/)被标记为 `Completed` 或 `Failed` 后，作业创建的容器组（pod）通常会继续存在。此行为允许您查看日志和结果，但在使用 Fargate 的情况下，如果您过后不清理作业，则将会产生费用。

  要在作业完成或失败后自动删除相关的容器组（pod），您可以使用生存时间（TTL）控制器指定时间段。以下示例显示了在作业清单中指定 `.spec.ttlSecondsAfterFinished`。

  ```
  apiVersion: batch/v1
  kind: Job
  metadata:
    name: busybox
  spec:
    template:
      spec:
        containers:
        - name: busybox
          image: busybox
          command: ["/bin/sh", "-c", "sleep 10"]
        restartPolicy: Never
    ttlSecondsAfterFinished: 60 # <-- TTL controller
  ```

## Fargate 比较表
<a name="_fargate_comparison_table"></a>


| 标准 |  AWS Fargate | 
| --- | --- | 
|  可以部署到 [AWS Outposts](https://docs.aws.amazon.com/outposts/latest/userguide/what-is-outposts.html)   |  否  | 
|  可以部署到 [AWS 本地区域](local-zones.md)   |  否  | 
|  可以运行需要 Windows 的容器  |  否  | 
|  可以运行需要 Linux 的容器  |  是  | 
|  可以运行需要 Inferentia 芯片的工作负载  |  否  | 
|  可以运行需要 GPU 的工作负载  |  否  | 
|  可以运行需要 ARM 处理器的工作负载  |  否  | 
|  可以运行 AWS [ Bottlerocket](https://aws.amazon.com/bottlerocket/)   |  否  | 
|  容器组（pod）之间共享内核运行时环境  |  否 – 每个容器组（pod）拥有专用的内核  | 
|  容器组之间共享 CPU、内存、存储和网络资源。  |  否 – 每个容器组（pod）都有专用资源，并且可以独立调整大小，能够最大限度地提高资源利用率。  | 
|  容器组（pod）可以使用多于容器组（pod）规范中所请求的硬件和内存  |  否 – 但是，可以使用更大的 vCPU 和内存配置重新部署容器组（pod）。  | 
|  必须部署和管理 Amazon EC2 实例  |  否  | 
|  必须保护、维护和修补 Amazon EC2 实例的操作系统  |  否  | 
|  可以在部署节点时提供引导参数，例如额外的 [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/) 实际参数。  |  否  | 
|  可以从与分配给节点的 IP 地址不同的 CIDR 块为容器组（pod）分配 IP 地址。  |  否  | 
|  可以通过 SSH 访问节点  |  否 – 没有主机操作系统要通过 SSH 访问的节点。  | 
|  可以将您自己的自定义 AMI 部署到节点  |  否  | 
|  可以将自己的自定义 CNI 部署到节点  |  否  | 
|  必须自己更新节点 AMI  |  否  | 
|  必须自己更新节点 Kubernetes 版本  |  否 – 您不管理节点。  | 
|  可以为容器组（pod）使用 Amazon EBS 存储  |  否  | 
|  可以为容器组（pod）使用 Amazon EFS 存储  |   [是](efs-csi.md)   | 
|  可以为容器组（pod）使用适用于 Lustre 的 Amazon FSx 存储  |  否  | 
|  可以对服务使用 Network Load Balancer  |  是，当使用[创建网络负载均衡器](network-load-balancing.md#network-load-balancer)时   | 
|  Pod 可以在公有子网中运行  |  否  | 
|  可以将不同的 VPC 安全组分配给各个容器组（pod）  |  是  | 
|  可以运行 Kubernetes DaemonSets  |  否  | 
|  支持容器组（pod）清单中的 `HostPort` 和 `HostNetwork`  |  否  | 
|   AWS 区域可用性  |   [部分 Amazon EKS 支持的区域](https://docs.aws.amazon.com/general/latest/gr/eks.html)   | 
|  可以在 Amazon EC2 专属主机上运行容器  |  否  | 
|  定价  |  单个 Fargate 内存和 CPU 配置的成本。每个容器组（pod）都有自己的成本。有关更多信息，请参阅 [AWS Fargate 定价](https://aws.amazon.com/fargate/pricing/)。  | 