Skip to content

Instantly share code, notes, and snippets.

@imranismail
Last active August 24, 2023 11:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save imranismail/6246c32d38888c77b8becd0b04587970 to your computer and use it in GitHub Desktop.
Save imranismail/6246c32d38888c77b8becd0b04587970 to your computer and use it in GitHub Desktop.
Using Kustomize with Terraform
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: nginx
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 8080
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
resource "terraform_data" "kustomize" {
triggers_replace = timestamp()
provisioner "local-exec" {
command = "mkdir -p ${path.module}/.terraform/tmp"
}
provisioner "local-exec" {
command = "kustomize build ${path.module} > ${path.module}/.terraform/tmp/manifests.yaml"
}
}
data "local_file" "manifests" {
depends_on = [terraform_data.kustomize]
filename = "${path.module}/.terraform/tmp/manifests.yaml"
}
locals {
manifests = {
for manifest in [
for doc in split(
"---", data.local_file.manifests.content
) :
yamldecode(doc)
if doc != ""
] :
join("/", [for part in [manifest.apiVersion, manifest.kind, try(manifest.metadata.namespace, ""), manifest.metadata.name] : part if part != ""]) => manifest
}
}
resource "kubernetes_manifest" "this" {
for_each = local.manifests
manifest = each.value
}
apiVersion: v1
kind: Service
metadata:
name: myapp
spec:
selector:
app: myapp
ports:
- port: 8080
targetPort: 8080
@imranismail
Copy link
Author

imranismail commented Aug 15, 2023

This is an attempt to use Kustomize with Terraform along with dealing with a yaml stream that is generated by Kustomize.

Tested with terraform = "~> 1.5"

The kubernetes_manifest resource name will be according to K8S standard of kubernetes_manifest.this["apps/v1/Deployment/envoy/envoy-control-plane"]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment