

 **このページの改善にご協力ください** 

このユーザーガイドに貢献するには、すべてのページの右側のペインにある「**GitHub でこのページを編集する**」リンクを選択してください。

# サンプルロードバランサーワークロードを EKS 自動モードl にデプロイする
<a name="auto-elb-example"></a>

このガイドではロードバランシングとインターネットアクセシビリティを備えて、コンテナ化されたバージョンの 2048 ゲームを Amazon EKS にデプロイする方法について説明します。

## 前提条件
<a name="_prerequisites"></a>
+ EKS 自動モードl クラスター
+  クラスターとやり取りするように設定された `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 イメージを使用
+ ポッドあたり 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
```

 **主要コンポーネント:** 
+ NodePort サービスを作成
+ ポート 80 をコンテナのポート 80 にマップ
+ ラベルセレクターを使用してポッドを検索

サービスを適用します：

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

## ステップ 4: ロードバランシングを設定する
<a name="_step_4_configure_load_balancing"></a>

アプリケーションがインターネットに公開されるようにイングレスを設定します。

まず `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 Auto Mode では、パブリックサブネットとプライベートサブネットを識別するためにサブネットタグが必要です。  
`eksctl` を使用してクラスターを作成した場合は、これらのタグは既にあります。  
「[EKS Auto Mode のサブネットにタグを付ける](tag-subnets-auto.md)」ではその方法を説明しています。

次に、イングレスリソースを作成します。`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 ターゲットタイプを使用
+ すべてのトラフィックをルーティングまたはゲームサービスにルーティング

イングレス設定を適用します：

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

イングレス出力の ADDRESS フィールドに ALB エンドポイントが表示されます。ALB がすべてのターゲットをプロビジョニングして登録するまで 2～3 分待ちます。

## ステップ 6: ゲームにアクセスする
<a name="_step_6_access_the_game"></a>

ウェブブラウザを開き、前のステップの ALB エンドポイント URL にアクセスします。2048 ゲームインターフェイスが表示されるはずです。

## ステップ 7: クリーンアップ
<a name="_step_7_cleanup"></a>

このチュートリアルで作成したリソースをすべて削除するには:

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

これにより、デプロイ、サービス、イングレスリソースなど、名前空間内のすべてのリソースが削除されます。

## シーンの背後で起こっていること
<a name="_whats_happening_behind_the_scenes"></a>

1. デプロイでは2048 ゲームを実行するポッドが 5 つ作成されます

1. このサービスではこれらのポッドに安定したネットワークアクセスを提供します

1. EKS 自動モードl:
   + AWS で Application Load Balancer を作成します 
   + ポッドのターゲットグループを設定します
   + サービスにトラフィックを誘導するルーティングルールを設定します

## トラブルシューティング
<a name="auto-elb-troubleshooting"></a>

ゲームがロードされない場合:
+ すべてのポッドが実行されていることを確認: `kubectl get pods -n game-2048` 
+ イングレスステータスの確認: `kubectl describe ingress -n game-2048` 
+ ALB ヘルスチェックの検証: AWS コンソールでターゲットグループのヘルスを確認します