Terraform AWS NLB TLS 直通

Eng*_*ery 2 nlb amazon-web-services terraform tls1.2

我使用 terraform 在 AWS 中为我​​的 K3S 集群配置基础设施。我已在端口 80 和 443 上配置了一个具有两个侦听器的 NLB,并具有适当的自签名证书。这有效。我可以通过 nlb 访问集群中的 HTTP 服务。

resource "tls_private_key" "agents" {
  algorithm = "RSA"
}

resource "tls_self_signed_cert" "agents" {
  key_algorithm         = "RSA"
  private_key_pem       = tls_private_key.agents.private_key_pem
  validity_period_hours = 24

  subject {
    common_name  = "my hostname"
    organization = "My org"
  }

  allowed_uses = [
    "key_encipherment",
    "digital_signature",
    "server_auth"
  ]
}

resource "aws_acm_certificate" "agents" {
  private_key      = tls_private_key.agents.private_key_pem
  certificate_body = tls_self_signed_cert.agents.cert_pem
}


resource "aws_lb" "agents" {
  name               = "basic-load-balancer"
  load_balancer_type = "network"

  subnet_mapping {
    subnet_id     = aws_subnet.agents.id
    allocation_id = aws_eip.agents.id
  }
}

resource "aws_lb_listener" "agents_80" {
  load_balancer_arn = aws_lb.agents.arn
  protocol = "TCP"
  port     = 80

  default_action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.agents_80.arn
  }
}

resource "aws_lb_listener" "agents_443" {
  load_balancer_arn = aws_lb.agents.arn
  protocol = "TLS"
  port     = 443
  certificate_arn = aws_acm_certificate.agents.arn

  default_action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.agents_443.arn
  }
}

resource "aws_lb_target_group" "agents_80" {
  port     = 30000
  protocol = "TCP"
  vpc_id   = var.vpc.id

  depends_on = [
    aws_lb.agents
  ]
}
resource "aws_lb_target_group" "agents_443" {
  port     = 30001
  protocol = "TCP"
  vpc_id   = var.vpc.id

  depends_on = [
    aws_lb.agents
  ]
}

resource "aws_autoscaling_attachment" "agents_80" {
  autoscaling_group_name = aws_autoscaling_group.agents.name
  alb_target_group_arn   = aws_lb_target_group.agents_80.arn
}

resource "aws_autoscaling_attachment" "agents_443" {
  autoscaling_group_name = aws_autoscaling_group.agents.name
  alb_target_group_arn   = aws_lb_target_group.agents_443.arn
}

Run Code Online (Sandbox Code Playgroud)

这是我的代码的精简版本。

我已将入口控制器配置为分别侦听 NodePort 30000 和 30001 上的 HTTP 和 HTTPS。这也有效。

不起作用的是 NLB 正在终止 TLS,但我需要它来直通。我这样做是为了访问 Kubernetes 仪表板(以及其他应用程序),但仪表板需要 https 才能登录,如果 tls 在 nlb 终止,我将无法提供此功能。

我需要帮助配置 nlb 以进行直通。我搜索了又搜索,找不到任何例子。如果有人知道如何配置它,那么最好获得一些 tf 代码,甚至只是了解在 AWS 中实现它的适当方法,以便我可以自己在 tf.

Mar*_*k B 6

您是否需要 TLS 直通,或者仅需要 NLB 和服务器之间的 TLS 通信?或者您是否只需要配置服务器以了解初始连接是 TLS?

对于 TLS 直通,您需要在服务器上安装 SSL 证书,并从负载均衡器中删除该证书。您可以将负载均衡器上端口 443 侦听器的协议从“TLS”更改为“TCP”。这不是 AWS 上非常典型的设置,您不能在此配置中使用免费的 AWS ACM SSL 证书,您必须在服务器上使用类似 Let's Encrypt 的东西。

对于 NLB 和服务器之间的 TLS 通信,您可以在服务器上安装证书(自签名证书就可以),然后只需更改负载均衡器上的目标组设置以指向服务器上的安全端口。

如果您只是想让服务器知道初始连接协议是 TLS,则可以将服务器配置为使用x-forwarded-proto负载均衡器传递的标头来确定连接是否安全。