클라우드/Azure-Terraform

k8s 관련 modules 구성

Hoony.Song 2024. 6. 18. 09:29
반응형
지난번엔 azure modules 를 구성하고 aks_cluster를 프로비저닝 해 봤다 
이번엔 aks-cluster에 helm 과 yaml 배포 namespace 등등 각종 초기세팅에 필요한것을 구성해봤다 

 

기존 모듈에 새로운 모듈을 추가 구성했다 

모듈의 디렉토리 구조 

modules
    ├── base
    │   └── resource_group
    ├── ETC
    │   ├── helm
    │   ├── kube
    │   ├── kube_tpl
    │   └── output_file
    ├── kubernetes
    │   └── core
    │       ├── configmap
    │       └── namespace
    └── network
        ├── publicIP
        ├── subnets
        └── virtual_network

 

helm modules 

resource "helm_release" "values_set" {
  count      = length(var.values_set) > 0 ? 1 : 0
  name       = var.name
  repository = var.repository
  chart      = var.chart
  namespace = var.namespace
  version = var.chart_version
  create_namespace = var.create_namespace
  dependency_update = true
  repository_username = var.repository_username
  repository_password = var.repository_password
  dynamic "set" {
   for_each=var.values_set
   
   content{
     name=set.value["name"]
     value=set.value["value"]
     type=set.value["type"]
     
   }
 }  
}
resource "helm_release" "values_file" {
  count      = length(var.values_file) > 0 ? 1 : 0
  name       = var.name
  repository = var.repository
  chart      = var.chart
  namespace = var.namespace
  version = var.chart_version 
  create_namespace = var.create_namespace
  dependency_update = true
  repository_username = var.repository_username
  repository_password = var.repository_password
  values = [
    templatefile(var.chart_Path,var.values_file)
  ]  
}
resource "helm_release" "values_empty" {
  count      =(length(var.values_file) ==0 && length(var.values_set)==0)?1:0
  name       = var.name
  repository = var.repository
  chart      = var.chart
  namespace = var.namespace
  version = var.chart_version 
  create_namespace = var.create_namespace
  dependency_update = true
  repository_username = var.repository_username
  repository_password = var.repository_password
}
  • helm 배포시 간단하게 set 을 써서 배포할 수도 있고 values.yaml 을 써서 배포할 수도 있고 아무것도 없이 배포할 수있다 모든 경우에서 배포 가능하도록 구성하였다 

kube_manifests modules

terraform {
  required_providers {
    kubectl = {
      source  = "gavinbunney/kubectl"
      version = ">= 1.7.0"
    }
  }
}

locals {
  manifest_files = fileset(var.manifests_Path, "*.yaml")
}


resource "kubectl_manifest" "yaml_list" {
  for_each = { for file in local.manifest_files : file => "${var.manifests_Path}/${file}" }
  
  yaml_body = file(each.value)
}

resource "kubectl_manifest" "yaml" {  
  count      = length(var.manifest_file) > 0 ? 1 : 0
  yaml_body = file(var.manifest_file)
}
  • kubernetes 공식 모듈의 manifests 리소스를 사용하면 cluster 생성 후에 배포 해야하는 버그? 가 있다 
    왜 그런지 모르겠다 왜 고쳐주질 않는것인지 ㅠ 그래서 gavinbunney 의 kubectl 모듈을 사용하였다 이것을 사용하면 aws 던 azure던 클러스터 생성과 동시에 manifests 배포가 가능하다 이 모듈을 쓰면 위 처럼 required_providers 를 모듈안에서 꼭 지정해 주어야 한다! 
  • 이 manifests 모듈 역시 여러개를 배포할 수 있고 단일로도 배포 할 수있도록 구성하였다 

kube_manifests_template modules

data "template_file" "k8s_manifest" {
  template = file("${var.manifests_Path}")
  vars = var.yaml_var
}

resource "kubectl_manifest" "test" {
   yaml_body= data.template_file.k8s_manifest.rendered   
}

terraform {
  required_providers {
    kubectl = {
      source  = "gavinbunney/kubectl"
      version = ">= 1.7.0"
    }
  }
}
  • templates 형식의 manifests 모듈이다 이게 왜 필요 했냐 하면... AWS에서 EFS스토리지 클래스 배포 할 때 EFS 관련정보를 넣어주기도 했고 ingress 에서 인증서 arn도 붙여주기 위해서 였던거 같다 azure 에서 지금 당장은 쓰지 않겠지만 일단 만들었던게 있으니 구성했다 

output_file modules 

resource "local_file" "value_input" {
  content = var.value
  filename = var.out_path 
}
  • 이 모듈은 README 작성을 위해 만들었다

 

다음 게시글에서 프로비저닝을 구성 합니다 

반응형

'클라우드 > Azure-Terraform' 카테고리의 다른 글

terraform 명령어 랩핑 스크립트  (0) 2024.06.18
aks 생성시 helm 과 yaml 배포  (0) 2024.06.18
Azure terraform provisioning 구현  (0) 2024.06.18
Azure terraform modules 구성  (0) 2024.06.17