Skip to content

project-octal/terraform-kubernetes-traefik

Repository files navigation

Project Octal: Traefik

Simplifies the deployment and management of Traefik on a Kubernetes cluster.

TODO:

  • Update the list of loadbalancer annotations to ignore so to check which cloud this is being deployed for.
  • Add support for newer Traefik releases

v0.0.2 to v1.0.0 Upgrade

# Import the Traefik dashboard if one was deployed
terraform import -var-file=secrets.tfvars \
'module.traefik.kubernetes_manifest.dashboard_ingress_route[0]' \
"apiVersion=traefik.containo.us/v1alpha1,kind=IngressRoute,namespace=kube-traefik,name=traefik-dashboard"

# Import the Traefik IngressClass
terraform import -var-file=secrets.tfvars \
'module.traefik.kubernetes_manifest.ingress_class' \
"apiVersion=networking.k8s.io/v1,kind=IngressClass,name=traefik"

# Import the Traefik Ingress Route CRD
terraform import -var-file=secrets.tfvars \
'module.traefik.kubernetes_manifest.ingress_route' \
"apiVersion=apiextensions.k8s.io/v1,kind=CustomResourceDefinition,name=ingressroutes.traefik.containo.us"

# Import the Traefik Ingress TCP Route CRD
terraform import -var-file=secrets.tfvars \
'module.traefik.kubernetes_manifest.ingress_route_tcp' \
"apiVersion=apiextensions.k8s.io/v1,kind=CustomResourceDefinition,name=ingressroutetcps.traefik.containo.us"

# Import the Traefik Ingress UDP Route CRD
terraform import -var-file=secrets.tfvars \
'module.traefik.kubernetes_manifest.ingress_route_udp' \
"apiVersion=apiextensions.k8s.io/v1,kind=CustomResourceDefinition,name=ingressrouteudps.traefik.containo.us"

# Import the Traefik Ingress Middleware CRD
terraform import -var-file=secrets.tfvars \
'module.traefik.kubernetes_manifest.middlewares' \
"apiVersion=apiextensions.k8s.io/v1,kind=CustomResourceDefinition,name=middlewares.traefik.containo.us"

# Import the Traefik Server Transports CRD
terraform import -var-file=secrets.tfvars \
'module.traefik.kubernetes_manifest.server_transports' \
"apiVersion=apiextensions.k8s.io/v1,kind=CustomResourceDefinition,name=serverstransports.traefik.containo.us"

# Import the Traefik TLS Options CRD
terraform import -var-file=secrets.tfvars \
'module.traefik.kubernetes_manifest.tls_options' \
"apiVersion=apiextensions.k8s.io/v1,kind=CustomResourceDefinition,name=tlsoptions.traefik.containo.us"

# Import the Traefik TLS Stores CRD
terraform import -var-file=secrets.tfvars \
'module.traefik.kubernetes_manifest.tls_stores' \
"apiVersion=apiextensions.k8s.io/v1,kind=CustomResourceDefinition,name=tlsstores.traefik.containo.us"

# Import the Traefik Services CRD
terraform import -var-file=secrets.tfvars \
'module.traefik.kubernetes_manifest.traefik_services' \
"apiVersion=apiextensions.k8s.io/v1,kind=CustomResourceDefinition,name=traefikservices.traefik.containo.us"

# Delete the state reference to the old k8s_manifest objects
terraform state rm 'module.traefik.k8s_manifest.dashboard_ingress_route[0]'
terraform state rm 'module.traefik.k8s_manifest.ingress_class'
terraform state rm 'module.traefik.k8s_manifest.ingress_route'
terraform state rm 'module.traefik.k8s_manifest.ingress_route_tcp'
terraform state rm 'module.traefik.k8s_manifest.ingress_route_udp'
terraform state rm 'module.traefik.k8s_manifest.middlewares'
terraform state rm 'module.traefik.k8s_manifest.server_transports'
terraform state rm 'module.traefik.k8s_manifest.tls_options'
terraform state rm 'module.traefik.k8s_manifest.tls_stores'
terraform state rm 'module.traefik.k8s_manifest.traefik_services'

# Lastly, run a Terraform apply to make sure the states are synced up.
terraform apply -var-file secrets.tfvars

Requirements

Name Version
terraform >= 0.14.8, < 2.0.0
kubernetes >= 2.8.0

Providers

Name Version
kubernetes 2.11.0
random 3.3.1

Modules

No modules.

Resources

Name Type
kubernetes_cluster_role.cluster_role resource
kubernetes_cluster_role_binding.cluster_role_binding resource
kubernetes_deployment.deployment resource
kubernetes_manifest.dashboard_ingress_route resource
kubernetes_manifest.ingress_class resource
kubernetes_manifest.ingress_route resource
kubernetes_manifest.ingress_route_tcp resource
kubernetes_manifest.ingress_route_udp resource
kubernetes_manifest.middlewares resource
kubernetes_manifest.middlewares_tcp resource
kubernetes_manifest.server_transports resource
kubernetes_manifest.tls_options resource
kubernetes_manifest.tls_stores resource
kubernetes_manifest.traefik_services resource
kubernetes_namespace.namespace resource
kubernetes_service.service resource
kubernetes_service_account.service_account resource
random_pet.instance_name resource

Inputs

Name Description Type Default Required
access_logs Determines whether access logs will be kept. bool "true" no
annotations Additional Traefik namespace annotations (e.g. for linkerd.io/inject: enabled for mesh things) map(string) {} no
dashboard_ingress_host The Traefik dashboard ingress host string null no
enable_dashboard Set to true to enable the Traefik dashboard string true no
image_name The image to use when deploying Traefik string "library/traefik" no
image_pull_policy Determines when the image should be pulled prior to starting the container. Always: Always pull the image. | IfNotPresent: Only pull the image if it does not already exist on the node. | Never: Never pull the image string "Always" no
image_repository The image repository to use when pulling images string "registry.hub.docker.com" no
image_tag The version of Traefik to deploy string "2.7.1" no
ingress_class_default Set to true to make the ingress class of this Traefik instance the default. bool true no
ingress_class_name The name of the Traefik ingress class string "traefik" no
labels (optional) A map that consists of any additional labels that should be included with resources created by this module. map(string) {} no
log_level (optional) The level at Traefik should be logging at. Options are INFO, DEBUG, and TRACE. string "INFO" no
namespace (optional) The name given to the namespace in which Traefik will reside. string "kube-traefik" no
pod_termination_grace_period_seconds n/a number 60 no
preferred_node_selector A list of objects that define preferredDuringSchedulingIgnoredDuringExecution for this deployment
list(object({
weight = number,
key = string,
operator = string,
values = list(string)
}))
[] no
replicas n/a number 2 no
resource_limits Resource limits for the Traefik deployment pods
object({
cpu = string,
memory = string
})
{
"cpu": null,
"memory": null
}
no
resource_requests Resource requests for the Traefik deployment pods
object({
cpu = string,
memory = string
})
{
"cpu": null,
"memory": null
}
no
rolling_update_max_surge n/a number 1 no
rolling_update_max_unavailable n/a number 1 no
service_annotations Additional Traefik service annotations (e.g. service.beta.kubernetes.io/aws-load-balancer-type: external) map(string) {} no
service_type The type used for this deployments service. string "LoadBalancer" no

Outputs

Name Description
ingress_class n/a

About

Simplifies the deployment and management of Traefik on a Kubernetes cluster.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

  •  
  •  

Languages