Развертывание контроллера балансировки нагрузки AWS на EKS с помощью Terraform

#amazon-web-services #kubernetes #kubernetes-ingress #amazon-eks #aws-load-balancer

Вопрос:

Попытка развернуть контроллер aws-балансировщика нагрузки на Kubernetes.

У меня есть следующий код TF:

 resource "kubernetes_deployment" "ingress" {
  metadata {
    name      = "alb-ingress-controller"
    namespace = "kube-system"
    labels = {
      app.kubernetes.io/name = "alb-ingress-controller" 
      app.kubernetes.io/version = "v2.2.3"
      app.kubernetes.io/managed-by = "terraform"
    }
  }

  spec {
    replicas = 1

    selector {
      match_labels = {
        app.kubernetes.io/name = "alb-ingress-controller" 
      }
    }

    strategy {
      type = "Recreate"
    }

    template {
      metadata {
        labels = {
                app.kubernetes.io/name = "alb-ingress-controller" 
                app.kubernetes.io/version = "v2.2.3"
        }
      }

      spec {
        dns_policy                       = "ClusterFirst"
        restart_policy                   = "Always"
        service_account_name             = kubernetes_service_account.ingress.metadata[0].name
        termination_grace_period_seconds = 60

        container {
          name              = "alb-ingress-controller"
          image             = "docker.io/amazon/aws-alb-ingress-controller:v2.2.3"
          image_pull_policy = "Always"

          args = [
            "--ingress-class=alb",
            "--cluster-name=${local.k8s[var.env].esk_cluster_name}",
            "--aws-vpc-id=${local.k8s[var.env].cluster_vpc}",
            "--aws-region=${local.k8s[var.env].region}"
          ]
          volume_mount {
            mount_path = "/var/run/secrets/kubernetes.io/serviceaccount"
            name       = kubernetes_service_account.ingress.default_secret_name
            read_only  = true
          }
        }
        volume {
          name = kubernetes_service_account.ingress.default_secret_name

          secret {
            secret_name = kubernetes_service_account.ingress.default_secret_name
          }
        }
      }
    }
  }

  depends_on = [kubernetes_cluster_role_binding.ingress]
}

resource "kubernetes_ingress" "app" {
  metadata {
    name      = "owncloud-lb"
    namespace = "fargate-node"
    annotations = {
      "kubernetes.io/ingress.class"           = "alb"
      "alb.ingress.kubernetes.io/scheme"      = "internet-facing"
      "alb.ingress.kubernetes.io/target-type" = "ip"
    }
    labels = {
      "app" = "owncloud"
    }
  }

  spec {
    backend {
      service_name = "owncloud-service"
      service_port = 80
    }
    rule {
      http {
        path {
          path = "/"
          backend {
            service_name = "owncloud-service"
            service_port = 80
          }
        }
      }
    }
  }
  depends_on = [kubernetes_service.app]
}
 

Это работает до версии 1.9 по мере необходимости. Как только я обновлюсь до версии 2.2.3 , модуль не сможет обновиться, и в модуле появится следующая ошибка: {"level":"error","ts":1629207071.4385357,"logger":"setup","msg":"unable to create controller","controller":"TargetGroupBinding","error":"no matches for kind "TargetGroupBinding" in version "elbv2.k8s.aws/v1beta1""}

Я прочитал обновление документа и внес изменения в политику IAM, как они утверждают, но в них также упоминается:

обновление CRD для привязки целевых групп

И это там, где я не уверен, как это сделать с помощью terraform

Если я попытаюсь выполнить развертывание в новом кластере (например, не обновление с версии 1.9, я получу ту же ошибку) Я получаю ту же ошибку.

Ответ №1:

С помощью кода Terraform вы применяете Deployment ресурс и Ingress ресурс, но вы также должны добавить CustomResourceDefinitions для TargetGroupBinding пользовательского ресурса.

Это описано в разделе «Добавление контроллера в кластер» в документации по установке контроллера балансировщика нагрузки — с примерами для Helm и Kubernetes Yaml.

Terraform поддерживает бета-версию для применения CRD, включая пример развертывания CustomResourceDefinition.

Комментарии:

1. ладно, спасибо за это … просто интересно, есть ли у вас или знаете ли вы какой-либо онлайн-ресурс, который вы рекомендуете о том, как вы могли бы запускать команды управления с помощью terraform ?

2. @alexis Я обновил свой ответ с поддержкой бета-версии Terraform для CRD, включая ссылку на пример применения пользовательских определений ресурсов.

3. Большое спасибо!. Я уверен, что этого достаточно для меня, чтобы понять это и забрать отсюда. Еще раз спасибо за потраченное время