νμ¬ νμ¬μμλ μΌλ³Έ 리μ μ VM νκ²½μ AKSλ‘ μ ννλ μμ
μ μ§ννκ³ μμ΅λλ€.
μΆκ°λ‘, λͺλͺ κ³³μμ Azure νκ²½μ μꡬνλ κ²½μ°κ° λ μκ²Όμ΅λλ€.
κΈ°μ‘΄ AKS νκ²½μ ꡬμ±νλ Terraform μ½λλ λ³μ λΆλ¦¬ μ λλ λμ΄ μμ§λ§, λͺ¨λνκ° λμ΄ μμ§λ μμμ΅λλ€. κ±°κΈ°μ Azure μ§μμ μ°Έκ³ ν λͺ¨λλ λ§μ§ μκ³ , λͺλͺ κ³³μμλ νΉλ³ν 쑰건λ μμκΈ° λλ¬Έμ λͺ¨λμ μ§μ μμ±νκΈ°λ‘ νμ΅λλ€.
μ΄λ²μλ λͺ¨λμ μ§μ λ§λ€λ©΄μ κ³ λ―Όνλ λ΄μ©κ³Ό ꡬν λ΄μ©μ κ°λ¨ν μ λ¦¬ν΄ λ³΄μμ΅λλ€.
:::warning λ€μ΄κ°κΈ° μ μ
κΈμμ NAT Gateway κ΄λ ¨ λ΄μ©μ΄ λ±μ₯νλλ°, μμ§ μ€μ μ¬μ© μ¬λ‘κ° μμ΄ μμ ν κ²μ¦λμ§ μμμ΅λλ€. μ°Έκ³ λ§ ν΄ μ£ΌμΈμ.
:::
Terraform λͺ¨λμ νμμ±
λ€μ΄κ°κΈ° μ μλ μ μ μ€λͺ
νμ§λ§, Terraform λͺ¨λμ΄ νμνλ€κ³ νλ¨ν μ΄μ λ λ€μκ³Ό κ°μμ΅λλ€.
μ¬μ©νλ λκ΅¬λ§ TerraformμΌ λΏ, νλ‘κ·Έλλ°μμ ν¨μλ λͺ¨λ, ν
νλ¦Ώμ μ¬μ©νλ μ΄μ μ λΉμ·ν©λλ€.
- λ³μ λΆλ¦¬λ₯Ό ν΅ν νμ₯μ±
- λ³μλ₯Ό νλμ½λ©νλ©΄ μ€μ μ λ³κ²½ν΄μΌ ν λ λ±μ μν©μμ μ μ°νκ² λμν μ μμ΅λλ€. μ΄λ Terraformλ λ§μ°¬κ°μ§μ λλ€.
- νΉν Terraformμ 리μμ€λͺ μ ν¬ν¨ν μ€μ μ 보μ λ³κ²½μ΄ μκΈ°λ©΄ Replace μ΄λ²€νΈκ° λ°μνλ―λ‘ μ€κ°μ μΈνλΌ κ³΅λ°±μ΄ μκΈΈ μ μκ³ , μ μ€νκ² μ€μ μ κ΄λ¦¬ν΄μΌ ν©λλ€.
- κ°λ μ± λ©΄μμλ μ’μ΅λλ€.
- μ¬μ¬μ©μ±
- λ³μ λΆλ¦¬λ λͺ¨λμ΄ μμ΄λ κ°λ₯ν©λλ€. (μ΄κΈ° AKSκ° κ·Έλ κ² κ΅¬μ±λμμ΅λλ€)
- νμ§λ§ λͺ¨λ ννλ‘ λ§λ€μ΄ λλ©΄ λ‘컬μ κ²½μ° μλ κ²½λ‘, μΈλΆ 곡κ°λ λͺ¨λμ 곡κ°λ μ΄λ¦μΌλ‘ μ¬μ¬μ©μ΄ κ°λ₯ν©λλ€. λ¬Όλ‘ λͺ¨λμ μ¬μ©νμ§ μμλ νμΌμ 볡μ¬νλ μμΌλ‘ ν μ μμ§λ§, λ°λ‘ κ΄λ¦¬ν΄μΌ νλ 리μμ€κ° μλλΌλ©΄ λͺ¨λμ μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.
μ΄λ¬ν μ΄μ λ‘ λͺ¨λμ΄ νμνλ€κ³ νλ¨ν μνμμ μ΅λν κ°λ¨νκ³ , κΈ°λ³Έμ μΈ κΈ°λ₯λ§ κΉλνκ² κ΅¬νν΄ μ μ§λ³΄μκ° μ½κ² λ§λλ κ²μ΄ λͺ©μ μ΄μμ΅λλ€.
λͺ¨λ μ€λͺ
μ€μ λ‘λ λͺ¨λμ 2κ° λ§λ€μμ΅λλ€.
1κ°λ CPU, GPU λ±μ κ΄κ³μμ΄ λ¨μΌ ν΄λ¬μ€ν° νκ²½μ κ³ λ €νκ³ μμ±λμκ³ , λ€λ₯Έ νλλ CPUμ GPU ν΄λ¬μ€ν°λ₯Ό λΆλ¦¬νλ μꡬμ¬νμ κ³ λ €νμ¬ μμ±λμμ΅λλ€.
κΈ°λ³Έμ μΈ κ³ λ €μ¬νμ κ°κΈ° λλ¬Έμ, μ¬κΈ°μλ λ¨μΌ ν΄λ¬μ€ν° λͺ¨λλ§ μ€λͺ
νλ € ν©λλ€.
λͺ¨λμ μ΄ 4κ°μ νμΌλ‘ μ΄λ£¨μ΄μ Έ μμ΅λλ€.
variable.tf: λͺ¨λμ νμν λ³μλ₯Ό μ μν νμΌμ λλ€. μλμμ μμΈν μ€λͺ ν©λλ€.provider.tf: νμν Providerλ₯Ό μ μνλ κ³³μ λλ€. μ¬κΈ°μλ azurerm λ§ μ¬μ©ν©λλ€.- ꡬλ μ΄ μ¬λ¬ κ°μΌ κ²½μ° μλ§μ Azure ꡬλ IDλ₯Ό μ§μ ν΄ μ£Όμ΄μΌ ν©λλ€.
output.tf: Terraform λͺ λ Ήμ΄ μ€ν ν μνλ μΆλ ₯μ μ μν©λλ€.- μ¬κΈ°μ μΆλ ₯λ κ°μ μ€μ λͺ¨λμ μ¬μ©νλ κ³³μμ μ°Έμ‘°ν μ μμ΅λλ€.
main.tf: μ€μ Terraform μ½λκ° μμ΅λλ€. μμ μλμμ μ€λͺ νκ² μ΅λλ€.
variable.tf νμΌ μ€λͺ
μ΄ 8κ°μ λ³μκ° μμ΅λλ€.
| λ³μλͺ | μ€λͺ | λΉκ³ |
|---|---|---|
rsc_group_name | 리μμ€ κ·Έλ£Ή μ΄λ¦ | Azure ν¬νμμ μ§μ μμ±νλλ‘ νμμ΅λλ€. |
aks_cluster_name | AKS ν΄λ¬μ€ν° μ΄λ¦ | |
subscription_id | Azure ꡬλ ID | |
ops_node_vm_size | κ΄λ¦¬μ© λ Έλ νμ VM ν¬κΈ° | |
ops_node_count | κ΄λ¦¬μ© λ Έλ νμ λ Έλ μ | |
node_pools | λ Έλ νμ μ€μ μ μ μνλ κ°μ²΄ λ°°μ΄ | νλ¨ μ€λͺ μ°Έκ³ |
connect_nat | NAT Gateway μ°κ²° μ¬λΆ | μ°κ²°ν NAT Gatewayλ μ‘΄μ¬νλ€κ³ κ°μ ν©λλ€. (μμΌλ©΄ λ§λ€μ΄μΌ ν©λλ€.) |
nat_gateway_name | μ°κ²°ν NAT Gatewayμ μ΄λ¦μ λλ€. | |
use_blob_storage | Blob Storage μ¬μ© μ¬λΆ | AKSμμ κΈ°λ³Έμ μΌλ‘ λΉνμ±νλμ΄ μκΈ° λλ¬Έμ, λͺ μμ μΌλ‘ νμ±νν΄μΌ ν©λλ€. |
-
리μμ€ κ·Έλ£Ήμ μ§μ μμ±νλλ‘ ν μ΄μ
- 리μμ€ κ·Έλ£Ή μμ±λ λΉμ°ν μλνκ° κ°λ₯ν©λλ€.
νμ§λ§ 리μμ€ κ·Έλ£Ήμ μμ±ν λ μ΄λ¦κ³Ό 리μ μ λλ νμΈνλ κ² μ’κ² λ€ νλ¨νμ¬ μΌλΆλ¬ νμ§ μμμ΅λλ€. - μ΄κ²κΉμ§ μλμΌλ‘ μμ±νκ³ μΆλ€λ©΄
dataλΈλ‘μresourceλΈλ‘μΌλ‘λ§ λ³κ²½νλ©΄ λ©λλ€.
- 리μμ€ κ·Έλ£Ή μμ±λ λΉμ°ν μλνκ° κ°λ₯ν©λλ€.
-
κ΄λ¦¬μ© λ Έλ νμ μ€μ ν μ΄μ
- μμ±ν λͺ¨λμμλ κΈ°λ³Έμ μΌλ‘ κ΄λ¦¬μ© λ Έλ νμ μμ±νκ³ , Auto-scalingμ λΉνμ±νλμ΄ μμ΅λλ€.
- μΆκ° λ
Έλ νμ λ³λμ
azurerm_kubernetes_cluster_node_pool리μμ€λ₯Ό μ¬μ©ν΄ μ€μ ν©λλ€. - μ΄λ₯Ό μ€μ ν μ΄μ λ λ€μκ³Ό κ°μ΅λλ€.
azurerm_kubernetes_cluster리μμ€μλdefault_node_poolμ΄λΌλ νλͺ©μ΄ μκ³ , μ΄ κ°μ νμμ λλ€.- μμ€ν λ Έλ νμ μ§μ λ³κ²½νλ κ²μ μλΉν μνν©λλ€. νΉν μ΄μ μ€μΈ ν΄λ¬μ€ν°λΌλ©΄ 리μ€ν¬κ° λ 컀μ§λλ€.
- λ Έλ νμ΄ μ¬λ¬ κ°μ΄κ±°λ λ³λμ΄ λ§μ λλ μ μ°νκ² λμ²ν μ μμ΅λλ€.
- AKS μ΄μμ ν΄ λ³΄λ©΄μ AGIC (Application Gateway Ingress Controller) λ± λ Έλ λ³κ²½μ΄ μμ΄μΌ ν λλ μ μ§λμ΄μΌ νλ 리μμ€λ€μ΄ μλ€λ κ²μ λ°°μ μ΅λλ€. μ΄λ¬ν 리μμ€λ€μ κ΄λ¦¬ λ Έλ λλ κ°μ©μ±μ΄ 보μ₯λ λ Έλμ μμΉν΄μΌ ν©λλ€. κ·Έλμ μ¬μ©μ μ€μ λ Έλ νμ λ³λλ‘ μ€μ νκ³ , κΈ°λ³Έ λ Έλ νμ λ³νμ§ μλ μνλ‘ μμ€ν μ΄ κ΄λ¦¬νλ κ²μ΄ κ°μ₯ λ°λμ§νλ€κ³ νλ¨νμμ΅λλ€.
- λ Έλ νμ΄ 1κ°μ΄κ³ , VM μ¬μ΄μ¦λ κ³ μ μΌλ‘ μ¬μ©νλ λ± κ·ΉνμΌλ‘ κ²½μ§λ νκ²½μ΄λΌλ©΄ κ΄λ¦¬ λ Έλ νμ΄ νμνμ§ μκ² μ§λ§, κ·Έλ° μΌμ΄μ€λ₯Ό κ³ λ €νμ§λ μμμ΅λλ€.
-
node_poolsλ³μμ λν μ€λͺ-
node_poolsλ³μλ κ°μ²΄ λ°°μ΄λ‘ μ΄λ£¨μ΄μ Έ μμΌλ©°, λ€μκ³Ό κ°μ νμμ λλ€.node_pools = [ { name = "cpupool" # μ΄λ¦ vm_size = "Standard_D8as_v5" # VM ν¬κΈ° node_count = 1 # λ Έλ μ auto_scaling_enabled = true # Auto-scaling νμ±ν μ¬λΆ min_count = 1 # Auto-scaling μ λ Έλ μ΅μ κ°μ max_count = 5 # Auto-scaling μ λ Έλ μ΅λ κ°μ node_labels = { # λ Έλμ μ€μ ν Label "haulrest.me/usage" = "cpu" } node_taints = [] # λ Έλμ μ€μ ν Taint enabled = true # λ Έλ ν μ체μ νμ±ν μ¬λΆ }, { name = "gpupool" vm_size = "Standard_NC8as_T4_v3" node_count = 1 auto_scaling_enabled = false node_labels = { "haulrest.me/usage" = "gpu" } node_taints = [ "haulrest.me/app=gpu:NoSchedule" ] enabled = false } ]λ Έλ νμ μ©λμ μ€μ , μ μ± λ±μ λ°λΌ λ³ν μ μλ μμκ° λ§€μ° λ§μ΅λλ€. μ΅λν λ§μ λΆλΆμ λͺ¨λλ‘ μ»€λ²νκ³ μΆμκΈ° λλ¬Έμ, κ°μ²΄ λ°°μ΄μ μ¬μ©νμ¬ νμ μ μ μνμμ΅λλ€.
-
-
NAT Gateway μ΅μ μ κ΄νμ¬
- NAT Gatewayλ νΉμ ν μμλ°μ΄λ ν΅μ κ³Ό κ·Έλ‘ μΈν μλ΅λ§ μ€κ° μ μλλ‘ ν©λλ€. μΌλΆ νκ²½μμ μ΄μ λν μꡬμ¬νμ΄ μμ μ μκΈ° λλ¬Έμ, μ΅μ μ λΆλ₯ν΄ λμμ΅λλ€.
- NAT Gateway 리μμ€λ μ΄ λͺ¨λμμ μμ±νμ§ μκ³ , μ΅μ
μ μ¬μ©νλ €λ©΄ μ΄λ―Έ μμ±λ 리μμ€κ° μμ΄μΌ ν©λλ€.
μ΄λ κ² ν μ΄μ λ λ€μκ³Ό κ°μ΅λλ€.
- NAT Gatewayλ λΉμ©λ μκ³ κ³΅κ° IP μ 보 λ±μ μ λ¬ν΄μ λ°©νλ²½μ κ°λ°©νλ μμ λ μ΄λ£¨μ΄μ§κΈ° λλ¬Έμ λͺ¨λμ μλ‘ μμ±νλλΌλ λ°λ‘ κ΄λ¦¬νλ κ²μ΄ μ’λ€κ³ μκ°νμ΅λλ€.
- μ½κ² λ³κ²½μ΄ νλ€κΈ° λλ¬Έμ κΈ°μ‘΄ 리μμ€λ₯Ό μ¬μ©ν΄μΌ νλ κ²½μ°λ μλ€ νλ¨νμμ΅λλ€. (μλ₯Ό λ€μ΄, νμ¬ SaaS νκ²½μ AKSλ₯Ό λ€μ ꡬμ±νκ² λμ΄λ NAT Gateway μͺ½μ μ΄λ―Έ ν΅λ³΄λμ΄ μλ IP λ³κ²½μ΄ μ½μ§ μκΈ° λλ¬Έμ μ¬μ¬μ©μ κ³ λ €ν΄μΌ ν©λλ€.)
- 쑰건μ λ°λΌ importλ₯Ό νλ κ²λ κ³ λ €νμ§λ§ Terraformμμ νΈλ²μ μΈ λ°©λ²μ μ μΈνκ³ λ Conditional importλ₯Ό μ§μνμ§ μκΈ° λλ¬Έμ λ°°μ νμ΅λλ€.
main.tf νμΌ μ€λͺ
μ£Όμ λ΄μ©λ§ κ°λ¨ν μ€λͺ νκ² μ΅λλ€.
- λ€μ κ΅¬μ± μμλ€μ μ μν΄ λμκ³ , λͺ¨λμ μ€μΉνλ©΄ μμ±λ©λλ€.
- ν΄λ¬μ€ν°
- λ Έλ ν (μ€μ ν λλ‘)
- VNet, Subnet
- Ingressμ μΈ κ³΅μΈ IP
- Network Contributor κΆν (κ°μ λ€νΈμν¬μ λν΄ AKSκ° νμλ‘ νλ κΆν)
- NAT Gateway λ°μ΄ν°λ₯Ό λΆλ¬μ€λ κ²κ³Ό Association μμ±μ
connect_natμ΅μ μ΄ νμ±νλμμ λλ§ μλν©λλ€. - AKSμ μμλ°μ΄λ μ€μ λ
connect_natμ΅μ μ΄ νμ±νλμμ λλ§userAssignedNATGatewayμ€μ μ μ¬μ©ν©λλ€. - λ
Έλ νμ μμμ μ€λͺ
ν λλ‘ ν΄λ¬μ€ν°μ κΈ°λ³Έ λ
Έλ νμ΄ λ°λ‘ μκ³ , μ¬μ©μ λ
Έλ νμ
for_eachλ°λ³΅λ¬Έμ ν΅ν΄ μμ±νλλ‘ νμμ΅λλ€.- κΈ°λ³Έ λ
Έλ νμ
temporary_name_for_rotationμ΄λΌλ μ΅μ μ΄ μλλ°, μ΄λ μ λ°μ΄νΈ λ±μΌλ‘ λ Έλ ν κ΅μ²΄κ° μ΄λ£¨μ΄μ§ λ μμλ‘ μ¬μ©ν μ΄λ¦μ λλ€. (μ μ ν κ°μ λ£μΌλ©΄ λ©λλ€.)
- κΈ°λ³Έ λ
Έλ νμ
κ·Έ μΈ
- λͺ¨λ κΈ°λ³Έ μΈν μ μ½κ² ν μ μλλ‘ μμ μ½λμ λ¬Έμλ₯Ό ν λ΄μ μΆκ°λ‘ 곡μ νμ΅λλ€.
- GPUλ μΌλΆ μ΅μ CPU VMμ κ²½μ° ν λΉλ λ¬Έμ κ° μμ μ μμ΅λλ€. μ΄λ Azureμμ κΈ°λ³Έμ μΌλ‘ μ μ μ, νΉν GPUμ κ²½μ° 0μΌλ‘ ν λΉλμ΄ μ€μ λμ΄ μκΈ° λλ¬Έμ λλ€. νΉν GPUμ κ²½μ° μλ ν λΉλ μ¦κ° μμ²μ΄ λΆκ°λ₯ν΄μ, μ§μ μ§μ ν°μΌμ ν΅ν΄ μμ²ν΄μΌ νμ΅λλ€.
- AKSμμ Ingressλ₯Ό μΈν
νλ κ³Όμ μμ 2κ° Annotationμ΄ νμν©λλ€.
service.beta.kubernetes.io/azure-load-balancer-resource-group: 리μμ€ κ·Έλ£Ή μ΄λ¦service.beta.kubernetes.io/azure-pip-name: Ingressμ μ¬μ©ν κ³΅μΈ IP 리μμ€ μ΄λ¦
- μ€ν λ¦¬μ§ κ³μ κ³Ό κ°μ΄ μ€μ νκ²½μμ λͺ¨λμ λ²μλ₯Ό λμ΄μλ μΆκ° μꡬμ¬νμ΄ νμν κ²½μ° μ§μ μμ μ νμ΅λλ€. μ΄ κΈκ³Ό κ΄λ ¨λ λ΄μ©μ μλκΈ° λλ¬Έμ λμ΄κ°λλ‘ νκ² μ΅λλ€.
λ§μΉλ©°
μμ μ μ λͺ κ°μ§ λ΄μ©λ§ μ£Όμνλ©΄, λ³μ«κ° λͺ κ°λ§μ μ μ ν μ‘°μ νλ κ²μΌλ‘ λͺ¨λμ ν΅ν΄ AKS νκ²½μ ꡬνν μ μμμ΅λλ€. μ€μ λ‘ λ§λ€μ΄μ§ 2κ°μ λͺ¨λμ μ¬μ©νμ¬ μꡬμ¬νμ λ§λ AKS ν μ€νΈ νκ²½μ ꡬμ±νμ¬ μ¬μ©νκ³ μμ΅λλ€.
AWSμλ Kubernetes νκ²½μ ꡬμ±ν΄μΌ νλλ°, μ΄ λλ terraform-aws-modulesμ λ§μ λͺ¨λμ΄ μμ΄ νμ©νκΈ° μ’μ΅λλ€.
Azureμλ λͺλͺ λͺ¨λμ΄ μμ§λ§ AWS μ§μμ λΉν΄μλ λΆμ‘±νλ€κ³ λκΌμ΅λλ€. νμ§λ§ μ΄λ κ² λͺ¨λμ μ§μ λ§λ€μ΄ 보λ κ²λ μ’μ κ²½νμ΄ λλ κ² κ°μ΅λλ€.
μμμ μ€λͺ ν Terraform μ½λλ μλμμ νμΈν μ μμ΅λλ€.
μ°Έκ³ μλ£
- azurerm_kubernetes_cluster λ± Terraform 곡μ λ¬Έμ