亚马逊AWS官方博客

在 AWS Outposts 本地部署您的 Amazon EKS 集群



我很高兴宣布,AWS Outposts 上的 Amazon Elastic Kubernetes Service (Amazon EKS) 可提供本地集群。这意味着从今天开始,您可以将您的 Amazon EKS 集群完全部署在 Outposts 上:包括 Kubernetes 控制面板和节点。

Amazon EKS 是一项托管的 Kubernetes 服务,它使您可以轻松地在 AWS 上和本地运行 Kubernetes。AWS Outposts 是一系列完全托管的解决方案,向几乎任何本地或边缘站点提供 AWS 基础架构和服务,以提供真正一致的混合体验。

为了充分了解本地集群对 Outposts 中 Amazon EKS 带来的益处,我首先需要分享一些背景知识。

一些客户使用 Outpost 将 Kubernetes 集群节点和容器组(pod)部署在其内部基础架构的其余部分附近。这使得他们的应用程序能够从对本地服务和数据的低延迟访问中获益,同时使用与基于云的集群相同的 AWS API、CLI 或 AWS 管理控制台管理集群和节点生命周期。

直到今天,当您在 Outposts 上部署 Kubernetes 应用程序时,通常都是从在 AWS Cloud 中创建 Amazon EKS 集群开始的。然后您在 Outposts 计算机上部署了集群节点。在此混合集群场景中,Kubernetes 控制面板在 Outposts 的父区域运行,而节点则在您的本地 Outposts 上运行。Amazon EKS 服务通过网络与在 Outposts 计算机上运行的节点进行通信。

但是,请记住:任何事物都会出现故障。客户告诉我们,在这种情况下,他们面临的主要挑战是管理站点断开连接。这是我们无法控制的,特别是当您在粗糙的边缘部署 Outpost 时:网络连接不良或断断续续的区域。当本地设备暂时与互联网断开连接时,运行在云中的 Amazon EKS 控制面板无法与节点和容器组(pod)通信。虽然节点和容器组(pod)工作正常,并继续在本地的本机网络上为应用程序提供服务,但 Kubernetes 可能会认为状况异常,并计划在重新建立连接时进行更换(请参阅 Kubernete 文档中的容器组(pod)驱逐)。恢复连接后,这可能会导致应用程序停机。

在准备这篇博客文章时,我和我们的 Kubernetes 产品经理兼专家 Chris 进行了交谈。他告诉我,至少有七个不同的选项可以配置控制面板如何重新连接到其节点。除非掌握了所有这些选项,否则重新连接时的系统状态是不可预测的。

为了简化此操作,我们让您能够将整个 Amazon EKS 集群托管在 Outposts 上。在这个配置中,Kubernetes 控制面板和 Worker 节点都在您的 Outposts 机器上本地运行。这样,即使您的服务链接连接暂时中断,您的集群仍能继续运行。在网络与云断开连接期间,您可以执行集群操作,例如创建、更新和扩展应用程序。

EKS 本地集群图本地群集与云中的 Amazon EKS 相同,并自动部署最新的安全补丁,使您能够轻松维护最新的、安全的集群。您可以在云中使用与 Amazon EKSAWS 管理控制台相同的工具,为在 Outposts 和 AWS Cloud 中运行的集群提供单一界面。

我们来看看它的实际操作
让我们看看如何使用这项新功能。在本演示中,我将在 Outposts 机架上本地运行的 Amazon Elastic Compute Cloud (Amazon EC2) 实例上部署 Kubernetes 控制面板。

我使用的是已经配置好的 Outposts 机架。如果您想学习如何开始使用 Outposts,可以阅读 AWS Outposts 入门页面上的步骤。

AWS Outposts 配置

该演示分为两个部分。首先,创建集群。其次,连接到集群并创建节点。

创建集群
在 Outposts 上部署 Amazon EKS 本地集群之前,我确保创建了一个 IAM 集群角色,并附加了 AmazonEKSLocalOutpostClusterPolicy 管理的策略。此 IAM 集群角色将用于创建集群。

然后,我切换到 Amazon EKS 控制面板,然后选择添加集群,然后选择创建

创建集群

在接下来的页面上,我选择了 Kubernetes 控制面板位置:AWS Cloud 或 AWS Outposts。我选择 AWS Outposts 并指定 Outposts ID

配置 EKS 集群以使用 AWS Outposts

Outposts 上的 Kubernetes 控制面板部署在三个 EC2 实例上,以实现高可用性。这就是为什么我看到三个副本。然后,我根据工作负载所需的 Worker 节点数量选择实例类型。例如,要处理 0—20 个 Worker 节点,建议使用 m5d.large EC2 实例。

设置实例类型

在同一页面上,我指定 Kubernetes 集群的配置值,例如其名称Kubernetes 版本和我之前创建的集群服务角色

集群配置

在下一页上,我配置网络选项。由于 Outposts 是 AWS 区域的扩展,我需要使用 Outposts 使用的 VPC子网来实现 Kubernetes 控制面板和 Worker 节点之间的通信。对于安全组Amazon EKS 为本地集群创建一个安全组,允许我的集群和我的 VPC 之间进行通信。我还可以根据我的应用程序要求定义其他安全组。

指定网络

当我们在 Outposts 中运行 Kubernetes 控制面板时,集群端点访问只能私下访问。这意味着我只能通过部署在同一 VPC 中的机器或通过具有直接 VPC 路由的 Outposts 本地网关通过本地网络访问 Kubernetes 集群。

私有集群端点访问权限
在下一页上,我定义了日志记录。默认情况下,日志记录处于禁用状态,我可以根据需要将其启用。有关日志记录的更多详细信息,您可以阅读 Amazon EKS 控制面板日志记录文档。

配置日志记录

最后一个屏幕可以让我查看所有配置选项。当我对配置感到满意时,我选择 Create(创建)来创建集群。

联网

创建集群需要几分钟的时间。要检查集群创建状态,我可以在控制台或终端上使用以下命令:

$ aws eks describe-cluster \ 
--region <REGION_CODE> \ 
--name <CLUSTER_NAME> \ 
--query "cluster.status"

状态部分告诉我集群何时创建并处于活动状态。

活动集群

除了使用 AWS 管理控制台外,我还可以使用 AWS CLI 创建本地集群。以下是使用 AWS CLI 创建本地集群的命令片段:

$ aws eks create-cluster \ 
--region <REGION_CODE> \ 
--name <CLUSTER_NAME> \ 
--resources-vpc-config subnetIds=<SUBNET_ID>\ 
--role-arn <ARN_CLUSTER_ROLE> \ 
--outpost-config controlPlaneInstanceType=<INSTANCE_TYPE> \ 
--outpostArns=<ARN_OUTPOST>

正在连接到集群
本地集群的端点访问是专用的;因此,我可以从具有 Direct VPC Routing 的本地网关或同一 VPC 中的机器访问。要了解如何在 Outposts 中使用本地网关,您可以查看使用本地网关页面上的信息。在这个演示中,我使用 EC2 实例作为堡垒机主机,并使用 kubectl 命令管理 Kubernetes 集群。

我要做的第一件事是编辑安全组以打开来自堡垒机主机的流量访问权限。我转到 Kubernetes 集群的详细信息页面,然后选择网络选项卡。然后我在集群安全组中选择链接。

网络与安全组

然后,我添加入站规则,并通过指定堡垒机主机的 IP 地址为其提供访问权限。

在安全组中添加入站规则

允许访问后,我通过运行以下命令在堡垒机主机中创建 kubeconfig

$ aws eks update-kubeconfig --region <REGION_CODE> --name <CLUSTER_NAME>

最后,我像往常一样使用 kubectl 与 Kubernetes API 服务器进行交互。

$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
ip-10-X-Y-Z.us-west-2.compute.internal NotReady control-plane,master 10h v1.21.13 10.X.Y.Z <none> Bottlerocket OS 1.8.0 (aws-k8s-1.21) 5.10.118 containerd://1.6.6+bottlerocket
ip-10-X-Y-Z.us-west-2.compute.internal NotReady control-plane,master 10h v1.21.13 10.X.Y.Z <none> Bottlerocket OS 1.8.0 (aws-k8s-1.21) 5.10.118 containerd://1.6.6+bottlerocket
ip-10-X-Y-Z.us-west-2.compute.internal NotReady control-plane,master 9h v1.21.13 10.X.Y.Z <none> Bottlerocket OS 1.8.0 (aws-k8s-1.21) 5.10.118 containerd://1.6.6+bottlerocket

AWS Outposts 上运行的 Kubernetes 本地集群在三个 EC2 实例上运行。我们在上面的输出中看到,三个 Worker 节点的状态为 NotReady。这是因为它们仅由控制面板使用,我们不能用来调度容器组(pod)。

从这个阶段开始,您可以使用 Amazon EKS 本地集群部署自我管理的节点组。

定价和可用性
Amazon EKS 本地集群的收费价格与传统 EKS 集群相同。起价为每小时 0.10 美元。在 Outposts 上部署 Kubernetes 控制面板和节点所需的 EC2 实例包含在 Outposts 的价格中。通常来说,定价页面包含详细信息

Amazon EKS 本地集群在提供 Outposts 的所有 AWS 区域均可用。

立即开始构建并创建您的第一个 EKS 本地集群

– seb 和 Donnie。