見出し画像

EKSにAWS Load Balancer Controllerをデプロイする

AWS Load Balancer Controller により、Kubernetes クラスター向けの AWS Elastic Load Balancer を管理できます。コントローラは、次のリソースをプロビジョニングします。

Kubernetes Ingress を作成する場合の AWS Application Load Balancer (ALB)。

タイプ LoadBalancer の Kubernetes Service を作成する場合の、AWS Network Load Balancer (NLB)。以前は、インスタンスターゲットには Kubernetes のツリー内ロードバランサーを使用していましたが、IP ターゲットには AWS Load Balancer Controller を使用していました。AWS Load Balancer Controller バージョン 2.3.0 以降では、いずれかのターゲットタイプを使用して Network Load Balancer を作成できます。NLB ターゲットタイプの詳細については、Network Load Balancer のユーザーガイドの 「ターゲットタイプ」を参照してください。

このコントローラは、以前、AWS ALB Ingress Controller と呼ばれていたものです。

これは、GitHub で管理されるオープンソースのプロジェクトです。このトピックでは、デフォルトのオプションを使用してコントローラをインストールする方法について説明します。

コントローラについての完全な ドキュメントは、GitHub でご覧になれます。コントローラをデプロイする前に、Amazon EKS でのアプリケーション負荷分散 および Amazon EKS でのネットワーク負荷分散 についての前提条件と考慮事項を、確認しておくことをお勧めします。

これらのトピックには、(AWS リソースのプロビジョニングのために、この Controller を使用する) サンプルアプリケーションのデプロイ手順も解説されています。

前提

既存の Amazon EKS クラスターを作成済であること。

クラスターの既存 AWS Identity and Access Management (IAM) OpenID Connect (OIDC) プロバイダーが作成済

ユーザーに代わって AWS API を呼び出すことを許可する

AWS Load Balancer Controller 用の IAM ポリシーをダウンロードします

$ curl -o iam_policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.3.1/docs/install/iam_policy.json

localにiam_policy.jsonが作成されます

ダウンロードしたポリシー を使用して、IAM ポリシーを作成

$ aws iam create-policy \
   --policy-name AWSLoadBalancerControllerIAMPolicy \
   --policy-document file://iam_policy.json
{
   "Policy": {
       "PolicyName": "AWSLoadBalancerControllerIAMPolicy",
       "PolicyId": "XXXXXXXX",
       "Arn": "arn:aws:iam::XXXXXXXXX:policy/AWSLoadBalancerControllerIAMPolicy",
       "Path": "/",
       "DefaultVersionId": "v1",
       "AttachmentCount": 0,
       "PermissionsBoundaryUsageCount": 0,
       "IsAttachable": true,
       "CreateDate": "2022-02-09T17:47:09+00:00",
       "UpdateDate": "2022-02-09T17:47:09+00:00"
   }
}

上記のように出力される。

IAM ロールを作成

AWS を使用 (もしくは AWS Management Console と kubectl を使用) して、eksctl Load Balancer Controller の kube-system 名前空間に、aws-load-balancer-controller という名前で Kubernetes サービスアカウントをアノテーションします。
*my-cluster をクラスター名に、111122223333 をアカウント ID に置き換え、コマンドを実行します。

$ eksctl create iamserviceaccount \
 --cluster=my_cluster \
 --namespace=kube-system \
 --name=aws-load-balancer-controller \
 --attach-policy-arn=arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerIAMPolicy \
 --override-existing-serviceaccounts \
 --approve

eksにサービスアカウントが作成されていることを確認

$ kubectl get sa -n kube-system | grep aws-load-balancer-controll
er
aws-load-balancer-controller         1         19s

インストール済みの AWS ALB Ingress Controller for Kubernetes がある場合は、それをアンインストールします。

AWS Load Balancer Controller は、AWS ALB Ingress Controller for Kubernetes の機能を置き換えます。Ingress Controller がインストール済みであるかどうかを確認します。

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

これは、コントローラが取り付けられていない場合の出力です。以下出力の場合は「コントローラーをインストールする」のステップに進みます。

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

見つかった場合は以下コマンドで削除します。

$ 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

次の IAM ポリシーを、前のステップで作成した IAM ロールに追加します。

このポリシーは、ALB Ingress Controller for Kubernetes によって作成されたリソースへの AWS Load Balancer Controller アクセスを許可します。

IAM ポリシーをダウンロードします。ポリシーを表示することもできます。

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

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

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

作成されたポリシーが出力されます

{
   "Policy": {
       "PolicyName": "AWSLoadBalancerControllerAdditionalIAMPolicy",
       "PolicyId": "XXXXXXX",
       "Arn": "arn:aws:iam::XXXXXXXXX:policy/AWSLoadBalancerControllerAdditionalIAMPolicy",
       "Path": "/",
       "DefaultVersionId": "v1",
       "AttachmentCount": 0,
       "PermissionsBoundaryUsageCount": 0,
       "IsAttachable": true,
       "CreateDate": "2022-02-09T17:59:41+00:00",
       "UpdateDate": "2022-02-09T17:59:41+00:00"
   }
}

作成した IAM ポリシーを、前のステップで作成した IAM ロールにアタッチします。

your-role-name はロールの名前に置き換えます。eksctl を使用してロールを作成した場合は、作成されたロール名を探すために AWS CloudFormation コンソールを開き、eksctl-your-cluster-name-addon-iamserviceaccount-kube-system-aws-load-balancer-controller スタックを選択します。[Resources (リソース)] タブを選択します。ロール名は、[Physical ID (物理 ID)] 列で見つかります。AWS Management Consoleを使用してロールを作成した場合、ロール名は作成時に付けたもの (例えば、AmazonEKSLoadBalancerControllerRole など) になります。

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

Helm V3 以降を使用して、または Kubernetes マニフェストを適用して、AWS Load Balancer Controller をインストールする

Fargate でコントローラーをデプロイする場合は、Helm チャートを使用します。これは cert-manager に依存しません。

eks-charts リポジトリを追加

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

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

$ helm repo update

AWS Load Balancer コントローラをインストール

Amazon EC2 インスタンスメタデータサービス (IMDS) に対するアクセスが制限されている Amazon EC2 ノードにコントローラーをデプロイする場合、または Fargate にデプロイする場合には、次のコマンドに次のフラグを追加します。

--set region=region-code
--set vpcId=vpc-xxxxxxxx

us-west-2 以外のリージョンにデプロイする場合は、次のコマンドに次のフラグを追加し、account と region-code を Amazon EKS アドオンコンテナイメージのアドレス にリストされているリージョン用の値に置き換えます。

以下のaccountとregion-codeはこちらを参照

--set image.repository={account}.dkr.ecr.{region-code}.amazonaws.com/amazon/aws-load-balancer-controller
$ helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
 -n kube-system \
 --set clusterName=cluster-name \
 --set serviceAccount.create=false \
 --set serviceAccount.name=aws-load-balancer-controller 

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

$ kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller/crds?ref=master"

コントローラがインストールされていることを確認

$ 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 リソースをプロビジョニングする場合には、クラスターは特定の要件を満たしている必要があります。詳細については、「Amazon EKS でのアプリケーション負荷分散」および「Amazon EKS でのネットワーク負荷分散」を参照してください。

ALBを使ってサンプルアプリケーションを公開する

Ingressを使用してALBを作成するため、ここではLoadBalancerタイプのサービスは必要ありません。

# sample-app.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
 name: sample-deployment
spec:
 selector:
   matchLabels:
     app: sample-app
 replicas: 1
 template:
   metadata:
     labels:
       app: sample-app
   spec:
     containers:
     - name: nginx-container
       image: nginx:1.7.9
       ports:
       - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
 name: sample-service
spec:
 type: NodePort
 selector:
   app: sample-app
 ports:
 - protocol: TCP
   port: 80
   targetPort: 80

# sample-ingress.yaml

annotationsにkubernetes.io/ingress.class: albを指定したingressを作成します

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
 name: test-ingress
 annotations:
   kubernetes.io/ingress.class: alb
   alb.ingress.kubernetes.io/scheme: internet-facing
   alb.ingress.kubernetes.io/target-type: ip
spec:
 rules:
   - http:
       paths:
         - path: /*
           backend:
             serviceName: sample-service
             servicePort: 80

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

$ kubectl apply -f sample-app.yaml
$ kubectl apply -f sample-ingress.yaml

ingressのマニフェストで指定した名前のingressが作成され、ADDRESSが付与されていることを確認できます。

$ kubectl get ingress
test-ingress   <none>   *       k8s-default-testingr-9b1f96b9b4-1284243088.ap-northeast-1.elb.amazonaws.com   80      6s

ブラウザでアクセスしてnginxのページが表示されれば完了!

























この記事が気に入ったらサポートをしてみませんか?