在 AWS Outposts 上创建本地 Amazon EKS 集群以实现高可用性 - Amazon EKS

在 AWS Outposts 上创建本地 Amazon EKS 集群以实现高可用性

您可以使用本地集群在 AWS Outposts 上本地运行您的整个 Amazon EKS 集群。这有助于降低因临时断开与云的网络连接而造成的应用程序停机风险。光纤中断或天气事件可能会导致此类连接断开的情况。由于整个 Kubernetes 集群在 Outpost 上本地运行,应用程序仍然可用。您可以在断开与云的网络连接期间执行集群操作。有关更多信息,请参阅 在 AWS Outposts 上准备本地 Amazon EKS 集群以防断网。下图显示了本地集群部署。

Outpost 本地集群

本地集群通常可用于与 Outpost 机架配合使用。

支持的 AWS 区域

您可以在以下 AWS 区域创建本地集群:美国东部(俄亥俄州)、美国东部(弗吉尼亚州北部)、美国西部(北加利福尼亚)、美国西部(俄勒冈州)、亚太地区(首尔)、亚太地区(新加坡)、亚太地区(悉尼)、亚太地区(东京)、加拿大(中部)、欧洲地区(法兰克福)、欧洲地区(爱尔兰)、欧洲地区(伦敦)、中东(巴林)和南美洲(圣保罗)。有关受支持的功能的详细信息,请参阅 部署选项比较

主题

    创建 Amazon EKS 本地集群

    您可以使用本页中描述的下列工具创建本地集群:

    您也可以使用 AWS CLIAmazon EKS APIAWS SDKAWS CloudFormationTerraform 在 Outposts 上创建集群。

    eksctl

    使用 eksctl 创建本地集群

    1. 在您的设备或 AWS CloudShell 上安装 0.194.0 版或更高版本的 eksctl 命令行工具。要安装或更新 eksctl,请参阅 eksctl 文档中的 Installation

    2. 将后续内容复制到您的设备。替换以下值,然后运行修改后的命令以创建 outpost-control-plane.yaml 文件:

      • region-code 替换为您要在其中创建集群的受支持的 AWS 区域

      • my-cluster 替换为您的集群名称。名称只能包含字母数字字符(区分大小写)和连字符。该名称必须以字母数字字符开头,且不得超过 100 个字符。对于您在其中创建集群的 AWS 区域和 AWS 账户,该名称必须在其内具有唯一性。对于您在其中创建集群的 AWS 区域和 AWS 账户,该名称必须在其内具有唯一性。

      • vpc-ExampleID1subnet-ExampleID1 替换为您的现有 VPC 和子网的 ID。VPC 和子网必须符合在 AWS Outposts 上为上的 Amazon EKS 集群创建 VPC 和子网中的要求。

      • uniqueid 替换为您的 Outpost 的 ID。

      • m5.large 替换为您的 Outpost 上可用的实例类型。在选择实例类型之前,请参阅 根据容量因素为 AWS Outposts 上的 Amazon EKS 集群选择实例类型和置放群组。将部署三个控制面板实例。您无法更改此数字。

        cat >outpost-control-plane.yaml <<EOF apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: my-cluster region: region-code version: "1.24" vpc: clusterEndpoints: privateAccess: true id: "vpc-vpc-ExampleID1" subnets: private: outpost-subnet-1: id: "subnet-subnet-ExampleID1" outpost: controlPlaneOutpostARN: arn:aws:outposts:region-code:111122223333:outpost/op-uniqueid controlPlaneInstanceType: m5.large EOF

        有关所有可用选项和默认设置的完整列表,请参阅 AWS Outposts 支持eksctl 文档中的配置文件架构

    3. 使用您在上一步中创建的配置文件创建集群。eksctl 将在您的 Outpost 上创建一个 VPC 和一个子网,以在其中部署集群。

      eksctl create cluster -f outpost-control-plane.yaml

      集群预配置需要几分钟时间。在创建集群时,将显示几行输出。输出的最后一行类似于以下示例行。

      [✓] EKS cluster "my-cluster" in "region-code" region is ready
      提示

      要查看在使用 eksctl 创建集群时可指定的大多数选项,请使用 eksctl create cluster --help 命令。要查看所有可用的选项,请使用 config 文件。有关更多信息,请参阅 eksctl 文档中的使用配置文件配置文件架构。您可以在 GitHub 上查找配置文件示例

      eksctl 命令自动为创建集群的 IAM 主体(用户或角色)创建访问条目,并授予 IAM 主体对集群上 Kubernetes 对象的管理员权限。如果您不希望集群创建者拥有集群上 Kubernetes 对象的管理员访问权限,请在之前的配置文件中添加以下文本:bootstrapClusterCreatorAdminPermissions: false(与 metadatavpcoutpost 的级别相同)。如果您添加了该选项,则在创建集群后,您需要为至少一个 IAM 主体创建访问条目,否则任何 IAM 主体将无法访问集群上的 Kubernetes 对象。

    AWS Management Console

    使用 AWS Management Console创建集群

    1. 您需要有满足 Amazon EKS 要求的现有 VPC 和子网。有关更多信息,请参阅 为 AWS Outposts 上的 Amazon EKS 集群创建 VPC 和子网

    2. 如果您已经拥有本地集群 IAM 角色,或者您将使用 eksctl 创建集群,则可以跳过此步骤。默认情况下,eksctl 会为您创建角色。

      1. 运行以下命令以创建 IAM 信任策略 JSON 文件。

        cat >eks-local-cluster-role-trust-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } EOF
      2. 创建 Amazon EKS 集群 IAM 角色。要创建 IAM 角色,必须为正在创建角色的 IAM 主体分配 iam:CreateRole 操作(权限)。

        aws iam create-role --role-name myAmazonEKSLocalClusterRole --assume-role-policy-document file://"eks-local-cluster-role-trust-policy.json"
      3. 将名为 AmazonEKSLocalOutpostClusterPolicy 的 Amazon EKS 托管策略附加到该角色。要将 IAM 策略附加到某个 IAM 主体,必须为附加该策略的主体分配以下 IAM 操作(权限)之一:iam:AttachUserPolicyiam:AttachRolePolicy

        aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonEKSLocalOutpostClusterPolicy --role-name myAmazonEKSLocalClusterRole
    3. 打开 Amazon EKS console 控制台

    4. 在控制台屏幕的顶部,确保您已选择受支持的 AWS 区域

    5. 请选择 Add cluster(添加集群),然后选择 Create(创建)。

    6. Configure cluster(配置集群)页面上,为以下字段输入或选择值:

      • Kubernetes 控制面板位置 – 选择 AWS Outposts。

      • Outpost ID - 选择您要在其上创建控制面板的 Outpost 的 ID。

      • Instance type(实例类型)– 选择一个实例类型。仅显示您的 Outpost 中可用的实例类型。在下拉列表中,每种实例类型都将描述为实例类型推荐多少个节点。在选择实例类型之前,请参阅 根据容量因素为 AWS Outposts 上的 Amazon EKS 集群选择实例类型和置放群组。所有副本都将使用相同实例类型进行部署。在创建您的集群后,您将无法更改实例类型。将部署三个控制面板实例。您无法更改此数字。

      • Name(名称)– 集群的名称。它在您的 AWS 账户中必须是唯一的。名称只能包含字母数字字符(区分大小写)和连字符。该名称必须以字母数字字符开头,且不得超过 100 个字符。对于您在其中创建集群的 AWS 区域和 AWS 账户,该名称必须在其内具有唯一性。对于您在其中创建集群的 AWS 区域和 AWS 账户,该名称必须在其内具有唯一性。

      • Kubernetes 版本 – 选择要用于集群的 Kubernetes 版本。建议选择最新版本,除非您需要使用早期版本。

      • Cluster service role(集群服务角色)– 选择您在上一步创建的 Amazon EKS 集群 IAM 角色,以允许 Kubernetes 控制面板管理 AWS 资源。

      • Kubernetes 集群管理员访问权限 – 如果您希望创建集群的 IAM 主体(角色或用户)拥有集群上 Kubernetes 对象的管理员访问权限,请接受默认设置(允许)。Amazon EKS 为 IAM 主体创建访问条目,并向集群管理员授予访问条目的权限。有关访问条目的更多信息,请参阅 使用 EKS 访问条目向 IAM 用户授予对 Kubernetes 的访问权限

        如果您希望与创建集群的主体不同的 IAM 主体拥有 Kubernetes 集群对象的管理员访问权限,请选择“不允许”选项。创建集群后,任何拥有创建访问条目的 IAM 权限的 IAM 主体都可以为需要访问 Kubernetes 集群对象的任何 IAM 主体添加访问条目。如需了解所需的 IAM 权限,请参阅《服务授权参考》中的 Amazon Elastic Kubernetes Service 定义的操作。如果您选择“不允许”选项并且不创建任何访问条目,则没有 IAM 主体有权访问集群上的 Kubernetes 对象。

      • Tags(标签)– (可选)向集群添加任何标签。有关更多信息,请参阅 使用标签整理 Amazon EKS 资源。完成此页面后,请选择下一步

    7. Specify networking (指定联网) 页面上,为以下字段选择值:

      • VPC – 选择现有 VPC。VPC 必须有足够数量的 IP 地址来供集群、任何节点和您想要创建的其他 Kubernetes 资源使用。您的 VPC 必须符合 VPC 要求和注意事项中的要求。

      • Subnets(子网)– 预设情况下,已预先选中在之前字段中指定的 VPC 中的所有可用子网。您选择的子网必须符合子网要求和注意事项中的要求。

      • Security groups(安全组)–(可选)指定您希望 Amazon EKS 将之与其创建的网络接口关联的一个或多个安全组。Amazon EKS 会自动创建安全组,以实现集群与 VPC 之间的通信。Amazon EKS 将此安全组以及您选择的任何安全组与它创建的网络接口关联起来。有关 Amazon EKS 创建的集群安全组的更多信息,请参阅 查看集群的 Amazon EKS 安全组要求。您可以修改 Amazon EKS 创建的集群安全组中的规则。如果您选择添加自己的安全组,则无法更改集群创建后选择的安全组。要使本地主机与集群端点进行通信,您必须允许来自集群安全组的入站流量。对于没有传入和传出互联网连接(也被称为私有集群)的集群,您必须执行以下操作之一:

        • 添加与所需 VPC 端点关联的安全组。有关所需端点的更多信息,请参阅子网对 AWS 服务的访问权限中的使用接口 VPC 端点

        • 修改 Amazon EKS 创建的安全组,以允许来自与 VPC 端点关联的安全组的流量。完成此页面后,请选择下一步

    8. 配置可观测性页面上,您可以选择要开启的指标控制面板日志记录选项。默认情况下,每种日志类型都处于关闭状态。

    9. Review and create (审核和创建) 页面上,审核您在之前页面输入或选择的信息。如果需要进行更改,请选择 Edit(编辑)。在您感到满意后,选择创建Status(状态)字段在预置集群时显示 CREATING(正在创建)。

      集群预配置需要几分钟时间。

    查看 Amazon EKS 本地集群

    1. 在创建您的集群后,您可以查看已创建的 Amazon EC2 控制面板实例。

      aws ec2 describe-instances --query 'Reservations[*].Instances[*].{Name:Tags[?Key==`Name`]|[0].Value}' | grep my-cluster-control-plane

      示例输出如下。

      "Name": "my-cluster-control-plane-id1" "Name": "my-cluster-control-plane-id2" "Name": "my-cluster-control-plane-id3"

      每个实例都将受到 node-role.eks-local.amazonaws.com/control-plane 的污染,这样就不会在控制面板实例上安排任何工作负载。有关污点的更多信息,请参阅 Kubernetes 文档中的污点和容忍度。Amazon EKS 将持续监控本地集群的状态。我们将执行自动管理操作,如安全补丁和修复运行状况不佳的实例。当本地集群与云断开连接时,我们会完成操作,以确保在重新连接后将集群修复到运行状况正常的状态。

    2. 如果您使用 eksctl 创建集群,则可以跳过此步骤。eksctl 会为您完成此步骤。通过向 kubectl config 文件添加新上下文来启用 kubectl 与您的集群通信。有关如何创建或更新文件的说明,请参阅 通过创建 kubeconfig 文件将 kubectl 连接到 EKS 集群

      aws eks update-kubeconfig --region region-code --name my-cluster

      示例输出如下。

      Added new context arn:aws:eks:region-code:111122223333:cluster/my-cluster to /home/username/.kube/config
    3. 要连接到您的本地集群的 Kubernetes API 服务器,您必须有权访问子网的本地网关,或从 VPC 内部进行连接。有关将 Outpost 机架连接到您的本地网络的更多信息,请参阅《AWS Outposts 用户指南》中的机架的本地网关的工作原理。如果您使用直接 VPC 路由且 Outpost 子网具有通向您的本地网关的路由,则 Kubernetes 控制面板实例的私有 IP 地址将在您的本地网络内自动广播。本地集群的 Kubernetes API 服务器端点托管在 Amazon Route 53(Route 53)中。API 访问端点可由公有 DNS 服务器解析至 Kubernetes API 服务器的私有 IP 地址。

      本地集群的 Kubernetes 控制面板实例将配置具有固定私有 IP 地址的静态弹性网络接口,这些固定私有 IP 地址在整个集群生命周期中都不会更改。在网络连接断开期间,与 Kubernetes API 服务器互动的设备可能无法连接到 Route 53。如果是这种情况,我们建议使用静态私有 IP 地址配置 /etc/hosts 以实现持续运行。我们还建议设置本地 DNS 服务器,并将其连接到 Outpost。有关更多信息,请参阅 AWS Outposts 文档。运行以下命令以确认已建立与集群的通信。

      kubectl get svc

      示例输出如下。

      NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 28h
    4. (可选)当本地集群与 AWS 云断开连接时,对其进行身份验证测试。有关说明,请参阅 在 AWS Outposts 上准备本地 Amazon EKS 集群以防断网

    内部资源

    Amazon EKS 将在您的集群上创建以下资源。这些资源将供 Amazon EKS 内部使用。为使您的集群正常运行,请不要编辑或修改这些资源。

    • 以下镜像容器组(pod)

      • aws-iam-authenticator-node-hostname

      • eks-certificates-controller-node-hostname

      • etcd-node-hostname

      • kube-apiserver-node-hostname

      • kube-controller-manager-node-hostname

      • kube-scheduler-node-hostname

    • 以下自行管理的附加组件:

      • kube-system/coredns

      • kube-system/ kube-proxy(在您添加第一个节点之前不会创建)

      • kube-system/aws-node(在您添加第一个节点之前不会创建)。本地集群将使用 Amazon VPC CNI plugin for Kubernetes 插件进行集群联网。不要更改控制面板实例(名为 aws-node-controlplane-* 的容器组 (pod))的配置。您可以使用一些配置变量在插件创建新网络接口时更改默认值。有关更多信息,请参阅 GitHub 上的文档

    • 以下服务:

      • default/kubernetes

      • kube-system/kube-dns

    • 名为 eks.systemPodSecurityPolicy

    • 名为 eks:system:podsecuritypolicyClusterRole

    • 名为 eks:systemClusterRoleBinding

    • 默认值 PodSecurityPolicy

    • 集群安全组以外,Amazon EKS 还会在您名为 eks-local-internal-do-not-use-or-edit-cluster-name-uniqueid 的 AWS 账户中创建一个安全组。此安全组允许流量在控制面板实例上运行的 Kubernetes 组件之间自由流动。

    向您建议的后续步骤: