자습서: Terraform을 사용하여 Azure Kubernetes Service로 Kubernetes 클러스터 만들기Tutorial: Create a Kubernetes cluster with Azure Kubernetes Service using Terraform

AKS(Azure Kubernetes Service)는 호스트된 Kubernetes 환경을 관리합니다.Azure Kubernetes Service (AKS) manages your hosted Kubernetes environment. AKS를 사용하면 컨테이너 오케스트레이션 전문 지식 없이도 컨테이너화된 애플리케이션을 배포 및 관리할 수 있습니다.AKS allows you to deploy and manage containerized applications without container orchestration expertise. AKS를 사용하면 앱을 오프라인 상태로 전환하지 않고도 많은 일반적인 유지 관리 작업을 수행할 수 있습니다.AKS also enables you to do many common maintenance operations without taking your app offline. 이러한 작업에는 주문형 리소스 프로비저닝, 업그레이드 및 확장이 포함됩니다.These operations include provisioning, upgrading, and scaling resources on demand.

이 자습서에서는 다음 작업을 수행하는 방법을 알아봅니다.In this tutorial, you learn how to do the following tasks:

  • HCL(HashiCorp Language)을 사용하여 Kubernetes 클러스터 정의Use HCL (HashiCorp Language) to define a Kubernetes cluster
  • Terraform 및 AKS를 사용하여 Kubernetes 클러스터 만들기Use Terraform and AKS to create a Kubernetes cluster
  • kubectl 도구를 사용하여 Kubernetes 클러스터의 가용성 테스트Use the kubectl tool to test the availability of a Kubernetes cluster

사전 요구 사항Prerequisites

디렉터리 구조 만들기Create the directory structure

첫 번째 단계는 연습용 Terraform 구성 파일을 넣을 디렉터리를 만드는 것입니다.The first step is to create the directory that holds your Terraform configuration files for the exercise.

  1. Azure Portal로 이동합니다.Browse to the Azure portal.

  2. Azure Cloud Shell을 엽니다.Open Azure Cloud Shell. 이전에 환경을 선택하지 않은 경우 환경으로 Bash를 선택합니다.If you didn't select an environment previously, select Bash as your environment.

    Cloud Shell 프롬프트

  3. 디렉터리를 clouddrive 디렉터리로 변경합니다.Change directories to the clouddrive directory.

    cd clouddrive
    
  4. 이름이 terraform-aks-k8s인 디렉터리를 만듭니다.Create a directory named terraform-aks-k8s.

    mkdir terraform-aks-k8s
    
  5. 디렉터리를 새 디렉터리로 변경합니다.Change directories to the new directory:

    cd terraform-aks-k8s
    

Azure 공급자 선언Declare the Azure provider

Azure 공급자를 선언하는 Terraform 구성 파일을 만듭니다.Create the Terraform configuration file that declares the Azure provider.

  1. Cloud Shell에서 이름이 main.tf인 파일을 만듭니다.In Cloud Shell, create a file named main.tf.

    code main.tf
    
  2. 다음 코드를 편집기에 붙여 넣습니다.Paste the following code into the editor:

    provider "azurerm" {
        version = "~>1.5"
    }
    
    terraform {
        backend "azurerm" {}
    }
    
  3. 파일을 저장( <Ctrl>S)하고 편집기를 종료( <Ctrl>Q)합니다.Save the file (<Ctrl>S) and exit the editor (<Ctrl>Q).

Kubernetes 클러스터 정의Define a Kubernetes cluster

Kubernetes 클러스터용 리소스를 선언하는 Terraform 구성 파일을 만듭니다.Create the Terraform configuration file that declares the resources for the Kubernetes cluster.

  1. Cloud Shell에서 이름이 k8s.tf인 파일을 만듭니다.In Cloud Shell, create a file named k8s.tf.

    code k8s.tf
    
  2. 다음 코드를 편집기에 붙여 넣습니다.Paste the following code into the editor:

    resource "azurerm_resource_group" "k8s" {
        name     = var.resource_group_name
        location = var.location
    }
    
    resource "random_id" "log_analytics_workspace_name_suffix" {
        byte_length = 8
    }
    
    resource "azurerm_log_analytics_workspace" "test" {
        # 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}"
        location            = var.log_analytics_workspace_location
        resource_group_name = azurerm_resource_group.k8s.name
        sku                 = var.log_analytics_workspace_sku
    }
    
    resource "azurerm_log_analytics_solution" "test" {
        solution_name         = "ContainerInsights"
        location              = azurerm_log_analytics_workspace.test.location
        resource_group_name   = azurerm_resource_group.k8s.name
        workspace_resource_id = azurerm_log_analytics_workspace.test.id
        workspace_name        = azurerm_log_analytics_workspace.test.name
    
        plan {
            publisher = "Microsoft"
            product   = "OMSGallery/ContainerInsights"
        }
    }
    
    resource "azurerm_kubernetes_cluster" "k8s" {
        name                = var.cluster_name
        location            = azurerm_resource_group.k8s.location
        resource_group_name = azurerm_resource_group.k8s.name
        dns_prefix          = var.dns_prefix
    
        linux_profile {
            admin_username = "ubuntu"
    
            ssh_key {
                key_data = file(var.ssh_public_key)
            }
        }
    
        default_node_pool {
            name            = "agentpool"
            node_count      = var.agent_count
            vm_size         = "Standard_DS1_v2"
        }
    
        service_principal {
            client_id     = var.client_id
            client_secret = var.client_secret
        }
    
        addon_profile {
            oms_agent {
            enabled                    = true
            log_analytics_workspace_id = azurerm_log_analytics_workspace.test.id
            }
        }
    
        tags = {
            Environment = "Development"
        }
    }
    

    위의 코드는 클러스터의 이름, 위치 및 리소스 그룹 이름을 설정합니다.The preceding code sets the name of the cluster, location, and the resource group name. FQDN(정규화된 도메인 이름)의 접두사도 설정됩니다.The prefix for the fully qualified domain name (FQDN) is also set. FQDN은 클러스터에 액세스하는 데 사용됩니다.The FQDN is used to access the cluster.

    linux_profile 레코드를 사용하면 SSH를 사용하여 작업자 노드에 로그인할 수 있는 설정을 구성할 수 있습니다.The linux_profile record allows you to configure the settings that enable signing into the worker nodes using SSH.

    AKS를 사용하면 작업자 노드에 대해서만 지불합니다.With AKS, you pay only for the worker nodes. default_node_pool 레코드는 이러한 작업자 노드에 대한 세부 정보를 구성합니다.The default_node_pool record configures the details for these worker nodes. default_node_pool record에는 만들 작업자 노드 수와 작업자 노드 유형이 포함됩니다.The default_node_pool record includes the number of worker nodes to create and the type of worker nodes. 나중에 클러스터를 확장하거나 축소해야 하는 경우, 이 레코드에서 count 값을 수정합니다.If you need to scale up or scale down the cluster in the future, you modify the count value in this record.

  3. 파일을 저장( <Ctrl>S)하고 편집기를 종료( <Ctrl>Q)합니다.Save the file (<Ctrl>S) and exit the editor (<Ctrl>Q).

변수 선언Declare the variables

  1. Cloud Shell에서 이름이 variables.tf인 파일을 만듭니다.In Cloud Shell, create a file named variables.tf.

    code variables.tf
    
  2. 다음 코드를 편집기에 붙여 넣습니다.Paste the following code into the editor:

    variable "client_id" {}
    variable "client_secret" {}
    
    variable "agent_count" {
        default = 3
    }
    
    variable "ssh_public_key" {
        default = "~/.ssh/id_rsa.pub"
    }
    
    variable "dns_prefix" {
        default = "k8stest"
    }
    
    variable cluster_name {
        default = "k8stest"
    }
    
    variable resource_group_name {
        default = "azure-k8stest"
    }
    
    variable location {
        default = "Central US"
    }
    
    variable log_analytics_workspace_name {
        default = "testLogAnalyticsWorkspaceName"
    }
    
    # refer https://azure.microsoft.com/global-infrastructure/services/?products=monitor for log analytics available regions
    variable log_analytics_workspace_location {
        default = "eastus"
    }
    
    # refer https://azure.microsoft.com/pricing/details/monitor/ for log analytics pricing 
    variable log_analytics_workspace_sku {
        default = "PerGB2018"
    }
    
  3. 파일을 저장( <Ctrl>S)하고 편집기를 종료( <Ctrl>Q)합니다.Save the file (<Ctrl>S) and exit the editor (<Ctrl>Q).

Terraform 출력 파일 만들기Create a Terraform output file

Terraform 출력을 사용하면 Terraform이 계획을 적용할 때 사용자에게 강조 표시되는 값 및 terraform output 명령을 사용하여 쿼리할 수 있는 값을 정의할 수 있습니다.Terraform outputs allow you to define values that will be highlighted to the user when Terraform applies a plan, and can be queried using the terraform output command. 이 섹션에서는 kubectl 도구를 사용하여 클러스터 액세스를 허용하는 출력 파일을 만듭니다.In this section, you create an output file that allows access to the cluster with kubectl.

  1. Cloud Shell에서 이름이 output.tf인 파일을 만듭니다.In Cloud Shell, create a file named output.tf.

    code output.tf
    
  2. 다음 코드를 편집기에 붙여 넣습니다.Paste the following code into the editor:

    output "client_key" {
        value = azurerm_kubernetes_cluster.k8s.kube_config.0.client_key
    }
    
    output "client_certificate" {
        value = azurerm_kubernetes_cluster.k8s.kube_config.0.client_certificate
    }
    
    output "cluster_ca_certificate" {
        value = azurerm_kubernetes_cluster.k8s.kube_config.0.cluster_ca_certificate
    }
    
    output "cluster_username" {
        value = azurerm_kubernetes_cluster.k8s.kube_config.0.username
    }
    
    output "cluster_password" {
        value = azurerm_kubernetes_cluster.k8s.kube_config.0.password
    }
    
    output "kube_config" {
        value = azurerm_kubernetes_cluster.k8s.kube_config_raw
    }
    
    output "host" {
        value = azurerm_kubernetes_cluster.k8s.kube_config.0.host
    }
    
  3. 파일을 저장( <Ctrl>S)하고 편집기를 종료( <Ctrl>Q)합니다.Save the file (<Ctrl>S) and exit the editor (<Ctrl>Q).

Terraform 상태를 저장하도록 Azure Storage 설정Set up Azure storage to store Terraform state

Terraform은 terraform.tfstate 파일을 통해 로컬로 상태를 추적합니다.Terraform tracks state locally via the terraform.tfstate file. 이 패턴은 단일 작업자 환경에서 잘 작동합니다.This pattern works well in a single-person environment. 다중 사용자 환경에서 Azure 스토리지는 상태를 추적하는 데 사용됩니다.In a multi-person environment, Azure storage is used to track state.

이 섹션에서는 다음 작업을 수행하는 방법을 보여줍니다.In this section, you see how to do the following tasks:

  • 스토리지 계정 정보 검색(계정 이름 및 계정 키)Retrieve storage account information (account name and account key)
  • Terraform 상태 정보가 저장되는 스토리지 컨테이너를 만듭니다.Create a storage container into which Terraform state information will be stored.
  1. Azure Portal에서 왼쪽 메뉴에 있는 모든 서비스를 선택합니다.In the Azure portal, select All services in the left menu.

  2. 스토리지 계정을 선택합니다.Select Storage accounts.

  3. 스토리지 계정 탭에서 Terraform가 상태를 저장하도록 설정할 스토리지 계정의 이름을 선택합니다.On the Storage accounts tab, select the name of the storage account into which Terraform is to store state. 예를 들어, Cloud Shell을 처음 열 때 만들어진 스토리지 계정을 사용할 수 있습니다.For example, you can use the storage account created when you opened Cloud Shell the first time. Cloud Shell에서 만든 스토리지 계정 이름은 일반적으로 cs로 시작되고 그 뒤에 숫자 및 문자로 이루어진 임의의 문자열이 나옵니다.The storage account name created by Cloud Shell typically starts with cs followed by a random string of numbers and letters. 선택한 스토리지 계정을 기록해 둡니다.Take note of the storage account you select. 이 값은 나중에 필요합니다.This value is needed later.

  4. [스토리지 계정] 탭에서 액세스 키를 선택합니다.On the storage account tab, select Access keys.

    스토리지 계정 메뉴

  5. key1 key 값을 기록해 둡니다.Make note of the key1 key value. (키 오른쪽에 있는 아이콘을 선택하면 값이 클립보드에 복사됩니다.)(Selecting the icon to the right of the key copies the value to the clipboard.)

    스토리지 계정 액세스 키

  6. Cloud Shell에서 Azure 스토리지 계정에 컨테이너를 만듭니다.In Cloud Shell, create a container in your Azure storage account. 자리 표시자를 사용자 환경에 적합한 값으로 바꿉니다.Replace the placeholders with appropriate values for your environment.

    az storage container create -n tfstate --account-name <YourAzureStorageAccountName> --account-key <YourAzureStorageAccountKey>
    

Kubernetes 클러스터 만들기Create the Kubernetes cluster

이 섹션에서는 terraform init 명령을 사용하여 이전 섹션에서 만든 구성 파일을 정의하는 리소스를 만드는 방법을 보여 줍니다.In this section, you see how to use the terraform init command to create the resources defined the configuration files you created in the previous sections.

  1. Cloud Shell에서 Terraform을 초기화합니다.In Cloud Shell, initialize Terraform. 자리 표시자를 사용자 환경에 적합한 값으로 바꿉니다.Replace the placeholders with appropriate values for your environment.

    terraform init -backend-config="storage_account_name=<YourAzureStorageAccountName>" -backend-config="container_name=tfstate" -backend-config="access_key=<YourStorageAccountAccessKey>" -backend-config="key=codelab.microsoft.tfstate" 
    

    terraform init 명령은 백 엔드 및 공급자 플러그 인 초기화 성공을 표시합니다.The terraform init command displays the success of initializing the backend and provider plug-in:

    “terraform init” 결과의 예

  2. 서비스 주체 자격 증명 내보내기Export your service principal credentials. 자리 표시자를 서비스 주체의 적절한 값으로 바꿉니다.Replace the placeholders with appropriate values from your service principal.

    export TF_VAR_client_id=<service-principal-appid>
    export TF_VAR_client_secret=<service-principal-password>
    
  3. terraform plan 명령을 실행하여 인프라 요소를 정의하는 Terraform 계획을 만듭니다.Run the terraform plan command to create the Terraform plan that defines the infrastructure elements.

    terraform plan -out out.plan
    

    terraform plan 명령은 terraform apply 명령 실행 시 만들어질 리소스를 표시합니다.The terraform plan command displays the resources that will be created when you run the terraform apply command:

    “terraform plan” 결과의 예

  4. terraform apply 명령을 실행하여 Kubernetes 클러스터를 만들 계획에 적용합니다.Run the terraform apply command to apply the plan to create the Kubernetes cluster. Kubernetes 클러스터를 만드는 프로세스는 몇 분 정도 소요될 수도 있으며 이 경우 Cloud Shell 세션 시간이 초과됩니다. Cloud Shell 세션의 시간이 초과되면 "Cloud Shell 시간 초과에서 복구" 섹션에 나온 단계에 따라 자습서를 완료할 수 있습니다.The process to create a Kubernetes cluster can take several minutes, resulting in the Cloud Shell session timing out. If the Cloud Shell session times out, you can follow the steps in the section "Recover from a Cloud Shell timeout" to enable you to complete the tutorial.

    terraform apply out.plan
    

    terraform apply 명령은 구성 파일에 정의된 리소스 만들기의 결과를 표시합니다.The terraform apply command displays the results of creating the resources defined in your configuration files:

    “terraform apply” 결과의 예

  5. Azure Portal에서 왼쪽 메뉴에 있는 모든 리소스를 선택하여 새 Kubernetes 클러스터에 대해 만든 리소스가 표시됩니다.In the Azure portal, select All resources in the left menu to see the resources created for your new Kubernetes cluster.

    Azure Portal의 모든 리소스

Cloud Shell 시간 초과에서 복구Recover from a Cloud Shell timeout

Cloud Shell 세션의 시간이 초과되면 다음 단계를 수행하여 복구할 수 있습니다.If the Cloud Shell session times out, you can do the following steps to recover:

  1. Cloud Shell 세션을 시작합니다.Start a Cloud Shell session.

  2. Terraform 구성 파일이 있는 디렉터리로 변경합니다.Change to the directory containing your Terraform configuration files.

    cd /clouddrive/terraform-aks-k8s
    
  3. 다음 명령 실행:Run the following command:

    export KUBECONFIG=./azurek8s
    

Kubernetes 클러스터 테스트Test the Kubernetes cluster

새로 만든 클러스터를 Kubernetes 도구를 사용해 확인할 수 있습니다.The Kubernetes tools can be used to verify the newly created cluster.

  1. Terraform 상태에서 Kubernetes 구성을 가져오고 이를 kubectl이 읽을 수 있는 파일에 저장합니다.Get the Kubernetes configuration from the Terraform state and store it in a file that kubectl can read.

    echo "$(terraform output kube_config)" > ./azurek8s
    
  2. kubectl이 올바른 구성을 선택할 수 있도록 환경 변수를 설정합니다.Set an environment variable so that kubectl picks up the correct config.

    export KUBECONFIG=./azurek8s
    
  3. 클러스터 상태를 확인합니다.Verify the health of the cluster.

    kubectl get nodes
    

    작업자 노드의 세부 정보가 표시됩니다. 노드는 다음 이미지에 나온 대로 모두 Ready상태여야 합니다.You should see the details of your worker nodes, and they should all have a status Ready, as shown in the following image:

    kubectl 도구를 사용하여 Kubernetes 클러스터의 상태 확인

상태 및 로그 모니터링Monitor health and logs

AKS 클러스터가 생성될 때 클러스터 노드와 Pod의 상태 메트릭을 캡처하기 위해 모니터링이 설정되었습니다.When the AKS cluster was created, monitoring was enabled to capture health metrics for both the cluster nodes and pods. 이 상태 메트릭은 Azure Portal에서 사용할 수 있습니다.These health metrics are available in the Azure portal. 컨테이너 상태 모니터링에 대한 자세한 내용은 Azure Kubernetes Service 상태 모니터링을 참조하세요.For more information on container health monitoring, see Monitor Azure Kubernetes Service health.

다음 단계Next steps