如何使用 kubernetes_ingress terraform 资源创建 AWS ALB?

Posted

技术标签:

【中文标题】如何使用 kubernetes_ingress terraform 资源创建 AWS ALB?【英文标题】:How to create AWS ALB using kubernetes_ingress terraform resource? 【发布时间】:2022-01-03 07:16:46 【问题描述】:

我正在尝试使用 Terraform 的 kubernetes_ingress 资源将 Application Load Balancer 部署到 AWS:

我正在使用aws-load-balancer-controller,我使用helm_release 资源安装到我的集群。

现在我正在尝试使用serviceingress 部署deployment

这就是我的service 的样子:

resource "kubernetes_service" "questo-server-service" 
  metadata 
    name      = "questo-server-service-$var.env"
    namespace = kubernetes_namespace.app-namespace.metadata.0.name
  
  spec 
    selector = 
      "app.kubernetes.io/name" = lookup(kubernetes_deployment.questo-server.metadata.0.labels, "app.kubernetes.io/name")
    

    port 
      port        = 80
      target_port = 4000
    
    type = "LoadBalancer"
  

这就是我的ingress 的样子:

resource "kubernetes_ingress" "questo-server-ingress" 
  wait_for_load_balancer = true
  metadata 
    name = "questo-server-ingress-$var.env"
    namespace = kubernetes_namespace.app-namespace.metadata.0.name
    annotations = 
      "kubernetes.io/ingress.class" = "alb"
      "alb.ingress.kubernetes.io/target-type" = "instance"
    
  
  spec 
    rule 
      http 
        path 
          path = "/*"
          backend 
            service_name = kubernetes_service.questo-server-service.metadata.0.name
            service_port = 80
          
        
      
    
  

问题是,当我运行 terraform apply 时,它会创建一个 Classic Load Balancer 而不是 Application Load Balancer。

我尝试将service 的类型更改为NodePort,但没有帮助。

我还尝试向ingress 添加更多注释,例如"alb.ingress.kubernetes.io/load-balancer-name" = "$name",但随后它一次创建了两个负载平衡器!一个内部 ALB 和一个面向 Internet 的 CLB。

任何想法如何使用此设置创建面向 Internet 的应用程序负载均衡器?

--- 更新----

我注意到,实际上,service 是 Classic Load Balancer,我可以通过它连接到我的 deployment

Ingress 创建了一个 ALB,但它的前缀是 internal,所以我的问题是,如何创建一个面向 Internet 的 ALB?

谢谢!

【问题讨论】:

您能分享使用 helm_release 安装 aws-load-balancer-controller 的 tf 文件吗? 您自己需要它吗?如果是这样,请在 PM 中 ping 我,我会发送给您。编辑:如果需要,您实际上可以在我的仓库中找到它:github.com/matewilk/questo/blob/master/tf/k8s/… 【参考方案1】:

尝试使用alb.ingress.kubernetes.io/scheme: internet-facing 注释。

您可以在此处找到所有可用注释的列表:https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.2/guide/ingress/annotations/

【讨论】:

嘿@florianmaxim,感谢您的回答,我在发布问题的当天晚上就知道了,我只是没有时间发布它。感谢您的输入,它确实是 internet-facingNodePort 组合的服务类型。【参考方案2】:

像大多数时候一样回答我自己的问题:)

这是正确的设置,以防万一有人遇到它:

service 的类型必须是 NodePort

resource "kubernetes_service" "questo-server-service" 
  metadata 
    name      = "questo-server-service-$var.env"
    namespace = kubernetes_namespace.app-namespace.metadata.0.name
  
  spec 
    selector = 
      "app.kubernetes.io/name" = lookup(kubernetes_deployment.questo-server.metadata.0.labels, "app.kubernetes.io/name")
    

    port 
      port        = 80
      target_port = 4000
    
    type = "NodePort"
  

并且ingress的注释必须设置如下:(你可以忽略load-balancer-namehealthcheck-pass,因为它们与问题无关:

resource "kubernetes_ingress" "questo-server-ingress" 
  wait_for_load_balancer = true
  metadata 
    name      = "questo-server-ingress-$var.env"
    namespace = kubernetes_namespace.app-namespace.metadata.0.name
    annotations = 
      "kubernetes.io/ingress.class"                  = "alb"
      "alb.ingress.kubernetes.io/target-type"        = "ip"
      "alb.ingress.kubernetes.io/scheme"             = "internet-facing"
      "alb.ingress.kubernetes.io/load-balancer-name" = "questo-server-alb-$var.env"
      "alb.ingress.kubernetes.io/healthcheck-path"   = "/health"
    
  

  spec 
    rule 
      http 
        path 
          path = "/*"
          backend 
            service_name = kubernetes_service.questo-server-service.metadata.0.name
            service_port = 80
          
        
      
    
  
 

【讨论】:

以上是关于如何使用 kubernetes_ingress terraform 资源创建 AWS ALB?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用反射在 Task<T> 中获取 T 类型的属性?

Rayon 如何防止线程之间使用 RefCell<T>、Cell<T> 和 Rc<T>?

如何使用 SSE 更有效地将 A*B^T 或 A^T*B^T(T 表示转置)矩阵相乘?

如何在管道内使用 t-SNE

r 中的 T 检验:如何使用 lapply 函数更改 t 检验的 x 和 y 参数

如何使用约束将 T 限制为值类型?