jrhouston/tfk8s

A tool for converting Kubernetes YAML manifests to Terraform HCL

Go

1,058

77 commits

updated Jan 17, 2024

See the code

README

tfk8s Go Report Card tests


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.

Demo

Features

  • Convert a YAML file containing multiple manifests
  • Strip out server side fields when piping kubectl get $R -o yaml | tfk8s --strip

Install

go 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

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

Examples

Create Terraform configuration from YAML files

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"
    }
  }
}

Use with kubectl to output maps instead of YAML

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"
  }
}

Convert a Helm chart to Terraform

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

Convert a directory tree of manifests to Terraform

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' \;
converter
hcl
kubernetes
terraform
yaml

jrhouston/tfk8s

A tool for converting Kubernetes YAML manifests to Terraform HCL

Go

1,058

77 commits

updated Jan 17, 2024

See the code

README

tfk8s Go Report Card tests


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.

Demo

Features

  • Convert a YAML file containing multiple manifests
  • Strip out server side fields when piping kubectl get $R -o yaml | tfk8s --strip

Install

go 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

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

Examples

Create Terraform configuration from YAML files

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"
    }
  }
}

Use with kubectl to output maps instead of YAML

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"
  }
}

Convert a Helm chart to Terraform

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

Convert a directory tree of manifests to Terraform

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' \;
converter
hcl
kubernetes
terraform
yaml

Project health

Overall

3.0/10

Maintained

0/10

Code review

2/10
OpenSSF Scorecard

Latest release

v0.1.10 · Dec 22, 2022

Releases this year

0

Significant stargazers

Patrick Schratz

341 followers · starred Jul 2023

Raphaël Pinson

329 followers · starred Apr 2021

Dan Buch

407 followers · starred Dec 2022

Akin

723 followers · starred Jul 2022