AKS(Azure Kubernetes Service)를 통해 내부 부하 분산 장치 사용
내부 부하 분산 장치를 만들고 사용하여 AKS(Azure Kubernetes Service)에서 애플리케이션에 대한 액세스를 제한할 수 있습니다. 내부 부하 분산 장치에는 공용 IP가 없으며 Kubernetes 서비스는 개인 IP에 도달할 수 있는 애플리케이션에서만 액세스할 수 있습니다. 이 애플리케이션은 동일한 VNET 내에 있거나 VNET 피어링을 통해 다른 VNET에 있을 수 있습니다. 이 문서에서는 AKS를 통해 내부 부하 분산 장치를 만들고 사용하는 방법을 보여 줍니다.
Important
2025년 9월 30일에 기본 Load Balancer가 사용 중지됩니다. 자세한 내용은 공식 공지를 참조하세요. 현재 기본 Load Balancer를 사용하는 경우 사용 중지 날짜 이전에 표준 Load Balancer 업그레이드해야 합니다. 업그레이드에 대한 지침은 기본 Load Balancer에서 업그레이드 - 참고 자료를 참조하세요.
시작하기 전에
- 이 문서에서는 기존 AKS 클러스터가 있다고 가정합니다. AKS 클러스터가 필요한 경우 Azure CLI, Azure PowerShell 또는 Azure Portal을 사용하여 만들 수 있습니다.
- Azure CLI 버전 2.0.59 이상이 필요합니다.
az --version
을 실행하여 버전을 찾습니다. 설치 또는 업그레이드해야 하는 경우 Azure CLI 설치를 참조하세요. - 기존 서브넷 또는 리소스 그룹을 사용하려면 AKS 클러스터 ID에 네트워크 리소스를 관리할 수 있는 권한이 필요합니다. 자세한 내용은 AKS에서 고유한 IP 주소 범위와 함께 kubenet 네트워킹 사용 또는 AKS에서 Azure CNI 네트워킹 구성을 참조하세요. 다른 서브넷의 IP 주소를 사용하도록 부하 분산 장치를 구성하는 경우, AKS 클러스터 ID에도 해당 서브넷에 대한 읽기 권한이 있는지 확인합니다.
- 사용 권한에 대한 자세한 내용은 다른 Azure 리소스에 대한 AKS 액세스 권한 위임을 참조하세요.
내부 부하 분산 장치 만들기
서비스 형식
LoadBalancer
및azure-load-balancer-internal
주석을 사용하여internal-lb.yaml
이라는 서비스 매니페스트를 만듭니다.apiVersion: v1 kind: Service metadata: name: internal-app annotations: service.beta.kubernetes.io/azure-load-balancer-internal: "true" spec: type: LoadBalancer ports: - port: 80 selector: app: internal-app
kubectl apply
명령을 사용하여 내부 부하 분산 장치를 배포합니다. 이 명령은 AKS 클러스터와 동일한 가상 네트워크에 연결된 노드 리소스 그룹에 Azure 부하 분산 장치를 만듭니다.kubectl apply -f internal-lb.yaml
kubectl get service
명령을 사용하여 서비스 세부 정보를 봅니다.kubectl get service internal-app
내부 부하 분산 장치의 IP 주소는 다음 출력 예와 같이
EXTERNAL-IP
열에 표시됩니다. 이 컨텍스트에서 외부는 부하 분산 장치의 외부 인터페이스를 나타냅니다. 공용 외부 IP 주소를 수신한다는 의미는 아닙니다. 이 IP 주소는 AKS 클러스터와 동일한 서브넷에서 동적으로 할당됩니다.NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE internal-app LoadBalancer 10.0.248.59 10.240.0.7 80:30555/TCP 2m
IP 주소 지정
부하 분산 장치의 IP 주소를 지정하는 경우 지정된 IP 주소는 AKS 클러스터와 동일한 가상 네트워크에 있어야 하지만, 가상 네트워크의 다른 리소스에 이미 할당되어서는 안 됩니다. 예를 들어 AKS 클러스터 내의 Kubernetes 서브넷에 지정된 범위의 IP 주소는 사용할 수 없습니다. 동일한 가상 네트워크의 다른 리소스에 이미 할당된 IP 주소를 사용하면 부하 분산 장치에 문제가 발생할 수 있습니다.
az network vnet subnet list
Azure CLI 명령 또는 Get-AzVirtualNetworkSubnetConfig
PowerShell cmdlet을 사용하여 가상 네트워크에서 서브넷을 가져올 수 있습니다.
서브넷에 대한 자세한 내용은 고유한 서브넷을 사용하여 노드 풀 추가를 참조하세요.
부하 분산 장치에서 특정 IP 주소를 사용하려는 경우 두 가지 옵션이 있습니다. 서비스 주석을 설정하거나 부하 분산 장치 YAML 매니페스트에 LoadBalancerIP 속성을 추가하는 것입니다.
Important
부하 분산 장치 YAML 매니페스트에 LoadBalancerIP 속성을 추가하는 기능은 업스트림 Kubernetes에 따라 더 이상 사용되지 않습니다. 현재 사용량은 동일하게 유지되고 기존 서비스는 수정 없이 작동할 것으로 예상되지만 대신 서비스 주석을 설정하는 것이 좋습니다. 서비스 주석에 대한 자세한 내용은 Azure LoadBalancer 지원 주석을 참조 하세요.
IPv4 주소에는
service.beta.kubernetes.io/azure-load-balancer-ipv4
을, IPv6 주소에는service.beta.kubernetes.io/azure-load-balancer-ipv6
을 사용하여 서비스 주석을 설정합니다.apiVersion: v1 kind: Service metadata: name: internal-app annotations: service.beta.kubernetes.io/azure-load-balancer-ipv4: 10.240.0.25 service.beta.kubernetes.io/azure-load-balancer-internal: "true" spec: type: LoadBalancer ports: - port: 80 selector: app: internal-app
kubectl get service
명령을 사용하여 서비스 세부 정보를 봅니다.kubectl get service internal-app
다음 출력 예에 표시된 것처럼
EXTERNAL-IP
열의 IP 주소는 지정된 IP 주소를 반영해야 합니다.NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE internal-app LoadBalancer 10.0.184.168 10.240.0.25 80:30225/TCP 4m
다른 서브넷에서 부하 분산 장치를 구성하는 방법에 대한 자세한 내용은 다른 서브넷 지정을 참조하세요.
Azure Private Link 서비스를 내부 부하 분산 장치에 연결
시작하기 전에
- Kubernetes 버전 1.22.x 이상이 필요합니다.
- VNet 및 서브넷이 있는 기존 리소스 그룹이 필요합니다. 이 리소스 그룹은 프라이빗 엔드포인트를 만드는 위치입니다. 이 리소스가 없는 경우 가상 네트워크 및 서브넷 만들기를 참조하세요.
Private Link 서비스 연결 만들기
서비스 형식이
LoadBalancer
이고azure-load-balancer-internal
및azure-pls-create
주석이 있는internal-lb-pls.yaml
이라는 서비스 매니페스트를 만듭니다. 추가 옵션은 Azure Private Link 서비스 통합 디자인 문서를 참조하세요.apiVersion: v1 kind: Service metadata: name: internal-app annotations: service.beta.kubernetes.io/azure-load-balancer-internal: "true" service.beta.kubernetes.io/azure-pls-create: "true" spec: type: LoadBalancer ports: - port: 80 selector: app: internal-app
kubectl apply
명령을 사용하여 내부 부하 분산 장치를 배포합니다. 이 명령은 AKS 클러스터와 동일한 가상 네트워크에 연결된 노드 리소스 그룹에 Azure 부하 분산 장치를 만듭니다. 또한 Kubernetes Service와 연결된 부하 분산 장치의 프런트 엔드 IP 구성에 연결하는 Private Link 서비스 개체를 만듭니다.kubectl apply -f internal-lb-pls.yaml
kubectl get service
명령을 사용하여 서비스 세부 정보를 봅니다.kubectl get service internal-app
내부 부하 분산 장치의 IP 주소는 다음 출력 예와 같이
EXTERNAL-IP
열에 표시됩니다. 이 컨텍스트에서 외부는 부하 분산 장치의 외부 인터페이스를 나타냅니다. 공용 외부 IP 주소를 수신한다는 의미는 아닙니다.NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE internal-app LoadBalancer 10.125.17.53 10.125.0.66 80:30430/TCP 64m
az network private-link-service list
명령을 사용하여 Private Link 서비스 개체의 세부 정보를 확인합니다.# Create a variable for the node resource group AKS_MC_RG=$(az aks show -g myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv) # View the details of the Private Link Service object az network private-link-service list -g $AKS_MC_RG --query "[].{Name:name,Alias:alias}" -o table
출력은 다음 예제 출력과 비슷하게 됩니다.
Name Alias -------- ------------------------------------------------------------------------- pls-xyz pls-xyz.abc123-defg-4hij-56kl-789mnop.eastus2.azure.privatelinkservice
Private Link 서비스에 대한 프라이빗 엔드포인트 만들기
프라이빗 엔드포인트를 사용하면 만든 Private Link 서비스를 통해 Kubernetes 서비스 개체에 비공개로 연결할 수 있습니다.
az network private-endpoint create
명령을 사용하여 프라이빗 엔드포인트를 만듭니다.# Create a variable for the private link service AKS_PLS_ID=$(az network private-link-service list -g $AKS_MC_RG --query "[].id" -o tsv) # Create the private endpoint $ az network private-endpoint create \ -g myOtherResourceGroup \ --name myAKSServicePE \ --vnet-name myOtherVNET \ --subnet pe-subnet \ --private-connection-resource-id $AKS_PLS_ID \ --connection-name connectToMyK8sService
주석을 통한 PLS 사용자 지정
다음 주석을 사용하여 PLS 리소스를 사용자 지정할 수 있습니다.
주석 | 값 | 설명 | 필수 항목 | 기본값 |
---|---|---|---|---|
service.beta.kubernetes.io/azure-pls-create |
"true" |
PLS를 만들어야 하는지 여부를 나타내는 부울입니다. | Required | |
service.beta.kubernetes.io/azure-pls-name |
<PLS name> |
만들 PLS 리소스의 이름을 지정하는 문자열입니다. | 선택 사항 | "pls-<LB frontend config name>" |
service.beta.kubernetes.io/azure-pls-resource-group |
Resource Group name |
PLS 리소스를 만들 리소스 그룹의 이름을 지정하는 문자열입니다. | 선택 사항 | MC_ resource |
service.beta.kubernetes.io/azure-pls-ip-configuration-subnet |
<Subnet name> |
PLS를 배포할 서브넷을 나타내는 문자열입니다. 이 서브넷은 백 엔드 풀과 동일한 VNET에 있어야 합니다. PLS NAT IP는 이 서브넷 내에 할당됩니다. | 선택 사항 | service.beta.kubernetes.io/azure-load-balancer-internal-subnet 인 경우 이 ILB 서브넷이 사용됩니다. 그렇지 않으면 구성 파일의 기본 서브넷이 사용됩니다. |
service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address-count |
[1-8] |
할당할 프라이빗 NAT IP의 총 수입니다. | 선택 사항 | 1 |
service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address |
"10.0.0.7 ... 10.0.0.10" |
할당할 고정 IPv4 IP의 공백으로 구분된 목록입니다. (IPv6는 현재 지원되지 않습니다.) 총 IP 수는 service.beta.kubernetes.io/azure-pls-ip-configuration-ip-address-count 에 지정된 IP 수보다 크지 않아야 합니다. 지정된 IP 수가 더 적으면 나머지 IP가 동적으로 할당됩니다. 목록의 첫 번째 IP는 Primary 로 설정됩니다. |
선택 사항 | 모든 IP가 동적으로 할당됩니다. |
service.beta.kubernetes.io/azure-pls-fqdns |
"fqdn1 fqdn2" |
PLS와 연결된 공백으로 구분된 fqdn 목록입니다. | 선택 사항 | [] |
service.beta.kubernetes.io/azure-pls-proxy-protocol |
"true" 또는 "false" |
링크 ID와 원본 IP 주소를 포함한 연결 정보를 전달하기 위해 PLS에서 TCP PROXY 프로토콜을 사용하도록 설정해야 하는지 여부를 나타내는 부울입니다. 백 엔드 서비스는 PROXY 프로토콜을 지원해야 하며, 그렇지 않으면 연결이 실패합니다. | 선택 사항 | false |
service.beta.kubernetes.io/azure-pls-visibility |
"sub1 sub2 sub3 … subN" 또는 "*" |
프라이빗 링크 서비스가 표시되는 공백으로 구분된 Azure 구독 ID 목록입니다. "*" 를 사용하여 PLS를 모든 하위에 노출합니다(가장 덜 제한적). |
선택 사항 | 역할 기반 액세스 제어만 나타내는 빈 목록 [] : 이 프라이빗 링크 서비스는 디렉터리 내에서 역할 기반 액세스 제어 권한이 있는 사용자만 사용할 수 있습니다. (가장 제한적) |
service.beta.kubernetes.io/azure-pls-auto-approval |
"sub1 sub2 sub3 … subN" |
공백으로 구분된 Azure 구독 ID 목록입니다. 이를 통해 나열된 구독의 PLS에 대한 PE 연결 요청이 자동으로 승인될 수 있습니다. 표시 유형이 "*"로 설정된 경우에만 작동합니다. | 선택 사항 | [] |
프라이빗 네트워크 사용
AKS 클러스터를 만들 때 고급 네트워킹 설정을 지정할 수 있습니다. 이 설정을 사용하여 클러스터를 기존 Azure 가상 네트워크 및 서브넷에 배포할 수 있습니다. 예를 들어 온-프레미스 환경에 연결된 프라이빗 네트워크에 AKS 클러스터를 배포하고 내부에서만 액세스할 수 있는 서비스를 실행할 수 있습니다.
자세한 내용은 Azure CNI 또는 Kubenet을 사용하여 고유한 가상 네트워크 서브넷 구성을 참조하세요.
AKS 클러스터에서 프라이빗 네트워크를 사용하는 내부 부하 분산 장치를 배포하기 위해 이전 단계를 변경할 필요가 없습니다. 부하 분산 장치는 AKS 클러스터와 동일한 리소스 그룹에 생성되지만 다음 예제와 같이 프라이빗 가상 네트워크 및 서브넷에 연결됩니다.
$ kubectl get service internal-app
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
internal-app LoadBalancer 10.1.15.188 10.0.0.35 80:31669/TCP 1m
참고 항목
AKS 클러스터에서 사용하는 클러스터 ID에는 최소한 가상 네트워크 리소스에 대한 네트워크 기여자 역할이 있어야 합니다. az aks show --resource-group <resource-group-name> --name <cluster-name> --query "identity"
와 같이 az aks show
명령을 사용하여 클러스터 ID를 볼 수 있습니다. az role assignment create --assignee <identity-resource-id> --scope <virtual-network-resource-id> --role "Network Contributor"
와 같이 az role assignment create
명령을 사용하여 클러스터 서브넷에 네트워크 기여자 역할을 할당할 수 있습니다.
대신 사용자 지정 역할을 정의하려면 다음 권한이 필요합니다.
Microsoft.Network/virtualNetworks/subnets/join/action
Microsoft.Network/virtualNetworks/subnets/read
자세한 내용은 가상 네트워크 서브넷 만들기, 변경 또는 삭제를 참조하세요.
다른 서브넷 지정
서비스에
azure-load-balancer-internal-subnet
주석을 추가하여 부하 분산 장치의 서브넷을 지정합니다. 지정된 서브넷은 AKS 클러스터와 동일한 가상 네트워크에 있어야 합니다. 배포된 경우, 부하 분산 장치EXTERNAL-IP
주소가 지정된 서브넷에 속합니다.apiVersion: v1 kind: Service metadata: name: internal-app annotations: service.beta.kubernetes.io/azure-load-balancer-internal: "true" service.beta.kubernetes.io/azure-load-balancer-internal-subnet: "apps-subnet" spec: type: LoadBalancer ports: - port: 80 selector: app: internal-app
부하 분산 장치 삭제하기
모든 서비스가 삭제되면 부하 분산 장치도 삭제됩니다.
Kubernetes 리소스와 마찬가지로 kubectl delete service internal-app
과 같은 서비스를 직접 삭제할 수도 있습니다. 그러면 기본 Azure 부하 분산 장치도 삭제됩니다.
다음 단계
Kubernetes 서비스에 대한 자세한 내용은 Kubernetes 서비스 설명서를 참조하세요.
Azure Kubernetes Service