Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/mingfang/terraform-provider-k8s

Terraform Provider For Kubernetes
https://github.com/mingfang/terraform-provider-k8s

k8s kubernetes terraform terraform-modules terraform-provider

Last synced: 3 months ago
JSON representation

Terraform Provider For Kubernetes

Awesome Lists containing this project

README

        

# terraform-provider-k8s
terraform-provider-k8s is a Terraform provider to manage Kubernetes resources.

## Features
- Supports all Kubernetes [resources](./site), including alpha and beta versions
- Supports resources based on Custom Resource Definition(CRD).
- Supports the latest version of Kubernetes
- Auto extract from live Kubernetes cluster and import as Terraform state
- Convert Kubernetes manifests to Terraform files

## Modules Catalog
A catalog of reusable modules is at [terraform-k8s-modules](https://github.com/mingfang/terraform-k8s-modules)

## Requirements
- Terraform 0.12 and 0.13
- Kubernetes v1.14+ (Recommended for best CRD support)

## Upgrading to Terraform 0.13
- Terraform 0.13 can automatically install this plugin. Make sure your Terraform configuration block has the plugin information like this.
```
terraform {
required_providers {
k8s = {
source = "mingfang/k8s"
}
}
}
```

- If you have existing Terraform state created before Terraform 0.13 then you may have to upgrade the state using this command.
```
terraform state replace-provider 'registry.terraform.io/-/k8s' 'mingfang/k8s'
```

## Installation
Download the binary from the [releases](https://github.com/mingfang/terraform-provider-k8s/releases).

Follow official plugin installations instructions here https://www.terraform.io/docs/configuration/providers.html#third-party-plugins.

## Run Using Docker (optional)
```sh
docker pull registry.rebelsoft.com/terraform-provider-k8s
alias terraform='docker run -v `pwd`/kubeconfig:/kubeconfig -e KUBECONFIG=/kubeconfig -v `pwd`:/docker -w /docker --rm -it registry.rebelsoft.com/terraform-provider-k8s terraform'
alias tfextract='docker run -v `pwd`/kubeconfig:/kubeconfig -e KUBECONFIG=/kubeconfig -v `pwd`:/docker -w /docker --rm -it registry.rebelsoft.com/terraform-provider-k8s extractor'
alias tfgenerate='docker run -v `pwd`/kubeconfig:/kubeconfig -e KUBECONFIG=/kubeconfig -v `pwd`:/docker -w /docker --rm -it registry.rebelsoft.com/terraform-provider-k8s generator'
```

## Init
For new projects or after install/upgrade, run ```terraform init```

## Import
After extracting existing resources to terraform files, you can import the state for them.

Run ```terraform import k8s_core_v1_service.nginx default.service.nginx``` to import, in this case a nginx service.

## Resource Format
The resource format is ```resource "k8s___" ""```.

Note the ```name``` here is the Terraform name and not the Kubernetes name.

All Kubernetes resources requires a name in the metadata like this
```hcl
metadata {
name = "nginx"
}
```

The set of supported groups, versions and kinds are loaded dynamically from your Kubernetes cluster.

## Data Source Format
The data source format is ```data "k8s___" ""```.

The set of supported groups, versions and kinds are loaded dynamically from your Kubernetes cluster.

For example, this gets the cluster_ip of the httpbin service.

```hcl
data "k8s_core_v1_service" "httpbin" {
metadata {
name = "httpbin"
}
}
output "httpbin_cluster_ip" {
value = "${data.k8s_core_v1_service.httpbin.spec.0.cluster_ip}"
}
```

## Id Format
The format of the resource Ids is ```..```. These are all Kubernetes identifiers.

If the Kind of the resource is not namespaced, such as ```Namespace``` resource, then the Id format is ```..```.

Ids are used internally by Terraform to uniquely identify resource state. The user will only need to know them when importing state from a Kubernetes cluster.

# Utilities

## List Resource Types
Run ```tfgenerate``` to list all available resource and data source types

## Generate
Run ```tfgenerate ``` to generate a skeleton terraform file for the resource. For example,

- ```tfgenerate k8s_core_v1_service``` to generate a Kubernetes Service
- ```tfgenerate k8s_apps_v1_deployment``` to generate a Kubernetes Deployment
- ```tfgenerate k8s_apps_v1_stateful_set``` to generate a Kubernetes StatefulSet

## Extract From YAML File
The ```tfextract``` will load the existing resources from YAML files and create Terraform files for them. One file per resource in the YAML file.

For local file, run the ```tfextract -filename <> -dir ``` command.

For remote file, run the ```tfextract -url <> -dir ``` command.

## Extract From Kubernetes
The ```tfextract``` will load the existing resources from Kubernetes and create Terraform files for them. One file per resource.

Run the ```tfextract -namespace <> -kind <> -name <> -import -dir ``` command. Any may be left blank but at least one must be set.

Example: ```tfextract -kind service -name nginx -dir ``` will extract the Service named nginx into a file called service-nginx.tf.

For this example, if ```-kind service``` was left blank then all resources named nginx will be extracted to their coresponding files. Likewise for ```-name nginx```; if left blank then all services will be extracted.

The ```-import``` flag will automatically import the extracted resources as Terraform state.