diff --git a/README.md b/README.md index 3f701df..239074c 100644 --- a/README.md +++ b/README.md @@ -206,8 +206,10 @@ worker_groups = { ## karpenter enabled ### NOTES: ### - enabling karpenter automatically disables cluster auto-scaler -### - then enabling karpenter on existing old cluster there is possibility to see cycle-dependency error, to overcome this you need at first to apply main eks module change (`terraform apply --target "module.<eks-module-name>.module.eks-cluster"`) and then rest of cluster-autoloader destroy and karpenter install onse +### - if vpc have been created externally(not inside this module) then you may need to set the following tags on private subnets `karpenter.sh/discovery=<cluster-name>` +### - then enabling karpenter on existing old cluster there is possibility to see cycle-dependency error, to overcome this you need at first to apply main eks module change (`terraform apply --target "module.<eks-module-name>.module.eks-cluster"`) and then rest of cluster-autoloader destroy and karpenter install ones ### - when destroying cluster which have karpenter enabled there is possibility of failure on karpenter resource removal, you need to run destruction one more time to get it complete +### - in order to be able to use spot instances you may need to create AWSServiceRoleForEC2Spot IAM role on aws account(TODO: check and create this role on account module automatically), here is the doc: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/service-linked-roles-spot-instance-requests.html , otherwise karpenter created `nodeclaim` kubernetes resource will show AuthFailure.ServiceLinkedRoleCreationNotPermitted error ```terraform module "eks" { source = "dasmeta/eks/aws" @@ -340,7 +342,7 @@ module "eks" { | <a name="input_map_roles"></a> [map\_roles](#input\_map\_roles) | Additional IAM roles to add to the aws-auth configmap. | <pre>list(object({<br> rolearn = string<br> username = string<br> groups = list(string)<br> }))</pre> | `[]` | no | | <a name="input_metrics_exporter"></a> [metrics\_exporter](#input\_metrics\_exporter) | Metrics Exporter, can use cloudwatch or adot | `string` | `"adot"` | no | | <a name="input_metrics_server_name"></a> [metrics\_server\_name](#input\_metrics\_server\_name) | n/a | `string` | `"metrics-server"` | no | -| <a name="input_nginx_ingress_controller_config"></a> [nginx\_ingress\_controller\_config](#input\_nginx\_ingress\_controller\_config) | Nginx ingress controller configs | <pre>object({<br> enabled = optional(bool, false)<br> name = optional(string, "nginx")<br> create_namespace = optional(bool, true)<br> namespace = optional(string, "ingress-nginx")<br> replicacount = optional(number, 3)<br> metrics_enabled = optional(bool, true)<br> })</pre> | <pre>{<br> "create_namespace": true,<br> "enabled": false,<br> "metrics_enabled": true,<br> "name": "nginx",<br> "namespace": "ingress-nginx",<br> "replicacount": 3<br>}</pre> | no | +| <a name="input_nginx_ingress_controller_config"></a> [nginx\_ingress\_controller\_config](#input\_nginx\_ingress\_controller\_config) | Nginx ingress controller configs | <pre>object({<br> enabled = optional(bool, false)<br> name = optional(string, "nginx")<br> create_namespace = optional(bool, true)<br> namespace = optional(string, "ingress-nginx")<br> replicacount = optional(number, 3)<br> metrics_enabled = optional(bool, true)<br> configs = optional(any, {}) # Configurations to pass and override default ones. Check the helm chart available configs here: https://artifacthub.io/packages/helm/ingress-nginx/ingress-nginx/4.12.0?modal=values<br> })</pre> | <pre>{<br> "create_namespace": true,<br> "enabled": false,<br> "metrics_enabled": true,<br> "name": "nginx",<br> "namespace": "ingress-nginx",<br> "replicacount": 3<br>}</pre> | no | | <a name="input_node_groups"></a> [node\_groups](#input\_node\_groups) | Map of EKS managed node group definitions to create | `any` | <pre>{<br> "default": {<br> "desired_size": 2,<br> "iam_role_additional_policies": [<br> "arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy"<br> ],<br> "instance_types": [<br> "t3.large"<br> ],<br> "max_size": 4,<br> "min_size": 2<br> }<br>}</pre> | no | | <a name="input_node_groups_default"></a> [node\_groups\_default](#input\_node\_groups\_default) | Map of EKS managed node group default configurations | `any` | <pre>{<br> "disk_size": 50,<br> "iam_role_additional_policies": [<br> "arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy"<br> ],<br> "instance_types": [<br> "t3.large"<br> ]<br>}</pre> | no | | <a name="input_node_security_group_additional_rules"></a> [node\_security\_group\_additional\_rules](#input\_node\_security\_group\_additional\_rules) | n/a | `any` | <pre>{<br> "ingress_cluster_10250": {<br> "description": "Metric server to node groups",<br> "from_port": 10250,<br> "protocol": "tcp",<br> "self": true,<br> "to_port": 10250,<br> "type": "ingress"<br> }<br>}</pre> | no | diff --git a/main.tf b/main.tf index cafbd8f..679af11 100644 --- a/main.tf +++ b/main.tf @@ -209,8 +209,10 @@ * ## karpenter enabled * ### NOTES: * ### - enabling karpenter automatically disables cluster auto-scaler - * ### - then enabling karpenter on existing old cluster there is possibility to see cycle-dependency error, to overcome this you need at first to apply main eks module change (`terraform apply --target "module.<eks-module-name>.module.eks-cluster"`) and then rest of cluster-autoloader destroy and karpenter install onse + * ### - if vpc have been created externally(not inside this module) then you may need to set the following tags on private subnets `karpenter.sh/discovery=<cluster-name>` + * ### - then enabling karpenter on existing old cluster there is possibility to see cycle-dependency error, to overcome this you need at first to apply main eks module change (`terraform apply --target "module.<eks-module-name>.module.eks-cluster"`) and then rest of cluster-autoloader destroy and karpenter install ones * ### - when destroying cluster which have karpenter enabled there is possibility of failure on karpenter resource removal, you need to run destruction one more time to get it complete + * ### - in order to be able to use spot instances you may need to create AWSServiceRoleForEC2Spot IAM role on aws account(TODO: check and create this role on account module automatically), here is the doc: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/service-linked-roles-spot-instance-requests.html , otherwise karpenter created `nodeclaim` kubernetes resource will show AuthFailure.ServiceLinkedRoleCreationNotPermitted error * ```terraform * module "eks" { * source = "dasmeta/eks/aws" diff --git a/modules/nginx-ingress-controller/README.md b/modules/nginx-ingress-controller/README.md index 31316b5..1371af7 100644 --- a/modules/nginx-ingress-controller/README.md +++ b/modules/nginx-ingress-controller/README.md @@ -15,7 +15,9 @@ ## Modules -No modules. +| Name | Source | Version | +|------|--------|---------| +| <a name="module_custom_default_configs_merged"></a> [custom\_default\_configs\_merged](#module\_custom\_default\_configs\_merged) | cloudposse/config/yaml//modules/deepmerge | 1.0.2 | ## Resources @@ -27,7 +29,8 @@ No modules. | Name | Description | Type | Default | Required | |------|-------------|------|---------|:--------:| -| <a name="input_chart_version"></a> [chart\_version](#input\_chart\_version) | The app chart version | `string` | `"4.11.3"` | no | +| <a name="input_chart_version"></a> [chart\_version](#input\_chart\_version) | The app chart version | `string` | `"4.12.0"` | no | +| <a name="input_configs"></a> [configs](#input\_configs) | Configurations to pass and override default ones. Check the helm chart available configs here: https://artifacthub.io/packages/helm/ingress-nginx/ingress-nginx/4.12.0?modal=values | `any` | `{}` | no | | <a name="input_create_namespace"></a> [create\_namespace](#input\_create\_namespace) | Create namespace or use existing one | `bool` | `true` | no | | <a name="input_metrics_enabled"></a> [metrics\_enabled](#input\_metrics\_enabled) | Enable metric export | `bool` | `true` | no | | <a name="input_name"></a> [name](#input\_name) | Name | `string` | `"nginx"` | no | diff --git a/modules/nginx-ingress-controller/main.tf b/modules/nginx-ingress-controller/main.tf index 210df88..44ad123 100644 --- a/modules/nginx-ingress-controller/main.tf +++ b/modules/nginx-ingress-controller/main.tf @@ -1,14 +1,44 @@ resource "helm_release" "ingress-nginx" { - name = var.name - repository = "https://kubernetes.github.io/ingress-nginx" - values = [ - templatefile("${path.module}/values.yaml.tpl", { - replicacount = var.replicacount - metrics_enabled = var.metrics_enabled - }) - ] + name = var.name + repository = "https://kubernetes.github.io/ingress-nginx" + values = [jsonencode(module.custom_default_configs_merged.merged)] chart = "ingress-nginx" namespace = var.namespace version = var.chart_version - create_namespace = true + create_namespace = var.create_namespace +} + + +module "custom_default_configs_merged" { + source = "cloudposse/config/yaml//modules/deepmerge" + version = "1.0.2" + + maps = [ + { + controller = { + config = { + use-forwarded-headers = "true" + enable-underscores-in-headers = "true" + } + replicaCount = var.replicacount + metrics = { + enabled : var.metrics_enabled + } + service = { + annotations = { + "service.beta.kubernetes.io/aws-load-balancer-scheme" = "internet-facing" + } + } + } + }, + var.metrics_enabled ? { + controller = { + podAnnotations = { + "prometheus.io/scrape" = true + "prometheus.io/port" = 10254 + } + } + } : {}, + var.configs + ] } diff --git a/modules/nginx-ingress-controller/values.yaml.tpl b/modules/nginx-ingress-controller/values.yaml.tpl deleted file mode 100644 index 483682e..0000000 --- a/modules/nginx-ingress-controller/values.yaml.tpl +++ /dev/null @@ -1,13 +0,0 @@ -controller: - config: - use-forwarded-headers: "true" - enable-underscores-in-headers: 'true' - replicaCount: ${replicacount} -%{ if metrics_enabled ~} - podAnnotations: - prometheus.io/scrape: true - prometheus.io/port: 10254 -%{ endif ~} - - metrics: - enabled: ${metrics_enabled} diff --git a/modules/nginx-ingress-controller/variables.tf b/modules/nginx-ingress-controller/variables.tf index db2a755..5a82942 100644 --- a/modules/nginx-ingress-controller/variables.tf +++ b/modules/nginx-ingress-controller/variables.tf @@ -12,7 +12,7 @@ variable "namespace" { variable "chart_version" { type = string - default = "4.11.3" + default = "4.12.0" description = "The app chart version" } @@ -33,3 +33,9 @@ variable "metrics_enabled" { default = true description = "Enable metric export" } + +variable "configs" { + type = any + default = {} + description = "Configurations to pass and override default ones. Check the helm chart available configs here: https://artifacthub.io/packages/helm/ingress-nginx/ingress-nginx/4.12.0?modal=values" +} diff --git a/nginx-ingress-controller.tf b/nginx-ingress-controller.tf index c732a43..271cfbb 100644 --- a/nginx-ingress-controller.tf +++ b/nginx-ingress-controller.tf @@ -8,4 +8,5 @@ module "nginx-ingress-controller" { namespace = var.nginx_ingress_controller_config.namespace replicacount = var.nginx_ingress_controller_config.replicacount metrics_enabled = var.nginx_ingress_controller_config.metrics_enabled + configs = var.nginx_ingress_controller_config.configs } diff --git a/variables.tf b/variables.tf index 469a033..5aed19c 100644 --- a/variables.tf +++ b/variables.tf @@ -334,6 +334,7 @@ variable "nginx_ingress_controller_config" { namespace = optional(string, "ingress-nginx") replicacount = optional(number, 3) metrics_enabled = optional(bool, true) + configs = optional(any, {}) # Configurations to pass and override default ones. Check the helm chart available configs here: https://artifacthub.io/packages/helm/ingress-nginx/ingress-nginx/4.12.0?modal=values }) default = {