マニフェストを使用して AWS Load Balancer Controller インストールする
このトピックでは、Kubernetes マニフェストをダウンロードして適用し、コントローラーをインストールする方法について説明します。GitHub でコントローラーの完全な ドキュメント
以下のステップでは、サンプル値
を独自の値に置き換えます。
前提条件
このチュートリアルを開始する前に、Amazon EKS クラスターの作成と管理に必要な次のツールとリソースを、インストールおよび設定しておく必要があります。
-
既存の Amazon EKS クラスター。デプロイするには、「Amazon EKS の使用を開始する」を参照してください。
-
クラスターの既存の AWS Identity and Access Management (IAM) OpenID Connect (OIDC) プロバイダー。既に存在しているかどうかを確認する、または作成するには「クラスターの IAM OIDC プロバイダーを作成する」を参照してください。
-
Amazon VPC CNI plugin for Kubernetes、
kube-proxy
、CoreDNS、および アドオンが、サービスアカウントトークンに記載されている最小のバージョンであることを確認してください。 -
AWS Elastic Load Balancing に関する知識。詳細については、Elastic Load Balancing ユーザーガイドを参照してください。
ステップ 1: IAM を設定する
注記
AWS Load Balancer Controller のロールを AWS アカウントごとに作成するだけで済みます。AmazonEKSLoadBalancerControllerRole
が IAM コンソール
-
ユーザーに代わって AWS API を呼び出すことを許可する、 AWS Load Balancer Controller 用の IAM ポリシーをダウンロードします。
- AWS
-
**
$ curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.7.2/docs/install/iam_policy.json
- AWS GovCloud (米国)
-
**
$ curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.7.2/docs/install/iam_policy_us-gov.json
$ mv iam_policy_us-gov.json iam_policy.json
-
前のステップでダウンロードしたポリシー を使用して、IAM ポリシーを作成します。
$ aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json
注記
AWS Management Console でポリシーを確認すると、コンソールには [ELB] サービスに関する警告が表示されますが、[ELB v2] サービスに関する警告は表示されません。これは、ポリシー内のアクションの一部が [ELB v2] には存在するが、[ELB] には存在しないために起こります。[ELB] に関する警告は無視できます。
- eksctl
-
-
my-cluster
はご自分のクラスター名に、111122223333
はご自分のアカウント ID に置き換えた上で、コマンドを実行します。クラスターが AWS GovCloud (米国東部) または AWS GovCloud (米国西部) の AWS リージョンにある場合は、arn:aws:
をarn:aws-us-gov:
に置き換えます。$ 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
-
- AWS CLI と kubectl
-
-
クラスターの OIDC プロバイダー ID を取得し、変数に格納します。
oidc_id=$(aws eks describe-cluster --name my-cluster --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)
-
クラスターの ID を持つ IAM OIDC プロバイダーが既にアカウントにあるかどうかを確認します。クラスターと IAM の両方に OIDC を設定する必要があります。
aws iam list-open-id-connect-providers | grep $oidc_id | cut -d "/" -f4
出力が返された場合は、クラスター用の IAM OIDC プロバイダーがすでに存在します。出力が返されない場合は、クラスター用の IAM OIDC プロバイダーを作成する必要があります。詳細については、「クラスターの IAM OIDC プロバイダーを作成する」を参照してください。
-
次のコンテンツをデバイスにコピーします。
111122223333
は、ご自分のアカウント ID に置き換えます。region-code
を、クラスターのある AWS リージョンに置き換えます。EXAMPLED539D4633E53DE1B71EXAMPLE
を、前のステップで返された出力に置き換えます。クラスターが AWS GovCloud (米国東部) または AWS GovCloud (米国西部) の AWS リージョンにある場合は、arn:aws:
をarn:aws-us-gov:
に置き換えます。テキストを置き換えたら、変更したコマンドを実行してload-balancer-role-trust-policy.json
ファイルを作成します。cat >load-balancer-role-trust-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com", "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:aws-load-balancer-controller" } } } ] } EOF
-
IAM ロールを作成します。
aws iam create-role \ --role-name AmazonEKSLoadBalancerControllerRole \ --assume-role-policy-document file://"load-balancer-role-trust-policy.json"
-
IAM ロールに、必要な Amazon EKS 管理の IAM ポリシーをアタッチします。
111122223333
は、ご自分のアカウント ID に置き換えます。aws iam attach-role-policy \ --policy-arn arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerIAMPolicy \ --role-name AmazonEKSLoadBalancerControllerRole
-
次のコンテンツをデバイスにコピーします。
111122223333
は、ご自分のアカウント ID に置き換えます。クラスターが AWS GovCloud (米国東部) または AWS GovCloud (米国西部) の AWS リージョンにある場合は、arn:aws:
をarn:aws-us-gov:
に置き換えます。テキストを置き換えたら、変更したコマンドを実行して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
-
クラスター上で Kubernetes サービスアカウントを作成します。
aws-load-balancer-controller
という名前の Kubernetes サービスアカウントは、作成した IAM ロール (名前:AmazonEKSLoadBalancerControllerRole
) でアノテーションされています。$ kubectl apply -f aws-load-balancer-controller-service-account.yaml
-
ステップ 2: cert-manager
をインストールする
以下のいずれかの方法で cert-manager
をインストールして、Webhook に証明書設定を導入します。詳細については、「cert-manager ドキュメント」の「開始方法
cert-manager
をインストールするには、quay.io
コンテナレジストリを使用することをお勧めします。ノードが quay.io
コンテナレジストリにアクセスできない場合は、Amazon ECR を使用して cert-manager
をインストールします (以下を参照)。
- Quay.io
-
-
ノードが
quay.io
コンテナレジストリにアクセスできる場合は、cert-manager
をインストールして、Webhook に証明書設定を挿入します。$ kubectl apply \ --validate=false \ -f https://github.com/jetstack/cert-manager/releases/download/v1.13.5/cert-manager.yaml
-
- Amazon ECR
-
-
以下のいずれかの方法で
cert-manager
をインストールして、Webhook に証明書設定を導入します。詳細については、「cert-manager ドキュメント」の「開始方法」を参照してください。 -
マニフェストをダウンロードします。
curl -Lo cert-manager.yaml https://github.com/jetstack/cert-manager/releases/download/v1.13.5/cert-manager.yaml
-
次のイメージをプルして、ノードがアクセスできるリポジトリにプッシュします。イメージをプルし、タグ付けして独自のリポジトリにプッシュする方法の詳細については、あるリポジトリから別のリポジトリにコンテナイメージをコピーする を参照してください。
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
-
三つのイメージのマニフェストの
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
-
マニフェストを適用します。
$ kubectl apply \ --validate=false \ -f ./cert-manager.yaml
-
ステップ 3: AWS Load Balancer Controller をインストールする
-
Controller の詳細をダウンロードします。コントローラーの詳細については、「GitHub」の ドキュメント
を参照してください。 curl -Lo v2_7_2_full.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.7.2/v2_7_2_full.yaml
-
ファイルに以下の編集を行います。
-
v2_7_2_full.yaml
ファイルをダウンロードした場合は、次のコマンドを実行してマニフェストのServiceAccount
セクションを削除します。このセクションを削除しないと、前のステップでサービスアカウントに作成した必須の注釈が上書きされます。コントローラーを削除した場合、このセクションの削除により、前のステップで作成したサービスアカウントも保持されます。$ sed -i.bak -e '612,620d' ./v2_7_2_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 ---
-
My-cluster
をユーザーのクラスター名に置き換えることにより、ファイルのDeployment
spec
セクションのyour-cluster-name
をクラスターの名前に置き換えます。$ sed -i.bak -e 's|your-cluster-name|my-cluster|' ./v2_7_2_full.yaml
-
ノードが Amazon EKS Amazon ECR イメージリポジトリにアクセスできない場合は、次のイメージをプルして、ノードがアクセスできるリポジトリにプッシュする必要があります。イメージをプルし、タグ付けして独自のリポジトリにプッシュする方法の詳細については、あるリポジトリから別のリポジトリにコンテナイメージをコピーする を参照してください。
public.ecr.aws/eks/aws-load-balancer-controller:v2.7.2
マニフェストにレジストリの名前を追加します。次のコマンドは、プライベートリポジトリの名前がソースリポジトリと同じであると仮定し、プライベートレジストリの名前をファイルに追加します。
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_7_2_full.yaml
-
(Fargate または制限付き IMDS の場合にのみ必須)
Amazon EC2 インスタンスメタデータサービス (IMDS) に対するアクセスが制限されている
Amazon EC2 ノードにコントローラをデプロイする場合、または Fargate にデプロイする場合には、 - args:
の下にfollowing parameters
を追加します。[...] spec: containers: - args: - --cluster-name=your-cluster-name - --ingress-class=alb - --aws-vpc-id=vpc-xxxxxxxx - --aws-region=region-code [...]
-
-
ファイルを適用します。
$ kubectl apply -f v2_7_2_full.yaml
-
IngressClass
およびIngressClassParams
マニフェストをクラスターにダウンロードします。$ curl -Lo v2_7_2_ingclass.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.7.2/v2_7_2_ingclass.yaml
-
マニフェストをクラスターに適用します。
$ kubectl apply -f v2_7_2_ingclass.yaml
ステップ 4: コントローラーがインストールされていることを確認する
-
コントローラがインストールされていることを確認します。
$ 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 つのみとなります。
-
コントローラーを使用して AWS リソースをプロビジョニングする場合には、クラスターは特定の要件を満たしている必要があります。詳細については、Application Load Balancer を使用してアプリケーションと HTTP トラフィックをルーティングするおよびNetwork Load Balancer を使用して TCP および UDP トラフィックをルーティングするを参照してください。