본문 바로가기
공부/IaC

[Terraform/k8s] k8s YAML 리소스로 Terraform Code를 쉽게 작성하는 3가지 방법

by haejang 2022. 8. 21.
728x90
728x90

 

 

 

Terraform으로 kubernetes를 관리하는 경우, yaml 리소스를 한땀한땀 HCL Code로 변경하는건 매우 귀찮다

 

그저,,,,개노가다

 

(너무 당연하게도) 노가다를 자동으로 돌려주는 오픈소스가 이미 있었다

 

 

1. k2tf (Open Source)


공식 k8s provider에서 제공하는 API를 사용하는 경우, k2tf를 사용해 간편하게 변환할 수 있다

https://github.com/sl1pm4t/k2tf

 

GitHub - sl1pm4t/k2tf: Kubernetes YAML to Terraform HCL converter

Kubernetes YAML to Terraform HCL converter. Contribute to sl1pm4t/k2tf development by creating an account on GitHub.

github.com

 

Install (mac)

brew install k2tf

 

Usage

k2tf -f [yaml file] -o [tf file]

 

 

 

그렇다면 공식 k8s provider에서 지원하지 않는 API는 어떻게 만드는가? (CRD 등,,)

-> kubernetes_manifest 리소스를 활용하면 된다

apiVersion부터 yaml의 모든 데이터를 manifest 값으로 넣어주면 된다

 

2. yamldecode (terraform 내장 함수)


https://www.terraform.io/language/functions/yamldecode

 

yamldecode - Functions - Configuration Language | Terraform by HashiCorp

The yamldecode function decodes a YAML string into a representation of its value.

www.terraform.io

 

yaml data를 hcl로 decode해주는 함수다. file을 읽어오는 file 함수와 결합해 아래와 같이 쓸 수 있다.

 

Usage

resource "kubernetes_manifest" "honglab" {
  manifest = yamldecode(file("./yamldecode.yaml"))
}

 

 

 

이는 아쉽게도 yaml 리소스를 한개씩밖에 못읽는다

(즉, ---로 구분된 여러 리소스의 yaml을 한꺼번에 읽지는 못한다)

그렇다면 k2tf처럼 여러 리소스를 한번에 kubernetes_manifest tf code로 바꿔주는건 없나? -> 당연히 있다

 

 

3. tfk8s (Open Source)


https://github.com/jrhouston/tfk8s

 

GitHub - jrhouston/tfk8s: A tool for converting Kubernetes YAML manifests to Terraform HCL

A tool for converting Kubernetes YAML manifests to Terraform HCL - GitHub - jrhouston/tfk8s: A tool for converting Kubernetes YAML manifests to Terraform HCL

github.com

 

Install (mac)

port를 먼저 깔아야 한다 : https://www.macports.org/install.php

sudo port install tfk8s

 

Usage

tfk8s -f [yaml file] -o [tf file]

 

 

근데 tf code상 이뻐보이진 않는다 (가독성 저하)

 

 

 


난 개인적으로 kubernetes_manifest 를 써야 하는 경우, 그냥 리소스 하나하나를 별개의 yaml파일로 구성한 후, fileset, file, yamldecode 함수를 결합해 for_each 돌려 만드는게 제일 이쁜 것 같다

 

그러나 kubernetes_manifest 리소스는 치명적인(?) 단점이 있는데.....

쿠버 클러스터랑 동시 생성이 불가하다

 

관련 issue

https://github.com/hashicorp/terraform-provider-kubernetes-alpha/issues/199#issuecomment-832614387

 

Error: Failed to construct REST client · Issue #199 · hashicorp/terraform-provider-kubernetes-alpha

Hello, I have this error when I'm using kubernetest-alpha provider terraform { required_providers { kubernetes-alpha = { source = "hashicorp/kubernetes-alpha" version = "0.3.2&qu...

github.com

 

대체 쿠버네티스 다른 리소스들이랑 왜 다르게 동작하는지는 모르겠다

만일 공식 지원이 안되는 api인데, 클러스터 생성 시 동시에 생성해야 하는 경우가 있다면...그냥 helm chart 만들어서 helm_release로 배포하는게 젤 맘 편할 듯 하다

 

그러나 한가지 방법을 더 찾자면,,,,

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

 

GitHub - mingfang/terraform-provider-k8s: Terraform Provider For Kubernetes

Terraform Provider For Kubernetes. Contribute to mingfang/terraform-provider-k8s development by creating an account on GitHub.

github.com

 

여기에 원하는 api가 있는진 모르겠지만, 적어도 CRD는 있다

쿠버네티스 프로바이더를 위에꺼로 바꿔서 시도해봐도 될 듯 하다. 나는 안해봐서 실 사용기는 못쓴다

 

(참고로 m1 plarform 지원 안함 -> m1 platform용으로 직접 빌드해서 쓰면 된다)

https://www.binaryflavor.com/m1-baineoriga-jegongdoeji-anhneun/

 

M1 바이너리가 제공되지 않는 테라폼 프로바이더 빌드해서 쓰기 (hashicorp/template)

terraform init 실패한다.테라폼을 m1 맥북으로 사용할 때 가끔, arm64 다윈 커널용 바이너리가 없어서 terraform init 에 실패하는 경우가 있다. 내가 최근에 겪은 hashicorp/template 의 경우로 해결하는 짧은

www.binaryflavor.com

 

 

 

 

 

 

 

728x90
728x90

댓글