AKS(Azure Kubernetes Service)를 통해 내부 부하 분산 장치 사용

내부 부하 분산 장치를 만들고 사용하여 AKS(Azure Kubernetes Service)에서 애플리케이션에 대한 액세스를 제한할 수 있습니다. 내부 부하 분산 장치에는 공용 IP가 없으며 Kubernetes 서비스는 개인 IP에 도달할 수 있는 애플리케이션에서만 액세스할 수 있습니다. 이 애플리케이션은 동일한 VNET 내에 있거나 VNET 피어링을 통해 다른 VNET에 있을 수 있습니다. 이 문서에서는 AKS를 통해 내부 부하 분산 장치를 만들고 사용하는 방법을 보여 줍니다.

참고 항목

Azure Load Balancer는 기본표준의 두 가지 SKU에서 사용할 수 있습니다. 기본적으로 표준 SKU는 AKS 클러스터를 만들 때 사용됩니다. LoadBalancer 서비스 유형을 만드는 경우 클러스터를 프로비전할 때와 동일한 부하 분산 장치 유형을 얻게 됩니다. 자세한 내용은 Azure Load Balancer SKU 비교를 참조하세요.

시작하기 전에

내부 부하 분산 장치 만들기

  1. 서비스 형식 LoadBalancerazure-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
    
  2. kubectl apply 명령을 사용하여 내부 부하 분산 장치를 배포합니다. 이 명령은 AKS 클러스터와 동일한 가상 네트워크에 연결된 노드 리소스 그룹에 Azure 부하 분산 장치를 만듭니다.

    kubectl apply -f internal-lb.yaml
    
  3. 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 주소는 사용할 수 없습니다.

az network vnet subnet list Azure CLI 명령 또는 Get-AzVirtualNetworkSubnetConfig PowerShell cmdlet을 사용하여 가상 네트워크에서 서브넷을 가져올 수 있습니다.

서브넷에 대한 자세한 내용은 고유한 서브넷을 사용하여 노드 풀 추가를 참조하세요.

부하 분산 장치에서 특정 IP 주소를 사용하려는 경우 두 가지 옵션이 있습니다. 서비스 주석을 설정하거나 부하 분산 장치 YAML 매니페스트에 LoadBalancerIP 속성을 추가하는 것입니다.

Important

부하 분산 장치 YAML 매니페스트에 LoadBalancerIP 속성을 추가하는 기능은 업스트림 Kubernetes에 따라 더 이상 사용되지 않습니다. 현재 사용량은 동일하게 유지되고 기존 서비스는 수정 없이 작동할 것으로 예상되지만 대신 서비스 주석을 설정하는 것이 좋습니다.

  1. 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
    
  1. 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
    

다른 서브넷에서 부하 분산 장치를 구성하는 방법에 대한 자세한 내용은 다른 서브넷 지정을 참조하세요.

시작하기 전에

  1. 서비스 형식이 LoadBalancer이고 azure-load-balancer-internalazure-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
    
  2. kubectl apply 명령을 사용하여 내부 부하 분산 장치를 배포합니다. 이 명령은 AKS 클러스터와 동일한 가상 네트워크에 연결된 노드 리소스 그룹에 Azure 부하 분산 장치를 만듭니다. 또한 Kubernetes Service와 연결된 부하 분산 장치의 프런트 엔드 IP 구성에 연결하는 Private Link 서비스 개체를 만듭니다.

    kubectl apply -f internal-lb-pls.yaml
    
  3. 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
    
  4. 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 서비스를 통해 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 서비스 설명서를 참조하세요.