다음을 통해 공유


빠른 시작: Terraform을 사용하여 AKS 클러스터용 Azure Linux 컨테이너 호스트 배포

Terraform을 사용하여 Azure Linux 컨테이너 호스트 클러스터를 배포하는 Azure Linux 컨테이너 호스트를 시작합니다. 필수 구성 요소를 설치한 후 Terraform 코드를 구현하고 Terraform을 초기화하며 Terraform 실행 계획을 만들고 적용합니다.

Terraform은 클라우드 인프라의 정의, 미리 보기 및 배포를 사용합니다. Terraform을 통해 HCL 구문을 사용하여 구성 파일을 만듭니다. HCL 구문을 사용하면 클라우드 인프라를 구성하는 클라우드 공급자와 요소를 지정할 수 있습니다. 구성 파일을 만든 후 배포되기 전에 인프라 변경을 미리 볼 수 있는 실행 계획를 만듭니다. 변경 내용을 확인 한 후에는 실행 계획을 적용하여 인프라를 배포합니다.

참고 항목

이 문서의 예제 코드는 Microsoft Terraform GitHub 리포지토리에 있습니다.

필수 조건

SSH 키 쌍 만들기

AKS 노드에 액세스하려면 ssh-keygen 명령을 사용해 생성하는 SSH 키 쌍(퍼블릭 및 프라이빗)을 사용하여 연결합니다. 기본적으로 이러한 파일은~/.ssh 디렉터리에 만들어집니다. ssh-keygen 명령을 실행하면 지정된 위치에 이미 존재하는 동일한 이름의 SSH 키 쌍을 덮어씁니다.

  1. https://shell.azure.com으로 이동하여 브라우저에서 Cloud Shell을 엽니다.

  2. ssh-keygen 명령을 실행합니다. 다음 예제에서는 RSA 암호화 및 4096비트 길이를 사용하여 SSH 키 쌍을 만듭니다.

    ssh-keygen -t rsa -b 4096
    

SSH 생성에 대한 자세한 내용은 Azure에서 인증용 SSH 키 생성 및 관리를 참조하세요.

Terraform 코드 구현

  1. 샘플 Terraform 코드를 테스트할 디렉터리를 만들고, 이를 현재 디렉터리로 만듭니다.

  2. 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 {}
        }
    
  3. 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를 지정할 수 있습니다.

  4. 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"
        }
    
  5. 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
        }
    
  6. terraform.tfvars라는 파일을 만들고 다음 코드를 삽입합니다.

        aks_service_principal_app_id = "<service_principal_app_id>"
        aks_service_principal_client_secret = "<service_principal_password>"
    

Terraform 초기화 및 실행 계획 만들기

  1. Terraform을 초기화하고 terraform init 명령을 사용하여 Azure 리소스를 관리하는 데 필요한 Azure 모듈을 다운로드합니다.

    terraform init
    
  2. terraform plan 명령을 사용하여 Terraform 실행 계획을 만듭니다.

    terraform plan -out main.tfplan
    

    terraform plan 명령은 실행 계획을 만들지만 실행하지는 않습니다. 대신 구성 파일에 지정된 구성을 만드는 데 필요한 작업을 결정합니다. 이 패턴을 사용하면 실제 리소스를 변경하기 전에 실행 계획이 예상과 일치하는지 확인할 수 있습니다.

    선택 사항인 -out 매개 변수를 사용하여 계획의 출력 파일을 지정할 수 있습니다. -out 매개 변수를 사용하면 검토한 계획이 정확하게 적용됩니다.

    실행 계획 및 보안을 유지하는 방법에 대한 자세한 내용은 보안 경고를 참조하세요.

  3. terraform apply 명령을 사용하여 Terraform 실행 계획을 적용합니다.

    terraform apply main.tfplan
    

    위의 terraform apply 명령은 이전에 terraform plan -out main.tfplan을 실행한 것으로 가정합니다. -out 매개 변수에 다른 파일 이름을 지정한 경우 terraform apply 호출에 동일한 파일 이름을 사용합니다. -out 매개 변수를 사용하지 않은 경우 매개 변수 없이 terraform apply를 호출합니다.

결과 확인

  1. 다음 echo 명령을 사용하여 리소스 그룹 이름을 가져옵니다.

    echo "$(terraform output resource_group_name)"
    
  2. Azure Portal로 이동합니다.

  3. Azure 서비스 아래에서 리소스 그룹을 선택하고 새 리소스 그룹을 찾아 이 데모에서 만든 다음 리소스를 확인합니다.

    • 솔루션: 기본적으로 데모에서는 이 솔루션의 이름을 ContainerInsights로 지정합니다. 포털은 솔루션의 작업 영역 이름을 괄호 안에 표시합니다.
    • Kubernetes 서비스: 기본적으로 데모에서는 이 서비스의 이름을 k8stest로 지정합니다. (관리되는 Kubernetes 클러스터는 AKS/Azure Kubernetes Service라고도 합니다.)
    • Log Analytics 작업 영역: 기본적으로 데모에서는 TestLogAnalyticsWorkspaceName-이라는 접두사와 그 뒤에 임의의 숫자를 사용하여 이 작업 영역의 이름을 지정합니다.
  4. Terraform 상태에서 Kubernetes 구성을 가져오고 다음 echo 명령을 사용하여 kubectl이 읽을 수 있는 파일에 저장합니다.

    echo "$(terraform output kube_config)" > ./azurek8s
    
  5. 다음 cat 명령을 사용하여 이전 명령이 ASCII EOT 문자를 추가하지 않았는지 확인합니다.

    cat ./azurek8s
    

    시작 부분에 << EOT가 있고 끝 부분에 EOT가 표시되면 파일에서 해당 문자를 제거합니다. 그렇지 않으면 error: error loading config file "./azurek8s": yaml: line 2: mapping values are not allowed in this context 오류 메시지가 나타날 수 있습니다.

  6. 다음 export 명령을 사용하여 kubectl이 올바른 구성을 선택할 수 있도록 환경 변수를 설정합니다.

    export KUBECONFIG=./azurek8s
    
  7. 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을 사용하여 만든 리소스가 더 이상 필요하지 않은 경우 다음 단계를 사용하여 제거할 수 있습니다.

  1. terraform plan 명령을 실행하고 destroy 플래그를 지정합니다.

    terraform plan -destroy -out main.destroy.tfplan
    
  2. terraform apply 명령을 사용하여 실행 계획을 제거합니다.

    terraform apply main.destroy.tfplan
    

서비스 주체 삭제

주의

다른 용도로 사용하지 않는 경우에만 이 데모에서 사용한 서비스 주체를 삭제합니다.

  1. az ad sp list 명령을 사용하여 서비스 주체의 개체 ID 가져오기

    az ad sp list --display-name "<display_name>" --query "[].{\"Object ID\":id}" --output table
    
  2. az ad sp delete 명령을 사용하여 서비스 주체를 삭제합니다.

    az ad sp delete --id <service_principal_object_id>
    

Azure의 Terraform 문제 해결

Azure에서 Terraform을 사용할 때 발생하는 일반적인 문제를 해결합니다.

다음 단계

이 빠른 시작에서는 Azure Linux 컨테이너 호스트 클러스터를 배포했습니다. Azure Linux 컨테이너 호스트에 대해 자세히 알아보고 전체 클러스터 배포 및 관리 예제를 살펴보려면 Azure Linux 컨테이너 호스트 자습서를 계속 진행하세요.