빠른 시작: Terraform을 사용하여 AKS 클러스터용 Azure Linux 컨테이너 호스트 배포
Terraform을 사용하여 Azure Linux 컨테이너 호스트 클러스터를 배포하는 Azure Linux 컨테이너 호스트를 시작합니다. 필수 구성 요소를 설치한 후 Terraform 코드를 구현하고 Terraform을 초기화하며 Terraform 실행 계획을 만들고 적용합니다.
Terraform은 클라우드 인프라의 정의, 미리 보기 및 배포를 사용합니다. Terraform을 통해 HCL 구문을 사용하여 구성 파일을 만듭니다. HCL 구문을 사용하면 클라우드 인프라를 구성하는 클라우드 공급자와 요소를 지정할 수 있습니다. 구성 파일을 만든 후 배포되기 전에 인프라 변경을 미리 볼 수 있는 실행 계획를 만듭니다. 변경 내용을 확인 한 후에는 실행 계획을 적용하여 인프라를 배포합니다.
참고 항목
이 문서의 예제 코드는 Microsoft Terraform GitHub 리포지토리에 있습니다.
필수 조건
-
Azure를 구독하고 있지 않다면 시작하기 전에 Azure 체험 계정을 만듭니다.
Terraform을 아직 구성하지 않은 경우 다음 옵션 중 하나를 사용하여 구성할 수 있습니다.
Azure 서비스 주체가 없는 경우 서비스 주체를 만듭니다.
appId
,display_name
,password
및tenant
를 기록해 둡니다.Kubernetes 명령줄 도구
kubectl
이 필요합니다. 아직 없으면 kubectl을 다운로드합니다.
SSH 키 쌍 만들기
AKS 노드에 액세스하려면 ssh-keygen
명령을 사용해 생성하는 SSH 키 쌍(퍼블릭 및 프라이빗)을 사용하여 연결합니다. 기본적으로 이러한 파일은~/.ssh 디렉터리에 만들어집니다. ssh-keygen
명령을 실행하면 지정된 위치에 이미 존재하는 동일한 이름의 SSH 키 쌍을 덮어씁니다.
https://shell.azure.com으로 이동하여 브라우저에서 Cloud Shell을 엽니다.
ssh-keygen
명령을 실행합니다. 다음 예제에서는 RSA 암호화 및 4096비트 길이를 사용하여 SSH 키 쌍을 만듭니다.ssh-keygen -t rsa -b 4096
SSH 생성에 대한 자세한 내용은 Azure에서 인증용 SSH 키 생성 및 관리를 참조하세요.
Terraform 코드 구현
샘플 Terraform 코드를 테스트할 디렉터리를 만들고, 이를 현재 디렉터리로 만듭니다.
providers.tf
라는 파일을 만들고 다음 코드를 삽입합니다.terraform { required_version = ">=1.0" required_providers { azurerm = { source = "hashicorp/azurerm" version = "~>3.0" } random = { source = "hashicorp/random" version = "~>3.0" } } } provider "azurerm" { features {} }
main.tf
라는 파일을 만들고 다음 코드를 삽입합니다.# Generate random resource group name resource "random_pet" "rg_name" { prefix = var.resource_group_name_prefix } resource "azurerm_resource_group" "rg" { location = var.resource_group_location name = random_pet.rg_name.id } resource "random_id" "log_analytics_workspace_name_suffix" { byte_length = 8 } resource "azurerm_log_analytics_workspace" "test" { location = var.log_analytics_workspace_location # The WorkSpace name has to be unique across the whole of azure; # not just the current subscription/tenant. name = "${var.log_analytics_workspace_name}-${random_id.log_analytics_workspace_name_suffix.dec}" resource_group_name = azurerm_resource_group.rg.name sku = var.log_analytics_workspace_sku } resource "azurerm_log_analytics_solution" "test" { location = azurerm_log_analytics_workspace.test.location resource_group_name = azurerm_resource_group.rg.name solution_name = "ContainerInsights" workspace_name = azurerm_log_analytics_workspace.test.name workspace_resource_id = azurerm_log_analytics_workspace.test.id plan { product = "OMSGallery/ContainerInsights" publisher = "Microsoft" } } resource "azurerm_kubernetes_cluster" "k8s" { location = azurerm_resource_group.rg.location name = var.cluster_name resource_group_name = azurerm_resource_group.rg.name dns_prefix = var.dns_prefix tags = { Environment = "Development" } default_node_pool { name = "azurelinuxpool" vm_size = "Standard_D2_v2" node_count = var.agent_count os_sku = "AzureLinux" } linux_profile { admin_username = "azurelinux" ssh_key { key_data = file(var.ssh_public_key) } } network_profile { network_plugin = "kubenet" load_balancer_sku = "standard" } service_principal { client_id = var.aks_service_principal_app_id client_secret = var.aks_service_principal_client_secret } }
마찬가지로 azurerm_kubernetes_cluster_node_pool에서 Azure Linux
os_sku
를 지정할 수 있습니다.variables.tf
라는 파일을 만들고 다음 코드를 삽입합니다.variable "agent_count" { default = 3 } # The following two variable declarations are placeholder references. # Set the values for these variable in terraform.tfvars variable "aks_service_principal_app_id" { default = "" } variable "aks_service_principal_client_secret" { default = "" } variable "cluster_name" { default = "k8stest" } variable "dns_prefix" { default = "k8stest" } # Refer to https://azure.microsoft.com/global-infrastructure/services/?products=monitor for available Log Analytics regions. variable "log_analytics_workspace_location" { default = "eastus" } variable "log_analytics_workspace_name" { default = "testLogAnalyticsWorkspaceName" } # Refer to https://azure.microsoft.com/pricing/details/monitor/ for Log Analytics pricing variable "log_analytics_workspace_sku" { default = "PerGB2018" } variable "resource_group_location" { default = "eastus" description = "Location of the resource group." } variable "resource_group_name_prefix" { default = "rg" description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription." } variable "ssh_public_key" { default = "~/.ssh/id_rsa.pub" }
outputs.tf
라는 파일을 만들고 다음 코드를 삽입합니다.output "client_certificate" { value = azurerm_kubernetes_cluster.k8s.kube_config[0].client_certificate sensitive = true } output "client_key" { value = azurerm_kubernetes_cluster.k8s.kube_config[0].client_key sensitive = true } output "cluster_ca_certificate" { value = azurerm_kubernetes_cluster.k8s.kube_config[0].cluster_ca_certificate sensitive = true } output "cluster_password" { value = azurerm_kubernetes_cluster.k8s.kube_config[0].password sensitive = true } output "cluster_username" { value = azurerm_kubernetes_cluster.k8s.kube_config[0].username sensitive = true } output "host" { value = azurerm_kubernetes_cluster.k8s.kube_config[0].host sensitive = true } output "kube_config" { value = azurerm_kubernetes_cluster.k8s.kube_config_raw sensitive = true } output "resource_group_name" { value = azurerm_resource_group.rg.name }
terraform.tfvars
라는 파일을 만들고 다음 코드를 삽입합니다.aks_service_principal_app_id = "<service_principal_app_id>" aks_service_principal_client_secret = "<service_principal_password>"
Terraform 초기화 및 실행 계획 만들기
Terraform을 초기화하고
terraform init
명령을 사용하여 Azure 리소스를 관리하는 데 필요한 Azure 모듈을 다운로드합니다.terraform init
terraform plan
명령을 사용하여 Terraform 실행 계획을 만듭니다.terraform plan -out main.tfplan
terraform plan
명령은 실행 계획을 만들지만 실행하지는 않습니다. 대신 구성 파일에 지정된 구성을 만드는 데 필요한 작업을 결정합니다. 이 패턴을 사용하면 실제 리소스를 변경하기 전에 실행 계획이 예상과 일치하는지 확인할 수 있습니다.선택 사항인
-out
매개 변수를 사용하여 계획의 출력 파일을 지정할 수 있습니다.-out
매개 변수를 사용하면 검토한 계획이 정확하게 적용됩니다.실행 계획 및 보안을 유지하는 방법에 대한 자세한 내용은 보안 경고를 참조하세요.
terraform apply
명령을 사용하여 Terraform 실행 계획을 적용합니다.terraform apply main.tfplan
위의
terraform apply
명령은 이전에terraform plan -out main.tfplan
을 실행한 것으로 가정합니다.-out
매개 변수에 다른 파일 이름을 지정한 경우terraform apply
호출에 동일한 파일 이름을 사용합니다.-out
매개 변수를 사용하지 않은 경우 매개 변수 없이terraform apply
를 호출합니다.
결과 확인
다음
echo
명령을 사용하여 리소스 그룹 이름을 가져옵니다.echo "$(terraform output resource_group_name)"
Azure Portal로 이동합니다.
Azure 서비스 아래에서 리소스 그룹을 선택하고 새 리소스 그룹을 찾아 이 데모에서 만든 다음 리소스를 확인합니다.
- 솔루션: 기본적으로 데모에서는 이 솔루션의 이름을 ContainerInsights로 지정합니다. 포털은 솔루션의 작업 영역 이름을 괄호 안에 표시합니다.
- Kubernetes 서비스: 기본적으로 데모에서는 이 서비스의 이름을 k8stest로 지정합니다. (관리되는 Kubernetes 클러스터는 AKS/Azure Kubernetes Service라고도 합니다.)
- Log Analytics 작업 영역: 기본적으로 데모에서는 TestLogAnalyticsWorkspaceName-이라는 접두사와 그 뒤에 임의의 숫자를 사용하여 이 작업 영역의 이름을 지정합니다.
Terraform 상태에서 Kubernetes 구성을 가져오고 다음
echo
명령을 사용하여 kubectl이 읽을 수 있는 파일에 저장합니다.echo "$(terraform output kube_config)" > ./azurek8s
다음
cat
명령을 사용하여 이전 명령이 ASCII EOT 문자를 추가하지 않았는지 확인합니다.cat ./azurek8s
시작 부분에
<< EOT
가 있고 끝 부분에EOT
가 표시되면 파일에서 해당 문자를 제거합니다. 그렇지 않으면error: error loading config file "./azurek8s": yaml: line 2: mapping values are not allowed in this context
오류 메시지가 나타날 수 있습니다.다음
export
명령을 사용하여 kubectl이 올바른 구성을 선택할 수 있도록 환경 변수를 설정합니다.export KUBECONFIG=./azurek8s
kubectl get nodes
명령을 사용하여 클러스터의 상태를 확인합니다.kubectl get nodes
Azure Linux 컨테이너 호스트 클러스터가 생성될 때 클러스터 노드와 Pod의 상태 메트릭을 캡처하기 위해 모니터링이 설정되었습니다. 이 상태 메트릭은 Azure Portal에서 사용할 수 있습니다. 컨테이너 상태 모니터링에 대한 자세한 내용은 Azure Kubernetes Service 상태 모니터링을 참조하세요.
Terraform 실행 계획을 적용하면 여러 주요 값이 출력되었습니다. 예를 들어 호스트 주소, Azure Linux 컨테이너 호스트 클러스터 사용자 이름 및 Azure Linux 컨테이너 호스트 클러스터 암호가 출력됩니다.
모든 출력 값을 보려면
terraform output
을 실행합니다. 특정 출력 값을 보려면echo "$(terraform output <output_value_name>)"
을 실행합니다.
리소스 정리
AKS 리소스 삭제
Terraform을 사용하여 만든 리소스가 더 이상 필요하지 않은 경우 다음 단계를 사용하여 제거할 수 있습니다.
terraform plan
명령을 실행하고destroy
플래그를 지정합니다.terraform plan -destroy -out main.destroy.tfplan
terraform apply
명령을 사용하여 실행 계획을 제거합니다.terraform apply main.destroy.tfplan
서비스 주체 삭제
주의
다른 용도로 사용하지 않는 경우에만 이 데모에서 사용한 서비스 주체를 삭제합니다.
az ad sp list
명령을 사용하여 서비스 주체의 개체 ID 가져오기az ad sp list --display-name "<display_name>" --query "[].{\"Object ID\":id}" --output table
az ad sp delete
명령을 사용하여 서비스 주체를 삭제합니다.az ad sp delete --id <service_principal_object_id>
Azure의 Terraform 문제 해결
Azure에서 Terraform을 사용할 때 발생하는 일반적인 문제를 해결합니다.
다음 단계
이 빠른 시작에서는 Azure Linux 컨테이너 호스트 클러스터를 배포했습니다. Azure Linux 컨테이너 호스트에 대해 자세히 알아보고 전체 클러스터 배포 및 관리 예제를 살펴보려면 Azure Linux 컨테이너 호스트 자습서를 계속 진행하세요.