如何使用 kubernetes_ingress terraform 资源创建 AWS ALB?
How to create AWS ALB using kubernetes_ingress terraform resource?
我正在尝试使用 Terraform 的 kubernetes_ingress
资源将 Application Load Balancer 部署到 AWS:
我正在使用 aws-load-balancer-controller,我使用 helm_release
资源安装到我的集群。
现在我正在尝试部署 deployment
和 service
和 ingress
。
这是我的 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 和一个面向 CLB 的互联网。
关于如何使用此设置创建面向 Internet 的应用程序负载均衡器有什么想法吗?
---更新----
我注意到,实际上,service
是 Classic Load Balancer,我可以通过它连接到我的 deployment
。
Ingress 创建一个 ALB,但它的前缀是 internal
,所以我的问题是,如何创建一个面向互联网的 ALB?
谢谢!
尝试使用 alb.ingress.kubernetes.io/scheme: internet-facing
注释。
您可以在此处找到所有可用注释的列表:https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.2/guide/ingress/annotations/
像大多数时候一样回答我自己的问题:)
这是正确的设置,以防有人遇到它:
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
}
}
}
}
}
}
我正在尝试使用 Terraform 的 kubernetes_ingress
资源将 Application Load Balancer 部署到 AWS:
我正在使用 aws-load-balancer-controller,我使用 helm_release
资源安装到我的集群。
现在我正在尝试部署 deployment
和 service
和 ingress
。
这是我的 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 和一个面向 CLB 的互联网。
关于如何使用此设置创建面向 Internet 的应用程序负载均衡器有什么想法吗?
---更新----
我注意到,实际上,service
是 Classic Load Balancer,我可以通过它连接到我的 deployment
。
Ingress 创建一个 ALB,但它的前缀是 internal
,所以我的问题是,如何创建一个面向互联网的 ALB?
谢谢!
尝试使用 alb.ingress.kubernetes.io/scheme: internet-facing
注释。
您可以在此处找到所有可用注释的列表:https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.2/guide/ingress/annotations/
像大多数时候一样回答我自己的问题:)
这是正确的设置,以防有人遇到它:
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
}
}
}
}
}
}