

 **帮助改进此页面** 

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

# 将示例负载均衡器工作负载部署到 EKS 自动模式
<a name="auto-elb-example"></a>

本指南将演示在 Amazon EKS 上部署 2048 游戏的容器化版本，包括负载均衡和互联网访问功能。

## 先决条件
<a name="_prerequisites"></a>
+ 一个 EKS 自动模式集群
+  配置好 `kubectl` 以与集群进行交互
+ 用于创建 ALB 资源的适当 IAM 权限

## 第 1 步：创建命名空间
<a name="_step_1_create_the_namespace"></a>

首先，为 2048 游戏应用程序创建一个专用的命名空间。

创建一个名为 `01-namespace.yaml` 的文件：

```
apiVersion: v1
kind: Namespace
metadata:
  name: game-2048
```

应用命名空间配置：

```
kubectl apply -f 01-namespace.yaml
```

## 第 2 步：部署应用程序
<a name="_step_2_deploy_the_application"></a>

该应用程序会运行 2048 游戏容器的多个副本。

创建一个名为 `02-deployment.yaml` 的文件：

```
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: game-2048
  name: deployment-2048
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: app-2048
  replicas: 5
  template:
    metadata:
      labels:
        app.kubernetes.io/name: app-2048
    spec:
      containers:
        - image: public.ecr.aws/l6m2t8p7/docker-2048:latest
          imagePullPolicy: Always
          name: app-2048
          ports:
            - containerPort: 80
          resources:
            requests:
              cpu: "0.5"
```

**注意**  
如果加载映像 `public.ecr.aws/l6m2t8p7/docker-2048:latest` 时收到错误消息，请确认节点 IAM 角色是否具有足够的权限从 ECR 提取映像。有关更多信息，请参阅 [节点 IAM 角色](auto-learn-iam.md#auto-learn-node-iam-role)。此外，示例中的 `docker-2048` 映像为 `x86_64` 映像，不会在其他架构上运行。

 **关键组件：**
+ 部署 5 个应用程序副本
+ 使用一个公有 ECR 映像
+ 每个容器组（pod）请求 0.5 个 CPU 核心
+ 为 HTTP 流量公开端口 80

应用部署：

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

## 第 3 步：创建服务
<a name="_step_3_create_the_service"></a>

该服务将该部署向集群网络公开。

创建一个名为 `03-service.yaml` 的文件：

```
apiVersion: v1
kind: Service
metadata:
  namespace: game-2048
  name: service-2048
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    app.kubernetes.io/name: app-2048
```

 **关键组件：**
+ 创建一个节点端口服务
+ 将端口 80 映射到容器的端口 80
+ 使用标签选择器查找容器组

应用服务：

```
kubectl apply -f 03-service.yaml
```

## 第 4 步：配置负载均衡
<a name="_step_4_configure_load_balancing"></a>

您将设置一个 Ingress，以将该应用程序向互联网公开。

首先，创建 `IngressClass`。创建一个名为 `04-ingressclass.yaml` 的文件：

```
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  labels:
    app.kubernetes.io/name: LoadBalancerController
  name: alb
spec:
  controller: eks.amazonaws.com/alb
```

**注意**  
EKS 自动模式需要子网标签来标识公有子网和私有子网。  
如果使用 `eksctl` 创建集群，则已包含这些标签。  
了解如何[为 EKS 自动模式的子网添加标签](tag-subnets-auto.md)。

然后创建该 Ingress 资源。创建一个名为 `05-ingress.yaml` 的文件：

```
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: game-2048
  name: ingress-2048
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
spec:
  ingressClassName: alb
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: service-2048
                port:
                  number: 80
```

 **关键组件：**
+ 创建一个面向互联网的 ALB
+ 使用适用于直接容器组路由的 IP 目标类型
+ 将所有流量 (/) 路由到游戏服务

应用 Ingress 配置：

```
kubectl apply -f 04-ingressclass.yaml
kubectl apply -f 05-ingress.yaml
```

## 第 5 步：验证部署
<a name="_step_5_verify_the_deployment"></a>

1. 检查所有容器组是否都在运行：

   ```
   kubectl get pods -n game-2048
   ```

1. 确认服务是否已创建：

   ```
   kubectl get svc -n game-2048
   ```

1. 获取 ALB 端点：

   ```
   kubectl get ingress -n game-2048
   ```

Ingress 输出中的 ADDRESS 字段将显示您的 ALB 端点。等待 2-3 分钟，让 ALB 完成预置并注册所有目标。

## 第 6 步：访问游戏
<a name="_step_6_access_the_game"></a>

打开 Web 浏览器并浏览到之前步骤中的 ALB 端点 URL。您应该会看到 2048 游戏界面。

## 步骤 7：清除
<a name="_step_7_cleanup"></a>

移除本教程中创建的所有资源：

```
kubectl delete namespace game-2048
```

这将删除命名空间中的所有资源，包括部署、服务和 Ingress 资源。

## 幕后发生了什么
<a name="_whats_happening_behind_the_scenes"></a>

1. 此部署创建了 5 个运行 2048 游戏的容器组

1. 该服务为这些容器组提供稳定的网络访问

1. EKS 自动模式：
   + 在 AWS 中创建一个应用程序负载均衡器 
   + 为容器组配置目标组
   + 设置路由规则以将流量定向到服务

## 故障排除
<a name="auto-elb-troubleshooting"></a>

如果游戏无法加载：
+ 确保所有容器组都在运行：`kubectl get pods -n game-2048`
+ 检查 Ingress 状态：`kubectl describe ingress -n game-2048`
+ 验证 ALB 运行状况检查：在 AWS 控制台中检查目标组的运行状况