EKSのArgo CDでIRSAを使いつつaws-load-balancer-controllerをApplicationとしてHelm Chartをsourceでインストールする
aws-load-balancer-controllerが起動しない
以下のエラーが出て起動しない。 alb-load-balancer-controllerのときと違うのは、CRDが必要になったのでそれを入れないといけないってのがポイント!
{ "level":"error", "ts":1606359399.366636, "logger":"setup", "msg":"unable to create controller", "controller":"TargetGroupBinding", "error":"no matches for kind \"TargetGroupBinding\" in version \"elbv2.k8s.aws/v1beta1\"" }
kustomization.yaml
Kustomizeならremote targetsで入れられるのでそれでやる。
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: # remote targetsを使ってCRDをinstallするのがポイント - github.com/aws/eks-charts/stable/aws-load-balancer-controller//crds?ref=v0.0.36 - aws-load-balancer-controller.yaml
aws-load-balancer-controller.yaml
IRSAのために、valuesでannotationsを渡すのがポイント!
parametersを使って渡すと、HelmのtemplateでtoYAML
が効かなくて反映されなかった
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: aws-load-balancer-controller namespace: argocd spec: source: repoURL: https://aws.github.io/eks-charts targetRevision: 1.0.8 chart: aws-load-balancer-controller helm: releaseName: aws-load-balancer-controller parameters: - name: "clusterName" value: "eks-your-cluster" - name: "serviceAccount.name" value: "aws-load-balancer-controller" values: | serviceAccount: annotations: eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/aws-load-balancer-controller
Terraform
巷にはeksctlを使ってiam作成するサンプルが多くてちょっとハマった。number_of_role_policy_arns
がないとダメなのは厳しいけど、多分、moduleの書き方の都合だとは思うので、従うしかない。
policyはdocumentにjsonで用意されてるので、iam-policy-json-to-terraformを使って変換した。便利!!
module "load_balancer_controller_iam" { source = "terraform-aws-modules/iam/aws//modules/iam-assumable-role-with-oidc" version = "3.4.0" create_role = true role_name = "aws-load-balancer-controller" provider_url = replace(module.eks_cluster.cluster_oidc_issuer_url, "https://", "") number_of_role_policy_arns = 1 # これがないとダメ(辛い・・) role_policy_arns = [aws_iam_policy.load_balancer_controller.arn] oidc_fully_qualified_subjects = ["system:serviceaccount:kube-system:aws-load-balancer-controller"] } resource "aws_iam_policy" "load_balancer_controller" { name_prefix = "load-balancer-controller" description = "EKS load balancer controller policy for cluster ${module.eks_cluster.cluster_id}" policy = data.aws_iam_policy_document.load_balancer_controller.json } data "aws_iam_policy_document" "load_balancer_controller" { // ... 省略 // https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2_ga/docs/install/iam_policy.json // ここから持ってきて変換する }