TL;DR
EKS で ALB を使いたいので、その辺りをうまくやってくれるコントローラをセットアップする
関連プロジェクトにある、AWS Load Balancer コントローラ
オリジナルの手順はここ
モチベーション
なるべく、helm を使ってセットアップしたい
DNS もセットで使いたい場合はこちら参照
前提
- 以下のコマンドをインストール済み
- eksctl
- aws
- kubectl
手順
- クラスタ作成
- クラスターの IAM OIDC プロバイダーを作成
- ポリシー作成
- サービスアカウント作成
- helm でインストール
クラスタ作成
これは略
クラスターの IAM OIDC プロバイダーを作成
これも、一回だけやっておけば良いから、略。
一応
-
OIDC プロバイダーの URL を取得
$ aws eks describe-cluster --name <cluster_name> --query "cluster.identity.oidc.issuer" --output text
-
まだ作成してないことを確認
$ aws iam list-open-id-connect-providers
-
OIDC プロバイダーを作成
$ eksctl utils associate-iam-oidc-provider --cluster <cluster_name> --approve
-
作成されたことを確認
$ aws iam list-open-id-connect-providers
ポリシー作成
-
ポリシーの記載された json ファイルを取ってくる
$ curl -o iam_policy.json \ https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.2.0/docs/install/iam_policy.json
-
ポリシーの作成
$ aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json
-
Arn をメモしておく
サービスアカウント作成
-
作成
$ eksctl create iamserviceaccount \ --cluster=<YOUR_CLUSTER_NAME> \ --namespace=kube-system \ --name=aws-load-balancer-controller \ --attach-policy-arn=arn:aws:iam::<AWS_ACCOUNT_ID>:policy/AWSLoadBalancerControllerIAMPolicy \ --override-existing-serviceaccounts \ --approve
-
確認
$ kubectl describe sa/aws-load-balancer-controller -n kube-system Name: aws-load-balancer-controller Namespace: kube-system Labels: app.kubernetes.io/managed-by=eksctl Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::xxx:role/xxx ...
helm でインストール
-
Amazon EKS チャートレポを Helm に追加
$ helm repo add eks https://aws.github.io/eks-charts "eks" has been added to your repositories
-
念のため、更新しておく
$ helm repo update Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "eks" chart repository Update Complete. ⎈Happy Helming!⎈
-
TargetGroupBinding カスタムリソース定義 (CRD) をインストール
$ kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller/crds?ref=master" customresourcedefinition.apiextensions.k8s.io/ingressclassparams.elbv2.k8s.aws created customresourcedefinition.apiextensions.k8s.io/targetgroupbindings.elbv2.k8s.aws created
-
Helm チャートをインストール
$ helm install aws-load-balancer-controller eks/aws-load-balancer-controller \ --set serviceAccount.create=false \ --set serviceAccount.name=aws-load-balancer-controller \ --set clusterName=<YOUR_CLUSTER_NAME> \ --set region=<REGION_CODE> \ --set vpcId=<VPC_ID> \ -n kube-system NAME: aws-load-balancer-controller LAST DEPLOYED: Thu Aug 19 16:46:36 2021 NAMESPACE: kube-system STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: AWS Load Balancer controller installed!
動作確認
test-nginx1 というネームスペースに nginx を起動させてみる
-
まず、fargate profile を作成する。忘れがち。
$ eksctl create fargateprofile \ --cluster <YOUR_CLUSTER_NAME> \ --region <REGION_CODE> \ --name test-nginx1 \ --namespace test-nginx1
-
マニフェストを準備
--- apiVersion: v1 kind: Namespace metadata: name: test-nginx1 --- apiVersion: apps/v1 kind: Deployment metadata: namespace: test-nginx1 name: deployment-nginx spec: selector: matchLabels: app.kubernetes.io/name: app-nginx replicas: 1 template: metadata: labels: app.kubernetes.io/name: app-nginx spec: containers: - image: nginx:1.16.1 imagePullPolicy: Always name: app-nginx ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: namespace: test-nginx1 name: service-nginx spec: ports: - port: 80 targetPort: 80 protocol: TCP type: NodePort selector: app.kubernetes.io/name: app-nginx --- apiVersion: extensions/v1beta1 kind: Ingress metadata: namespace: test-nginx1 name: ingress-nginx annotations: kubernetes.io/ingress.class: alb alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: ip # group.name 使うと ALB を共有できる alb.ingress.kubernetes.io/group.name: my-group spec: rules: - http: paths: - path: "/*" backend: serviceName: service-nginx servicePort: 80
-
デプロイ
$ kubectl apply -f ./test-nginx1.yml
-
ログ
$ kubectl logs -f deployment/aws-load-balancer-controller -n kube-system