在 Outpost 上创建本地集群 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

在 Outpost 上创建本地集群

本主题概述了在 Outpost 上运行本地集群时需要考虑的事项。本主题还提供了有关如何在 Outpost 上部署本地集群的说明。

注意事项
重要
  • 相关的 Amazon EKS 文档中没有重复这些注意事项。若其他 Amazon EKS 文档主题与本文的考虑事项冲突,则遵从本文的考虑事项。

  • 这些注意事项可能会经常更改。因此,我们建议您定期查看本主题。

  • 很多注意事项与在 Amazon Web Services 云 上创建集群的注意事项不同。

  • 本地集群仅支持 Outpost 机架。单个本地集群可跨构成单个逻辑 Outpost 的多个物理 Outpost 机架运行。单个本地集群不能跨多个逻辑 Outpost 运行。每个逻辑 Outpost 都有一个 Outpost ARN。

  • 本地集群运行和管理 Outpost 上您的账户中的 Kubernetes 控制面板。您不能在 Kubernetes 控制面板实例上运行工作负载或对 Kubernetes 控制面板组件进行修改。这些节点由 Amazon EKS 服务管理。对 Kubernetes 控制面板的更改不会在自动 Amazon EKS 管理操作(如修补)期间一直持续存在。

  • 本地集群支持自行管理的附加组件和自行管理的 Amazon Linux 2 节点组。Amazon VPC CNI plugin for Kuberneteskube-proxyCoreDNS 附加组件将自动安装在本地集群上。

  • 本地集群需要使用 Outpost 上的 Amazon EBS。您的 Outpost 必须拥有可用于 Kubernetes 控制面板存储的 Amazon EBS。

  • 本地集群使用 Outpost 上的 Amazon EBS。您的 Outpost 必须拥有可用于 Kubernetes 控制面板存储的 Amazon EBS。Outpost 仅支持 Amazon EBS gp2 卷。

  • 使用 Amazon EBS CSI 驱动程序支持 Amazon EBS 支持的 Kubernetes PersistentVolumes

先决条件

创建本地 Amazon EKS 集群后,创建集群的 IAM 主体将永久添加。主体将作为管理员专门添加到 Kubernetes RBAC 授权表。该实体具有 system:masters 权限。此实体的身份在您的集群配置中不可见。因此,重要的是要注意创建集群的实体并确保永远不会删除它。最初,仅创建服务器的主体可以使用 kubectl 调用 Kubernetes API 服务器。如果使用控制台创建集群,请确保在集群上运行 kubectl 命令时,相同的 IAM 凭证位于 Amazon SDK 凭证链中。创建集群后,您可以向其他 IAM 主体授予对集群的访问权限。

创建本地 Amazon EKS 本地集群

您可以使用 eksctl、Amazon Web Services Management Console、Amazon CLIAmazon EKS APIAmazon SDKAmazon CloudFormationTerraform 创建本地集群。

  1. 创建本地集群。

    eksctl
    先决条件

    您的设备或 Amazon CloudShell 上安装了 0.171.0 版或更高版本的 eksctl 命令行工具。要安装或更新 eksctl,请参阅 eksctl 文档中的 Installation

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

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

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

      • vpc-ExampleID1subnet-ExampleID1 替换为现有 VPC 和子网的 ID。VPC 和子网必须满足 Amazon EKS 本地集群 VPC 及子网的要求和注意事项 中的要求。

      • uniqueid 替换为您的 Outpost 的 ID。

      • m5.large 替换为您的 Outpost 上可用的实例类型。在选择实例类型之前,请参阅 容量注意事项。将部署三个控制面板实例。您无法更改此数字。

      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

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

    2. 使用您在上一步中创建的配置文件创建集群。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 对象。

    Amazon Web Services Management Console
    先决条件

    满足 Amazon EKS 要求的现有 VPC 和子网。有关更多信息,请参阅Amazon EKS 本地集群 VPC 及子网的要求和注意事项

    使用 Amazon Web Services Management Console 创建集群
    1. 如果您已经拥有本地集群 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 policy 附加到角色。要将 IAM policy 附加到某个 IAM 主体,必须为附加该策略的主体分配以下 IAM 操作(权限)之一:iam:AttachUserPolicyiam:AttachRolePolicy

        aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonEKSLocalOutpostClusterPolicy --role-name myAmazonEKSLocalClusterRole
    2. 从以下位置打开 Amazon EKS 控制台:https://console.aws.amazon.com/eks/home#/clusters

    3. 在控制台屏幕的顶部,确保您已选择受支持的 Amazon Web Services 区域

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

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

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

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

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

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

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

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

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

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

      • Tags(标签)– (可选)向集群添加任何标签。有关更多信息,请参阅为您的 Amazon EKS 资源添加标签

      完成此页面后,请选择下一步

    6. 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 创建的集群安全组中的规则。如果您选择添加自己的安全组,则无法更改集群创建后选择的安全组。要使本地主机与集群端点进行通信,您必须允许来自集群安全组的入站流量。对于没有传入和传出互联网连接(也被称为私有集群)的集群,您必须执行以下操作之一:

      完成此页面后,请选择下一步

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

      完成此页面后,请选择下一步

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

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

  2. 在创建您的集群后,您可以查看已创建的 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 将持续监控本地集群的状态。我们将执行自动管理操作,如安全补丁和修复运行状况不佳的实例。当本地集群与云断开连接时,我们会完成操作,以确保在重新连接后将集群修复到运行状况正常的状态。

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

    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
  4. 要连接到您的本地集群的 Kubernetes API 服务器,您必须有权访问子网的本地网关,或从 VPC 内部进行连接。有关将 Outpost 机架连接到您的本地网络的更多信息,请参阅《Amazon 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。有关更多信息,请参阅 Amazon Outposts 文档。运行以下命令以确认已建立与集群的通信。

    kubectl get svc

    示例输出如下。

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

内部资源

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

  • 以下映像 Pods

    • 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 的 Amazon Web Services 账户 中创建一个安全组。此安全组允许流量在控制面板实例上运行的 Kubernetes 组件之间自由流动。

向您建议的后续步骤: