

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

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

# IngressClass を作成して Application Load Balancer を設定する
<a name="auto-configure-alb"></a>

EKS Auto Mode は、インターネットへのクラスターアプリケーションの公開など、ロードバランシングのルーチンタスクを自動化します。

 AWS では、Application Load Balancer (ALB) を使用して HTTP および HTTPS トラフィックを処理することを推奨しています。Application Load Balancer は、リクエストの内容に基づいてリクエストをルーティングできます。Application Load Balancer の詳細については、「[What is Elastic Load Balancing?](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html)」を参照してください。

EKS Auto Mode は、Application Load Balancer (ALB) の作成と設定を行います。例えば、`Ingress` Kubernetes オブジェクトを作成すると EKS Auto Mode によってロードバランサーが作成され、クラスターワークロードにトラフィックをルーティングするように設定されます。

 **概要**: 

1. インターネットに公開するワークロードを作成します。

1. SSL/TLS や VPC サブネットに使用する証明書などの AWS 固有の設定値を指定して、`IngressClassParams` リソースを作成します。

1. `IngressClass` リソースを作成し、EKS Auto Mode がリソースのコントローラーになるように指定します。

1. HTTP パスおよびポートをクラスターワークロードに関連付ける `Ingress` リソースを作成します。

EKS Auto Mode は、`IngressClassParams` リソースで指定されたロードバランサー設定を使用して、`Ingress` リソースで指定されたワークロードをポイントする Application Load Balancer を作成します。

## 前提条件
<a name="_prerequisites"></a>
+ EKS Auto Mode が Amazon EKS クラスターで有効になっている
+ kubectl がクラスターに接続するように設定されている
  + `kubectl apply -f <filename>` を使用して、以下のサンプル設定 YAML ファイルをクラスターに適用できます。

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

## ステップ 1: ワークロードを作成する
<a name="_step_1_create_a_workload"></a>

まず、インターネットに公開するワークロードを作成します。これは、デプロイやサービスなど、HTTP トラフィックを処理する任意の Kubernetes リソースです。

この例では、`service-2048` というシンプルな HTTP サービスを使用して、ポート `80` をリッスンします。次の `2048-deployment-service.yaml` というマニフェストを適用して、このサービスとそのデプロイを作成します。

```
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-2048
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: app-2048
  replicas: 2
  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
---
apiVersion: v1
kind: Service
metadata:
  name: service-2048
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  type: NodePort
  selector:
    app.kubernetes.io/name: app-2048
```

設定をクラスターに適用します。

```
kubectl apply -f 2048-deployment-service.yaml
```

前記のリソースは、デフォルトの名前空間に作成されます。次のコマンドを実行して、これを検証できます。

```
kubectl get all -n default
```

## ステップ 2: IngressClassParams を作成する
<a name="_step_2_create_ingressclassparams"></a>

`IngressClassParams` オブジェクトを作成して、Application Load Balancer に対する AWS 固有の設定オプションを指定します。この例では、`alb` という名前の `IngressClassParams` リソース (次のステップで使用する) を作成し、ロードバランサースキームを `internet-facing` として `alb-ingressclassparams.yaml` というファイルで指定します。

```
apiVersion: eks.amazonaws.com/v1
kind: IngressClassParams
metadata:
  name: alb
spec:
  scheme: internet-facing
```

設定をクラスターに適用します。

```
kubectl apply -f alb-ingressclassparams.yaml
```

## ステップ 3: IngressClass を作成する
<a name="_step_3_create_ingressclass"></a>

`alb-ingressclass.yaml` という名前のファイル内に、`IngressClassParams` リソースで設定された AWS 固有の設定値を参照する `IngressClass` を作成します。`IngressClass` の名前をメモしてください。この例では、`IngressClass` と `IngressClassParams` の両方が `alb` という名前になっています。

`is-default-class` 注釈を使用して、`Ingress` リソースがこのクラスをデフォルトで使用するかどうかを制御します。

```
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: alb
  annotations:
    # Use this annotation to set an IngressClass as Default
    # If an Ingress doesn't specify a class, it will use the Default
    ingressclass.kubernetes.io/is-default-class: "true"
spec:
  # Configures the IngressClass to use EKS Auto Mode
  controller: eks.amazonaws.com/alb
  parameters:
    apiGroup: eks.amazonaws.com
    kind: IngressClassParams
    # Use the name of the IngressClassParams set in the previous step
    name: alb
```

設定オプションの詳細については、「[IngressClassParams リファレンス](#ingress-reference)」を参照してください。

設定をクラスターに適用します。

```
kubectl apply -f alb-ingressclass.yaml
```

## ステップ 4: Ingress を作成する
<a name="_step_4_create_ingress"></a>

`alb-ingress.yaml` という名前のファイルに `Ingress` リソースを作成します。このリソースの目的は、Application Load Balancer のパスとポートをクラスター内のワークロードに関連付けることです。この例では、ポート 80 で `service-2048` という名前のサービスにトラフィックをルーティングする `2048-ingress` という名前の `Ingress` リソースを作成します。

このリソースの構成方法の詳細については、Kubernetes ドキュメントの「[Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/)」を参照してください。

```
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: 2048-ingress
spec:
  # this matches the name of IngressClass.
  # this can be omitted if you have a default ingressClass in cluster: the one with ingressclass.kubernetes.io/is-default-class: "true"  annotation
  ingressClassName: alb
  rules:
    - http:
        paths:
          - path: /*
            pathType: ImplementationSpecific
            backend:
              service:
                name: service-2048
                port:
                  number: 80
```

設定をクラスターに適用します。

```
kubectl apply -f alb-ingress.yaml
```

## ステップ 5: ステータスを確認する
<a name="_step_5_check_status"></a>

`kubectl` を使用して、`Ingress` のステータスを取得します。ロードバランサーが利用できるようになるまで数分かかる場合があります。

前のステップで設定した `Ingress` リソースの名前を使用します。例えば、次のようになります。

```
kubectl get ingress 2048-ingress
```

リソースの準備ができたら、ロードバランサーのドメイン名を取得します。

```
kubectl get ingress 2048-ingress -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'
```

ウェブブラウザでサービスを表示するには、`Ingress` レスキューで指定したポートとパスを確認します。

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

ロードバランサーをクリーンアップするには、次のコマンドを使用します。

```
kubectl delete ingress 2048-ingress
kubectl delete ingressclass alb
kubectl delete ingressclassparams alb
```

EKS Auto Mode が、AWS アカウント内の関連するロードバランサーを自動的に削除します。

## IngressClassParams リファレンス
<a name="ingress-reference"></a>

次の表は、一般的に使用される設定オプションのクイックリファレンスです。


| フィールド | 説明 | 値の例 | 
| --- | --- | --- | 
|   `scheme`   |  ALB が内部向けかインターネット向けかを定義します  |   `internet-facing`   | 
|   `namespaceSelector`   |  この IngressClass を使用できる名前空間を制限します  |   `environment: prod`   | 
|   `group.name`   |  1 つの ALB を共有する複数の Ingress をグループ化します  |   `retail-apps`   | 
|   `ipAddressType`   |  ALB の IP アドレスタイプを設定します  |   `dualstack`   | 
|   `subnets.ids`   |  ALB デプロイにおけるサブネット ID のリスト  |   `subnet-xxxx, subnet-yyyy`   | 
|   `subnets.tags`   |  ALB のサブネットを選択するタグフィルター  |   `Environment: prod`   | 
|   `certificateARNs`   |  使用する SSL 証明書の ARN  |   ` arn:aws:acm:region:account:certificate/id`   | 
|   `tags`   |  AWS リソースのカスタムタグ  |   `Environment: prod, Team: platform`   | 
|   `loadBalancerAttributes`   |  ロードバランサー固有の属性  |   `idle_timeout.timeout_seconds: 60`   | 

## 考慮事項
<a name="_considerations"></a>
+ EKS Auto Mode でロードバランサーを設定するのに、IngressClass で注釈を使用することはできません。IngressClass の設定は、IngressClassParams を介して行う必要があります。ただし、個々の Ingress リソースで注釈を使用すると、ロードバランサーの動作を設定できます (`alb.ingress.kubernetes.io/security-group-prefix-lists`や `alb.ingress.kubernetes.io/conditions.*` など)。
+ EKS Auto Mode では、[ListenerAttribute](https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_ListenerAttribute.html) を設定できません。
+ クラスター IAM ロールを更新して、Kubernetes から AWS ロードバランサーリソースへのタグの伝播を有効にする必要があります。詳細については、「[EKS Auto リソースのカスタム AWS タグ](auto-cluster-iam-role.md#tag-prop)」を参照してください。
+ リソースを EKS Auto Mode またはセルフマネージド AWS Load Balancer Controller に関連付ける方法については、「[移行のリファレンス](migrate-auto.md#migration-reference)」を参照してください。
+ ロードバランサーの問題の修正方法については、「[EKS 自動モードl のトラブルシューティング](auto-troubleshoot.md)」を参照してください。
+ EKS Auto Mode のロードバランシング機能の使用に関する考慮事項については、「[負荷分散](auto-networking.md#auto-lb-consider)」を参照してください。

次の表は、EKS Auto Mode の IngressClassParams、Ingress 注釈、および TargetGroupBinding 設定の変更の詳細な比較を示しています。これらの表は、API バージョンの変更、廃止された機能、更新されたパラメータ名など、EKS Auto Mode のロードバランシング機能とオープンソースのロードバランサーコントローラーの主な違いを強調しています。

### IngressClassParams
<a name="_ingressclassparams"></a>


| 旧 | 新 | 説明 | 
| --- | --- | --- | 
|   `elbv2.k8s.aws/v1beta1`   |   `eks.amazonaws.com/v1`   |  API バージョンの変更  | 
|   `spec.certificateArn`   |   `spec.certificateARNs`   |  複数の証明書 ARN のサポート  | 
|   `spec.subnets.tags`   |   `spec.subnets.matchTags`   |  サブネット一致スキーマの変更  | 
|   `spec.listeners.listenerAttributes`   |  サポートされていません  |  EKS Auto Mode で未サポート  | 

### Ingress 注釈
<a name="_ingress_annotations"></a>


| 旧 | 新 | 説明 | 
| --- | --- | --- | 
|   `kubernetes.io/ingress.class`   |  サポートされていません  |  Ingress オブジェクトで `spec.ingressClassName` を使用  | 
|   `alb.ingress.kubernetes.io/group.name`   |  サポートされていません  |  IngressClass でのみグループを指定  | 
|   `alb.ingress.kubernetes.io/waf-acl-id`   |  サポートされていません  |  代わりに WAF v2 を使用  | 
|   `alb.ingress.kubernetes.io/web-acl-id`   |  サポートされていません  |  代わりに WAF v2 を使用  | 
|   `alb.ingress.kubernetes.io/shield-advanced-protection`   |  サポートされていません  |  Shield 統合が無効  | 
|   `alb.ingress.kubernetes.io/auth-type: oidc`   |  サポートされていません  |  現時点で OIDC 認証タイプはサポートされていません  | 

### TargetGroupBinding
<a name="_targetgroupbinding"></a>


| 旧 | 新 | 説明 | 
| --- | --- | --- | 
|   `elbv2.k8s.aws/v1beta1`   |   `eks.amazonaws.com/v1`   |  API バージョンの変更  | 
|   `spec.targetType` が任意  |   `spec.targetType` が必須  |  明示的なターゲットタイプの指定  | 
|   `spec.networking.ingress.from`   |  サポートされていません  |  セキュリティグループなしでは NLB がサポートされなくなりました  | 

カスタム TargetGroupBinding 機能を使用するには、ターゲットグループにクラスター名と共に eks:eks-cluster-name タグを付けて、必要な IAM アクセス許可をコントローラーに付与する必要があります。TargetGroupBinding リソースまたはクラスターを削除すると、コントローラーがターゲットグループを削除することに注意してください。