如何使用 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
资源安装到我的集群。
现在我正在尝试使用service
和ingress
部署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-facing
与 NodePort
组合的服务类型。【参考方案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-name
和healthcheck-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?的主要内容,如果未能解决你的问题,请参考以下文章
Rayon 如何防止线程之间使用 RefCell<T>、Cell<T> 和 Rc<T>?
如何使用 SSE 更有效地将 A*B^T 或 A^T*B^T(T 表示转置)矩阵相乘?