Module deploys Ingress Nginx and Cert Manager into a Kubernetes cluster via Helm. Creates Let's Encrypt ClusterIssuers for ACME servers:
staging - to test Let's Encrypt cert generation via Staging server of LEproduction - uses production Let's Encrypt CA server (with limited rate of certificate generation requests)Once you have a Corewide Solutions Portal account, this one-time action will use your browser session to retrieve credentials:
shellterraform login solutions.corewide.com
Initialize mandatory providers:
Copy and paste into your Terraform configuration and insert the variables:
hclmodule "tf_k8s_ingress_nginx" {
source = "solutions.corewide.com/kubernetes/tf-k8s-ingress-nginx/helm"
version = "~> 1.2.1"
# specify module inputs here or try one of the examples below
...
}
Initialize the setup:
shellterraform init
Corewide DevOps team strictly follows Semantic Versioning
Specification
to
provide our clients with products that have predictable upgrades between versions. We
recommend
pinning
patch versions of our modules using pessimistic
constraint operator (~>) to prevent breaking changes during upgrades.
To get new features during the upgrades (without breaking compatibility), use
~> 1.2 and run
terraform init -upgrade
For the safest setup, use strict pinning with version = "1.2.1"
|
Module
45% off
|
€280
|
| TOTAL | €500 |
| tf-k8s-cert-manager | €180 |
| tf-k8s-crd | €50 |
Module deploys Ingress Nginx and Cert Manager into a Kubernetes cluster via Helm. Creates Let's Encrypt ClusterIssuers for ACME servers:
staging - to test Let's Encrypt cert generation via Staging server of LEproduction - uses production Let's Encrypt CA server (with limited rate of certificate generation requests)All notable changes to this project are documented here.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
chart_version parameter for the ingress_nginx variable to control the version of Ingress Nginx Helm charttf-k8s-cert-manager module dependency from 2.0 to 2.12026.6.28 to 2026.7.20cert_manager.version variable in favor of cert_manager.chart_version and will be deleted in v6.5ingress_nginx.version variable in favor of ingress_nginx.chart_version and will be deleted in v6.52026.1.1 and newer)forkline/ingress-nginx to keep Ingress Nginx controller usage in strict maintenance mode with dependency updates and security patches2026.6.28tf-k8s-cert-manager module dependency from 1.1 to 2.03.13.04.15.1ingress_nginx_hostname and ingress_nginx_ip output resources deprecated in version 5.2custom_values argument of the nginx_ingress variable deprecated in version 5.6 and the corresponding validation block in favour of the values_override(Last version compatible with Helm and Kubernetes Terraform providers version 2.0)
ingress_nginx.enable_json_log_format variable to enable JSON-formatted logsingress_nginx.values_override to allow passing custom values as Terraform map. Will supersede custom_values in the next major releasecustom_values argument of the nginx_ingress in favour of values_override and will be deleted in the next major releaseingress_nginx.ingress_class_name variableingress_nginx.version variable (compatible Helm chart version is 4.12.0 and newer)4.6.1 to 4.12.1) to align with latest fixes of Ingress Nginx vulnerabilitiesingress_class outputService in the data source making the module return an incorrect external IP address in the outputk8s_flavor variableingressClass name (ingress_class)ingress_nginx_ip output to ingress_ipingress_nginx_hostname output to ingress_hostnameingress_nginx_ip output in favour of ingress_ip and will be deleted in v6.0ingress_nginx_hostname output in favour of ingress_hostname and will be deleted in v6.0helm_timeout parameter for ingress_nginx variable to configure deployment timeout of its Helm releaseBREAKING CHANGE: now cert-manager setup is managed by the child module and Ingress Nginx deployment is mandatory
acme_email variable for cert-manager configurationvar.ingress_nginx.enabled parametertf-k8s-crd module dependency to ~> 2.04.0.18 to 4.6.1) versionBREAKING CHANGE: now all custom_values are declared as lists of objects which aren't compatible with previous version
k8s_flavor variableBREAKING CHANGE: now all kubernetes provider resources use versioned resources which aren't compatible with previous version
tf-k8s-crd module dependencyClusterIssuer custom resources use CRD TF moduleingress_nginx variablegavinbunney/kubectl provider dependencyBREAKING CHANGE: now module inputs and resources management have fundamentally new concept which isn't compatible with previous version
moved blocks to ensure reverse compatibility1.3ingress_* and certmanager_* separate variables into two ingress and cert-manager object variables that contain all related elementskubernetes_manifest calls for each cluser issuer into onekubernetes provider resourcesatomic nowtemplatefile function is used instead of template data sourcestemplate providerv2.x to v3.xNow all kubernetes provider resources use versioned resources. According to kubernetes provider's suggestions the simplest, non-destructive way to do this is to remove the old resource from state and import the resource as a version one. If Kubernetes namespaces were managed by the module, they must be re-imported, like so:
bashterraform state rm module.ingress.kubernetes_namespace.ingress_namespace[0] module.ingress.kubernetes_namespace.certmanager_namespace[0]
terraform import module.ingress.kubernetes_namespace_v1.ingress_namespace[0] ingress-nginx
terraform import module.ingress.kubernetes_namespace_v1.certmanager_namespace[0] cert-manager
terraform state mv 'module.ingress.kubectl_manifest.cluster_issuer["letsencrypt"]' 'module.ingress.module.cluster_issuer["letsencrypt"].kubectl_manifest.crd'
terraform state mv 'module.ingress.kubectl_manifest.cluster_issuer["letsencrypt-staging"]' 'module.ingress.module.cluster_issuer["letsencrypt-staging"].kubectl_manifest.crd'
terraform state mv 'module.ingress.kubectl_manifest.cluster_issuer["selfsigned"]' 'module.ingress.module.cluster_issuer["selfsigned"].kubectl_manifest.crd'
v3.x to v4.xNow all custom_values are declared as lists of objects. In case if there were already declared custom_values in the module inputs, then they must be updated:
hcl # Old definition | # New definition
custom_values = { | custom_values = [
"controller.containerPort" = 8080 | {
} | name = "controller.containerPort"
| value = 8080
| },
| ]
If there weren't any custom_values declared (neither for Ingress Nginx nor cert-manager), no actions are needed.
v4.x to v5.xNow cert-manager setup is managed by the child module. cert-manager resource addresses will be moved automatically with moved blocks. Ingress Nginx deployment is mandatory now. Manual removal of the input variable var.ingress_nginx.enabled is mandatory. Variable var.cert_manager.acme_email must be changed to the var.acme_email.
v5.x to v6.xModule from v6.0 has several management changes that require attention:
ingress_nginx.custom_values:hcl
module "ingress" {
...
ingress_nginx = {
...
custom_values = [
{
name = "controller.metrics.serviceMonitor.additionalLabels.app\\.kubernetes\\.io/name"
value = "ingress"
},
]
}
}
to the new ingress_nginx.values_override variable with the new format:
hcl
module "ingress" {
...
ingress_nginx = {
...
values_override = {
controller = {
metrics = {
serviceMonitor = {
additionalLabels = {
"app.kubernetes.io/name" = "ingress"
}
}
}
}
}
}
}
Updated version of the tf-k8s-cert-manager module dependency from 1.1 to 2.0. custom_values parameter might require update, for reference see to the changelog and upgrade notes of the tf-k8s-cert-manager module.
Changed Kubernetes and Helm Terraform providers versions, which aren't compatible with older versions. After the module version is upgraded, re-init the module to upgrade the providers versions. Upgrade the provider versions on the project level:
```hcl
terraform {
required_providers {
helm = {
source = "hashicorp/helm"
version = "~> 3.1"
}
text kubernetes = {
source = "hashicorp/kubernetes"
version = "~> 3.0"
}
}
}
```
Upgrade project dependencies:
bash
terraform init --upgrade
Update the declaration of the module according to the requirements and examples to match the designed configuration, then the configuration can be applied.
Apply the changes to make sure the state of the resources is up-to-date with the new provider version:
bashterraform apply
v6.0.x to v6.1.xModule from v6.1 has changed Ingress Nginx Helm chart repository to the forkline/ingress-nginx to keep Ingress Nginx controller usage in strict maintenance mode with dependency updates and security patches.
Fork Helm chart relies on the own repository and uses date based version tags - YYYY.MM.DD. Ingress Nginx default Helm chart version is set to 2026.6.28.
Update the ingress_nginx.version to set compatible release version if the specific Ingress Nginx Helm chart version was set; or don't set the ingress_nginx.version input parameter to use the default value.
v6.1.x to v6.2.xModule from v6.2 has several adjustments that require attention:
Ingress Nginx default Helm chart version is updated to 2026.7.20. You can skip this chapter if you have already used Ingress Nginx Helm chart version 2026.7.20 or newer
Updated version of the tf-k8s-cert-manager module dependency from 2.0 to 2.1. Refer to the changelog and upgrade notes of the tf-k8s-cert-manager module
cert-manager Helm chart default version is updated to 1.21.0. You can skip this chapter if you have already used cert-manager Helm chart version 1.21.0 or newer
Update the declaration of the module according to the requirements and examples to match the designed configuration.
Now the configuration can be applied:
bashterraform apply
hclmodule "ingress" {
source = "solutions.corewide.com/kubernetes/tf-k8s-ingress-nginx/helm"
version = "~> 1.2"
certmanager_acme_email = "[email protected]"
# Example of complex value name syntax.
ingress_custom_values = {
"controller.metrics.serviceMonitor.additionalLabels\\.app\\.kubernetes\\.io/name" = "ingress",
}
}
| Variable | Description | Type | Default | Required | Sensitive |
|---|---|---|---|---|---|
certmanager_acme_email |
E-mail that Let's Encrypt cluster issuer will use to request certificates | string |
yes | no | |
k8s_flavor |
Name of managed Kubernetes to enable cloud-specific adjustments | string |
yes | no | |
certmanager_create_namespace |
Indicates creation of dedicated namespace for Cert Manager deployment | bool |
true |
no | no |
certmanager_custom_values |
Custom values for Cert Manager Helm chart | map(any) |
{} |
no | no |
certmanager_enable_metrics |
Enable Prometheus metrics of Cert Manager | bool |
true |
no | no |
certmanager_name |
Name to override Cert Manager release name | string |
cert-manager |
no | no |
certmanager_namespace |
Namespace to install Cert Manager into | string |
cert-manager |
no | no |
certmanager_version |
Version of Cert Manager Helm chart | string |
v1.7.1 |
no | no |
ingress_create_namespace |
Indicates creation of dedicated namespace for Ingress Nginx deployment | bool |
true |
no | no |
ingress_custom_values |
Custom values for Ingress Nginx Helm chart | map(any) |
{} |
no | no |
ingress_enable_metrics |
Enable Prometheus metrics of Ingress Nginx | bool |
true |
no | no |
ingress_name |
Name to override Ingress Nginx release name | string |
ingress-nginx |
no | no |
ingress_namespace |
Namespace to install Ingress Nginx into | string |
ingress-nginx |
no | no |
ingress_version |
Version of Ingress Nginx Helm chart | string |
4.0.18 |
no | no |
| Output | Description | Type | Sensitive |
|---|---|---|---|
ingress_hostname |
Hostname of Ingress Nginx | attribute |
no |
ingress_ip |
External IP of Ingress Nginx | attribute |
no |
| Dependency | Version | Kind |
|---|---|---|
terraform |
>= 1.0 |
CLI |
gavinbunney/kubectl |
~> 1.13 |
provider |
hashicorp/helm |
~> 2.5 |
provider |
hashicorp/kubernetes |
~> 2.9 |
provider |