

 **帮助改进此页面** 

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

# 快速入门：部署 Web 应用程序并存储数据
<a name="quickstart"></a>

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

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

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

## 在本教程中：
<a name="_in_this_tutorial"></a>

使用之后的 `eksctl` 集群模板，您将构建一个启用了 EKS 自动模式的集群，以实现自动节点预置。
+  **VPC 配置**：使用下面的 eksctl 集群模板时，eksctl 会自动为该集群创建一个 IPv4 虚拟私有云（VPC）。默认情况下，除创建公有和私有端点外，eksctl 还会配置一个满足所有联网要求的 VPC。
+  **实例管理**：EKS 自动模式会根据 Kubernetes 应用程序的需求，动态添加或移除 EKS 集群中的节点。
+  **数据持久性**：使用 EKS 自动模式的块存储功能来确保应用程序数据的持久性，即使在涉及容器组（pod）重启或故障等场景时也不例外。
+  **外部应用程序访问**：使用 EKS 自动模式的负载均衡功能来动态预调配应用程序负载均衡器（ALB）。

## 先决条件
<a name="_prerequisites"></a>

开始之前，请确保您已执行以下任务：
+  [为 Amazon EKS 设置您的环境](https://docs.aws.amazon.com/eks/latest/userguide/setting-up.html) 
+  [安装 eksctl 的最新版本](https://eksctl.io/installation/) 

## 配置集群
<a name="_configure_the_cluster"></a>

在本节中，您将使用 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
<a name="_create_ingressclass"></a>

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

将以下 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 游戏示例应用程序
<a name="_deploy_the_2048_game_sample_application"></a>

在这一部分中，我们将演示在集群中部署流行的“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
   ```

1. 部署 [2048 游戏示例应用程序](https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.8.0/docs/examples/2048/2048_full.yaml)。

   ```
   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
   ```

1. 运行以下命令以获取 `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）完成预置。

1. 打开 Web 浏览器，并输入上一步中的 `ADDRESS` 以访问该 Web 应用程序。例如：

   ```
   k8s-game2048-ingress2-eb379a0f83-378466616.region-code.elb.amazonaws.com
   ```

   您应该会在浏览器中看到 2048 游戏。开始玩吧！  
![\[玩 2048 游戏。\]](http://docs.aws.amazon.com/zh_cn/eks/latest/userguide/images/quick2048.png)

## 使用 Amazon EKS 自动模式持久保存数据
<a name="_persist_data_using_amazon_eks_auto_mode"></a>

现在 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"
   ```

1. 应用 `StorageClass`：

   ```
   kubectl apply -f storage-class.yaml
   ```

1. 创建持久卷注册声明（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
   ```

1. 将该 PVC 应用到集群：

   ```
   kubectl apply -f ebs-pvc.yaml
   ```

   您应看到以下响应输出：

   ```
   persistentvolumeclaim/game-data-pvc created
   ```

1. 现在，您需要更新 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
   ```

1. 应用更新后的部署：

   ```
   kubectl apply -f ebs-deployment.yaml
   ```

   您应看到以下响应输出：

   ```
   deployment.apps/deployment-2048 configured
   ```

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

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

## 清理
<a name="_clean_up"></a>

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

删除 CloudFormation 堆栈：

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