Terraform으로 kubernetes를 관리하는 경우, yaml 리소스를 한땀한땀 HCL Code로 변경하는건 매우 귀찮다
(너무 당연하게도) 노가다를 자동으로 돌려주는 오픈소스가 이미 있었다
1. k2tf (Open Source)
공식 k8s provider에서 제공하는 API를 사용하는 경우, k2tf를 사용해 간편하게 변환할 수 있다
https://github.com/sl1pm4t/k2tf
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
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
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
대체 쿠버네티스 다른 리소스들이랑 왜 다르게 동작하는지는 모르겠다
만일 공식 지원이 안되는 api인데, 클러스터 생성 시 동시에 생성해야 하는 경우가 있다면...그냥 helm chart 만들어서 helm_release
로 배포하는게 젤 맘 편할 듯 하다
그러나 한가지 방법을 더 찾자면,,,,
https://github.com/mingfang/terraform-provider-k8s
여기에 원하는 api가 있는진 모르겠지만, 적어도 CRD는 있다
쿠버네티스 프로바이더를 위에꺼로 바꿔서 시도해봐도 될 듯 하다. 나는 안해봐서 실 사용기는 못쓴다
(참고로 m1 plarform 지원 안함 -> m1 platform용으로 직접 빌드해서 쓰면 된다)
https://www.binaryflavor.com/m1-baineoriga-jegongdoeji-anhneun/
끝
'공부 > IaC' 카테고리의 다른 글
[Terraform/AWS] EC2를 Directory Service에 Seamlessly하게 join시키기 (0) | 2023.01.16 |
---|---|
[Terraform/AWS] VPC Peering Module을 만들 때 고려할 점 (0) | 2022.10.30 |
[Terraform/EKS/k8s] import 시 Kubernetes: Unauthorized (1) | 2022.06.28 |
[Terraform] MAC에서 tfenv로 terraform 특정 버전 사용 (1) | 2022.05.14 |
[Terraform] 다른 backend의 state가 업데이트가 안돼요..?! (terraform_remote_state 불러오는 방식) (0) | 2022.04.30 |
댓글