Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Combine AWS NLBs to use one NLB per cluster #249

Merged
merged 1 commit into from
Jun 22, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,13 @@ Notable changes between versions.
#### AWS

* Switch `kube-apiserver` port from 443 to 6443 ([#248](https://github.com/poseidon/typhoon/pull/248))
* Update NLB, security groups, and generated kubeconfig's
* Combine apiserver and ingress NLBs ([#249](https://github.com/poseidon/typhoon/pull/249))
* Simplify clusters to come with one NLB. Reduce cost by ~$18/month per cluster.
* Users may keep using CNAME records to `ingress_dns_name` and the `nginx-ingress` addon for Ingress (up to a few million RPS)
* Users with heavy traffic (many million RPS) should create a separate NLB(s) for Ingress instead
* Listen for apiserver traffic on port 6443 and forward to controllers (with healthy apiserver)
* Listen for ingress traffic on ports 80/443 and forward to workers (with healthy ingress controller)
* Worker pools (advanced) no longer include an extraneous load balancer

#### Bare-Metal

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@ resource "aws_route53_record" "apiserver" {

# AWS recommends their special "alias" records for ELBs
alias {
name = "${aws_lb.apiserver.dns_name}"
zone_id = "${aws_lb.apiserver.zone_id}"
name = "${aws_lb.nlb.dns_name}"
zone_id = "${aws_lb.nlb.zone_id}"
evaluate_target_health = true
}
}

# Network Load Balancer for apiservers
resource "aws_lb" "apiserver" {
name = "${var.cluster_name}-apiserver"
# Network Load Balancer for apiservers and ingress
resource "aws_lb" "nlb" {
name = "${var.cluster_name}-nlb"
load_balancer_type = "network"
internal = false

Expand All @@ -24,9 +24,9 @@ resource "aws_lb" "apiserver" {
enable_cross_zone_load_balancing = true
}

# Forward TCP traffic to controllers
# Forward TCP apiserver traffic to controllers
resource "aws_lb_listener" "apiserver-https" {
load_balancer_arn = "${aws_lb.apiserver.arn}"
load_balancer_arn = "${aws_lb.nlb.arn}"
protocol = "TCP"
port = "6443"

Expand All @@ -36,6 +36,30 @@ resource "aws_lb_listener" "apiserver-https" {
}
}

# Forward HTTP ingress traffic to workers
resource "aws_lb_listener" "ingress-http" {
load_balancer_arn = "${aws_lb.nlb.arn}"
protocol = "TCP"
port = 80

default_action {
type = "forward"
target_group_arn = "${module.workers.target_group_http_arn}"
}
}

# Forward HTTPS ingress traffic to workers
resource "aws_lb_listener" "ingress-https" {
load_balancer_arn = "${aws_lb.nlb.arn}"
protocol = "TCP"
port = 443

default_action {
type = "forward"
target_group_arn = "${module.workers.target_group_https_arn}"
}
}

# Target group of controllers
resource "aws_lb_target_group" "controllers" {
name = "${var.cluster_name}-controllers"
Expand Down
12 changes: 11 additions & 1 deletion aws/container-linux/kubernetes/outputs.tf
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
output "ingress_dns_name" {
value = "${module.workers.ingress_dns_name}"
value = "${aws_lb.nlb.dns_name}"
description = "DNS name of the network load balancer for distributing traffic to Ingress controllers"
}

output "target_group_http_arn" {
description = "ARN of a target group of workers for HTTP traffic"
value = "${module.workers.target_group_http_arn}"
}

output "target_group_https_arn" {
description = "ARN of a target group of workers for HTTPS traffic"
value = "${module.workers.target_group_https_arn}"
}

# Outputs for worker pools

output "vpc_id" {
Expand Down
37 changes: 1 addition & 36 deletions aws/container-linux/kubernetes/workers/ingress.tf
Original file line number Diff line number Diff line change
@@ -1,39 +1,4 @@
# Network Load Balancer for Ingress
resource "aws_lb" "ingress" {
name = "${var.name}-ingress"
load_balancer_type = "network"
internal = false

subnets = ["${var.subnet_ids}"]

enable_cross_zone_load_balancing = true
}

# Forward HTTP traffic to workers
resource "aws_lb_listener" "ingress-http" {
load_balancer_arn = "${aws_lb.ingress.arn}"
protocol = "TCP"
port = 80

default_action {
type = "forward"
target_group_arn = "${aws_lb_target_group.workers-http.arn}"
}
}

# Forward HTTPS traffic to workers
resource "aws_lb_listener" "ingress-https" {
load_balancer_arn = "${aws_lb.ingress.arn}"
protocol = "TCP"
port = 443

default_action {
type = "forward"
target_group_arn = "${aws_lb_target_group.workers-https.arn}"
}
}

# Network Load Balancer target groups of instances
# Target groups of instances for use with load balancers

resource "aws_lb_target_group" "workers-http" {
name = "${var.name}-workers-http"
Expand Down
11 changes: 8 additions & 3 deletions aws/container-linux/kubernetes/workers/outputs.tf
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
output "ingress_dns_name" {
value = "${aws_lb.ingress.dns_name}"
description = "DNS name of the network load balancer for distributing traffic to Ingress controllers"
output "target_group_http_arn" {
description = "ARN of a target group of workers for HTTP traffic"
value = "${aws_lb_target_group.workers-http.arn}"
}

output "target_group_https_arn" {
description = "ARN of a target group of workers for HTTPS traffic"
value = "${aws_lb_target_group.workers-https.arn}"
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@ resource "aws_route53_record" "apiserver" {

# AWS recommends their special "alias" records for ELBs
alias {
name = "${aws_lb.apiserver.dns_name}"
zone_id = "${aws_lb.apiserver.zone_id}"
name = "${aws_lb.nlb.dns_name}"
zone_id = "${aws_lb.nlb.zone_id}"
evaluate_target_health = true
}
}

# Network Load Balancer for apiservers
resource "aws_lb" "apiserver" {
name = "${var.cluster_name}-apiserver"
# Network Load Balancer for apiservers and ingress
resource "aws_lb" "nlb" {
name = "${var.cluster_name}-nlb"
load_balancer_type = "network"
internal = false

Expand All @@ -24,31 +24,55 @@ resource "aws_lb" "apiserver" {
enable_cross_zone_load_balancing = true
}

# Forward TCP traffic to controllers
# Forward TCP apiserver traffic to controllers
resource "aws_lb_listener" "apiserver-https" {
load_balancer_arn = "${aws_lb.apiserver.arn}"
load_balancer_arn = "${aws_lb.nlb.arn}"
protocol = "TCP"
port = "443"
port = "6443"

default_action {
type = "forward"
target_group_arn = "${aws_lb_target_group.controllers.arn}"
}
}

# Forward HTTP ingress traffic to workers
resource "aws_lb_listener" "ingress-http" {
load_balancer_arn = "${aws_lb.nlb.arn}"
protocol = "TCP"
port = 80

default_action {
type = "forward"
target_group_arn = "${module.workers.target_group_http_arn}"
}
}

# Forward HTTPS ingress traffic to workers
resource "aws_lb_listener" "ingress-https" {
load_balancer_arn = "${aws_lb.nlb.arn}"
protocol = "TCP"
port = 443

default_action {
type = "forward"
target_group_arn = "${module.workers.target_group_https_arn}"
}
}

# Target group of controllers
resource "aws_lb_target_group" "controllers" {
name = "${var.cluster_name}-controllers"
vpc_id = "${aws_vpc.network.id}"
target_type = "instance"

protocol = "TCP"
port = 443
port = 6443

# TCP health check for apiserver
health_check {
protocol = "TCP"
port = 443
port = 6443

# NLBs required to use same healthy and unhealthy thresholds
healthy_threshold = 3
Expand All @@ -65,5 +89,5 @@ resource "aws_lb_target_group_attachment" "controllers" {

target_group_arn = "${aws_lb_target_group.controllers.arn}"
target_id = "${element(aws_instance.controllers.*.id, count.index)}"
port = 443
port = 6443
}
12 changes: 11 additions & 1 deletion aws/fedora-atomic/kubernetes/outputs.tf
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
output "ingress_dns_name" {
value = "${module.workers.ingress_dns_name}"
value = "${aws_lb.nlb.dns_name}"
description = "DNS name of the network load balancer for distributing traffic to Ingress controllers"
}

output "target_group_http_arn" {
description = "ARN of a target group of workers for HTTP traffic"
value = "${module.workers.target_group_http_arn}"
}

output "target_group_https_arn" {
description = "ARN of a target group of workers for HTTPS traffic"
value = "${module.workers.target_group_https_arn}"
}

# Outputs for worker pools

output "vpc_id" {
Expand Down
37 changes: 1 addition & 36 deletions aws/fedora-atomic/kubernetes/workers/ingress.tf
Original file line number Diff line number Diff line change
@@ -1,39 +1,4 @@
# Network Load Balancer for Ingress
resource "aws_lb" "ingress" {
name = "${var.name}-ingress"
load_balancer_type = "network"
internal = false

subnets = ["${var.subnet_ids}"]

enable_cross_zone_load_balancing = true
}

# Forward HTTP traffic to workers
resource "aws_lb_listener" "ingress-http" {
load_balancer_arn = "${aws_lb.ingress.arn}"
protocol = "TCP"
port = 80

default_action {
type = "forward"
target_group_arn = "${aws_lb_target_group.workers-http.arn}"
}
}

# Forward HTTPS traffic to workers
resource "aws_lb_listener" "ingress-https" {
load_balancer_arn = "${aws_lb.ingress.arn}"
protocol = "TCP"
port = 443

default_action {
type = "forward"
target_group_arn = "${aws_lb_target_group.workers-https.arn}"
}
}

# Network Load Balancer target groups of instances
# Target groups of instances for use with load balancers

resource "aws_lb_target_group" "workers-http" {
name = "${var.name}-workers-http"
Expand Down
11 changes: 8 additions & 3 deletions aws/fedora-atomic/kubernetes/workers/outputs.tf
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
output "ingress_dns_name" {
value = "${aws_lb.ingress.dns_name}"
description = "DNS name of the network load balancer for distributing traffic to Ingress controllers"
output "target_group_http_arn" {
description = "ARN of a target group of workers for HTTP traffic"
value = "${aws_lb_target_group.workers-http.arn}"
}

output "target_group_https_arn" {
description = "ARN of a target group of workers for HTTPS traffic"
value = "${aws_lb_target_group.workers-https.arn}"
}