まーぽんって誰がつけたの?

iOS→Scala→インフラなおじさん技術メモ

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
// ここから持ってきて変換する
}