

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

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

# AWS Load Balancer Controller を使用してインターネットトラフィックをルーティングする
<a name="aws-load-balancer-controller"></a>

**ヒント**  
 今後開催予定の Amazon EKS ワークショップに[登録](https://aws-experience.com/emea/smb/events/series/get-hands-on-with-amazon-eks?trk=4a9b4147-2490-4c63-bc9f-f8a84b122c8c&sc_channel=el)してください。

AWS Load Balancer Controller により、Kubernetes クラスター向けの AWS Elastic Load Balancer を管理できます。コントローラーを使用すると、クラスターアプリケーションをインターネットに公開できます。コントローラーは、クラスターサービスまたは Ingress リソースを指す AWS ロードバランサーをプロビジョニングします。つまり、コントローラーはクラスター内の複数のポッドを指す単一の IP アドレスまたは DNS 名を作成します。

![\[アーキテクチャ図。インターネットユーザーから Amazon Load Balancer へのトラフィックの図。Amazon Load Balancer は、クラスター内のポッドにトラフィックを分散します。\]](http://docs.aws.amazon.com/ja_jp/eks/latest/userguide/images/lbc-overview.png)


コントローラーは、Kubernetes Ingress または Service のリソースを監視します。これに応じて、適切な AWS Elastic Load Balancing リソースが作成されます。Kubernetes リソースに注釈を適用することで、ロードバランサーの特定の動作を設定できます。例えば、注釈を使用してロードバランサーに AWS セキュリティグループをアタッチできます。

コントローラは、以下のリソースをプロビジョニングします。

 **Kubernetes `Ingress` **   
Kubernetes `Ingress` を作成すると、LBC は [AWS Application Load Balancer (ALB)](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html) を作成します。[Ingress リソースに適用できる注釈を確認してください。](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/ingress/annotations/)

 **`LoadBalancer` タイプの Kubernetes サービス**   
`LoadBalancer` タイプの Kubernetes サービスを作成すると、LBC は [AWS Network Load Balancer (NLB)](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/introduction.html) を作成します。[サービスリソースに適用できる注釈を確認してください。](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/service/annotations/)  
以前は、*インスタンス*ターゲットには Kubernetes Network Load Balancer が使用されていましたが、*IP* ターゲットには LBC が使用されていました。AWS Load Balancer Controller バージョン `2.3.0` 以降では、いずれかのターゲットタイプを使用して NLBs を作成できます。NLB ターゲットタイプの詳細については、Network Load Balancer のユーザーガイドの 「[ターゲットタイプ](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-target-groups.html#target-type)」を参照してください。

コントローラーは GitHub で管理される[オープンソースプロジェクト](https://github.com/kubernetes-sigs/aws-load-balancer-controller)です。

コントローラーをデプロイする前に、「[Application Load Balancers を使用したアプリケーションおよび HTTP トラフィックのルーティング](alb-ingress.md)」および [Network Load Balancer を使用して TCP および UDP トラフィックをルーティングする](network-load-balancing.md) で前提条件と考慮事項を確認しておくことをお勧めします。これらのトピックでは、AWS ロードバランサーを含むサンプルアプリケーションをデプロイしています。

 **Kubernetes `Gateway` API**   
AWS Load Balancer Controller バージョン `2.14.0` 以降では、Kubernetes `Gateway` の作成時に [AWS Application Load Balancer (ALB)](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html) が作成されます。Kubernetes Gateway は、イングレスよりも多くの設定を標準化します (イングレスでは、よく使用される多くのオプションにカスタム注釈が必要でした)。[Gateway リソースに適用可能な設定を確認します。](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/gateway/gateway/)`Gateway` API の詳細については、Kubernetes ドキュメントの「[Gateway API](https://kubernetes.io/docs/concepts/services-networking/gateway/)」を参照してください。

## コントローラーのインストール
<a name="lbc-overview"></a>

次のどちらかの手順を使用して AWS Load Balancer Controller をインストールできます。
+ Amazon EKS を初めて使用する場合は、AWS Load Balancer Controller のインストールが簡素化されるため、Helm を使用してインストールすることをお勧めします。詳細については、「[Helm による AWS Load Balancer Controller のインストール](lbc-helm.md)」を参照してください。
+ パブリックコンテナレジストリへのネットワークアクセスが制限されているクラスターなどの高度な設定には、Kubernetes マニフェストを使用します。詳細については、「[マニフェストによる AWS Load Balancer Controller のインストール](lbc-manifest.md)」を参照してください。

## 非推奨のコントローラーバージョンから移行する
<a name="lbc-deprecated"></a>
+ 非推奨バージョンの AWS Load Balancer Controller がインストールされている場合は、「[非推奨になった ALB Ingress Controller からのアプリの移行](lbc-remove.md)」を参照してください。
+ 非推奨バージョンはアップグレードできません。このバージョンを削除し、AWS Load Balancer Controller の最新バージョンをインストールする必要があります。
+ 非推奨バージョンには以下が含まれます。
  +  AWS Load Balancer Controller の前身である AWS ALB Ingress Controller for Kubernetes (「Ingress Controller」)。
  + AWS Load Balancer Controller の任意の `0.1.x ` バージョン

## レガシークラウドプロバイダー
<a name="lbc-legacy"></a>

Kubernetes には、AWS のレガシークラウドプロバイダーが含まれています。レガシークラウドプロバイダーは AWS Load Balancer Controller と同様に、AWS ロードバランサーをプロビジョニングできます。レガシークラウドプロバイダーは Classic Load Balancer を作成します。AWS Load Balancer Controller をインストールしない場合、Kubernetes はデフォルトでレガシークラウドプロバイダーを使用します。AWS Load Balancer Controller をインストールして、レガシークラウドプロバイダーを使用しないようにしてください。

**重要**  
バージョン 2.5 以降では、AWS Load Balancer Controller は、`type: LoadBalancer` を持つ Kubernetes *サービス*リソースのデフォルトコントローラーとなり、サービスごとに AWS Network Load Balancer (NLB) を作成します。これは、サービスの変更ウェブフックを変化することで実行され、これにより `type: LoadBalancer` の新しいサービスの `spec.loadBalancerClass` フィールドが `service.k8s.aws/nlb` に設定されます。Helm チャートの値 `enableServiceMutatorWebhook` を `false` に設定すると、この機能をオフにして、[レガシークラウドプロバイダー](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/service/annotations/#legacy-cloud-provider)をデフォルトのコントローラーとして使用するように戻すことができます。この機能をオフにしない限り、クラスターはサービスに新しい Classic Load Balancer をプロビジョニングしません。既存の Classic Load Balancer は従来どおり機能します。

# Helm による AWS Load Balancer Controller のインストール
<a name="lbc-helm"></a>

**ヒント**  
 今後開催予定の Amazon EKS ワークショップに[登録](https://aws-experience.com/emea/smb/events/series/get-hands-on-with-amazon-eks?trk=4a9b4147-2490-4c63-bc9f-f8a84b122c8c&sc_channel=el)してください。

**ヒント**  
Amazon EKS 自動モード ではネットワーク形成のアドオンをインストールまたはアップグレードする必要はありません。自動モード にはポッドのネットワーク形成とロードバランシング機能が含まれています。  
詳細については、「[EKS Auto Mode を使用してクラスターインフラストラクチャを自動化する](automode.md)」を参照してください。

このトピックでは、Kubernetes のパッケージマネージャーである Helm と `eksctl` を使用して AWS Load Balancer Controller をインストールする方法について説明します。コントローラーはデフォルトのオプションでインストールされます。注釈を使用した設定などコントローラーの詳細については、GitHub で「[AWS Load Balancer Controller ドキュメント](https://kubernetes-sigs.github.io/aws-load-balancer-controller/)」を参照してください。

以下のステップでは、サンプル値を独自の値に置き換えます。

## 前提条件
<a name="lbc-prereqs"></a>

このチュートリアルを開始する前に、以下のステップを完了する必要があります。
+ Amazon EKS クラスターを作成します。作成する場合は「[Amazon EKS の使用を開始する](getting-started.md)」を参照してください。
+ ローカルマシンに [Helm](https://helm.sh/docs/helm/helm_install/) をインストールします。
+ Amazon VPC CNI plugin for Kubernetes、`kube-proxy`、および CoreDNS アドオンが、[サービスアカウントトークン](service-accounts.md#boundserviceaccounttoken-validated-add-on-versions)に記載されている最小のバージョンであることを確認してください。
+ AWS Elastic Load Balancing の概念を確認します。詳細については、「[Elastic Load Balancing ユーザーガイド](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/)」を参照してください。
+ Kubernetes [サービス](https://kubernetes.io/docs/concepts/services-networking/service/)と [Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/) リソースについて確認します。

### 考慮事項
<a name="lbc-considerations"></a>

このページの設定手順に進む前に、以下の点について考慮してください。
+ IAM ポリシーとロール (`AmazonEKSLoadBalancerControllerRole`) は、同じ AWS アカウントの複数の EKS クラスターで再利用できます。
+ ロール (`AmazonEKSLoadBalancerControllerRole`) が最初に作成されたのと同じクラスターにコントローラーをインストールする場合は、ロールが存在することを確認した後、「[ステップ 2: Load Balancer Controller のインストール](#lbc-helm-install)」に進みます。
+ サービスアカウントの IAM ロール (IRSA) を使用している場合、IRSA はクラスターごとに設定する必要があり、ロールの信頼ポリシー内の OpenID Connect (OIDC) プロバイダー ARN は各 EKS クラスターに固有です。さらに、既存の `AmazonEKSLoadBalancerControllerRole` を使用して新しいクラスターにコントローラーをインストールする場合は、そのロールの信頼ポリシーを更新して新しいクラスターの OIDC プロバイダーを追加し、適切なロール注釈を持つ新しいサービスアカウントを作成します。OIDC プロバイダーが既に存在しているかどうかを確認する、または OIDC プロバイダーを作成するには、「[クラスターの IAM OIDC プロバイダーを作成するには](enable-iam-roles-for-service-accounts.md)」を参照してください。

## ステップ 1: `eksctl` を使用して IAM ロールを作成する
<a name="lbc-helm-iam"></a>

次の手順は、AWS Load Balancer Controller **v2.14.1** リリースバージョンに関するものです。すべてのリリースの詳細については、GitHub で「[AWS Load Balancer Controller Release Page](https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/)」を参照してください。

1. ユーザーに代わって AWS API を呼び出すことを許可する、AWS Load Balancer Controller 用の IAM ポリシーをダウンロードします。

   ```
   curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.14.1/docs/install/iam_policy.json
   ```
   + AWS パーティションが政府リージョンや中国リージョンなど標準以外のものである場合は、[GitHub でポリシーを確認](https://github.com/kubernetes-sigs/aws-load-balancer-controller/tree/main/docs/install)し、ご使用のリージョンに適切なポリシーをダウンロードします。

1. 前のステップでダウンロードしたポリシー を使用して、IAM ポリシーを作成します。

   ```
   aws iam create-policy \
       --policy-name AWSLoadBalancerControllerIAMPolicy \
       --policy-document file://iam_policy.json
   ```
**注記**  
AWS マネジメントコンソール でポリシーを確認すると、コンソールには **[ELB]** サービスに関する警告が表示されますが、**[ELB v2]** サービスに関する警告は表示されません。これは、ポリシー内のアクションの一部が **[ELB v2]** には存在するが、**[ELB]** には存在しないために起こります。**[ELB]** に関する警告は無視できます。

1. クラスター名、リージョンコード、およびアカウント ID の値を置き換えます。

   ```
   eksctl create iamserviceaccount \
       --cluster=<cluster-name> \
       --namespace=kube-system \
       --name=aws-load-balancer-controller \
       --attach-policy-arn=arn:aws:iam::<AWS_ACCOUNT_ID>:policy/AWSLoadBalancerControllerIAMPolicy \
       --override-existing-serviceaccounts \
       --region <aws-region-code> \
       --approve
   ```

## ステップ 2: AWS Load Balancer Controller をインストールする
<a name="lbc-helm-install"></a>

1. `eks-charts` Helm チャートリポジトリを追加します。AWS は[このリポジトリ](https://github.com/aws/eks-charts)を GitHub で管理しています。

   ```
   helm repo add eks https://aws.github.io/eks-charts
   ```

1. ローカルリポジトリを更新して、最新のグラフがあることを確認します。

   ```
   helm repo update eks
   ```

1. AWS Load Balancer コントローラをインストールします。

   [Amazon EC2 インスタンスメタデータサービス (IMDS) に対するアクセスが制限されている](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node) Amazon EC2 ノードにコントローラーをデプロイする場合、または Fargate もしくは Amazon EKS Hybrid Nodes にデプロイする場合には、次の `helm` コマンドに次のフラグを追加します。
   +  `--set region=region-code ` 
   +  `--set vpcId=vpc-xxxxxxxx ` 

     *マイクラスター* の部分は自分のクラスター名に置き換えます。次のコマンドの中の `aws-load-balancer-controller`は、前のステップで作成した Kubernetes サービスアカウントです。

     Helm チャートの設定の詳細については、GitHub の「[values.yaml](https://github.com/aws/eks-charts/blob/master/stable/aws-load-balancer-controller/values.yaml)」を参照してください。

     ```
     helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
       -n kube-system \
       --set clusterName=my-cluster \
       --set serviceAccount.create=false \
       --set serviceAccount.name=aws-load-balancer-controller \
       --version 1.14.0
     ```

**重要**  
デプロイされたグラフは、セキュリティに関する更新を自動的に受信しません。この更新が利用可能になったら、手動で新しいグラフにアップグレードする必要があります。アップグレードする場合は、前のコマンドで *install* を `upgrade` に変更します。

`helm install` コマンドは、コントローラーのカスタムリソース定義 (CRD) を自動的にインストールします。一方、`helm upgrade` コマンドでは自動的にインストールされません。`helm upgrade,` コマンドを使用する場合は、CRD を手動でインストールする必要があります。次のコマンドを実行して、CRD をインストールします。

```
wget https://raw.githubusercontent.com/aws/eks-charts/master/stable/aws-load-balancer-controller/crds/crds.yaml
kubectl apply -f crds.yaml
```

## ステップ 3: コントローラーがインストールされていることを確認する
<a name="lbc-helm-verify"></a>

1. コントローラがインストールされていることを確認します。

   ```
   kubectl get deployment -n kube-system aws-load-balancer-controller
   ```

   出力例は次のとおりです。

   ```
   NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
   aws-load-balancer-controller   2/2     2            2           84s
   ```

   Helm を使用してデプロイした場合は、前の出力を受け取ります。Kubernetes マニフェストを使用してデプロイした場合、レプリカは 1 つしかありません。

1. コントローラーを使用して AWS リソースをプロビジョニングする場合には、クラスターは特定の要件を満たしている必要があります。詳細については、「[Application Load Balancer を使用してアプリケーションと HTTP トラフィックをルーティングする](alb-ingress.md)」および「[Network Load Balancer を使用して TCP および UDP トラフィックをルーティングする](network-load-balancing.md)」を参照してください。

# マニフェストによる AWS Load Balancer Controller のインストール
<a name="lbc-manifest"></a>

**ヒント**  
Amazon EKS Auto Mode では、ネットワーク形成のアドオンをインストールまたはアップグレードする必要はありません。自動モード にはポッドのネットワーク形成とロードバランシング機能が含まれています。  
詳細については、「[EKS Auto Mode を使用してクラスターインフラストラクチャを自動化する](automode.md)」を参照してください。

このトピックでは、Kubernetes マニフェストをダウンロードし適用することでコントローラーをインストールする方法について説明します。コントローラについての完全な [ドキュメント](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/)は、GitHub でご覧になれます。

以下のステップでは、サンプル値を独自の値に置き換えます。

## 前提条件
<a name="lbc-manifest-prereqs"></a>

このチュートリアルを開始する前に、以下のステップを完了する必要があります。
+ Amazon EKS クラスターを作成します。作成する場合は「[Amazon EKS の使用を開始する](getting-started.md)」を参照してください。
+ ローカルマシンに [Helm](https://helm.sh/docs/helm/helm_install/) をインストールします。
+ Amazon VPC CNI plugin for Kubernetes、`kube-proxy`、および CoreDNS アドオンが、[サービスアカウントトークン](service-accounts.md#boundserviceaccounttoken-validated-add-on-versions)に記載されている最小のバージョンであることを確認してください。
+ AWS Elastic Load Balancing の概念を確認します。詳細については、「[Elastic Load Balancing ユーザーガイド](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/)」を参照してください。
+ Kubernetes [サービス](https://kubernetes.io/docs/concepts/services-networking/service/)と [Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/) リソースについて確認します。

### 考慮事項
<a name="lbc-manifest-considerations"></a>

このページの設定手順に進む前に、以下の点について考慮してください。
+ IAM ポリシーとロール (`AmazonEKSLoadBalancerControllerRole`) は、同じ AWS アカウントの複数の EKS クラスターで再利用できます。
+ ロール (`AmazonEKSLoadBalancerControllerRole`) が最初に作成されたのと同じクラスターにコントローラーをインストールする場合は、ロールが存在することを確認した後、「[ステップ 2: cert-manager のインストール](#lbc-cert)」に進みます。
+ サービスアカウントの IAM ロール (IRSA) を使用している場合、IRSA はクラスターごとに設定する必要があり、ロールの信頼ポリシー内の OpenID Connect (OIDC) プロバイダー ARN は各 EKS クラスターに固有です。さらに、既存の `AmazonEKSLoadBalancerControllerRole` を使用して新しいクラスターにコントローラーをインストールする場合は、そのロールの信頼ポリシーを更新して新しいクラスターの OIDC プロバイダーを追加し、適切なロール注釈を持つ新しいサービスアカウントを作成します。OIDC プロバイダーが既に存在しているかどうかを確認する、または OIDC プロバイダーを作成するには、「[クラスターの IAM OIDC プロバイダーを作成するには](enable-iam-roles-for-service-accounts.md)」を参照してください。

## ステップ 1: IAM を設定する
<a name="lbc-iam"></a>

次の手順は、AWS Load Balancer Controller **v2.14.1** リリースバージョンに関するものです。すべてのリリースの詳細については、GitHub で「[AWS Load Balancer Controller Release Page](https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/)」を参照してください。

1. ユーザーに代わって AWS API を呼び出すことを許可する、AWS Load Balancer Controller 用の IAM ポリシーをダウンロードします。  
**Example**  

------
#### [  AWS  ]

   ```
   curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.14.1/docs/install/iam_policy.json
   ```

------
#### [  AWS GovCloud (US) ]

   ```
   curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.14.1/docs/install/iam_policy_us-gov.json
   ```

   ```
   mv iam_policy_us-gov.json iam_policy.json
   ```

------

1. 前のステップでダウンロードしたポリシー を使用して、IAM ポリシーを作成します。

   ```
   aws iam create-policy \
       --policy-name AWSLoadBalancerControllerIAMPolicy \
       --policy-document file://iam_policy.json
   ```
**注記**  
AWS マネジメントコンソール でポリシーを確認すると、コンソールには **[ELB]** サービスに関する警告が表示されますが、**[ELB v2]** サービスに関する警告は表示されません。これは、ポリシー内のアクションの一部が **[ELB v2]** には存在するが、**[ELB]** には存在しないために起こります。**[ELB]** に関する警告は無視できます。

**Example**  

1. *my-cluster* はご自分のクラスター名に、*111122223333* はご自分のアカウント ID に置き換えた上で、コマンドを実行します。

   ```
   eksctl create iamserviceaccount \
     --cluster=my-cluster \
     --namespace=kube-system \
     --name=aws-load-balancer-controller \
     --role-name AmazonEKSLoadBalancerControllerRole \
     --attach-policy-arn=arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerIAMPolicy \
     --approve
   ```

1. クラスターの OIDC プロバイダー ID を取得して、変数に格納します。

   ```
   oidc_id=$(aws eks describe-cluster --name my-cluster --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)
   ```

1. クラスターの ID を持つ IAM OIDC プロバイダーが既にアカウントにあるかどうかを確認します。クラスターと IAM の両方に OIDC を設定する必要があります。

   ```
   aws iam list-open-id-connect-providers | grep $oidc_id | cut -d "/" -f4
   ```

   出力が返された場合は、クラスター用の IAM OIDC プロバイダーが既に存在します。出力が返されない場合はクラスター用の IAM OIDC プロバイダーを作成する必要があります。詳細については、「[クラスターの IAM OIDC プロバイダーを作成するには](enable-iam-roles-for-service-accounts.md)」を参照してください。

1. 次のコンテンツをデバイスにコピーします。*111122223333* は、ご自分のアカウント ID に置き換えます。*region-code* を、クラスターのある AWS リージョンに置き換えます。*EXAMPLED539D4633E53DE1B71EXAMPLE* を、前のステップで返された出力に置き換えます。

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
               },
               "Action": "sts:AssumeRoleWithWebIdentity",
               "Condition": {
                   "StringEquals": {
                       "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com",
                       "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:aws-load-balancer-controller"
                   }
               }
           }
       ]
   }
   ```

1. IAM ロールの作成

   ```
   aws iam create-role \
     --role-name AmazonEKSLoadBalancerControllerRole \
     --assume-role-policy-document file://"load-balancer-role-trust-policy.json"
   ```

1. IAM ロールに、必要な Amazon EKS 管理の IAM ポリシーをアタッチします。*111122223333* は、ご自分のアカウント ID に置き換えます。

   ```
   aws iam attach-role-policy \
     --policy-arn arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerIAMPolicy \
     --role-name AmazonEKSLoadBalancerControllerRole
   ```

1. 次のコンテンツをデバイスにコピーします。*111122223333* は、ご自分のアカウント ID に置き換えます。テキストを置き換えたら、変更したコマンドを実行して `aws-load-balancer-controller-service-account.yaml` ファイルを作成します。

   ```
   cat >aws-load-balancer-controller-service-account.yaml <<EOF
   apiVersion: v1
   kind: ServiceAccount
   metadata:
     labels:
       app.kubernetes.io/component: controller
       app.kubernetes.io/name: aws-load-balancer-controller
     name: aws-load-balancer-controller
     namespace: kube-system
     annotations:
       eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/AmazonEKSLoadBalancerControllerRole
   EOF
   ```

1. クラスター上で Kubernetes サービスアカウントを作成します。`aws-load-balancer-controller` という名前の Kubernetes サービスアカウントは、作成した IAM ロール (名前: *AmazonEKSLoadBalancerControllerRole*) でアノテーションされています。

   ```
   kubectl apply -f aws-load-balancer-controller-service-account.yaml
   ```

## ステップ 2: `cert-manager` をインストールする
<a name="lbc-cert"></a>

以下のいずれかの方法で `cert-manager` をインストールして、Webhook に証明書設定を導入します。詳細については、「*cert-manager ドキュメント*」の「[開始方法](https://cert-manager.io/docs/installation/#getting-started)」を参照してください。

`cert-manager` をインストールするには、`quay.io` コンテナレジストリを使用することをお勧めします。ノードが `quay.io` コンテナレジストリにアクセスできない場合は、Amazon ECR を使用して `cert-manager` をインストールします (以下を参照)。

**Example**  

1. ノードが `quay.io` コンテナレジストリにアクセスできる場合は、`cert-manager` をインストールして、Webhook に証明書設定を挿入します。

   ```
   kubectl apply \
       --validate=false \
       -f https://github.com/jetstack/cert-manager/releases/download/v1.13.5/cert-manager.yaml
   ```

1. 以下のいずれかの方法で `cert-manager` をインストールして、Webhook に証明書設定を導入します。詳細については、「*cert-manager ドキュメント*」の「[開始方法](https://cert-manager.io/docs/installation/#getting-started)」を参照してください。

1. マニフェストをダウンロードします。

   ```
   curl -Lo cert-manager.yaml https://github.com/jetstack/cert-manager/releases/download/v1.13.5/cert-manager.yaml
   ```

1. 次のイメージをプルして、ノードがアクセスできるリポジトリにプッシュします。イメージをプルし、タグ付けして独自のリポジトリにプッシュする方法の詳細については、[あるリポジトリから別のリポジトリにコンテナイメージをコピーする](copy-image-to-repository.md) を参照してください。

   ```
   quay.io/jetstack/cert-manager-cainjector:v1.13.5
   quay.io/jetstack/cert-manager-controller:v1.13.5
   quay.io/jetstack/cert-manager-webhook:v1.13.5
   ```

1. 三つのイメージのマニフェストの `quay.io` を、独自のレジストリ名に置き換えます。次のコマンドは、プライベートリポジトリの名前がソースリポジトリと同じであることを前提としています。*111122223333.dkr.ecr.region-code.amazonaws.com* をプライベートレジストリに置き換えます。

   ```
   sed -i.bak -e 's|quay.io|111122223333.dkr.ecr.region-code.amazonaws.com|' ./cert-manager.yaml
   ```

1. マニフェストを適用します。

   ```
   kubectl apply \
       --validate=false \
       -f ./cert-manager.yaml
   ```

## ステップ 3: AWS Load Balancer Controller をインストールする
<a name="lbc-install"></a>

1. Controller の詳細をダウンロードします。Controller の詳細については、GitHub の[ドキュメント](https://kubernetes-sigs.github.io/aws-load-balancer-controller/)を参照してください。

   ```
   curl -Lo v2_14_1_full.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.14.1/v2_14_1_full.yaml
   ```

1. ファイルに以下の編集を行います。

   1. `v2_14_1_full.yaml` ファイルをダウンロードした場合は、次のコマンドを実行してマニフェストの `ServiceAccount` セクションを削除します。このセクションを削除しないと、前のステップでサービスアカウントに作成した必須の注釈が上書きされます。コントローラーを削除した場合、このセクションの削除により、前のステップで作成したサービスアカウントも保持されます。

      ```
      sed -i.bak -e '764,772d' ./v2_14_1_full.yaml
      ```

      別のバージョンのファイルをダウンロードした場合は、エディタでファイルを開き、次の行を削除します。

      ```
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        labels:
          app.kubernetes.io/component: controller
          app.kubernetes.io/name: aws-load-balancer-controller
        name: aws-load-balancer-controller
        namespace: kube-system
      ---
      ```

   1. *My-cluster* をユーザーのクラスター名に置き換えることにより、ファイルの`Deployment` `spec` セクションの `your-cluster-name` をクラスターの名前に置き換えます。

      ```
      sed -i.bak -e 's|your-cluster-name|my-cluster|' ./v2_14_1_full.yaml
      ```

   1. ノードが Amazon EKS Amazon ECR イメージリポジトリにアクセスできない場合は、次のイメージをプルして、ノードがアクセスできるリポジトリにプッシュする必要があります。イメージをプルし、タグ付けして独自のリポジトリにプッシュする方法の詳細については、[あるリポジトリから別のリポジトリにコンテナイメージをコピーする](copy-image-to-repository.md) を参照してください。

      ```
      public.ecr.aws/eks/aws-load-balancer-controller:v2.14.1
      ```

      マニフェストにレジストリの名前を追加します。次のコマンドは、プライベートリポジトリの名前がソースリポジトリと同じであると仮定し、プライベートレジストリの名前をファイルに追加します。*111122223333.dkr.ecr.region-code.amazonaws.com* をレジストリに置き換えます。この行は、プライベートリポジトリにソースリポジトリと同じ名前を付けたことを前提としています。そうでない場合は、プライベートレジストリ名の後の `eks/aws-load-balancer-controller` テキストを、リポジトリ名に変更します。

      ```
      sed -i.bak -e 's|public.ecr.aws/eks/aws-load-balancer-controller|111122223333.dkr.ecr.region-code.amazonaws.com/eks/aws-load-balancer-controller|' ./v2_14_1_full.yaml
      ```

   1. (Fargate または制限付き IMDS の場合にのみ必須)

      [Amazon EC2 インスタンスメタデータサービス (IMDS) に対するアクセスが制限されている](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node) Amazon EC2 ノードにコントローラをデプロイする場合、または Fargate もしくは Amazon EKS Hybrid Nodes にデプロイする場合には、`- args:` の下に `following parameters` を追加します。

      ```
      [...]
      spec:
            containers:
              - args:
                  - --cluster-name=your-cluster-name
                  - --ingress-class=alb
                  - --aws-vpc-id=vpc-xxxxxxxx
                  - --aws-region=region-code
      
      
      [...]
      ```

1. ファイルを適用します。

   ```
   kubectl apply -f v2_14_1_full.yaml
   ```

1. `IngressClass` および `IngressClassParams` マニフェストをクラスターにダウンロードします。

   ```
   curl -Lo v2.14.1_ingclass.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.14.1/v2_14_1_ingclass.yaml
   ```

1. マニフェストをクラスターに適用します。

   ```
   kubectl apply -f v2_14_1_ingclass.yaml
   ```

## ステップ 4: コントローラーがインストールされていることを確認する
<a name="lbc-verify"></a>

1. コントローラがインストールされていることを確認します。

   ```
   kubectl get deployment -n kube-system aws-load-balancer-controller
   ```

   出力例は次のとおりです。

   ```
   NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
   aws-load-balancer-controller   2/2     2            2           84s
   ```

   Helm を使用してデプロイした場合は、前の出力を受け取ります。Kubernetes マニフェストを使用してデプロイした場合、レプリカは 1 つしかありません。

1. コントローラーを使用して AWS リソースをプロビジョニングする場合には、クラスターは特定の要件を満たしている必要があります。詳細については、「[Application Load Balancer を使用してアプリケーションと HTTP トラフィックをルーティングする](alb-ingress.md)」および「[Network Load Balancer を使用して TCP および UDP トラフィックをルーティングする](network-load-balancing.md)」を参照してください。

# 非推奨になった ALB Ingress Controller からのアプリの移行
<a name="lbc-remove"></a>

このトピックでは非推奨のコントローラーバージョンから移行する方法を説明します。具体的には、AWS Load Balancer Controller の非推奨バージョンを削除する方法について説明します。
+ 非推奨バージョンはアップグレードできません。まずそれらを削除してから、最新バージョンをインストールする必要があります。
+ 非推奨バージョンには以下が含まれます。
  +  AWS Load Balancer Controller の前身である AWS ALB Ingress Controller for Kubernetes (「Ingress Controller」)。
  + AWS Load Balancer Controller の任意の `0.1.x ` バージョン

## 非推奨のコントローラーバージョンを削除する
<a name="lbc-remove-desc"></a>

**注記**  
非推奨バージョンは、Helm を使用したか、Kubernetes マニフェストに従って手動でインストールされた可能性があります。この手順は元々インストールしてあるツールを使用して実行してください。

1. `incubator/aws-alb-ingress-controller` Helm チャートをインストールしてある場合はこれをアンインストールします。

   ```
   helm delete aws-alb-ingress-controller -n kube-system
   ```

1. `eks-charts/aws-load-balancer-controller` のバージョン `0.1.x ` をインストールしている場合はこれをアンインストールします。`0.1.x ` からバージョン `1.0.0` へのアップグレードはWebhook API のバージョンとの互換性がないため動作しません。

   ```
   helm delete aws-load-balancer-controller -n kube-system
   ```

1. イングレス・コントローラー がインストール済みであるかどうかを確認します。

   ```
   kubectl get deployment -n kube-system alb-ingress-controller
   ```

   これはコントローラが取り付けられていない場合の出力です。

   ```
   Error from server (NotFound): deployments.apps "alb-ingress-controller" not found
   ```

   これは、コントローラが取り付けられている場合の出力です。

   ```
   NAME                   READY UP-TO-DATE AVAILABLE AGE
   alb-ingress-controller 1/1   1          1         122d
   ```

1. 次のコマンドを入力してコントローラを削除します。

   ```
   kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/alb-ingress-controller.yaml
   kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/rbac-role.yaml
   ```

## AWS Load Balancer Controller への移行
<a name="lbc-migrate"></a>

ALB Ingress Controller for Kubernetes から AWS Load Balancer Controller に移行するには、以下を実行する必要があります。

1. ALB イングレス・コントローラー を削除します (上記を参照)。

1.  [AWS ロードバランサー コントローラーをインストールします。](aws-load-balancer-controller.md#lbc-overview)

1. AWS Load Balancer Controller で使用される IAM ロールにポリシーを追加します。このポリシーにより、ALB Ingress Controller for Kubernetes によって作成されたリソースを LBC が管理できるようになります。

1. IAM ポリシーをダウンロードします。このポリシーにより、ALB Ingress Controller for Kubernetes によって作成されたリソースを AWS Load Balancer Controller が管理できるようになります。[ポリシーを表示](https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy_v1_to_v2_additional.json)することもできます。

   ```
   curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.14.1/docs/install/iam_policy_v1_to_v2_additional.json
   ```

1. クラスターが AWS GovCloud (米国東部) または AWS GovCloud (米国西部) の AWS リージョンにある場合は` arn:aws: ` を `arn:aws-us-gov:` に置き換えます。

   ```
   sed -i.bak -e 's|arn:aws:|arn:aws-us-gov:|' iam_policy_v1_to_v2_additional.json
   ```

1. IAM ポリシーを作成し、返された ARN を書き留めます。

   ```
   aws iam create-policy \
     --policy-name AWSLoadBalancerControllerAdditionalIAMPolicy \
     --policy-document file://iam_policy_v1_to_v2_additional.json
   ```

1. AWS Load Balancer Controller によって使用される IAM ロールに IAM ポリシーをアタッチします。*ロール名* を役割の名前 (例: `AmazonEKSLoadBalancerControllerRole`) に置き換えます。

   `eksctl` を使用して役割を作成している場合、作成された役割名を見つけるには[AWS クラウドフォーメーション コンソール](https://console.aws.amazon.com/cloudformation)を開き、**eksctl-*マイクラスター*-addon-iamserviceaccount-kube-system-aws-load-balancer-controller** スタックを選択してください。[**Resources (リソース)**] タブを選択してください。役割名は[**Physical ID (物理 ID)**] 列で見つかります。

   ```
   aws iam attach-role-policy \
     --role-name your-role-name \
     --policy-arn arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerAdditionalIAMPolicy
   ```