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

帮助改进此页面

要帮助改进本用户指南,请选择位于每个页面右侧窗格中的在 GitHub 上编辑此页面链接。

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

本快速入门教程将指导您完成使用 eksctl 在 Amazon EKS 自动模式集群上部署 2048 游戏示例应用程序,并将其数据持久保存的步骤。

Amazon EKS 自动模式可自动执行块存储、联网、负载均衡和计算自动扩缩等例行任务,从而简化集群管理。在设置过程中,该模式负责创建包含 EC2 托管式实例、应用程序负载均衡器和 EBS 卷的节点。

总之,您将部署一个示例工作负载,其中包含与 Amazon 服务无缝集成所需的自定义注释。

在本教程中:

使用之后的 eksctl 集群模板,您将构建一个启用了 EKS 自动模式的集群,以实现自动节点预置。

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

  • 实例管理:EKS 自动模式会根据 Kubernetes 应用程序的需求,动态添加或移除 EKS 集群中的节点。

  • 数据持久性:使用 EKS 自动模式的块存储功能来确保应用程序数据的持久性,即使在涉及容器组(pod)重启或故障等场景时也不例外。

  • 外部应用程序访问:使用 EKS 自动模式的负载均衡功能来动态预调配应用程序负载均衡器(ALB)。

先决条件

开始之前,请确保您已执行以下任务:

配置集群

在本节中,您将使用 EKS 自动模式创建一个集群,以进行动态节点预置。

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

apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: web-quickstart region: <region-code> autoModeConfig: enabled: true

现在,我们可以随时创建集群。

使用 cluster-config.yaml` 创建 EKS 集群:

eksctl create cluster -f cluster-config.yaml
重要

如果您不使用 eksctl 创建集群,则需要手动标记 VPC 子网。

创建 IngressClass

为 EKS 自动模式创建一个 Kubernetes 。IngressClassIngressClass 定义 EKS 自动模式将如何处理 Ingress 资源。此步骤会配置 EKS 自动模式的负载均衡功能。为应用程序创建 Ingress 资源时,EKS 自动模式使用此 IngressClass 自动预置和管理负载均衡器,从而将您的 Kubernetes 应用程序与 Amazon 负载均衡服务集成。

将以下 yaml 文件另存为 ingressclass.yaml

apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: alb annotations: ingressclass.kubernetes.io/is-default-class: "true" spec: controller: eks.amazonaws.com/alb

将 IngressClass 应用到集群:

kubectl apply -f ingressclass.yaml

部署 2048 游戏示例应用程序

在这一部分中,我们将演示在集群中部署流行的“2048 游戏”这款示例应用程序的步骤。提供的清单包括自定义的应用程序负载均衡器(ALB)注释。这些注释与 EKS 集成并指示后者将传入的 HTTP 流量作为“面向互联网”的流量处理,并使用目标类型“ip”将其路由到 game-2048 命名空间中的相应服务。

注意

示例中的 docker-2048 映像为 x86_64 容器映像,不会在其他架构上运行。

  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 游戏。

使用 Amazon EKS 自动模式持久保存数据

现在 2048 游戏已在 Amazon EKS 集群上启动并运行,可以使用 Amazon EKS 自动模式的块存储功能来确保安全地持久保存游戏数据。

  1. 创建一个名为 storage-class.yaml 的文件:

    apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: auto-ebs-sc annotations: storageclass.kubernetes.io/is-default-class: "true" provisioner: ebs.csi.eks.amazonaws.com volumeBindingMode: WaitForFirstConsumer parameters: type: gp3 encrypted: "true"
  2. 应用 StorageClass

    kubectl apply -f storage-class.yaml
  3. 创建持久卷注册声明(PVC)以请求存储游戏数据。创建一个名为 ebs-pvc.yaml 的文件,并将以下内容添加到该文件:

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

    kubectl apply -f ebs-pvc.yaml

    您应看到以下响应输出:

    persistentvolumeclaim/game-data-pvc created
  5. 现在,您需要更新 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
  6. 应用更新后的部署:

    kubectl apply -f ebs-deployment.yaml

    您应看到以下响应输出:

    deployment.apps/deployment-2048 configured

完成这些步骤后,集群上的 2048 游戏现已设置为使用 Amazon EKS 自动模式的块存储功能持久保存数据。这样可以确保即使在容器组或节点出现故障,游戏进度和数据也同样安全。

如果您喜欢本教程,请给我们反馈,以便我们可以为您提供更多与此类似的应用场景专用快速入门教程。

清理

为避免将来产生费用,您需要手动删除关联的 CloudFormation 堆栈,以删除在本指南中创建的所有资源,包括 VPC 网络。

删除 CloudFormation 堆栈:

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