Amazon EKS 为 Kubernetes 集群提供了一个托管的控制平面。为了确保高可用性,Amazon EKS 中的 Kubernetes 控制平面实例运行在多个可用区。Rancher 为部署和管理 Amazon EKS 中运行的 Kubernetes 集群提供了直观的用户界面。通过本指南,您将使用 Rancher 在您的 AWS 帐户中快速轻松地启动 Amazon EKS Kubernetes 集群。有关 Amazon EKS 的更多信息,参考文档

先决条件

注意 在亚马逊 AWS 中进行部署会产生费用。了解更多信息,请参阅EKS 定价页面

要在 EKS 上建立集群,您需要创建一个 Amazon VPC(Virtual Private Cloud)。您还需要确保用于创建 EKS 集群的帐户具有适当的权限。有关详细信息,请参阅官方文档Amazon EKS 先决条件

Amazon VPC

您需要建立一个 Amazon VPC 来启动 EKS 集群。VPC 使您能够将 AWS 资源启动到您定义的虚拟网络中。了解更多信息,参考教程: 为 Amazon EKS 集群创建一个包含公共和私有子网的 VPC

IAM 策略

Rancher 需要访问您的 AWS 帐户,以便在 Amazon EKS 中创建和管理您的 Kubernetes 集群。您需要在 AWS 帐户中为 Rancher 创建一个用户,并定义该用户可以访问的内容。

  1. 请按照以下步骤创建具有程序访问权限的用户:此处

  2. 下一步,创建 IAM 策略,定义该用户在 AWS 账户中有权访问的内容。请务必仅授予此用户所需要的最小权限。请按照此处的步骤来创建 IAM 策略并将其附加到用户。

  3. 最后,按照此处的步骤为此用户创建 Access Key 和 Secret Key。

注意: 定期轮换 Access Key 和 Secret Key 非常重要,参考文档了解更多信息。

有关 EKS 的 IAM 策略的更多详细信息,请参阅官方有关 Amazon EKS IAM 策略、角色和权限的文档

架构

下图展示了 Rancher 2.x 的大体架构。该图描述了一个 Rancher Server 管理两个 Kubernetes 集群:一个由 RKE 创建,另一个由 EKS 创建。

具有EKS托管集群的Rancher体系结构

创建 EKS 集群

使用 Rancher 设置和配置 Kubernetes 集群.

  1. 集群 页面,单击 添加集群.

  2. 选择 Amazon EKS.

  3. 输入 集群名称.

  4. 通过成员角色来设置用户访问集群的权限。

    • 点击添加成员将需要访问这个集群的用户添加到成员中。
    • 角色下拉菜单中选择每个用户的权限。
  5. 为 EKS 集群配置账户访问

    设置描述
    区域从下拉列表中选择要在其中创建集群的地理区域。。
    Access Key输入之前创建的 Access Key
    Secret Key输入之前创建的 Secret Key
  6. 单击 下一步: 配置集群。然后选择服务角色

    服务角色描述
    标准: Rancher 生成的服务角色。如果选择此角色,Rancher 会自动添加一个服务角色以用于集群。
    自定义: 从现有服务角色中选择。如果您选择此角色,Rancher 允许您从已经在 AWS 中创建的服务角色中进行选择。有关在 AWS 中创建自定义服务角色的详细信息,参考亚马逊文档
  7. 单击 下一步: 选择 VPC 和 Subnet

  8. Worker 节点的公网 IP选择一个选项。您对此选项的选择决定了VPC 和 Subnet可用的选项。

    选择描述
    当您的集群节点被配置时,它们将被分配一个内网 IP 地址和一个外网 IP 地址。
    否:仅私有 IP当您的集群节点被配置时,它们将会只被分配一个内网 IP 地址。

    如果您选择此选项,您还必须选择一个VPC & Subnet来允许您的实例访问 internet。此访问是必需的,以便您的工作节点可以连接到 Kubernetes 控制平面。
  9. 现在选择VPC & Subnet。有关更多信息,请参阅 AWS 文档中的集群 VPC 注意事项。根据上一步的选择,按照下面的说明进行操作。

    • 什么是亚马逊 VPC?

    • VPCs 和 Subnets

    • Worker 节点的公网 IP:是

      如果您选择将外网 IP 地址分配给集群的工作节点,您可以选择 “由 Rancher 自动生成 VPC” 或“使用在 AWS 中已有的 VPC”。请选择最适合您的用例的选项。

      1. 选择 VPC 和 Subnet 选项。

        操作描述
        标准: Rancher 生成的 VPC 和 Subnets在配置集群时,Rancher 会生成一个新的 VPC 和子网。
        自定义:选择您现有的 VPC 和 Subnets设置集群时,Rancher 将使用您已经在AWS 中创建的 VPC 和子网来配置您的节点。如果选择此选项,请完成以下剩余步骤。
      2. 如果您使用 自定义:选择现有的 VPC 和 Subnets

        1. 确保 自定义:选择现有的 VPC 和 Subnets 已经选择中。

        2. 在显示的下拉列表中,选择一个 VPC。

        3. 单击 下一步: 选择 Subnets。然后选择其中一个显示的Subnets

        4. 单击 下一步: 选择安全组

    • Worker 节点的公网 IP:否:仅私有 IP

      如果您选择此选项,您还必须选择允许您的实例访问 internet 的VPC & Subnet。这个访问是必需的,这样您的工作节点才可以连接到 Kubernetes 控制平面。步骤如下:

      提示: 仅使用私有 IP 地址时,为了使您的节点可以访问 internet,您可以创建一个由两个子网组成的 VPC,一个共有子网,一个私有子网。公有子网内的网络地址转换 (NAT) 实例,可让私有子网中的实例发起到 Internet 的流量。有关私有子网路由流量的更多信息,请查看 官方 AWS 文档

      1. 从显示的下拉列表中,选择专有网络 VPC。

      2. 单击 下一步: 选择 Subnets。然后选择其中一个显示的Subnets

      3. 单击 下一步: 选择安全组

  10. 选择安全组。请参阅下面的文档,了解如何创建一个安全组。

    Amazon 文档:

  11. 单击 选择实例选项,然后编辑可用的节点选项。工作节点的实例类型和大小会影响每个工作节点将有多少 IP 地址可用。参考这个文档了解更多信息。

    选项描述
    实例类型为正在配置的实例选择硬件规格
    自定义 AMI如果您想使用自定义的 Amazon Machine Image (AMI),请在这里指定它。默认情况下,Rancher 将会根据您选择的 EKS 版本来使用相应的EKS-调优的 AMI
    预期 ASG 大小通过亚马逊弹性伸缩组控制实例数。
    用户数据可以传递自定义命令来执行自动配置任务 警告:修改此命令可能会导致节点无法加入集群 注意: 从 v2.2.0 起提供
  12. 单击 创建

结果:

  • 您的集群创建成功并进入到Provisioning(启动中)的状态。Rancher 正在拉起您的集群。
  • 在集群状态变为Active(激活)状态后,您将可以开始访问您的集群。
  • Active的集群中,有两个默认项目:Default项目(包括default命名空间)和System项目(包括cattle-systemingress-nginxkube-publickube-system)。

故障排查

对于您的 Amazon EKS Kubernetes 集群的任何问题或故障排查细节,请参考文档

AWS 服务事件

查找任何 AWS 服务事件的信息,请参考此页

安全性和合规性

对于您的 Amazon EKS Kubernetes 集群的安全性和合规性的更多信息,请参考文档

教程

AWS 开源博客上的这篇教程将指导您如何使用 Rancher 设置一个 EKS 集群,并部署一个可公开访问的应用程序来测试集群。并部署一个通过使用其他开源软件如 Grafana 和 influxdb 来实时监控地理信息的示例项目。

附录 - 最小 EKS 权限

此文档描述了在使用 Rancher 中的 EKS 驱动时,所需要的最小权限。

因为很多要创建的资源的 ARN(Amazon 资源名称)不能在创建 EKS 集群之前确定,所以需要使用*来表示目标资源。某些权限(例如 ec2:CreateVpc)仅在 Rancher 需要创建这些资源的时候使用。

  1. {
  2. "Version": "2012-10-17",
  3. "Statement": [
  4. {
  5. "Sid": "EC2Permisssions",
  6. "Effect": "Allow",
  7. "Action": [
  8. "ec2:AuthorizeSecurityGroupIngress",
  9. "ec2:DeleteSubnet",
  10. "ec2:CreateKeyPair",
  11. "ec2:AttachInternetGateway",
  12. "ec2:ReplaceRoute",
  13. "ec2:DeleteRouteTable",
  14. "ec2:AssociateRouteTable",
  15. "ec2:DescribeInternetGateways",
  16. "ec2:CreateRoute",
  17. "ec2:CreateInternetGateway",
  18. "ec2:RevokeSecurityGroupEgress",
  19. "ec2:DescribeAccountAttributes",
  20. "ec2:DeleteInternetGateway",
  21. "ec2:DescribeKeyPairs",
  22. "ec2:CreateTags",
  23. "ec2:CreateRouteTable",
  24. "ec2:DescribeRouteTables",
  25. "ec2:DetachInternetGateway",
  26. "ec2:DisassociateRouteTable",
  27. "ec2:RevokeSecurityGroupIngress",
  28. "ec2:DeleteVpc",
  29. "ec2:CreateSubnet",
  30. "ec2:DescribeSubnets",
  31. "ec2:DeleteKeyPair",
  32. "ec2:DeleteTags",
  33. "ec2:CreateVpc",
  34. "ec2:DescribeAvailabilityZones",
  35. "ec2:CreateSecurityGroup",
  36. "ec2:ModifyVpcAttribute",
  37. "ec2:AuthorizeSecurityGroupEgress",
  38. "ec2:DescribeTags",
  39. "ec2:DeleteRoute",
  40. "ec2:DescribeSecurityGroups",
  41. "ec2:DescribeImages",
  42. "ec2:DescribeVpcs",
  43. "ec2:DeleteSecurityGroup"
  44. ],
  45. "Resource": "*"
  46. },
  47. {
  48. "Sid": "EKSPermissions",
  49. "Effect": "Allow",
  50. "Action": [
  51. "eks:DeleteFargateProfile",
  52. "eks:DescribeFargateProfile",
  53. "eks:ListTagsForResource",
  54. "eks:UpdateClusterConfig",
  55. "eks:DescribeNodegroup",
  56. "eks:ListNodegroups",
  57. "eks:DeleteCluster",
  58. "eks:CreateFargateProfile",
  59. "eks:DeleteNodegroup",
  60. "eks:UpdateNodegroupConfig",
  61. "eks:DescribeCluster",
  62. "eks:ListClusters",
  63. "eks:UpdateClusterVersion",
  64. "eks:UpdateNodegroupVersion",
  65. "eks:ListUpdates",
  66. "eks:CreateCluster",
  67. "eks:UntagResource",
  68. "eks:CreateNodegroup",
  69. "eks:ListFargateProfiles",
  70. "eks:DescribeUpdate",
  71. "eks:TagResource"
  72. ],
  73. "Resource": "*"
  74. },
  75. {
  76. "Sid": "IAMPermissions",
  77. "Effect": "Allow",
  78. "Action": [
  79. "iam:ListRoleTags",
  80. "iam:RemoveRoleFromInstanceProfile",
  81. "iam:CreateRole",
  82. "iam:AttachRolePolicy",
  83. "iam:AddRoleToInstanceProfile",
  84. "iam:DetachRolePolicy",
  85. "iam:GetRole",
  86. "iam:DeleteRole",
  87. "iam:CreateInstanceProfile",
  88. "iam:ListInstanceProfilesForRole",
  89. "iam:PassRole",
  90. "iam:GetInstanceProfile",
  91. "iam:ListRoles",
  92. "iam:ListInstanceProfiles",
  93. "iam:DeleteInstanceProfile"
  94. ],
  95. "Resource": "*"
  96. },
  97. {
  98. "Sid": "CloudFormationPermisssions",
  99. "Effect": "Allow",
  100. "Action": [
  101. "cloudformation:DescribeStackResource",
  102. "cloudformation:ListStackResources",
  103. "cloudformation:DescribeStackResources",
  104. "cloudformation:DescribeStacks",
  105. "cloudformation:ListStacks",
  106. "cloudformation:CreateStack"
  107. ],
  108. "Resource": "*"
  109. },
  110. {
  111. "Sid": "AutoScalingPermissions",
  112. "Effect": "Allow",
  113. "Action": [
  114. "autoscaling:DescribeAutoScalingGroups",
  115. "autoscaling:UpdateAutoScalingGroup",
  116. "autoscaling:TerminateInstanceInAutoScalingGroup",
  117. "autoscaling:CreateOrUpdateTags",
  118. "autoscaling:DeleteAutoScalingGroup",
  119. "autoscaling:CreateAutoScalingGroup",
  120. "autoscaling:DescribeAutoScalingInstances",
  121. "autoscaling:DescribeLaunchConfigurations",
  122. "autoscaling:DescribeScalingActivities",
  123. "autoscaling:CreateLaunchConfiguration",
  124. "autoscaling:DeleteLaunchConfiguration"
  125. ],
  126. "Resource": "*"
  127. }
  128. ]
  129. }