亚马逊AWS官方博客

在Outposts上本地化部署Amazon EKS集群

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

Amazon EKS是一个托管的Kubernetes服务,使您可以很容易地在亚马逊云科技上和本地机房运行Kubernetes。Outposts是一个完全托管的解决方案,可以在几乎任何本地或边缘位置提供亚马逊云科技基础设施和服务,以获得真正一致的混合云体验。

为了充分理解在Outposts上部署 Amazon EKS本地集群的好处,我需要首先分享一下背景:一些客户希望使用Outposts来部署Kubernetes集群节点和pods,这样可以更靠近其本地基础设施的其他设备。这使他们的应用程序能够低延迟访问企业内部服务和数据,同时使用和亚马逊云科技上集群相同的API、CLI或控制台来管理本地集群和节点的生命周期。

至今当您在Outposts上部署Kubernetes应用程序时,您通常要先在亚马逊云科技中创建一个Amazon EKS集群,然后在您的Outposts机器上部署集群节点。在这种混合集群方案中,Kubernetes控制平面在Outposts所附着的Region运行,而节点则在部署在本地机房内部的Outposts上运行。Amazon EKS服务通过网络与Outposts机器上运行的节点进行通信。

但是,请记住:“所有的东西都有失败的可能。” 客户告诉我们,在这种情况下他们面临的主要挑战是与控制平面的连接断开,这是我们无法控制的,特别是当您把Outposts部署在网络连接不畅或断续的边缘地区。当企业内部设施与互联网暂时断开连接时,在云中运行的Amazon EKS控制平面就无法与EKS  nodes和pods进行通信。尽管nodes和pods工作得很好,并继续为企业内部本地网络上的应用提供服务,但Kubernetes可能认为它们不健康,并在连接重新建立时安排它们被替换(见Kubernetes文档中的pod驱逐),这种情况可能会导致网络连接恢复后的应用停机。在准备这篇博文时,我与我们的Kubernetes产品经理和专家Chris交谈过。他告诉我,至少有七个不同的选项可以配置控制平面如何重新连接到其节点,除非您掌握所有这些选项,否则重新连接时的系统状态是不可预测的。

为了简化这个问题,我们准备让您能够在Outposts上托管您的整个Amazon EKS集群。在这种配置中,Kubernetes控制平面和您的工作节点都在您的Outposts机器上本地运行。这样,即使在服务链路连接临时中断的情况下,您的集群也能继续运行。您可以执行集群操作,比如在与云的网络断开期间创建、更新和扩展应用程序。

 

本地集群与云中的Amazon EKS集群相同,也能自动部署最新的安全补丁,使您能够轻松地维护一个最新的、安全的集群。您可以使用与您在云中的Amazon EKS和管理控制台所使用的相同工具,为您在Outposts和亚马逊云科技中运行的集群提供一致的界面。

通过演示让我们看看它是如何运作的:

在这个演示中,我们将在已经在Outposts机架上运行的Amazon Elastic Compute Cloud(Amazon EC2)实例上部署Kubernetes控制平面。在演示中我们是使用一个已经配置好的Outposts机架。如果您想了解如何开始使用Outposts,您可以参考Get Started with AWS Outposts page上的使用步骤。

 

本演示分为两个部分。第一,创建集群。第二,连接到集群并创建节点。

创建集群

在Outposts上部署Amazon EKS本地集群之前,我们必须确保创建了一个IAM集群role并附加了AmazonEKSLocalOutpostClusterPolicy管理策略。这个IAM集群role将在集群创建中使用。

然后,我们切换到Amazon EKS仪表板,选择Add Cluster,然后选择Create

 

在之后的页面,选择Kubernetes控制平面所在的位置:亚马逊云科技或 Outposts。选择AWS Outposts并指定Outposts ID

 

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

在同一页面上,可以设置Kubernetes集群的配置值,比如它的Name、Kubernetes版本,以及之前创建的集群服务role。

点击Next 可以配置网络选项。由于Outposts是亚马逊云科技 region的延伸,需要用Outposts使用的VPC和子网来实现Kubernetes控制平面和工作节点之间的通信。关于安全组,Amazon EKS为本地集群创建了一个安全组,使集群和VPC之间能够进行通信。我们还可以根据应用的要求来定义额外的安全组。

 

由于我们在Outposts内部运行Kubernetes控制平面,集群的endpoint访问只能是private模式。这意味着我们只能通过部署在同一VPC中的实例或者从本地网络通过Outposts本地网关的 Direct VPC Routing来访问Kubernetes集群。

 

点击Next,定义日志记录。默认情况下,日志是禁用的,我们可以根据需要启用它。关于日志的更多细节,您可以阅读Amazon EKS control plane logging 文档。

 

最后一个页面允许我们审查所有的配置选项。当对配置感到满意时,选择 Create 来创建集群。

 

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

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

 Status部分可以告诉我们集群是什么时候创建和激活的。

 

除了使用管理控制台外,我们也可以通过CLI创建一个本地集群。下面是用CLI创建本地集群的命令片段:

BASH
$ 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>

连接到群集

本地集群的endpoint访问是私有的;因此可以从具有Direct VPC Routing的本地网关或者在同一VPC中的实例访问它。要了解如何使用Outposts的本地网关,您可以遵循Working with local gateways页面上的信息。在这个演示中,使用一个EC2实例作为堡垒主机,通过kubectl命令来管理Kubernetes集群。

首先是编辑安全组,打开来自堡垒主机的流量访问。然后进入Kubernetes集群的详细页面,选择Networking标签。然后再选择Cluster security group

 

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

 

允许访问后,通过运行下面的命令在堡垒主机上创建kubeconfig。

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

最后,如常使用kubectl与Kubernetes API服务进行交互。

BASH
$ 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

注意:部署在Outposts上的Kubernetes本地集群是在三个EC2实例上运行。我们在上面的页面中看到三个节点的状态是NotReady。这是因为它们是由控制平面专门使用的,我们不能用它们来调度pod。

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

价格和可用性

Amazon EKS本地集群的收费与传统EKS集群的价格相同。起步价为0.10美元/小时。在Outposts上部署Kubernetes控制平面和节点所需的EC2实例包括在Outposts的价格中。在产品定价页面有详细介绍。

Amazon EKS本地集群现在可以在以下亚马逊云科技 region提供。包括:美东(俄亥俄州)、美东(弗吉尼亚州北部)、美西(加利福尼亚北部)、美西(俄勒冈州)、亚太(首尔)、亚太(东京)、欧洲(法兰克福)、欧洲(伦敦)、中东(巴林)和南美(圣保罗)。

去建立和创建您的第一个EKS本地集群吧! Let’s Go!

—— by Sébastien Stormacq and Donnie Prakoso