はじめに
Amazon EKSでAWS Load Balancer Controllerを利用する方法をまとめます。
AWS Load Balancer Controllerは、KubernetesクラスターのElastic Load Balancerの管理ができるコントローラーです。
AWS Load Balancer Controllerを利用するとALBが構築されます。
Mac環境を想定しています。
実行環境の準備
-
AWS CLIの設定
AWS CloudFormationを動かすためのAWS CLIの設定を参考にしてください。 -
EKSクラスタの構築
Macでeksctlを利用してAmazon EKSのクラスターを構築するを参考にしてください。 -
EKSのコンテキストの設定
MacにてAmazon EKSの設定をするを参考にしてください。 -
Helmの設定
Amazon EKSでHelmを利用するを参考にしてください。 -
ArgoCDの設定
Amazon EKSでArgoCDを利用するを参考にしてください。
IAM OIDC IDプロバイダの作成
クラスター用の IAM OIDC プロバイダーの作成を参考にしてください。
-
クラスター名を設定する
CLUSTER_NAME=${クラスター名}
-
IDプロバイダを作成する
eksctl utils associate-iam-oidc-provider \ --cluster ${CLUSTER_NAME} \ --approve
-
IDプロバイダのARNを取得する
-
OIDC_ARN=$(aws iam list-open-id-connect-providers \ --query "OpenIDConnectProviderList[*].Arn" \ --output text \ | grep $( \ aws eks describe-cluster \ --name ${CLUSTER_NAME} \ --query "cluster.identity.oidc.issuer" \ --output text \ | cut -d '/' -f 5 \ ) )
-
IDプロバイダ名を取得する
OIDC_NAME=$(aws iam get-open-id-connect-provider \ --query "Url" \ --output text \ --open-id-connect-provider-arn \ $( \ aws iam list-open-id-connect-providers \ --query "OpenIDConnectProviderList[*].Arn" \ --output text \ | grep $( \ aws eks describe-cluster \ --name ${CLUSTER_NAME} \ --query "cluster.identity.oidc.issuer" \ --output text \ | cut -d '/' -f 5 \ ) \ ) )
IAMロールの作成
-
IAMロールを作成する
※今回はロール名をakane-dev-aws-load-balancer-controller-role
にしています。ROLE_POLICY=$(echo -n '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "'; echo -n "${OIDC_ARN}"; echo -n '" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "'; echo -n "${OIDC_NAME}"; echo -n ':sub": "system:serviceaccount:kube-system:aws-load-balancer-controller" } } } ] }') aws iam create-role \ --role-name akane-dev-aws-load-balancer-controller-role \ --assume-role-policy-document "${ROLE_POLICY}"
-
ポリシーを作成する
※ポリシーを参考にしてください。
※今回はポリシー名をakane-dev-aws-load-balancer-controller-policy
にしています。aws iam create-policy \ --policy-name akane-dev-aws-load-balancer-controller-policy \ --policy-document "$(curl -s https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.4/docs/install/iam_policy.json)"
-
ポリシーをロールにアタッチする
export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account) aws iam attach-role-policy \ --role-name akane-dev-aws-load-balancer-controller-role \ --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/akane-dev-aws-load-balancer-controller-policy
環境設定
※事前にKubernetesクラスターのコンテキストの設定をします。
※ArgoCDのインストールが必要です。
-
VPC IDを取得する
aws ec2 describe-tags \ --filter "Name=tag-value,Values=eksctl-*-cluster/VPC" \ --query "Tags[].ResourceId" \ --output text
-
IAMロールのARNを取得する
※今回はロール名をakane-dev-aws-load-balancer-controller-role
にしています。aws iam get-role \ --role-name akane-dev-aws-load-balancer-controller-role \ --query "Role.Arn" \ --output text
-
aws-load-balancer-controller.yaml
を作成する
※targetRevisionは1.4.4
としていますが、最新バージョンはeks-charts/stable/aws-load-balancer-controller/で確認してください。
※VPCのID、クラスター名、IAMロールのARNを設定します。aws-load-balancer-controller.yamlapiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: aws-load-balancer-controller namespace: argocd finalizers: - resources-finalizer.argocd.argoproj.io spec: project: default source: repoURL: 'https://aws.github.io/eks-charts' targetRevision: 1.4.4 chart: aws-load-balancer-controller helm: parameters: - name: region value: ap-northeast-1 - name: vpcId value: ${VPCのID} - name: clusterName value: ${クラスター名} values: | serviceAccount: create: true name: aws-load-balancer-controller annotations: eks.amazonaws.com/role-arn: ${IAMロールのARN} destination: server: 'https://kubernetes.default.svc' namespace: kube-system syncPolicy: automated: prune: true selfHeal: true
-
クラスターに適用する
kubectl apply -f aws-load-balancer-controller.yaml
[サンプル] guestbookのマニフェスト
※今回はakane
というNamespaceでguestbookを作成します。
※guestbookを参考にしてください。
-
akane-namespace.yaml
を作成するakane-namespace.yamlapiVersion: v1 kind: Namespace metadata: name: akane labels: name: akane
-
akane-ingress.yaml
を作成するakane-ingress.yamlapiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: alb alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: ip name: guestbook-ui namespace: akane spec: rules: - http: paths: - path: / pathType: Prefix backend: service: name: guestbook-ui port: number: 3000
-
akane-service.yaml
を作成する
※guestbook-ui-svc.yaml を参考にするakane-service.yamlapiVersion: v1 kind: Service metadata: annotations: labels: app: guestbook-ui name: guestbook-ui namespace: akane spec: ports: - port: 3000 protocol: TCP targetPort: 80 selector: app: guestbook-ui type: NodePort
-
akane-deployment.yaml
を作成する
※guestbook-ui-deployment.yaml を参考にするakane-deployment.yamlapiVersion: apps/v1 kind: Deployment metadata: name: guestbook-ui namespace: akane spec: replicas: 1 revisionHistoryLimit: 3 selector: matchLabels: app: guestbook-ui template: metadata: labels: app: guestbook-ui spec: containers: - image: gcr.io/heptio-images/ks-guestbook-demo:0.2 name: guestbook-ui ports: - containerPort: 80
-
クラスターに適用する
kubectl apply -f akane-namespace.yaml kubectl apply -f akane-ingress.yaml kubectl apply -f akane-service.yaml kubectl apply -f akane-deployment.yaml
-
guestbook にアクセスする
※ELBが構築されるまで、数分アクセスできないことがあります。open "http://$(kubectl get ingress -n akane guestbook-ui | awk '{ print $4 }' | tail -1)"
クリーンアップ
-
クラスターから削除する
kubectl delete -f akane-deployment.yaml kubectl delete -f akane-service.yaml kubectl delete -f akane-ingress.yaml kubectl delete -f akane-namespace.yaml kubectl delete -f aws-load-balancer-controller.yaml
-
ポリシーをロールからデタッチする
export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account) aws iam detach-role-policy \ --role-name akane-dev-aws-load-balancer-controller-role \ --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/akane-dev-aws-load-balancer-controller-policy
-
ポリシーを削除する
export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account) aws iam delete-policy \ --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/akane-dev-aws-load-balancer-controller-policy
-
IAMロールを削除する
aws iam delete-role \ --role-name akane-dev-aws-load-balancer-controller-role
-
IAM OIDC IDを削除する
eksctl delete cluster
を実行するとクラスターと一緒に削除されます。