快速入门:部署 Web 应用程序并存储数据 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

帮助改进此页面

想为本用户指南做出贡献? 滚动到页面底部,然后选择在 GitHub 上编辑此页面。您的贡献有助于我们的用户指南为每个人提供更充分的参考。

快速入门:部署 Web 应用程序并存储数据

本快速入门教程演示了使用 eksctl 部署 2048 游戏示例应用程序并将其数据持久保存在 Amazon EKS 集群上的步骤。eksctl 是一种使用 Amazon CloudFormation 的基础设施即代码实用工具,让您能够设置功能齐全的集群,包括所有基本组件。这些组件包括一个 Amazon VPC 以及一个量身定制的 IAM 角色,用于提供对我们定义的 Amazon 服务的权限。在此过程中,我们将演示集群设置过程,整合 Amazon EKSAmazon EKS 附加组件 以为您的集群提供操作功能。最后将会部署一个示例工作负载,其中包含与 Amazon 服务完全集成所需的自定义注释。

在本教程中:

使用下面的 eksctl 集群模板,您将构建一个具有托管式节点组的 Amazon EKS 集群。该集群包括以下组件:

VPC 配置

使用下面的 eksctl 集群模板时,eksctl 会自动为该集群创建一个 IPv4 虚拟私有云(VPC)。默认情况下,除创建公有和私有端点外,eksctl 还会配置一个满足所有联网要求的 VPC。

实例类型

使用 t3.medium 实例类型。该实例类型充分平衡了计算、内存和网络资源,非常适合 CPU 使用量中等,但偶尔会遇到峰值的应用程序。

身份验证

建立 IRSA 映射以促进 Kubernetes 容器组和 Amazon 服务之间的通信。该模板配置为设置用于身份验证和授权的 OpenID Connect (OIDC)端点。此外还会为 Amazon Load Balancer Controller(LBC)建立一个服务帐户,后者是负责公开应用程序和管理流量的控制器。

数据持久性

集成 AmazonEBS CSI 驱动程序托管式插件来确保应用程序数据的持久性,即使在涉及容器组重启或故障的情况下也是如此。该模板配置为安装插件并建立服务账户

外部应用程序访问

设置并与 Amazon Load Balancer Controller(LBC)插件集成以公开 2048 游戏应用程序,使用 LBC 动态预置应用程序负载均衡器(ALB)。

先决条件

第 1 步:配置集群

在这一部分中,您将使用包含两个节点的 t3.medium 实例创建一个基于托管节点组的集群。该配置包括 Amazon 负载均衡器控制器(LBC)插件的服务账户,以及安装最新版本的 AmazonAmazon EBS CSI 驱动程序。有关所有可用 eksctl 插件的信息,请参阅 eksctl 文档中的 Discovering addons

  • 创建一个 cluster-config.yaml 文件,并将以下内容粘贴到该文件中。将 region-code 替换为有效的区域,例如 us-east-1

    输出示例如下:

    apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: web-quickstart region: region-code managedNodeGroups: - name: eks-mng instanceType: t3.medium desiredCapacity: 2 iam: withOIDC: true serviceAccounts: - metadata: name: aws-load-balancer-controller namespace: kube-system wellKnownPolicies: awsLoadBalancerController: true addons: - name: aws-ebs-csi-driver wellKnownPolicies: # Adds an IAM service account ebsCSIController: true cloudWatch: clusterLogging: enableTypes: ["*"] logRetentionInDays: 30

第 2 步:创建集群

现在,我们已经准备好创建 Amazon EKS 集群。此过程需要几分钟时间才能完成。如果要监控状态,请访问 Amazon CloudFormation 控制台。

  • 创建 Amazon EKS 集群并指定 cluster-config.yaml。

    eksctl create cluster -f cluster-config.yaml
    注意

    如果您在响应中收到 Error: checking STS access,请确认为当前 Shell 会话使用的用户身份正确。您可能还需要指定命名的配置文件(例如 --profile clusteradmin)或获取 Amazon CLI 的新安全令牌。

    完成后,您应会看到以下响应输出:

    2024-07-04 21:47:53 [✔] EKS cluster "web-quickstart" in "region-code" region is ready

第 3 步:使用 Amazon Load Balancer Controller(LBC)设置对应用程序的外部访问权限

集群开始运行后,下一步将是使其容器化应用程序可以从外部访问。要实现这一目标,您需要部署应用程序负载均衡器(ALB),以将集群外的流量指向我们的服务(即我们的应用程序)。创建集群时,我们为 Load Balancer Controller(LBC)建立了一个服务账户 IAM 角色(IRSA)。该角色具有动态创建 ALB 所需的权限,以便将外部流量路由到我们的 Kubernetes 服务。在这一部分中,我们将在集群上设置 Amazon LBC。

配置环境变量

  1. 设置 Amazon EKS 集群的 CLUSTER_REGION 环境变量。替换 region-code 的样本值。

    export CLUSTER_REGION=region-code
  2. 设置 Amazon EKS 集群的 CLUSTER_VPC 环境变量。

    export CLUSTER_VPC=$(aws eks describe-cluster --name web-quickstart --region $CLUSTER_REGION --query "cluster.resourcesVpcConfig.vpcId" --output text)

安装 Amazon Load Balancer Controller(LBC)

Amazon Load Balancer Controller(LBC)利用 Kubernetes 中的自定义资源定义(CRD)来管理 Amazon 弹性负载均衡器(ELB)。这些 CRD 定义了负载均衡器和 TargetGroupBindings 等自定义资源,从而使 Kubernetes 集群能够识别和管理这些资源。

  1. 使用 Helm 将 Amazon EKS 图表存储库添加到 Helm。

    helm repo add eks https://aws.github.io/eks-charts
  2. 更新存储库以确保 Helm 能够感知图表的最新版本:

    helm repo update eks
  3. 运行以下 Helm 命令以同时安装自定义资源定义(CRD)和 Amazon Load Balancer Controller(Amazon LBC)的主控制器。要跳过 CRD 安装,请传递 --skip-crds 标志;这在已经安装了 CRD、需要特定的版本兼容性或者在有严格访问控制和自定义需求的环境中时会非常实用。

    helm install aws-load-balancer-controller eks/aws-load-balancer-controller \ --namespace kube-system \ --set clusterName=web-quickstart \ --set serviceAccount.create=false \ --set region=${CLUSTER_REGION} \ --set vpcId=${CLUSTER_VPC} \ --set serviceAccount.name=aws-load-balancer-controller

    您应看到以下响应输出:

    NAME: aws-load-balancer-controller LAST DEPLOYED: Wed July 3 19:43:12 2024 NAMESPACE: kube-system STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: Amazon Load Balancer controller installed!

第 4 步:部署 2048 游戏示例应用程序

现在,负载均衡器已设置完毕,可以为集群中的容器化应用程序启用外部访问。在这一部分中,我们将演示在集群中部署流行的“2048 游戏”这款示例应用程序的步骤。提供的清单包括应用程序负载均衡器(ALB)的自定义注释,特别是“架构”注释“目标类型”注释。这些注释与 Amazon Load Balancer Controller(LBC)集成并指示后者将传入的 HTTP 流量作为“面向互联网”的流量处理,并使用目标类型“ip”将其路由到“game-2048”命名空间中的相应服务。有关更多注释,请参阅 Amazon LBC 文档中的 Annotations

  1. 创建一个名为 game-2048 的 Kubernetes 命名空间,带 --save-config 标志。

    kubectl create namespace game-2048 --save-config

    您应看到以下响应输出:

    namespace/game-2048 created
  2. 部署 2048 游戏示例应用程序

    kubectl apply -n game-2048 -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.8.0/docs/examples/2048/2048_full.yaml

    此清单为 game-2048 命名空间设置了 Kubernetes 部署、服务和入口,从而创建了在集群中部署和公开 game-2048 应用程序所需的资源。这包括创建一个名为 service-2048 的服务,用于在端口 80 上公开该部署;以及一个名为 ingress-2048 的入口资源,用于定义传入的 HTTP 流量的路由规则,以及面向互联网的应用程序负载均衡器(ALB)的注释。您应看到以下响应输出:

    namespace/game-2048 configured
    deployment.apps/deployment-2048 created
    service/service-2048 created
    ingress.networking.k8s.io/ingress-2048 created
  3. 运行以下命令以获取 game-2048 命名空间的入口资源。

    kubectl get ingress -n game-2048

    您应看到以下响应输出:

    NAME CLASS HOSTS ADDRESS PORTS AGE ingress-2048 alb * k8s-game2048-ingress2-eb379a0f83-378466616.region-code.elb.amazonaws.com 80 31s

    在开始以下步骤之前,您需要等待几分钟,以便应用程序负载均衡器(ALB)完成预置。

  4. 打开 Web 浏览器,并输入上一步中的 ADDRESS 以访问该 Web 应用程序。例如,k8s-game2048-ingress2-eb379a0f83-378466616.region-code.elb.amazonaws.com。您应该会在浏览器中看到 2048 游戏。开始玩吧!

    玩 2048 游戏。

第 5 步:使用 Amazon EBS CSI 驱动程序节点持久保存数据

现在 2048 game 已在 Amazon EKS 集群上启动并运行,可以使用 Amazon EBS CSI 驱动程序托管式插件来确保安全地持久保存游戏数据。此插件是在创建过程中安装到集群上的。这种集成对于持久保存游戏进度和数据至关重要,即使重启或替换了 Kubernetes 容器组或节点也不例外。

  1. 为 EBS CSI 驱动程序创建一个存储类

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/master/examples/kubernetes/dynamic-provisioning/manifests/storageclass.yaml
  2. 创建持久卷注册声明(PVC)以请求存储游戏数据。创建一个名为 ebs-pvc.yaml 的文件,并将以下内容添加到该文件:

    apiVersion: v1 kind: PersistentVolumeClaim metadata: name: game-data-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: ebs-sc
  3. 将该 PVC 应用到集群:

    kubectl apply -f ebs-pvc.yaml

    您应看到以下响应输出:

    persistentvolumeclaim/game-data-pvc created
  4. 现在,您需要更新 2,048 游戏部署才能使用此 PVC 存储数据。以下部署配置为使用 PVC 来存储游戏数据。创建一个名为 ebs-deployment.yaml 的文件,并将以下内容添加到该文件:

    apiVersion: apps/v1 kind: Deployment metadata: namespace: game-2048 name: deployment-2048 spec: replicas: 3 # Adjust the number of replicas as needed selector: matchLabels: app.kubernetes.io/name: app-2048 template: metadata: labels: app.kubernetes.io/name: app-2048 spec: containers: - name: app-2048 image: public.ecr.aws/l6m2t8p7/docker-2048:latest imagePullPolicy: Always ports: - containerPort: 80 volumeMounts: - name: game-data mountPath: /var/lib/2048 volumes: - name: game-data persistentVolumeClaim: claimName: game-data-pvc
  5. 应用更新后的部署:

    kubectl apply -f ebs-deployment.yaml

    您应看到以下响应输出:

    deployment.apps/deployment-2048 configured

通过这些步骤,Amazon EKS 上的 2048 游戏现已设置为使用 Amazon EBS CSI 驱动程序持久保存数据。这样可以确保即使在容器组或节点出现故障,游戏进度和数据也同样安全。如果您喜欢本教程,请给我们反馈,以便我们可以为您提供更多与此类似的应用场景专用快速入门教程。

第 6 步:删除集群和节点

在使用完成针对本教程而创建的集群和节点后,应使用下面的命令删除这些集群和节点,从而将它们清除。如果要在清除该集群前对其执行更多操作,请参阅“后续步骤”。

eksctl delete cluster -f ./cluster-config.yaml

完成后,您应会看到以下响应输出:

2024-07-05 17:26:44 [✔] all cluster resources were deleted

后续步骤

以下文档主题有祝您扩展集群的功能:

要探索创建不同类型集群的方法,请参阅以下资源: