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

在 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 管理操作(如修补)期间一直持续存在。

  • 本地集群仅支持 Kubernetes 版本 1.21

  • 本地集群支持自行管理的附加组件和自行管理的 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 权限。此实体的身份在您的集群配置中不可见。因此,重要的是要注意创建集群的实体并确保永远不会删除它。最初,仅创建服务器的 IAM 实体可以使用 kubectl 调用 Kubernetes API 服务器。如果使用控制台创建集群,则必须确保在集群上运行 kubectl 命令时,相同的 IAM 凭证位于 Amazon 开发工具包凭证链中。创建集群后,您可以向其他 IAM 实体授予对集群的访问权限。

创建本地 Amazon EKS 本地集群

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

  1. 创建本地集群。

    eksctl

    先决条件

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

    使用 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.21 vpc: clusterEndpoints: privateAccess: true id: "vpc-vpc-ExampleID1" subnets: private: outpost-subnet-1: id: "subnet-subnet-ExampleID1" outposts: controlPlaneOutpostArn: arn:aws:outposts:region-code:111122223333:outpost/op-uniqueid controlPlaneInstanceType: m5.large

      有关所有可用选项和默认设置的完整列表,请参阅 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 上查找配置文件示例

    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 操作(权限):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 操作(权限)之一: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 control plane location(Kubernetes 控制面板位置)– 选择 Amazon Outposts。

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

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

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

      • Kubernetes version(Kubernetes 版本)– 仅版本 1.21 可用。

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

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

    6. 选择 Next(下一步)。

    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 创建的集群安全组中的规则。如果您选择添加自己的安全组,则无法更改集群创建后选择的安全组。要使本地主机与集群端点进行通信,您必须允许来自集群安全组的入站流量。

    8. 选择 Next(下一步)。

    9. Configure logging (配置日志记录) 页面上,您可以选择要启用的日志类型,此操作是可选的。预设情况下,每个日志类型均为已禁用。在选择其他选项前,请自行熟悉 Amazon EKS 控制面板日志记录 中的信息。创建集群后,您可以更改此选项。

    10. 选择 Next(下一步)。

    11. 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) 中,可以通过公有 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. (可选)如果您的 Outpost 上没有运行任何生产服务,并且您希望在您的本地集群与 Amazon Web Services 云 处于断开连接状态时测试对本地集群的身份验证,请参阅 为网络断开连接做好准备

内部资源

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

向您建议的后续步骤: