A tool for converting Kubernetes YAML manifests to Terraform HCL
Go
1,058
77 commits
updated Jan 17, 2024

tfk8s is a tool that makes it easier to work with the Terraform Kubernetes Provider.
If you want to copy examples from the Kubernetes documentation or migrate existing YAML manifests and use them with Terraform without having to convert YAML to HCL by hand, this tool is for you.
kubectl get $R -o yaml | tfk8s --stripgo install github.com/jrhouston/tfk8s@latest
Alternatively, clone this repo and run:
make install
If Go's bin directory is not in your PATH you will need to add it:
export PATH=$PATH:$(go env GOPATH)/bin
Or you can install via brew for macOS/Linux:
brew install tfk8s
On macOS, you can also install via MacPorts:
sudo port install tfk8s
Usage of tfk8s:
-f, --file string Input file containing Kubernetes YAML manifests (default "-")
-M, --map-only Output only an HCL map structure
-o, --output string Output file to write Terraform config (default "-")
-p, --provider provider Provider alias to populate the provider attribute
-s, --strip Strip out server side fields - use if you are piping from kubectl get
-Q, --strip-key-quotes Strip out quotes from HCL map keys unless they are required.
-V, --version Show tool version
tfk8s -f input.yaml -o output.tf
or, using pipes:
cat input.yaml | tfk8s > output.tf
input.yaml:
---
apiVersion: v1
kind: ConfigMap
metadata:
name: test
data:
TEST: test
✨✨ magically becomes ✨✨
output.tf:
resource "kubernetes_manifest" "configmap_test" {
manifest = {
"apiVersion" = "v1"
"data" = {
"TEST" = "test"
}
"kind" = "ConfigMap"
"metadata" = {
"name" = "test"
}
}
}
kubectl get ns default -o yaml | tfk8s -M
{
"apiVersion" = "v1"
"kind" = "Namespace"
"metadata" = {
"creationTimestamp" = "2020-05-02T15:01:32Z"
"name" = "default"
"resourceVersion" = "147"
"selfLink" = "/api/v1/namespaces/default"
"uid" = "6ac3424c-07a4-4a69-86ae-cc7a4ae72be3"
}
"spec" = {
"finalizers" = [
"kubernetes",
]
}
"status" = {
"phase" = "Active"
}
}
You can use helm template to generate a manifest from the chart, then pipe it into tfk8s:
helm template ./chart-path -f values.yaml | tfk8s
You can use tfk8s in conjunction with find to convert an entire directory recursively:
find dirname/ -name '*.yaml' -type f -exec sh -c 'tfk8s -f {} -o $(echo {} | sed "s/\.[^.]*$//").tf' \;
Overall
Maintained
Code review
Go module
Latest release
Releases this year
341 followers · starred Jul 2023
329 followers · starred Apr 2021
407 followers · starred Dec 2022
723 followers · starred Jul 2022
A tool for converting Kubernetes YAML manifests to Terraform HCL
Go
1,058
77 commits
updated Jan 17, 2024

tfk8s is a tool that makes it easier to work with the Terraform Kubernetes Provider.
If you want to copy examples from the Kubernetes documentation or migrate existing YAML manifests and use them with Terraform without having to convert YAML to HCL by hand, this tool is for you.
kubectl get $R -o yaml | tfk8s --stripgo install github.com/jrhouston/tfk8s@latest
Alternatively, clone this repo and run:
make install
If Go's bin directory is not in your PATH you will need to add it:
export PATH=$PATH:$(go env GOPATH)/bin
Or you can install via brew for macOS/Linux:
brew install tfk8s
On macOS, you can also install via MacPorts:
sudo port install tfk8s
Usage of tfk8s:
-f, --file string Input file containing Kubernetes YAML manifests (default "-")
-M, --map-only Output only an HCL map structure
-o, --output string Output file to write Terraform config (default "-")
-p, --provider provider Provider alias to populate the provider attribute
-s, --strip Strip out server side fields - use if you are piping from kubectl get
-Q, --strip-key-quotes Strip out quotes from HCL map keys unless they are required.
-V, --version Show tool version
tfk8s -f input.yaml -o output.tf
or, using pipes:
cat input.yaml | tfk8s > output.tf
input.yaml:
---
apiVersion: v1
kind: ConfigMap
metadata:
name: test
data:
TEST: test
✨✨ magically becomes ✨✨
output.tf:
resource "kubernetes_manifest" "configmap_test" {
manifest = {
"apiVersion" = "v1"
"data" = {
"TEST" = "test"
}
"kind" = "ConfigMap"
"metadata" = {
"name" = "test"
}
}
}
kubectl get ns default -o yaml | tfk8s -M
{
"apiVersion" = "v1"
"kind" = "Namespace"
"metadata" = {
"creationTimestamp" = "2020-05-02T15:01:32Z"
"name" = "default"
"resourceVersion" = "147"
"selfLink" = "/api/v1/namespaces/default"
"uid" = "6ac3424c-07a4-4a69-86ae-cc7a4ae72be3"
}
"spec" = {
"finalizers" = [
"kubernetes",
]
}
"status" = {
"phase" = "Active"
}
}
You can use helm template to generate a manifest from the chart, then pipe it into tfk8s:
helm template ./chart-path -f values.yaml | tfk8s
You can use tfk8s in conjunction with find to convert an entire directory recursively:
find dirname/ -name '*.yaml' -type f -exec sh -c 'tfk8s -f {} -o $(echo {} | sed "s/\.[^.]*$//").tf' \;
Overall
Maintained
Code review
Go module
Latest release
Releases this year
341 followers · starred Jul 2023
329 followers · starred Apr 2021
407 followers · starred Dec 2022
723 followers · starred Jul 2022