

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

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

# 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)」を参照してください。