다음을 통해 공유


AKS(네트워크 격리 Azure Kubernetes Service) 클러스터 만들기(미리 보기)

조직에서는 일반적으로 데이터 반출 위험을 제거하기 위해 클러스터에서 송신(아웃바운드) 네트워크 트래픽을 규제하기 위한 엄격한 보안 및 규정 준수 요구 사항이 있습니다. 기본적으로 AKS(Azure Kubernetes Service) 클러스터에는 무제한 아웃바운드 인터넷 액세스가 있습니다. 이러한 수준의 네트워크 액세스가 있으면 사용자가 실행하는 노드와 서비스는 필요할 때마다 외부 리소스에 액세스할 수 있습니다. 송신 트래픽을 제한하려면 정상적인 클러스터 유지 관리 작업을 유지할 수 있도록 제한된 수의 포트 및 주소에 액세스할 수 있어야 합니다.

아웃바운드 주소를 보호하는 한 가지 솔루션은 도메인 이름에 따라 아웃바운드 트래픽을 제어할 수 있는 방화벽 디바이스를 사용하는 것입니다.

또 다른 솔루션인 네트워크 격리 AKS 클러스터(미리 보기)는 클러스터에 대한 아웃바운드 제한 설정을 간소화합니다. 네트워크 격리 AKS 클러스터는 클러스터의 퍼블릭 엔드포인트에 대한 데이터 반출 또는 의도하지 않은 노출 위험을 줄입니다.

Important

AKS 미리 보기 기능은 셀프 서비스에서 사용할 수 있습니다(옵트인 방식). 미리 보기는 "있는 그대로" 및 "사용 가능한 상태로" 제공되며 서비스 수준 계약 및 제한적 보증에서 제외됩니다. AKS 미리 보기의 일부는 고객 지원팀에서 최선을 다해 지원합니다. 따라서 이러한 기능은 프로덕션 용도로 사용할 수 없습니다. 자세한 내용은 다음 지원 문서를 참조하세요.

시작하기 전에

  • 이 문서에는 Azure CLI 버전 2.63.0 이상이 필요합니다. Azure Cloud Shell을 사용하는 경우 최신 버전이 이미 설치되어 있습니다.

  • aks-preview Azure CLI 확장 버전 9.0.0b2 이상을 설치합니다.

    • 확장이 aks-preview 아직 없는 경우 명령을 사용하여 설치합니다 az extension add .

      az extension add --name aks-preview
      
    • 확장이 aks-preview 이미 있는 경우 명령을 사용하여 최신 버전이 있는지 확인하도록 업데이트합니다 az extension update .

      az extension update --name aks-preview
      
  • NetworkIsolatedClusterPreview az feature register 명령을 사용하여 기능 플래그를 등록합니다.

    az feature register --namespace Microsoft.ContainerService --name NetworkIsolatedClusterPreview
    

    az feature show 명령을 사용하여 등록 상태를 확인합니다. 상태가 등록됨으로 표시되는 데 몇 분 정도 걸립니다.

    az feature show --namespace Microsoft.ContainerService --name NetworkIsolatedClusterPreview
    

    참고 항목

    API Server의 프라이빗 액세스를 위해 구성된 API Server VNet 통합을 사용하여 네트워크 격리 클러스터를 만들도록 선택하는 경우 위의 단계를 반복하여 기능 플래그를 등록 EnableAPIServerVnetIntegrationPreview 해야 합니다. 상태가 등록됨을 반영하는 경우 az provider register 명령을 사용하여 등록 및 Microsoft.ContainerRegistry 리소스 공급자를 새로 고칩니다Microsoft.ContainerService.

     az provider register --namespace Microsoft.ContainerService
     az provider register --namespace Microsoft.ContainerRegistry
    
  • BYO(Bring Your Own) ACR(Azure Container Registry) 옵션을 선택하는 경우 ACR이 다음 요구 사항을 충족하는지 확인해야 합니다.

  • (선택 사항) 아웃바운드 네트워크 액세스 가 필요한 선택적 AKS 기능 또는 추가 기능을 사용하려는 경우 이 문서에 는 각 기능에 대한 아웃바운드 요구 사항이 포함되어 있습니다. 또한 이 문서에서는 클러스터의 가상 네트워크 내에서 보안 연결을 위해 프라이빗 링크 통합을 지원하는 기능 또는 추가 기능을 열거합니다. 이러한 기능에 프라이빗 링크 통합을 사용할 수 없는 경우 해당 기능에 필요한 네트워크 규칙 및 애플리케이션 규칙에 따라 사용자 정의 라우팅 테이블 및 Azure Firewall을 사용하여 클러스터를 설정할 수 있습니다.

참고 항목

다음 AKS 클러스터 확장은 네트워크 격리 클러스터에서 아직 지원되지 않습니다.

AKS 관리형 ACR을 사용하여 네트워크 격리 클러스터 배포

AKS는 이 옵션에서 ACR 리소스를 만들고, 관리하고, 조정합니다. 사용 권한을 할당하거나 ACR을 관리할 필요가 없습니다. AKS는 네트워크 격리 클러스터에서 사용되는 캐시 규칙, 프라이빗 링크 및 프라이빗 엔드포인트를 관리합니다.

네트워크 격리 클러스터 만들기

네트워크 격리 AKS 클러스터를 만들 때 프라이빗 링크 또는 API 서버 Vnet 통합과 같은 프라이빗 클러스터 모드 중 하나를 선택할 수 있습니다.

선택한 모드에 관계없이 설정하고 매개 변수를 --outbound-type 설정합니다--bootstrap-artifact-source.

--bootstrap-artifact-source 은 각각 이미지 끌어오기용 직접 MCR(네트워크 격리되지 않음) 및 프라이빗 ACR(네트워크 격리)을 사용하는 경우 또는 Direct Cache 이에 해당하도록 설정할 수 있습니다.

또는 --outbound-type parameter .로 none block설정할 수 있습니다. 아웃바운드 형식이 설정된 none경우 AKS는 클러스터에 대한 아웃바운드 연결을 설정하지 않으므로 사용자가 직접 구성할 수 있습니다. 아웃바운드 형식이 차단되도록 설정된 경우 모든 아웃바운드 연결이 차단됩니다.

및 매개 변수를 사용하여 az aks create 명령을 --outbound-type --enable-private-cluster--bootstrap-artifact-source실행하여 프라이빗 링크 기반 네트워크 격리 AKS 클러스터를 만듭니다.

az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME}   --kubernetes-version 1.30.3 --bootstrap-artifact-source Cache --outbound-type none  --network-plugin azure --enable-private-cluster

API Server VNet 통합

및 매개 변수를 사용하여 az aks create 명령을 실행하여 API Server VNet 통합으로 --bootstrap-artifact-source--outbound-type --enable-apiserver-vnet-integration --enable-private-cluster구성된 네트워크 격리 AKS 클러스터를 만듭니다.

az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --kubernetes-version 1.30.3 --bootstrap-artifact-source Cache --outbound-type none --network-plugin azure --enable-private-cluster --enable-apiserver-vnet-integration

기존 AKS 클러스터를 네트워크 격리 형식으로 업데이트

새 클러스터를 만드는 대신 기존 AKS 클러스터에서 네트워크 격리를 사용하도록 설정하려면 az aks update 명령을 사용합니다.

az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache --outbound-type none

기능을 사용하도록 설정한 후 새로 추가된 노드는 송신 없이 성공적으로 부트스트랩할 수 있습니다. 기존 클러스터에서 네트워크 격리를 사용하도록 설정하는 경우 모든 기존 노드를 수동으로 이미지로 다시 설치해야 합니다.

az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only

Important

기존 클러스터에 대한 네트워크 격리 모드를 사용하도록 설정한 후 클러스터의 노드 풀을 이미지로 다시 설치해야 합니다. 그렇지 않으면 이 기능은 클러스터에 적용되지 않습니다.

사용자 고유의 ACR을 사용하여 네트워크 격리 클러스터 배포

AKS는 BYO(사용자 고유) ACR 가져오기를 지원합니다. BYO ACR 시나리오를 지원하려면 AKS 클러스터를 만들기 전에 ACR 프라이빗 엔드포인트 및 프라이빗 DNS 영역을 구성해야 합니다.

다음 단계에서는 이러한 리소스를 준비하는 방법을 보여 줍니다.

  • AKS 및 ACR에 대한 사용자 지정 가상 네트워크 및 서브넷
  • ACR, ACR 캐시 규칙, 프라이빗 엔드포인트 및 프라이빗 DNS 영역.
  • 사용자 지정 컨트롤 플레인 ID 및 kubelet ID입니다.

1단계: 가상 네트워크 및 서브넷 만들기

AKS 서브넷에 대한 기본 아웃바운드 액세스는 false여야 합니다.

az group create --name ${RESOURCE_GROUP} --location ${LOCATION}

az network vnet create  --resource-group ${RESOURCE_GROUP} --name ${VNET_NAME} --address-prefixes 192.168.0.0/16

az network vnet subnet create --name ${AKS_SUBNET_NAME} --vnet-name ${VNET_NAME} --resource-group ${RESOURCE_GROUP} --address-prefixes 192.168.1.0/24 --default-outbound-access false

SUBNET_ID=$(az network vnet subnet show --name ${AKS_SUBNET_NAME} --vnet-name ${VNET_NAME} --resource-group ${RESOURCE_GROUP} --query 'id' --output tsv)

az network vnet subnet create --name ${ACR_SUBNET_NAME} --vnet-name ${VNET_NAME} --resource-group ${RESOURCE_GROUP} --address-prefixes 192.168.2.0/24 --private-endpoint-network-policies Disabled

2단계: ACR 만들기 및 아티팩트 캐시 사용

  1. 프라이빗 링크 및 익명 끌어오기 액세스 사용하여 ACR을 만듭니다.

    az acr create --resource-group ${RESOURCE_GROUP} --name ${REGISTRY_NAME} --sku Premium --public-network-enabled false
    
    az acr update --resource-group ${RESOURCE_GROUP} --name ${REGISTRY_NAME} --anonymous-pull-enabled true
    
    REGISTRY_ID=$(az acr show --name ${REGISTRY_NAME} -g ${RESOURCE_GROUP}  --query 'id' --output tsv)
    
  2. 사용자가 새 ACR에서 MCR 컨테이너 이미지를 캐시할 수 있도록 ACR 캐시 규칙을 만듭니다.

    az acr cache create -n acr-cache-rule -r ${REGISTRY_NAME} -g ${RESOURCE_GROUP} --source-repo "mcr.microsoft.com/*" --target-repo "*"
    

3단계: ACR에 대한 프라이빗 엔드포인트 만들기

az network private-endpoint create --name myPrivateEndpoint --resource-group ${RESOURCE_GROUP} --vnet-name ${VNET_NAME} --subnet ${ACR_SUBNET_NAME} --private-connection-resource-id ${REGISTRY_ID} --group-id registry --connection-name myConnection

NETWORK_INTERFACE_ID=$(az network private-endpoint show --name myPrivateEndpoint --resource-group ${RESOURCE_GROUP} --query 'networkInterfaces[0].id' --output tsv)

REGISTRY_PRIVATE_IP=$(az network nic show --ids ${NETWORK_INTERFACE_ID} --query "ipConfigurations[?privateLinkConnectionProperties.requiredMemberName=='registry'].privateIPAddress" --output tsv)

DATA_ENDPOINT_PRIVATE_IP=$(az network nic show --ids ${NETWORK_INTERFACE_ID} --query "ipConfigurations[?privateLinkConnectionProperties.requiredMemberName=='registry_data_$LOCATION'].privateIPAddress" --output tsv)

4단계: 프라이빗 DNS 영역 만들기 및 레코드 추가

라는 프라이빗 DNS 영역을 만듭니다 privatelink.azurecr.io. 레지스트리 REST 엔드포인트 및 레지스트리 데이터 엔드포인트{REGISTRY_NAME}.azurecr.io{REGISTRY_NAME}.{REGISTRY_LOCATION}.data.azurecr.io에 대한 레코드를 추가합니다.

az network private-dns zone create --resource-group ${RESOURCE_GROUP} --name "privatelink.azurecr.io"

az network private-dns link vnet create --resource-group ${RESOURCE_GROUP} --zone-name "privatelink.azurecr.io" --name MyDNSLink --virtual-network ${VNET_NAME} --registration-enabled false

az network private-dns record-set a create --name ${REGISTRY_NAME} --zone-name "privatelink.azurecr.io" --resource-group ${RESOURCE_GROUP}

az network private-dns record-set a add-record --record-set-name ${REGISTRY_NAME} --zone-name "privatelink.azurecr.io" --resource-group ${RESOURCE_GROUP} --ipv4-address ${REGISTRY_PRIVATE_IP}

az network private-dns record-set a create --name ${REGISTRY_NAME}.${LOCATION}.data --zone-name "privatelink.azurecr.io" --resource-group ${RESOURCE_GROUP}

az network private-dns record-set a add-record --record-set-name ${REGISTRY_NAME}.${LOCATION}.data --zone-name "privatelink.azurecr.io" --resource-group ${RESOURCE_GROUP} --ipv4-address ${DATA_ENDPOINT_PRIVATE_IP}

5단계: 컨트롤 플레인 및 kubelet ID 만들기

컨트롤 플레인 ID

az identity create --name ${CLUSTER_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP}

CLUSTER_IDENTITY_RESOURCE_ID=$(az identity show --name ${CLUSTER_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --query 'id' -o tsv)

CLUSTER_IDENTITY_PRINCIPAL_ID=$(az identity show --name ${CLUSTER_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --query 'principalId' -o tsv)

Kubelet ID

az identity create --name ${KUBELET_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP}

KUBELET_IDENTITY_RESOURCE_ID=$(az identity show --name ${KUBELET_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --query 'id' -o tsv)

KUBELET_IDENTITY_PRINCIPAL_ID=$(az identity show --name ${KUBELET_IDENTITY_NAME} --resource-group ${RESOURCE_GROUP} --query 'principalId' -o tsv)

Kubelet ID에 대한 AcrPull 권한 부여

az role assignment create --role AcrPull --scope ${REGISTRY_ID} --assignee-object-id ${KUBELET_IDENTITY_PRINCIPAL_ID} --assignee-principal-type ServicePrincipal

이러한 리소스를 구성한 후 BYO ACR을 사용하여 네트워크 격리 AKS 클러스터를 계속 만들 수 있습니다.

6단계: BYO ACR을 사용하여 네트워크 격리 클러스터 만들기

네트워크 격리 AKS 클러스터를 만들 때 프라이빗 링크 또는 API 서버 Vnet 통합과 같은 프라이빗 클러스터 모드 중 하나를 선택할 수 있습니다.

선택한 모드에 관계없이 설정하고 매개 변수를 --outbound-type 설정합니다--bootstrap-artifact-source.

--bootstrap-artifact-source 은 각각 이미지 끌어오기용 직접 MCR(네트워크 격리되지 않음) 및 프라이빗 ACR(네트워크 격리)을 사용하는 경우 또는 Direct Cache 이에 해당하도록 설정할 수 있습니다.

또는 --outbound-type parameter .로 none block설정할 수 있습니다. 아웃바운드 형식이 설정된 none경우 AKS는 클러스터에 대한 아웃바운드 연결을 설정하지 않으므로 사용자가 직접 구성할 수 있습니다. 아웃바운드 형식이 차단되도록 설정된 경우 모든 아웃바운드 연결이 차단됩니다.

필요한 매개 변수를 사용하여 az aks create 명령을 실행 하여 ACR에 액세스하는 프라이빗 링크 기반 네트워크 격리 클러스터를 만듭니 다.

az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --kubernetes-version 1.30.3 --vnet-subnet-id ${SUBNET_ID} --assign-identity ${CLUSTER_IDENTITY_RESOURCE_ID} --assign-kubelet-identity ${KUBELET_IDENTITY_RESOURCE_ID} --bootstrap-artifact-source Cache --bootstrap-container-registry-resource-id ${REGISTRY_ID} --outbound-type none --network-plugin azure --enable-private-cluster

API Server VNet 통합

API 서버 VNet 통합을 사용하는 네트워크 격리 클러스터의 경우 먼저 서브넷을 만들고 다음 명령을 사용하여 올바른 역할을 할당합니다.

az network vnet subnet create --name ${APISERVER_SUBNET_NAME} --vnet-name ${VNET_NAME} --resource-group ${RESOURCE_GROUP} --address-prefixes 192.168.3.0/24

export APISERVER_SUBNET_ID=$(az network vnet subnet show --resource-group ${RESOURCE_GROUP} --vnet-name ${VNET_NAME} --name ${APISERVER_SUBNET_NAME} --query id -o tsv)
az role assignment create --scope ${APISERVER_SUBNET_ID} --role "Network Contributor" --assignee-object-id ${CLUSTER_IDENTITY_PRINCIPAL_ID} --assignee-principal-type ServicePrincipal

API Server VNet 통합으로 구성된 네트워크 격리 AKS 클러스터를 만들고 필요한 매개 변수를 사용하여 az aks create 명령을 실행하여 ACR에 액세스합니다.

az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --kubernetes-version 1.30.3 --vnet-subnet-id ${SUBNET_ID} --assign-identity ${CLUSTER_IDENTITY_RESOURCE_ID} --assign-kubelet-identity ${KUBELET_IDENTITY_RESOURCE_ID} --bootstrap-artifact-source Cache --bootstrap-container-registry-resource-id ${REGISTRY_ID} --outbound-type none --network-plugin azure --enable-apiserver-vnet-integration --apiserver-subnet-id ${APISERVER_SUBNET_ID}

기존 AKS 클러스터 업데이트

새 클러스터를 만드는 대신 기존 AKS 클러스터에서 네트워크 격리를 사용하도록 설정하려면 az aks update 명령을 사용합니다.

BYO ACR에 대한 프라이빗 엔드포인트 및 프라이빗 DNS 영역을 만들 때 기존 AKS 클러스터의 기존 가상 네트워크 및 서브넷을 사용합니다. AcrPull 권한을 kubelet ID에 할당하는 경우 기존 AKS 클러스터의 기존 kubelet ID를 사용합니다.

기존 AKS 클러스터에서 네트워크 격리 기능을 사용하도록 설정하려면 다음 명령을 사용합니다.

az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache --bootstrap-container-registry-resource-id ${REGISTRY_ID} --outbound-type none

네트워크 격리 클러스터 기능을 사용하도록 설정한 후 새로 추가된 노드 풀의 노드는 송신 없이 성공적으로 부트스트랩할 수 있습니다. 새로 크기 조정된 노드가 성공적으로 부트스트랩될 수 있도록 기존 노드 풀을 이미지로 다시 설치해야 합니다. 기존 클러스터에서 기능을 사용하도록 설정하면 모든 기존 노드를 수동으로 이미지로 다시 설치해야 합니다.

az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only

Important

네트워크 격리 클러스터 기능을 사용하도록 설정한 후 클러스터의 노드 풀을 이미지로 다시 설치해야 합니다. 그렇지 않으면 이 기능은 클러스터에 적용되지 않습니다.

ACR ID 업데이트

네트워크 격리 AKS 클러스터와 함께 사용되는 프라이빗 ACR을 업데이트할 수 있습니다. ACR 리소스 ID를 식별하려면 명령을 사용합니다 az aks show .

az aks show --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME}

ACR ID 업데이트는 명령과 --bootstrap-artifact-source --bootstrap-container-registry-resource-id 매개 변수를 az aks update 사용하여 실행하여 수행됩니다.

az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Cache --bootstrap-container-registry-resource-id <New BYO ACR resource ID>

기존 클러스터에서 ACR ID를 업데이트하는 경우 모든 기존 노드를 수동으로 이미지로 다시 설치해야 합니다.

az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only

Important

네트워크 격리 클러스터 기능을 사용하도록 설정한 후 클러스터의 노드 풀을 이미지로 다시 설치해야 합니다. 그렇지 않으면 이 기능은 클러스터에 적용되지 않습니다.

네트워크 격리 클러스터가 사용하도록 설정되어 있는지 확인

네트워크 격리 클러스터 기능이 사용하도록 설정되어 있는지 확인하려면 'az aks show 명령<a1/>을 사용합니다.

az aks show --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME}

다음 출력은 속성(없음 또는 차단됨) 및 artifactSource 속성(캐시됨)의 outboundType 값에 따라 기능이 사용하도록 설정되어 있음을 보여 줍니다.

"kubernetesVersion": "1.30.3",
"name": "myAKSCluster"
"type": "Microsoft.ContainerService/ManagedClusters"
"properties": {
  ...
  "networkProfile": {
    ...
    "outboundType": "none",
    ...
  },
  ...
  "bootstrapProfile": {
    "artifactSource": "Cache",
    "containerRegistryId": "/subscriptions/my-subscription-id/my-node-resource-group-name/providers/Microsoft.ContainerRegistry/registries/my-registry-name"
  },
  ...
}

네트워크 격리 클러스터 사용 안 함

--outbound-type 매개 변수를 사용하여 명령을 --bootstrap-artifact-source 실행 az aks update 하여 네트워크 격리 클러스터 기능을 사용하지 않도록 설정합니다.

az aks update --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --bootstrap-artifact-source Direct --outbound-type LoadBalancer

기존 클러스터에서 기능을 사용하지 않도록 설정하면 모든 기존 노드를 수동으로 이미지로 다시 설치해야 합니다.

az aks upgrade --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-image-only

Important

네트워크 격리 클러스터 기능을 사용하지 않도록 설정한 후 클러스터의 노드 풀을 이미지로 다시 설치해야 합니다. 그렇지 않으면 이 기능은 클러스터에 적용되지 않습니다.

다음 단계

이 문서에서는 클러스터의 송신 트래픽을 제한하는 경우 허용할 포트와 주소를 알아보았습니다.

Azure Firewall을 사용하여 아웃바운드 제한 구성을 설정하려면 AKS에서 Azure Firewall을 사용하여 송신 트래픽 제어를 방문 하세요.

클러스터 내에서 Pod가 자신과 동서 트래픽 제한 간에 통신하는 방식을 제한하려면 AKS에서 네트워크 정책을 사용하여 Pod 간의 트래픽 보안을 참조하세요.