프라이빗 AKS(Azure Kubernetes Service) 클러스터 만들기

이 문서는 Azure CLI 또는 Terraform을 사용하여 프라이빗 링크 기반 AKS 클러스터를 배포하는 데 도움이 됩니다. 필요한 프라이빗 링크 또는 터널 없이 AKS 클러스터를 만들려면 API Server VNet 통합을 사용하여 AKS(Azure Kubernetes Service) 클러스터 만들기 참조하세요.

AKS의 프라이빗 클러스터 개요

프라이빗 클러스터의 컨트롤 플레인 또는 API 서버에는 RFC1918 - 프라이빗 인터넷용 주소 할당 문서에 정의된 내부 IP 주소가 있습니다. 프라이빗 클러스터를 사용하면 API 서버와 노드 풀 간의 네트워크 트래픽이 개인 네트워크에만 유지되도록 할 수 있습니다.

컨트롤 플레인 또는 API 서버는 AKS 관리 Azure 리소스 그룹에 있고 클러스터 또는 노드 풀은 리소스 그룹에 있습니다. 서버와 클러스터 또는 노드 풀은 API 서버 가상 네트워크의 Azure Private Link 서비스 및 AKS 클러스터의 서브넷에 노출된 프라이빗 엔드포인트를 통해 서로 통신할 수 있습니다.

프라이빗 AKS 클러스터를 만들 때 AKS는 기본적으로 해당 DNS 영역을 사용하여 프라이빗 및 퍼블릭 FQDN(정규화된 도메인 이름)을 모두 만듭니다. 자세한 DNS 구성 옵션은 프라이빗 DNS 영역, 프라이빗 DNS 하위 영역 또는 사용자 지정 하위 도메인 구성을 참조하세요.

지역 가용성

프라이빗 클러스터는 공용 지역, Azure Government 및 Microsoft Azure AKS가 지원되는 21Vianet 지역에서 작동합니다.

중요

모든 클라우드용 Microsoft Defender 기능은 2026년 8월 18일 중국 지역의 Azure 공식적으로 사용 중지됩니다. 이 예정된 사용 중지로 인해 중국의 Azure 고객은 더 이상 서비스에 새 구독을 등록할 수 없습니다. 새 구독은 사용 중지 공지 날짜인 2025년 8월 18일 이전에 클라우드용 Microsoft Defender 서비스에 아직 등록되지 않은 모든 구독입니다. 자세한 사용 중지 정보는 21Vianet이 운영하는 Microsoft Azure의 클라우드용 Microsoft Defender 사용 중단 공지를 참조하세요.

고객은 21Vianet에서 운영하는 Microsoft Azure 계정 담당자와 협력하여 이러한 사용 중지가 자신의 운영에 미치는 영향을 평가해야 합니다.

프라이빗 AKS 클러스터에 대한 필수 구성 요소

  • 활성 Azure 구독입니다. Azure 구독이 없는 경우 시작하기 전에 free 계정 만듭니다.

  • 명령을 사용하여 구독 컨텍스트를 az account set 설정합니다. 다음은 그 예입니다.

    az account set --subscription "00000000-0000-0000-0000-000000000000"
    
  • Azure CLI 버전 2.28.0 이상 az --version 명령을 사용하여 버전을 찾으세요. 설치하거나 업그레이드해야 하는 경우 Azure CLI 설치를 참조하세요.

  • ARM(Azure Resource Manager) 또는 Azure REST API를 사용하는 경우 AKS API 버전은 2021-05-01 이상이어야 합니다.

  • 사용자 지정 DNS 서버를 사용하려면 Azure 공용 IP 주소 168.63.129.16을 사용자 지정 DNS 서버의 업스트림 DNS 서버로 추가하고 이 공용 IP 주소를 first DNS 서버로 추가해야 합니다. Azure IP 주소에 대한 자세한 내용은 IP 주소 168.63.129.16인가요?

    • 클러스터의 DNS 영역은 168.63.129.16으로 전달해야 합니다. Azure 서비스 DNS 영역 구성 영역 이름에 대한 자세한 내용을 확인할 수 있습니다.
  • API Server VNet 통합으로 사용하도록 설정된 기존 AKS 클러스터는 프라이빗 클러스터 모드를 사용하도록 설정할 수 있습니다. 자세한 내용은 API Server VNet 통합을 사용하여 기존 클러스터에서 프라이빗 클러스터 모드 사용 또는 사용 안 함을 참조하세요.

  • 프라이빗 AKS 클러스터에서 Azure Container Registry 사용하도록 설정해야 하는 경우 클러스터 가상 네트워크(VNet)의 컨테이너 레지스트리에 대한 프라이빗 링크를 설정하거나 컨테이너 레지스트리의 VNet과 프라이빗 클러스터의 VNet 간에 피어링을 설정합니다.

  • kubectl 이 설치되었습니다. az aks install-cli 명령을 사용하여 로컬로 설치할 수 있습니다.

  • Terraform이 로컬로 설치되었습니다. 설치 지침은 Terraform 설치를 참조하세요.

중요

November 30, 2025부터 AKS(Azure Kubernetes Service) 더 이상 Azure Linux 2.0에 대한 보안 업데이트를 지원하거나 제공하지 않습니다. Azure Linux 2.0 노드 이미지는 202512.06.0 릴리스 고정되어 있습니다. 2026년 3월 31일부터 노드 이미지가 제거되며 노드 풀의 크기를 조정할 수 없습니다. 노드 풀을 지원되는 Kubernetes 버전으로 업그레이드하거나 osSku AzureLinux3 마이그레이션하여 지원되는 Azure Linux 버전으로 마이그레이션합니다. 자세한 내용은 GitHub 서비스 종료 이슈Azure 업데이트 서비스 종료 공지를 참조하세요. 공지 사항 및 업데이트 소식을 접하려면 AKS 릴리스 정보를 참고하세요.

제한점

  • IP 권한 있는 범위는 공용 API 서버에만 적용됩니다. 프라이빗 API 서버 엔드포인트에는 이러한 범위를 적용할 수 없습니다.
  • Azure Private Link 서비스 제한 프라이빗 클러스터에 적용됩니다.
  • 프라이빗 클러스터를 사용하는 Azure DevOps Microsoft 호스팅 에이전트는 지원되지 않습니다. 자체 호스팅 에이전트를 사용하는 것이 좋습니다.
  • 고객 서브넷에서 프라이빗 엔드포인트를 삭제하거나 수정하면 클러스터의 작동이 중지됩니다.
  • Azure Private Link 서비스는 표준 Azure Load Balancer만 지원됩니다. 기본 Azure Load Balancer 지원되지 않습니다.

사용자 지정 DNS를 사용한 프라이빗 AKS 클러스터의 허브 및 스포크 구성

Hub 및 스포크 아키텍처는 일반적으로 Azure 네트워크를 배포하는 데 사용됩니다. 이러한 배포의 대부분에서 스포크 VNet의 DNS 설정은 온-프레미스 및 Azure 기반 DNS 확인을 허용하도록 중앙 DNS 전달자를 참조하도록 구성됩니다.

다음 다이어그램에서는 사용자 지정 DNS를 사용하는 프라이빗 AKS 클러스터에 대한 허브 및 스포크 아키텍처를 보여 줍니다.

프라이빗 클러스터 허브 및 스포크

  • 프라이빗 클러스터가 만들어지면 기본적으로 프라이빗 엔드포인트(1) 및 프라이빗 DNS 영역(2)이 클러스터 관리 리소스 그룹에 만들어집니다. 클러스터는 프라이빗 영역의 A 레코드를 사용하여 API 서버와 통신할 프라이빗 엔드포인트의 IP를 확인합니다.
  • 프라이빗 DNS 영역은 클러스터 노드가 연결된 VNet(3)에만 연결됩니다. 즉, 프라이빗 엔드포인트는 연결된 VNet의 호스트에서만 확인할 수 있습니다. VNet에 사용자 지정 DNS가 구성되지 않은 경우(기본값) 연결을 통해 프라이빗 DNS 영역의 레코드를 확인할 수 있는 DNS인 168.63.129.16 에 위치한 호스트 지점으로서 이 작업은 문제없이 작동합니다.
  • 기본 프라이빗 DNS 영역 동작을 유지하는 경우 AKS는 영역이 이미 허브 VNet에 연결된 경우에도 클러스터를 호스트하는 스포크 VNet에 영역을 직접 연결하려고 합니다.
    • 사용자 지정 DNS 서버를 사용하는 스포크 VNet에서 클러스터의 관리 ID에 스포크 VNet의 네트워크 기여자가 없는 경우 이 작업이 실패할 수 있습니다. 오류를 방지하려면 지원되는 다음 구성 중 하나를 선택합니다.
      • 사용자 지정 프라이빗 DNS 영역: 기존 프라이빗 영역을 제공하고 해당 리소스 ID로 설정합니다 privateDNSZone / --private-dns-zone . 해당 영역을 적절한 VNet(예: 허브 VNet)에 연결하고 publicDNSfalse로 설정합니다 --disable-public-fqdn.
      • 공용 DNS만: privateDNSZone / --private-dns-zonenone 로 설정하여 프라이빗 영역 만들기를 비활성화하고 publicDNS 를 기본값(true)으로 남겨 두세요--disable-public-fqdn.
  • 프라이빗 클러스터에서 kubenet 및 BYO DNS와 함께 BYO(Bring Your Own) 경로 테이블을 사용하는 경우 클러스터 만들기가 실패합니다. 클러스터 만들기를 실패한 후에는 노드 리소스 그룹의 RouteTable을 서브넷에 연결하여 성공적으로 클러스터를 만듭니다.

사용자 지정 DNS를 사용하는 프라이빗 AKS 클러스터에 대한 제한 사항

  • privateDNSZone / --private-dns-zone과(와) nonepublicDNS: false / --disable-public-fqdn 동시에 설정하는 것은 지원되지 않습니다.
  • 조건부 전달은 하위 도메인을 지원하지 않습니다.

리소스 그룹 만들기

az group create 명령을 사용하여 리소스 그룹을 만듭니다. AKS 클러스터에 기존 리소스 그룹을 사용할 수도 있습니다.

az group create \
    --name <private-cluster-resource-group> \
    --location <location>

기본 기본 네트워킹을 사용하여 프라이빗 AKS 클러스터 만들기

az aks create 플래그와 함께 --enable-private-cluster 명령을 사용하여 기본 네트워킹이 있는 프라이빗 클러스터를 만듭니다.

이 명령의 키 매개 변수:

  • --enable-private-cluster: 프라이빗 클러스터 모드를 사용하도록 설정합니다.
az aks create \
    --name <private-cluster-name> \
    --resource-group <private-cluster-resource-group> \
    --load-balancer-sku standard \
    --enable-private-cluster \
    --generate-ssh-keys
  1. main.tf 파일을 만들고 다음 코드를 추가하여 Terraform 버전을 정의하고 Azure 공급자를 지정합니다.

    terraform {
      required_version = ">= 1.3.0"
      required_providers {
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~> 4.0"
        }
      }
    }
    
    provider "azurerm" {
      features {}
      subscription_id = var.subscription_id
    }
    
  2. main.tf 다음 코드를 추가하여 Azure 구독 ID, 리소스 그룹 이름, 위치 및 AKS 클러스터 이름에 대한 입력 변수를 만듭니다. 필요에 따라 기본값을 수정할 수 있습니다.

    variable "subscription_id" {
      description = "The Azure subscription ID."
      type = string
    }
    
    variable "resource_group_name" {
      description = "The name of the resource group for the AKS cluster."
      type        = string
      default     = "rg-private-aks-basic"
    }
    
    variable "location" {
      description = "The Azure region where the resources will be created."
      type        = string
      default     = "eastus"
    }
    
    variable "aks_cluster_name" {
      description = "The name of the AKS cluster."
      type        = string
      default     = "aks-private-basic"
    }
    
  3. 다음 코드를 main.tf 추가하여 Azure 리소스 그룹을 만듭니다.

    resource "azurerm_resource_group" "this" {
      name     = var.resource_group_name
      location = var.location
    }
    
  4. 다음 코드를 추가하여 main.tf 기본 네트워킹을 사용하여 프라이빗 AKS 클러스터를 만듭니다.

    resource "azurerm_kubernetes_cluster" "this" {
      name                = var.aks_cluster_name
      location            = azurerm_resource_group.this.location
      resource_group_name = azurerm_resource_group.this.name
      dns_prefix          = "privatebasicaks"
    
      private_cluster_enabled = true
    
      default_node_pool {
        name       = "system"
        node_count = 1
        vm_size    = "Standard_DS2_v2"
      }
    
      identity {
        type = "SystemAssigned"
      }
    
      network_profile {
        load_balancer_sku = "standard"
        network_plugin    = "kubenet"
      }
    }
    
  5. 단계에 따라 Terraform을 초기화하고, Terraform 구성의 형식을 지정하고, 유효성을 검사하고, Terraform 실행 계획을 만들고, Terraform 구성을 적용하고, AKS 클러스터에 연결합니다.

고급 네트워킹을 사용하여 프라이빗 AKS 클러스터 만들기

az aks create 명령을 사용하여 고급 네트워킹 기능이 포함된 프라이빗 클러스터를 만듭니다.

이 명령의 키 매개 변수:

  • --enable-private-cluster: 프라이빗 클러스터 모드를 사용하도록 설정합니다.
  • --network-plugin azure: Azure CNI 네트워킹 플러그 인을 지정합니다.
  • --vnet-subnet-id <subnet-id>: VNet에 있는 기존 서브넷의 리소스 ID입니다.
  • --dns-service-ip <dns-service-ip>: 클러스터 DNS 서비스에 사용할 Kubernetes 서비스 주소 범위 내에서 사용 가능한 IP 주소입니다. 예: 10.2.0.10.
  • --service-cidr <service-cidr>: 서비스 클러스터 IP를 할당할 CIDR 표기법 IP 범위입니다. 예: 10.2.0.0/24.
az aks create \
    --resource-group <private-cluster-resource-group> \
    --name <private-cluster-name> \
    --load-balancer-sku standard \
    --enable-private-cluster \
    --network-plugin azure \
    --vnet-subnet-id <subnet-id> \
    --dns-service-ip <dns-service-ip> \
    --service-cidr <service-cidr> \
    --generate-ssh-keys
  1. main.tf 파일을 만들고 다음 코드를 추가하여 Terraform 버전을 정의하고 Azure 공급자를 지정합니다.

    terraform {
      required_version = ">= 1.3.0"
      required_providers {
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~> 4.0"
        }
      }
    }
    
    provider "azurerm" {
      features {}
      subscription_id = var.subscription_id
    }
    
  2. 다음 코드를 main.tf 추가하여 Azure 구독 ID, 리소스 그룹 이름, 위치, AKS 클러스터 이름, VNet(가상 네트워크) 이름 및 서브넷 이름에 대한 입력 변수를 만듭니다. 필요에 따라 기본값을 수정할 수 있습니다.

    variable "subscription_id" {
      description = "The Azure subscription ID."
      type = string
    }
    
    variable "resource_group_name" {
      description = "The name of the resource group for the AKS cluster."
      type = string
      default = "rg-private-aks-advanced"
    }
    
    variable "location" {
      description = "The Azure region where the resources will be created."
      type = string
      default = "eastus"
    }
    
    variable "aks_cluster_name" {
      description = "The name of the AKS cluster."
      type = string
      default = "aks-private-advanced"
    }
    
    variable "vnet_name" {
      description = "The name of the virtual network."
      type = string
      default = "vnet-private-aks"
    }
    
    variable "subnet_name" {
      description = "The name of the subnet used by AKS."
      type = string
      default = "snet-aks"
    }
    
  3. 다음 코드를 main.tf 추가하여 Azure 리소스 그룹, VNet 및 서브넷을 만듭니다.

    resource "azurerm_resource_group" "this" {
      name = var.resource_group_name
      location = var.location
    }
    
    resource "azurerm_virtual_network" "this" {
      name = var.vnet_name
      location = azurerm_resource_group.this.location
      resource_group_name = azurerm_resource_group.this.name
      address_space = ["10.0.0.0/8"]
    }
    
    resource "azurerm_subnet" "aks" {
      name = var.subnet_name
      resource_group_name  = azurerm_resource_group.this.name
      virtual_network_name = azurerm_virtual_network.this.name
      address_prefixes = ["10.240.0.0/16"]
    }
    
  4. 고급 네트워킹을 사용하여 main.tf AKS 클러스터를 만들려면 다음 코드를 추가합니다.

    resource "azurerm_kubernetes_cluster" "this" {
      name = var.aks_cluster_name
      location = azurerm_resource_group.this.location
      resource_group_name = azurerm_resource_group.this.name
      dns_prefix = "privateadvancedaks"
    
      private_cluster_enabled = true
    
      default_node_pool {
        name = "system"
        node_count = 1
        vm_size = "Standard_DS2_v2"
        vnet_subnet_id = azurerm_subnet.aks.id
      }
    
      identity {
        type = "SystemAssigned"
      }
    
      network_profile {
        load_balancer_sku = "standard"
        network_plugin = "azure"
        dns_service_ip = "10.2.0.10"
        service_cidr = "10.2.0.0/24"
      }
    }
    
  5. 단계에 따라 Terraform을 초기화하고, Terraform 구성의 형식을 지정하고, 유효성을 검사하고, Terraform 실행 계획을 만들고, Terraform 구성을 적용하고, AKS 클러스터에 연결합니다.

프라이빗 AKS 클러스터에서 사용자 지정 도메인 사용

내부적으로만 확인할 수 있는 사용자 지정 도메인을 구성하려는 경우 사용자 지정 도메인 사용을 참조하세요.

프라이빗 AKS 클러스터에서 공용 FQDN 사용 안 함

새 클러스터에서 공용 FQDN 사용 안 함

az aks create 명령과 --disable-public-fqdn 플래그를 사용하여 프라이빗 AKS 클러스터를 만들 때 공용 FQDN을 사용하지 않도록 설정합니다.

이 명령의 키 매개 변수:

  • --disable-public-fqdn: API 서버에 대한 공용 FQDN(정규화된 도메인 이름)을 사용하지 않도록 설정합니다.
  • --assign-identity <resource-id>: 클러스터에 사용할 관리 ID를 지정합니다.
  • --private-dns-zone [system|none]: 클러스터에 사용할 프라이빗 DNS 영역을 지정합니다. system 는 프라이빗 DNS 영역을 구성할 때 기본값입니다. 생략 --private-dns-zone하면 AKS는 노드 리소스 그룹에 프라이빗 DNS 영역을 만듭니다. none 는 프라이빗 DNS 영역 만들기를 사용하지 않도록 설정합니다.
az aks create \
    --name <private-cluster-name> \
    --resource-group <private-cluster-resource-group> \
    --load-balancer-sku standard \
    --enable-private-cluster \
    --assign-identity <resource-id> \
    --private-dns-zone [system|none] \
    --disable-public-fqdn \
    --generate-ssh-keys
  1. 고급 네트워킹을 사용하여 프라이빗 AKS 클러스터 만들기 또는 기본 기본 네트워킹을 사용하여 프라이빗 AKS 클러스터 만들기의 1-3단계를 수행하여 Terraform 구성을 설정하고 시나리오에 따라 필요한 리소스를 만듭니다. 이 예제에서는 고급 네트워킹을 사용합니다.

  2. 다음 코드를 main.tf 추가하여 사용자 할당 ID와 공용 FQDN을 사용하지 않도록 설정한 프라이빗 AKS 클러스터를 만듭니다.

    resource "azurerm_user_assigned_identity" "aks" {
      name = "id-private-aks-public-fqdn-off"
      location = azurerm_resource_group.this.location
      resource_group_name = azurerm_resource_group.this.name
    }
    resource "azurerm_kubernetes_cluster" "this" {
      name = var.aks_cluster_name
      location = azurerm_resource_group.this.location
      resource_group_name = azurerm_resource_group.this.name
      dns_prefix = "privateaks"
      private_cluster_enabled = true
      private_cluster_public_fqdn_enabled = false
    
      private_dns_zone_id = "System"
    
      default_node_pool {
        name = "system"
        node_count = 1
        vm_size = "Standard_DS2_v2"
        vnet_subnet_id = azurerm_subnet.aks.id
      }
      identity {
        type = "UserAssigned"
        identity_ids = [azurerm_user_assigned_identity.aks.id]
      }
      network_profile {
        load_balancer_sku = "standard"
        network_plugin = "azure"
        dns_service_ip = "10.2.0.10"
        service_cidr = "10.2.0.0/24"
      }
    }
    
  3. 단계에 따라 Terraform을 초기화하고, Terraform 구성의 형식을 지정하고, 유효성을 검사하고, Terraform 실행 계획을 만들고, Terraform 구성을 적용하고, AKS 클러스터에 연결합니다.

기존 클러스터에서 공용 FQDN 사용 안 함

az aks update 플래그와 함께 --disable-public-fqdn 명령을 사용하여 기존 AKS 클러스터에서 공용 FQDN을 사용하지 않도록 설정합니다.

이 명령의 키 매개 변수:

  • --disable-public-fqdn: API 서버에 대한 공용 FQDN(정규화된 도메인 이름)을 사용하지 않도록 설정합니다.
az aks update \
    --name <private-cluster-name> \
    --resource-group <private-cluster-resource-group> \
    --disable-public-fqdn
  1. 기존 main.tf AKS 클러스터에서 공용 FQDN을 사용하지 않도록 설정하려면 기존 코드에 다음 코드를 추가합니다. 이 예제에서는 고급 네트워킹을 사용합니다. 관련 Terraform 리소스 및 매개 변수를 변경하여 기본 기본 네트워킹을 사용하도록 수정할 수 있습니다.

    resource "azurerm_kubernetes_cluster" "this" {
      name = var.aks_cluster_name
      location = azurerm_resource_group.this.location
      resource_group_name = azurerm_resource_group.this.name
      dns_prefix = "privateaks"
    
      private_cluster_enabled = true
      private_cluster_public_fqdn_enabled = false
      private_dns_zone_id = "System"
    
      default_node_pool {
        name = "system"
        node_count = 1
        vm_size = "Standard_DS2_v2"
        vnet_subnet_id = azurerm_subnet.aks.id
      }
    
      identity {
        type = "UserAssigned"
        identity_ids = [azurerm_user_assigned_identity.aks.id]
      }
    
      network_profile {
        load_balancer_sku = "standard"
        network_plugin = "azure"
        dns_service_ip = "10.2.0.10"
        service_cidr = "10.2.0.0/24"
      }
    }
    
  2. Terraform의 업데이트된 구성을 terraform planterraform apply 명령을 사용하여 적용합니다.

    terraform plan
    terraform apply
    

프라이빗 DNS에 대한 구성 옵션

Azure CLI(--private-dns-zone 매개 변수 포함) 또는 ARM(Azure Resource Manager) 템플릿(privateDNSZone 속성 포함)을 사용하여 프라이빗 AKS 클러스터에 대한 프라이빗 DNS 설정을 구성할 수 있습니다. 다음 표에서는 매개 변수/ --private-dns-zone 속성에 사용할 수 있는 privateDNSZone 옵션을 간략하게 설명합니다.

Setting Description
system 프라이빗 DNS 영역을 구성할 때의 기본값입니다. 생략 --private-dns-zone / privateDNSZone하면 AKS는 노드 리소스 그룹에 프라이빗 DNS 영역을 만듭니다.
none --private-dns-zone / privateDNSZonenone로 설정하면 AKS는 비공개 DNS 영역을 만들지 않습니다.
<custom-private-dns-zone-resource-id> 이 매개 변수를 사용하려면 Azure 전역 클라우드에 대해 privatelink.<region>.azmk8s.io 또는 <subzone>.privatelink.<region>.azmk8s.io 형식으로 프라이빗 DNS 영역을 만들어야 합니다. 나중에 사용하려면 프라이빗 DNS 영역의 리소스 ID가 필요합니다. 또한 프라이빗 DNS 영역 기여자Network 기여자 역할이 있는 사용자 할당 ID 또는 서비스 주체가 필요합니다. API Server VNet 통합을 사용하는 클러스터의 경우 프라이빗 DNS 영역은 이름 지정 형식 private.<region>.azmk8s.io 을 지원합니다 <subzone>.private.<region>.azmk8s.io. 클러스터를 만든 후에는 이러한 리소스 리소스를 변경하거나 삭제할 수 없습니다. 이 경우 성능 문제 및 클러스터 업그레이드 오류가 발생할 수 있습니다. --fqdn-subdomain <subdomain><custom-private-dns-zone-resource-id>와 함께 사용하면 privatelink.<region>.azmk8s.io에 하위 도메인 기능을 제공할 수 있습니다. 하위 존을 지정하는 경우 이름에 대한 <subzone> 32자 제한이 있습니다.

프라이빗 DNS에 대한 고려 사항

프라이빗 AKS 클러스터에 대한 프라이빗 DNS를 구성할 때는 다음 사항을 고려해야 합니다.

  • 프라이빗 DNS 영역이 AKS 클러스터와 다른 구독에 있는 경우 두 구독에 Microsoft.ContainerService Azure 공급자를 등록해야 합니다.
  • AKS 클러스터가 Active Directory 서비스 주체로 구성된 경우 AKS는 사용자 지정 프라이빗 DNS 영역이 있는 시스템 할당 관리 ID 사용을 지원하지 않습니다. 클러스터는 사용자 할당 관리 ID 인증을 사용해야 합니다.

프라이빗 DNS 영역을 사용하여 프라이빗 AKS 클러스터 만들기

명령을 사용하여 프라이빗 DNS 영역이 있는 프라이빗 AKS 클러스터를 만듭니다 az aks create .

이 명령의 키 매개 변수:

  • --enable-private-cluster: 프라이빗 클러스터 모드를 사용하도록 설정합니다.
  • --private-dns-zone [system|none]: 클러스터에 대한 프라이빗 DNS 영역을 구성합니다. system 는 프라이빗 DNS 영역을 구성할 때 기본값입니다. 생략 --private-dns-zone하면 AKS는 노드 리소스 그룹에 프라이빗 DNS 영역을 만듭니다. none 는 프라이빗 DNS 영역 만들기를 사용하지 않도록 설정합니다.
  • --assign-identity <resource-id>: 프라이빗 DNS 영역 기여자네트워크 기여자 역할이 있는 사용자 할당 관리 ID의 리소스 ID입니다.
az aks create \
    --name <private-cluster-name> \
    --resource-group <private-cluster-resource-group> \
    --load-balancer-sku standard \
    --enable-private-cluster \
    --assign-identity <resource-id> \
    --private-dns-zone [system|none] \
    --generate-ssh-keys
  1. 고급 네트워킹을 사용하여 프라이빗 AKS 클러스터 만들기 또는 기본 기본 네트워킹을 사용하여 프라이빗 AKS 클러스터 만들기의 1-3단계를 수행하여 Terraform 구성을 설정하고 시나리오에 따라 필요한 리소스를 만듭니다. 이 예제에서는 고급 네트워킹을 사용합니다.

  2. AKS 관리형 프라이빗 DNS 영역을 사용하여 프라이빗 AKS 클러스터를 만들려면 다음 코드를 main.tf 추가합니다.

    resource "azurerm_kubernetes_cluster" "this" {
     name                = var.aks_cluster_name
     location            = azurerm_resource_group.this.location
     resource_group_name = azurerm_resource_group.this.name
     dns_prefix          = "aks-system-dns"
     private_cluster_enabled = true
     private_dns_zone_id     = "System"
     default_node_pool {
       name           = "system"
       node_count     = 1
       vm_size        = "Standard_DS2_v2"
       vnet_subnet_id = azurerm_subnet.aks.id
     }
     identity {
       type = "SystemAssigned"
     }
     network_profile {
       network_plugin    = "azure"
       load_balancer_sku = "standard"
       dns_service_ip    = "10.2.0.10"
       service_cidr      = "10.2.0.0/24"
     }
    }
    
  3. 단계에 따라 Terraform을 초기화하고, Terraform 구성의 형식을 지정하고, 유효성을 검사하고, Terraform 실행 계획을 만들고, Terraform 구성을 적용하고, AKS 클러스터에 연결합니다.

프라이빗 DNS 영역 없이 프라이빗 AKS 클러스터 만들기

  1. 고급 네트워킹을 사용하여 프라이빗 AKS 클러스터 만들기 또는 기본 기본 네트워킹을 사용하여 프라이빗 AKS 클러스터 만들기의 1-3단계를 수행하여 Terraform 구성을 설정하고 시나리오에 따라 필요한 리소스를 만듭니다. 이 예제에서는 고급 네트워킹을 사용합니다.

  2. 다음 코드를 추가하여 main.tf 프라이빗 DNS 영역 없이 AKS 클러스터를 만듭니다.

    resource "azurerm_kubernetes_cluster" "this" {
     name                = var.aks_cluster_name
     location            = azurerm_resource_group.this.location
     resource_group_name = azurerm_resource_group.this.name
     dns_prefix          = "aks-no-dns"
     private_cluster_enabled = true
     private_dns_zone_id     = "None"
     default_node_pool {
       name           = "system"
       node_count     = 1
       vm_size        = "Standard_DS2_v2"
       vnet_subnet_id = azurerm_subnet.aks.id
     }
     identity {
       type = "SystemAssigned"
     }
     network_profile {
       network_plugin    = "azure"
       load_balancer_sku = "standard"
       dns_service_ip    = "10.2.0.10"
       service_cidr      = "10.2.0.0/24"
     }
    }
    
  3. 단계에 따라 Terraform을 초기화하고, Terraform 구성의 형식을 지정하고, 유효성을 검사하고, Terraform 실행 계획을 만들고, Terraform 구성을 적용하고, AKS 클러스터에 연결합니다.

사용자 지정 프라이빗 DNS 영역 또는 프라이빗 DNS 하위 영역을 사용하여 프라이빗 AKS 클러스터 만들기

명령을 사용하여 사용자 지정 프라이빗 DNS 영역 또는 하위 영역이 있는 프라이빗 AKS 클러스터를 만듭니다 az aks create .

이 명령의 키 매개 변수:

  • --enable-private-cluster: 프라이빗 클러스터 모드를 사용하도록 설정합니다.
  • --private-dns-zone [<custom-private-dns-zone-resource-id>|<custom-private-dns-subzone-resource-id>]: Azure 전역 클라우드에 대한 기존 프라이빗 DNS 영역 또는 하위 영역의 리소스 ID입니다. privatelink.<region>.azmk8s.io 또는 <subzone>.privatelink.<region>.azmk8s.io.
  • --assign-identity <resource-id>: 프라이빗 DNS 영역 기여자네트워크 기여자 역할이 있는 사용자 할당 관리 ID의 리소스 ID입니다.
az aks create \
    --name <private-cluster-name> \
    --resource-group <private-cluster-resource-group> \
    --load-balancer-sku standard \
    --enable-private-cluster \
    --assign-identity <resource-id> \
    --private-dns-zone [<custom-private-dns-zone-resource-id>|<custom-private-dns-subzone-resource-id>] \
    --generate-ssh-keys

사용자 지정 프라이빗 DNS 영역을 사용하는 경우 Azure 관리되는 DNS를 사용하는 대신 DNS 인프라를 만들고 관리할 책임이 있습니다. 여기에는 DNS 영역을 만들고, VNet에 연결하고, AKS가 레코드를 관리하는 데 필요한 권한을 할당하는 것이 포함됩니다.

사용자 지정 DNS 구성의 경우 프라이빗 DNS 영역 기여자Network 기여자 역할과 함께 사용자 할당 관리 ID를 사용해야 합니다.

  1. 고급 네트워킹을 사용하여 프라이빗 AKS 클러스터 만들기 또는 기본 기본 네트워킹을 사용하여 프라이빗 AKS 클러스터 만들기의 1-3단계를 수행하여 Terraform 구성을 설정하고 시나리오에 따라 필요한 리소스를 만듭니다. 이 예제에서는 고급 네트워킹을 사용합니다.

  2. 사용자 지정 프라이빗 DNS 영역 또는 하위 영역을 사용하여 프라이빗 AKS 클러스터를 만드는 코드를 main.tf 추가합니다.

    resource "azurerm_user_assigned_identity" "aks" {
     name                = "aks-custom-dns-id"
     location            = azurerm_resource_group.this.location
     resource_group_name = azurerm_resource_group.this.name
    }
    resource "azurerm_private_dns_zone" "aks" {
     name                = "privatelink.eastus.azmk8s.io"
     resource_group_name = azurerm_resource_group.this.name
    }
    resource "azurerm_private_dns_zone_virtual_network_link" "link" {
     name                  = "aks-dns-link"
     resource_group_name   = azurerm_resource_group.this.name
     private_dns_zone_name = azurerm_private_dns_zone.aks.name
     virtual_network_id    = azurerm_virtual_network.this.id
    }
    resource "azurerm_role_assignment" "dns" {
     scope                = azurerm_private_dns_zone.aks.id
     role_definition_name = "Private DNS Zone Contributor"
     principal_id         = azurerm_user_assigned_identity.aks.principal_id
    }
    resource "azurerm_role_assignment" "network" {
     scope                = azurerm_virtual_network.this.id
     role_definition_name = "Network Contributor"
     principal_id         = azurerm_user_assigned_identity.aks.principal_id
    }
    resource "azurerm_kubernetes_cluster" "this" {
     name                = var.aks_cluster_name
     location            = azurerm_resource_group.this.location
     resource_group_name = azurerm_resource_group.this.name
     dns_prefix          = "aks-custom-dns"
     private_cluster_enabled = true
     private_dns_zone_id     = azurerm_private_dns_zone.aks.id
     default_node_pool {
       name           = "system"
       node_count     = 1
       vm_size        = "Standard_DS2_v2"
       vnet_subnet_id = azurerm_subnet.aks.id
     }
     identity {
       type         = "UserAssigned"
       identity_ids = [azurerm_user_assigned_identity.aks.id]
     }
     network_profile {
       network_plugin    = "azure"
       load_balancer_sku = "standard"
       dns_service_ip    = "10.2.0.10"
       service_cidr      = "10.2.0.0/24"
     }
     depends_on = [
       azurerm_role_assignment.dns,
       azurerm_role_assignment.network
     ]
    }
    
  3. 단계에 따라 Terraform을 초기화하고, Terraform 구성의 형식을 지정하고, 유효성을 검사하고, Terraform 실행 계획을 만들고, Terraform 구성을 적용하고, AKS 클러스터에 연결합니다.

사용자 지정 프라이빗 DNS 영역 및 사용자 지정 하위 도메인을 사용하여 프라이빗 AKS 클러스터 만들기

az aks create 명령을 사용하여 사용자 지정 프라이빗 DNS 존 및 하위 도메인과 함께 프라이빗 AKS 클러스터를 만듭니다.

이 명령의 키 매개 변수:

  • --enable-private-cluster: 프라이빗 클러스터 모드를 사용하도록 설정합니다.
  • --private-dns-zone <custom-private-dns-zone-resource-id>: Azure 전역 클라우드에 대해 다음과 같은 형식의 기존 프라이빗 DNS 영역의 리소스 ID입니다. privatelink.<region>.azmk8s.io.
  • --fqdn-subdomain <subdomain>: 사용자 지정 프라이빗 DNS 영역 내의 클러스터 FQDN에 사용할 하위 도메인입니다.
  • --assign-identity <resource-id>: 프라이빗 DNS 영역 기여자네트워크 기여자 역할이 있는 사용자 할당 관리 ID의 리소스 ID입니다.
az aks create \
    --name <private-cluster-name> \
    --resource-group <private-cluster-resource-group> \
    --load-balancer-sku standard \
    --enable-private-cluster \
    --assign-identity <resource-id> \
    --private-dns-zone <custom-private-dns-zone-resource-id> \
    --fqdn-subdomain <subdomain> \
    --generate-ssh-keys
  1. 고급 네트워킹을 사용하여 프라이빗 AKS 클러스터 만들기 또는 기본 기본 네트워킹을 사용하여 프라이빗 AKS 클러스터 만들기의 1-3단계를 수행하여 Terraform 구성을 설정하고 시나리오에 따라 필요한 리소스를 만듭니다. 이 예제에서는 고급 네트워킹을 사용합니다.

  2. 다음 코드를 main.tf 추가하여 사용자 지정 프라이빗 DNS 영역 및 하위 도메인을 사용하여 프라이빗 AKS 클러스터를 만듭니다.

    resource "azurerm_kubernetes_cluster" "this" {
     name                = var.aks_cluster_name
     location            = azurerm_resource_group.this.location
     resource_group_name = azurerm_resource_group.this.name
     dns_prefix          = "aks-subdomain"
     private_cluster_enabled = true
     private_dns_zone_id     = azurerm_private_dns_zone.aks.id
     fqdn_subdomain          = "team1"
     default_node_pool {
       name           = "system"
       node_count     = 1
       vm_size        = "Standard_DS2_v2"
       vnet_subnet_id = azurerm_subnet.aks.id
     }
     identity {
       type         = "UserAssigned"
       identity_ids = [azurerm_user_assigned_identity.aks.id]
     }
     network_profile {
       network_plugin    = "azure"
       load_balancer_sku = "standard"
       dns_service_ip    = "10.2.0.10"
       service_cidr      = "10.2.0.0/24"
     }
    }
    
  3. 단계에 따라 Terraform을 초기화하고, Terraform 구성의 형식을 지정하고, 유효성을 검사하고, Terraform 실행 계획을 만들고, Terraform 구성을 적용하고, AKS 클러스터에 연결합니다.

프라이빗 DNS 영역에서 공용으로 기존 프라이빗 AKS 클러스터 업데이트

byo (직접 가져오기) 또는 system에서 none로만 업데이트할 수 있습니다. 업데이트 값의 다른 조합은 지원되지 않습니다.

경고

byo 또는 system에서 none으로 프라이빗 클러스터를 업데이트하면 에이전트 노드가 공용 FQDN을 사용하도록 변경됩니다. Azure Virtual Machine Scale Sets 사용하는 AKS 클러스터에서는 node 이미지 업그레이드를 수행하여 노드를 공용 FQDN으로 업데이트합니다.

byo 또는 system에서 none로 프라이빗 클러스터를 업데이트하려면, az aks update 명령을 사용하고 매개 변수 --private-dns-zonenone로 설정하세요.

az aks update \
    --name <private-cluster-name> \
    --resource-group <private-cluster-resource-group> \
    --private-dns-zone none
  1. 프라이빗 DNS 영역에서 공용으로 프라이빗 AKS 클러스터를 업데이트하려면 기존 main.tf 에 다음 코드를 추가합니다. 이 예제에서는 고급 네트워킹을 사용합니다. 관련 Terraform 리소스 및 매개 변수를 변경하여 기본 기본 네트워킹을 사용하도록 수정할 수 있습니다.

    resource "azurerm_kubernetes_cluster" "this" {
     name                = var.aks_cluster_name
     location            = azurerm_resource_group.this.location
     resource_group_name = azurerm_resource_group.this.name
     dns_prefix          = "aks-update"
     private_cluster_enabled = true
     private_dns_zone_id     = "None"
     default_node_pool {
       name           = "system"
       node_count     = 1
       vm_size        = "Standard_DS2_v2"
       vnet_subnet_id = azurerm_subnet.aks.id
     }
     identity {
       type         = "UserAssigned"
       identity_ids = [azurerm_user_assigned_identity.aks.id]
     }
     network_profile {
       network_plugin    = "azure"
       load_balancer_sku = "standard"
       dns_service_ip    = "10.2.0.10"
       service_cidr      = "10.2.0.0/24"
     }
    }
    
  2. Terraform의 업데이트된 구성을 terraform planterraform apply 명령을 사용하여 적용합니다.

    terraform plan
    terraform apply
    

Terraform 초기화

main.tf 파일이 있는 디렉터리에서 terraform init 명령어를 사용해 Terraform을 초기화하세요. 이 명령은 Terraform을 사용하여 Azure 리소스를 관리하는 데 필요한 Azure 공급자를 다운로드합니다.

terraform init

Terraform 구성 형식 지정 및 유효성 검사

명령들(terraform fmtterraform validate)을 사용하여 Terraform 구성의 형식을 지정하고 유효성을 검사합니다.

terraform fmt
terraform validate

Terraform 실행 계획 만들기

terraform plan 명령을 사용하여 Terraform 실행 계획을 만듭니다. 이 명령은 Terraform이 Azure 구독에서 만들거나 수정할 리소스를 보여 줍니다.

terraform plan -var="subscription_id=<your-subscription-id>"

Terraform 구성 적용

실행 계획을 검토하고 확인한 후 명령을 사용하여 Terraform 구성을 적용합니다 terraform apply . 이 명령은 Azure 구독의 main.tf 파일에 정의된 리소스를 만들거나 수정합니다.

terraform apply -var="subscription_id=<your-subscription-id>"

프라이빗 AKS 클러스터에 연결하도록 kubectl 구성

Kubernetes 클러스터를 관리하려면 Kubernetes 명령줄 클라이언트인 kubectl을 사용합니다. Azure Cloud Shell 사용하는 경우 kubectl 이미 설치되어 있습니다. kubectl을 로컬로 설치하려면 az aks install-cli 명령을 사용합니다.

  1. kubectl 명령을 사용하여 Kubernetes 클러스터에 연결하도록 az aks get-credentials을 구성합니다. 이 명령은 자격 증명을 다운로드하고 Kubernetes CLI가 해당 자격 증명을 사용하도록 구성합니다.

    az aks get-credentials --resource-group <private-cluster-resource-group> --name <private-cluster-name>
    
  2. kubectl get 명령을 사용하여 클러스터에 대한 연결을 확인합니다. 이 명령은 클러스터 노드 목록을 반환합니다.

    kubectl get nodes
    

    이 명령은 다음 예제 출력과 유사한 출력을 반환합니다.

    NAME                                STATUS   ROLES   AGE    VERSION
    aks-nodepool1-12345678-vmss000000   Ready    agent   3h6m   v1.15.11
    aks-nodepool1-12345678-vmss000001   Ready    agent   3h6m   v1.15.11
    aks-nodepool1-12345678-vmss000002   Ready    agent   3h6m   v1.15.11