Skip to content

Commit 6569044

Browse files
authored
enh: use aws-load-balancer-controller in front of ingress-nginx (#293)
1 parent 3c304ed commit 6569044

File tree

6 files changed

+166
-19
lines changed

6 files changed

+166
-19
lines changed

README.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -396,14 +396,17 @@ terragrunt destroy
396396
397397
## What to do after deployment
398398
399-
After applying this configuration, you will get the infrastructure described and outlined at the beginning of the document. In AWS and within the EKS cluster, the basic resources and services necessary for the operation of the EKS k8s cluster will be created.
399+
* After applying this configuration, you will get the infrastructure described and outlined at the beginning of the document. In AWS and within the EKS cluster, the basic resources and services necessary for the operation of the EKS k8s cluster will be created.
400400
401-
You can get access to the cluster using this command:
401+
* You can get access to the cluster using this command:
402402
403403
```bash
404404
aws eks update-kubeconfig --name maddevs-demo-use1 --region us-east-1
405405
```
406406
407+
* If you used default configuration and want to serve traffic for a main domain (example.com) by an application deployed into a k8s cluster, youn need to manually create DNS record in Route53 with type A + Alias
408+
* DNS record `*.example.com` created automatically and points to Load Balancer in front of k8s cluster.
409+
407410
## Update terraform version
408411
409412
Change terraform version in this files

docs/FAQ.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,3 +304,10 @@ kubectl delete installations.operator.tigera.io default
304304
kubectl delete ns calico-apiserver calico-system
305305
```
306306
5. Restart all nodes
307+
308+
## What if you don't want to use an aws-load-balancer controller in front of an ingress-nginx and want to use a cert-manager and terminate SSL on ingres-nginx side
309+
310+
1. Set `nginx ` for a `nginx_ingress_ssl_terminator` variable in the layer2-k8s folder
311+
2. Set `enabled: false` for `id: aws-load-balancer-controller` in the **layer2-k8s/helm-releases.yaml** file
312+
3. Set `enabled: true` for `id: external-dns`, `id: cert-manager`, `id: cert-mananger-certificate`, `id:cert-manager-cluster-issuer` in the **layer2-k8s/helm-releases.yaml** file
313+
4. Run `terraform apply` in the layer2-k8s folder

terraform/layer2-k8s/README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
| <a name="provider_kubernetes"></a> [kubernetes](#provider\_kubernetes) | 2.10.0 |
2222
| <a name="provider_random"></a> [random](#provider\_random) | 3.1.3 |
2323
| <a name="provider_terraform"></a> [terraform](#provider\_terraform) | n/a |
24+
| <a name="provider_tls"></a> [tls](#provider\_tls) | 3.3.0 |
2425

2526
## Modules
2627

@@ -58,6 +59,7 @@
5859

5960
| Name | Type |
6061
|------|------|
62+
| [aws_route53_record.default_ingress](https://registry.terraform.io/providers/aws/4.10.0/docs/resources/route53_record) | resource |
6163
| [aws_s3_bucket.elastic_stack](https://registry.terraform.io/providers/aws/4.10.0/docs/resources/s3_bucket) | resource |
6264
| [aws_s3_bucket.gitlab_runner_cache](https://registry.terraform.io/providers/aws/4.10.0/docs/resources/s3_bucket) | resource |
6365
| [aws_s3_bucket_public_access_block.elastic_stack_public_access_block](https://registry.terraform.io/providers/aws/4.10.0/docs/resources/s3_bucket_public_access_block) | resource |
@@ -86,6 +88,7 @@
8688
| [kubectl_manifest.istio_prometheus_service_monitor_cp](https://registry.terraform.io/providers/gavinbunney/kubectl/1.14.0/docs/resources/manifest) | resource |
8789
| [kubectl_manifest.istio_prometheus_service_monitor_dp](https://registry.terraform.io/providers/gavinbunney/kubectl/1.14.0/docs/resources/manifest) | resource |
8890
| [kubectl_manifest.kube_prometheus_stack_operator_crds](https://registry.terraform.io/providers/gavinbunney/kubectl/1.14.0/docs/resources/manifest) | resource |
91+
| [kubernetes_ingress_v1.default](https://registry.terraform.io/providers/kubernetes/2.10.0/docs/resources/ingress_v1) | resource |
8992
| [kubernetes_secret.elasticsearch_certificates](https://registry.terraform.io/providers/kubernetes/2.10.0/docs/resources/secret) | resource |
9093
| [kubernetes_secret.elasticsearch_credentials](https://registry.terraform.io/providers/kubernetes/2.10.0/docs/resources/secret) | resource |
9194
| [kubernetes_secret.elasticsearch_s3_user_creds](https://registry.terraform.io/providers/kubernetes/2.10.0/docs/resources/secret) | resource |
@@ -96,6 +99,11 @@
9699
| [random_string.kibana_password](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/string) | resource |
97100
| [random_string.kube_prometheus_stack_grafana_password](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/string) | resource |
98101
| [random_string.victoria_metrics_k8s_stack_grafana_password](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/string) | resource |
102+
| [tls_cert_request.aws_loadbalancer_controller_webhook](https://registry.terraform.io/providers/hashicorp/tls/latest/docs/resources/cert_request) | resource |
103+
| [tls_locally_signed_cert.aws_loadbalancer_controller_webhook](https://registry.terraform.io/providers/hashicorp/tls/latest/docs/resources/locally_signed_cert) | resource |
104+
| [tls_private_key.aws_loadbalancer_controller_webhook](https://registry.terraform.io/providers/hashicorp/tls/latest/docs/resources/private_key) | resource |
105+
| [tls_private_key.aws_loadbalancer_controller_webhook_ca](https://registry.terraform.io/providers/hashicorp/tls/latest/docs/resources/private_key) | resource |
106+
| [tls_self_signed_cert.aws_loadbalancer_controller_webhook_ca](https://registry.terraform.io/providers/hashicorp/tls/latest/docs/resources/self_signed_cert) | resource |
99107
| [aws_caller_identity.current](https://registry.terraform.io/providers/aws/4.10.0/docs/data-sources/caller_identity) | data source |
100108
| [aws_eks_cluster.main](https://registry.terraform.io/providers/aws/4.10.0/docs/data-sources/eks_cluster) | data source |
101109
| [aws_eks_cluster_auth.main](https://registry.terraform.io/providers/aws/4.10.0/docs/data-sources/eks_cluster_auth) | data source |

terraform/layer2-k8s/eks-aws-loadbalancer-controller.tf

Lines changed: 139 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ locals {
77
chart_version = local.helm_releases[index(local.helm_releases.*.id, "aws-load-balancer-controller")].chart_version
88
namespace = local.helm_releases[index(local.helm_releases.*.id, "aws-load-balancer-controller")].namespace
99
}
10-
aws_load_balancer_controller_values = <<VALUES
10+
ssl_certificate_arn = data.terraform_remote_state.layer1-aws.outputs.ssl_certificate_arn
11+
aws_load_balancer_controller_webhook_service_name = "${local.aws_load_balancer_controller.name}-webhook-service"
12+
aws_load_balancer_controller_values = <<VALUES
13+
nameOverride: ${local.aws_load_balancer_controller.name}
1114
clusterName: ${local.eks_cluster_id}
1215
region: ${local.region}
1316
vpcId: ${local.vpc_id}
@@ -115,12 +118,24 @@ module "aws_iam_aws_loadbalancer_controller" {
115118
{
116119
"Effect" : "Allow",
117120
"Action" : [
118-
"iam:CreateServiceLinkedRole",
121+
"iam:CreateServiceLinkedRole"
122+
],
123+
"Resource" : "*",
124+
"Condition" : {
125+
"StringEquals" : {
126+
"iam:AWSServiceName" : "elasticloadbalancing.amazonaws.com"
127+
}
128+
}
129+
},
130+
{
131+
"Effect" : "Allow",
132+
"Action" : [
119133
"ec2:DescribeAccountAttributes",
120134
"ec2:DescribeAddresses",
121135
"ec2:DescribeAvailabilityZones",
122136
"ec2:DescribeInternetGateways",
123137
"ec2:DescribeVpcs",
138+
"ec2:DescribeVpcPeeringConnections",
124139
"ec2:DescribeSubnets",
125140
"ec2:DescribeSecurityGroups",
126141
"ec2:DescribeInstances",
@@ -318,6 +333,62 @@ module "aws_iam_aws_loadbalancer_controller" {
318333
})
319334
}
320335

336+
resource "tls_private_key" "aws_loadbalancer_controller_webhook_ca" {
337+
count = local.aws_load_balancer_controller.enabled ? 1 : 0
338+
339+
algorithm = "RSA"
340+
}
341+
342+
resource "tls_self_signed_cert" "aws_loadbalancer_controller_webhook_ca" {
343+
count = local.aws_load_balancer_controller.enabled ? 1 : 0
344+
345+
private_key_pem = tls_private_key.aws_loadbalancer_controller_webhook_ca[count.index].private_key_pem
346+
validity_period_hours = 87600 # 10 years
347+
early_renewal_hours = 8760 # 1 year
348+
is_ca_certificate = true
349+
allowed_uses = [
350+
"cert_signing",
351+
"key_encipherment",
352+
"digital_signature"
353+
]
354+
subject {
355+
common_name = local.aws_load_balancer_controller_webhook_service_name
356+
organization = local.name
357+
}
358+
}
359+
360+
resource "tls_private_key" "aws_loadbalancer_controller_webhook" {
361+
count = local.aws_load_balancer_controller.enabled ? 1 : 0
362+
363+
algorithm = "RSA"
364+
}
365+
366+
resource "tls_cert_request" "aws_loadbalancer_controller_webhook" {
367+
count = local.aws_load_balancer_controller.enabled ? 1 : 0
368+
369+
private_key_pem = tls_private_key.aws_loadbalancer_controller_webhook[count.index].private_key_pem
370+
dns_names = ["${local.aws_load_balancer_controller_webhook_service_name}.${module.aws_load_balancer_controller_namespace[count.index].name}", "${local.aws_load_balancer_controller_webhook_service_name}.${module.aws_load_balancer_controller_namespace[count.index].name}.svc", "${local.aws_load_balancer_controller_webhook_service_name}.${module.aws_load_balancer_controller_namespace[count.index].name}.svc.cluster.local"]
371+
subject {
372+
common_name = local.aws_load_balancer_controller_webhook_service_name
373+
organization = local.name
374+
}
375+
}
376+
377+
resource "tls_locally_signed_cert" "aws_loadbalancer_controller_webhook" {
378+
count = local.aws_load_balancer_controller.enabled ? 1 : 0
379+
380+
cert_request_pem = tls_cert_request.aws_loadbalancer_controller_webhook[count.index].cert_request_pem
381+
ca_private_key_pem = tls_private_key.aws_loadbalancer_controller_webhook_ca[count.index].private_key_pem
382+
ca_cert_pem = tls_self_signed_cert.aws_loadbalancer_controller_webhook_ca[count.index].cert_pem
383+
384+
validity_period_hours = 87600 # 10 years
385+
early_renewal_hours = 8760 # 1 year
386+
allowed_uses = [
387+
"key_encipherment",
388+
"digital_signature"
389+
]
390+
}
391+
321392
resource "helm_release" "aws_loadbalancer_controller" {
322393
count = local.aws_load_balancer_controller.enabled ? 1 : 0
323394

@@ -331,5 +402,71 @@ resource "helm_release" "aws_loadbalancer_controller" {
331402
values = [
332403
local.aws_load_balancer_controller_values
333404
]
405+
set {
406+
name = "webhookTLS.caCert"
407+
value = tls_self_signed_cert.aws_loadbalancer_controller_webhook_ca[0].cert_pem
408+
}
409+
set {
410+
name = "webhookTLS.cert"
411+
value = tls_locally_signed_cert.aws_loadbalancer_controller_webhook[0].cert_pem
412+
}
413+
set {
414+
name = "webhookTLS.key"
415+
value = tls_private_key.aws_loadbalancer_controller_webhook[0].private_key_pem
416+
}
417+
}
418+
419+
resource "kubernetes_ingress_v1" "default" {
420+
count = local.aws_load_balancer_controller.enabled && local.ingress_nginx.enabled && var.nginx_ingress_ssl_terminator == "lb" ? 1 : 0
421+
422+
metadata {
423+
name = "${local.ingress_nginx.name}-controller"
424+
annotations = {
425+
"kubernetes.io/ingress.class" = "alb"
426+
"alb.ingress.kubernetes.io/scheme" = "internet-facing"
427+
"alb.ingress.kubernetes.io/tags" = "Environment=${local.env},Name=${local.name},Cluster=${local.eks_cluster_id}"
428+
"alb.ingress.kubernetes.io/certificate-arn" = "${local.ssl_certificate_arn}"
429+
"alb.ingress.kubernetes.io/ssl-policy" = "ELBSecurityPolicy-FS-1-2-Res-2019-08"
430+
"alb.ingress.kubernetes.io/listen-ports" = "[{\"HTTP\": 80}, {\"HTTPS\": 443}]"
431+
"alb.ingress.kubernetes.io/target-type" = "ip"
432+
"alb.ingress.kubernetes.io/load-balancer-attributes" = "routing.http2.enabled=true"
433+
"alb.ingress.kubernetes.io/ssl-redirect" = "443"
434+
}
435+
namespace = module.ingress_nginx_namespace[count.index].name
436+
}
437+
spec {
438+
rule {
439+
http {
440+
path {
441+
path = "/*"
442+
backend {
443+
service {
444+
name = "${local.ingress_nginx.name}-controller"
445+
port {
446+
number = 80
447+
}
448+
}
449+
}
450+
}
451+
}
452+
}
453+
}
454+
wait_for_load_balancer = true
455+
456+
depends_on = [helm_release.aws_loadbalancer_controller, helm_release.ingress_nginx, module.aws_iam_aws_loadbalancer_controller, tls_locally_signed_cert.aws_loadbalancer_controller_webhook]
457+
}
458+
459+
resource "aws_route53_record" "default_ingress" {
460+
count = local.aws_load_balancer_controller.enabled && local.ingress_nginx.enabled && var.nginx_ingress_ssl_terminator == "lb" ? 1 : 0
334461

462+
zone_id = local.zone_id
463+
name = "*.${local.domain_name}"
464+
type = "CNAME"
465+
ttl = 360
466+
467+
records = [kubernetes_ingress_v1.default[count.index].status.0.load_balancer.0.ingress.0.hostname]
468+
469+
depends_on = [
470+
kubernetes_ingress_v1.default
471+
]
335472
}

terraform/layer2-k8s/eks-ingress-nginx-controller.tf

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ locals {
77
chart_version = local.helm_releases[index(local.helm_releases.*.id, "ingress-nginx")].chart_version
88
namespace = local.helm_releases[index(local.helm_releases.*.id, "ingress-nginx")].namespace
99
}
10-
ssl_certificate_arn = var.nginx_ingress_ssl_terminator == "lb" ? data.terraform_remote_state.layer1-aws.outputs.ssl_certificate_arn : "ssl-certificate"
11-
ingress_nginx_general_values = <<VALUES
10+
ingress_nginx_general_values = <<VALUES
1211
rbac:
1312
create: true
1413
controller:
@@ -27,27 +26,20 @@ controller:
2726
values:
2827
- ON_DEMAND
2928
VALUES
30-
ingress_loadbalancer_ssl_termination_values = <<VALUES
29+
ingress_nginx_and_aws_load_balancer_controller = <<VALUES
3130
controller:
3231
service:
32+
type: ClusterIP
3333
targetPorts:
3434
http: http
3535
https: http
36-
annotations:
37-
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http
38-
service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout: '60'
39-
service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https"
40-
service.beta.kubernetes.io/aws-load-balancer-ssl-cert: ${local.ssl_certificate_arn}
41-
service.beta.kubernetes.io/aws-load-balancer-ssl-negotiation-policy: ELBSecurityPolicy-TLS-1-2-2017-01
42-
external-dns.alpha.kubernetes.io/hostname: ${local.domain_name}.
4336
publishService:
4437
enabled: true
4538
config:
4639
server-tokens: "false"
4740
use-forwarded-headers: "true"
48-
set-real-ip-from: "${local.vpc_cidr}"
4941
VALUES
50-
ingress_pod_ssl_termination_values = <<VALUES
42+
ingress_pod_ssl_termination_values = <<VALUES
5143
controller:
5244
extraArgs:
5345
default-ssl-certificate: "${local.ingress_nginx.enabled ? module.ingress_nginx_namespace[0].name : "default"}/nginx-tls"
@@ -219,7 +211,7 @@ resource "helm_release" "ingress_nginx" {
219211

220212
values = [
221213
local.ingress_nginx_general_values,
222-
var.nginx_ingress_ssl_terminator == "lb" ? local.ingress_loadbalancer_ssl_termination_values : local.ingress_pod_ssl_termination_values
214+
var.nginx_ingress_ssl_terminator == "lb" ? local.ingress_nginx_and_aws_load_balancer_controller : local.ingress_pod_ssl_termination_values
223215
]
224216

225217
depends_on = [kubectl_manifest.kube_prometheus_stack_operator_crds]

terraform/layer2-k8s/helm-releases.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
releases:
22
- id: aws-load-balancer-controller
3-
enabled: false
3+
enabled: true
44
chart: aws-load-balancer-controller
55
repository: https://aws.github.io/eks-charts
66
chart_version: 1.4.1
@@ -42,7 +42,7 @@ releases:
4242
chart_version:
4343
namespace: elk
4444
- id: external-dns
45-
enabled: true
45+
enabled: false
4646
chart: external-dns
4747
repository: https://kubernetes-sigs.github.io/external-dns
4848
chart_version: 1.9.0

0 commit comments

Comments
 (0)