다음을 통해 공유


AKS(Azure Kubernetes Service) 부하 분산 장치에 고정 공용 IP 주소 및 DNS 레이블 사용

AKS(Azure Kubernetes Service) 클러스터에서 부하 분산 장치 리소스를 만들 때 할당된 공용 IP 주소는 해당 리소스의 수명 동안만 유효합니다. Kubernetes 서비스를 삭제하면 연결된 부하 분산 장치 및 IP 주소도 삭제됩니다. 특정 IP 주소를 할당하거나 재배포된 Kubernetes 서비스의 IP 주소를 유지하려는 경우에는 고정 공용 IP 주소를 만들어 사용할 수 있습니다.

이 문서에서는 고정 공용 IP 주소를 만들어 Kubernetes 서비스에 할당하는 방법을 설명합니다.

시작하기 전에

  • Azure CLI 2.0.59 이상 버전을 설치하고 구성해야 합니다. az --version을 실행하여 버전을 찾습니다. 설치 또는 업그레이드해야 하는 경우 Azure CLI 설치를 참조하세요.
  • 이 문서에서는 표준 SKU 부하 분산 장치로 표준 SKU IP를 사용하는 방법을 설명합니다. 자세한 내용은 Azure에서 IP 주소 형식 및 할당 메서드를 참조하세요.

AKS 클러스터 만들기

  1. az group create 명령을 사용하여 Azure 리소스 그룹을 만듭니다.

    az group create --name myNetworkResourceGroup --location eastus
    
  2. az aks create 명령을 사용하여 AKS 클러스터를 만듭니다.

    az aks create --name myAKSCluster --resource-group myNetworkResourceGroup --generate-ssh-keys
    

고정 IP 주소 만들기

  1. az aks show 명령을 사용하여 노드 리소스 그룹의 이름을 가져오고 nodeResourceGroup 속성을 쿼리합니다.

    az aks show --name myAKSCluster --resource-group myNetworkResourceGroup --query nodeResourceGroup -o tsv
    
  2. az network public ip create 명령을 사용하여 노드 리소스 그룹에 고정 공용 IP 주소를 만듭니다.

    az network public-ip create \
        --resource-group <node resource group name> \
        --name myAKSPublicIP \
        --sku Standard \
        --allocation-method static
    

    참고 항목

    AKS 클러스터에서 기본 SKU 부하 분산 장치를 사용하는 경우, 공용 IP를 정의할 때 --sku 매개 변수에 Basic을 사용합니다. 기본 SKU IP만 기본 SKU 부하 분산 장치에서 작동하며, 표준 SKU IP만 표준 SKU 부하 분산 장치에서 작동합니다.

  3. az network public-ip list 명령을 사용하여 고정 공용 IP 주소를 가져옵니다. 직접 만든 노드 리소스 그룹의 이름과 공용 IP 주소를 지정하고 ipAddress를 쿼리합니다.

    az network public-ip show --resource-group <node resource group name> --name myAKSPublicIP --query ipAddress --output tsv
    

고정 IP 주소를 사용하여 서비스 만들기

  1. 먼저, AKS 클러스터가 사용하는 관리 ID 유형(시스템 할당 또는 사용자 할당)을 결정합니다. 확실하지 않으면 az aks show 명령을 호출하고 ID의 type 속성을 쿼리합니다.

    az aks show \
        --name myAKSCluster \
        --resource-group myResourceGroup \
        --query identity.type \
        --output tsv       
    

    클러스터가 관리 ID를 사용하는 경우 type 속성의 값은 SystemAssigned 또는 UserAssigned가 됩니다.

    클러스터가 서비스 주체를 사용하는 경우 type 속성 값은 null이 됩니다. 관리 ID를 사용하도록 클러스터를 업그레이드하는 것이 좋습니다.

  2. AKS 클러스터가 시스템에서 할당한 관리 ID를 사용하는 경우 다음과 같이 관리 ID의 주체 ID를 쿼리합니다.

    # Get the principal ID for a system-assigned managed identity.
    CLIENT_ID=$(az aks show \
        --name myAKSCluster \
        --resource-group myNetworkResourceGroup \
        --query identity.principalId \
        --output tsv)
    

    AKS 클러스터가 사용자가 할당한 관리 ID를 사용하는 경우 주체 ID는 null이 됩니다. 대신 사용자가 할당한 관리 ID의 클라이언트 ID를 쿼리합니다.

    # Get the client ID for a user-assigned managed identity.
    CLIENT_ID=$(az aks show \
        --name myAKSCluster \
        --resource-group myNetworkResourceGroup \
        --query identity.userAssignedIdentities.*.clientId \
        --output tsv    
    
  3. az role assignment create 명령을 호출하여 공용 IP의 리소스 그룹에 대해 AKS 클러스터에서 사용하는 관리 ID에 대한 위임된 권한을 할당합니다.

    # Get the resource ID for the node resource group.
    RG_SCOPE=$(az group show \
        --name <node resource group> \
        --query id \
        --output tsv)
    
    # Assign the Network Contributor role to the managed identity,
    # scoped to the node resource group.
    az role assignment create \
        --assignee ${CLIENT_ID} \
        --role "Network Contributor" \
        --scope ${RG_SCOPE}
    

    Important

    아웃바운드 IP를 사용자 지정한 경우 클러스터 ID에 아웃바운드 공용 IP와 인바운드 공용 IP 모두에 대한 권한이 있는지 확인합니다.

  4. load-balancer-service.yaml이라는 파일을 만들고 다음 YAML 파일의 콘텐츠에 복사하여 이전 단계에서 만든 고유한 공용 IP 주소와 노드 리소스 그룹 이름을 제공합니다.

    Important

    부하 분산 장치 YAML 매니페스트에 loadBalancerIP 속성을 추가하는 기능은 업스트림 Kubernetes에 따라 더 이상 사용되지 않습니다. 현재 사용량은 동일하게 유지되고 기존 서비스는 수정 없이 작동할 것으로 예상되지만 대신 서비스 주석을 설정하는 것이 좋습니다. 서비스 주석을 설정하려면 YAML 예에 표시된 것처럼 공용 IP 이름에 service.beta.kubernetes.io/azure-pip-name을, IPv4 주소에 service.beta.kubernetes.io/azure-load-balancer-ipv4를, IPv6 주소에 service.beta.kubernetes.io/azure-load-balancer-ipv6을 사용할 수 있습니다.

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group name>
        service.beta.kubernetes.io/azure-pip-name: myAKSPublicIP
      name: azure-load-balancer
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: azure-load-balancer
    

    참고 항목

    service.beta.kubernetes.io/azure-pip-name 주석을 추가하면 가장 효율적인 LoadBalancer 만들기가 보장되며 잠재적인 제한을 방지하려면 적극 권장됩니다.

  5. service.beta.kubernetes.io/azure-dns-label-name 서비스 주석을 사용하여 서비스에 공용 DNS 레이블을 설정합니다. 이렇게 하면 Azure의 퍼블릭 DNS 서버 및 최상위 도메인을 사용하여 서비스에 FQDN(정규화된 도메인 이름)이 게시됩니다. 주석 값은 Azure 위치 내에서 고유해야 하므로 충분히 정규화된 레이블을 사용하는 것이 좋습니다. Azure는 <location>.cloudapp.azure.com과 같이 선택된 위치의 기본 접미사를 제공된 이름에 자동으로 추가하여 FQDN을 만듭니다.

    참고 항목

    고유의 도메인에 서비스를 게시하려면 Azure DNSexternal-dns 프로젝트를 참조하세요.

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-resource-group: <node resource group name>
        service.beta.kubernetes.io/azure-pip-name: myAKSPublicIP
        service.beta.kubernetes.io/azure-dns-label-name: <unique-service-label>
      name: azure-load-balancer
    spec:
      type: LoadBalancer
      ports:
      - port: 80
      selector:
        app: azure-load-balancer
    
  6. kubectl apply 명령을 사용하여 서비스 및 배포를 만듭니다.

    kubectl apply -f load-balancer-service.yaml
    
  7. 부하 분산 장치의 DNS 레이블을 보려면 kubectl describe service 명령을 사용합니다.

    kubectl describe service azure-load-balancer
    

    DNS 레이블은 다음 압축된 예제 출력과 같이 Annotations 아래에 나열됩니다.

    Name:                    azure-load-balancer
    Namespace:               default
    Labels:                  <none>
    Annotations:             service.beta.kuberenetes.io/azure-dns-label-name: <unique-service-label>
    

문제 해결

Kubernetes 서비스 매니페스트의 loadBalancerIP 속성에 정의된 고정 IP 주소가 없거나 노드 리소스 그룹에 생성되지 않았고 추가적인 위임이 구성되지 않은 경우, 부하 분산 장치 서비스 만들기에 실패합니다. 문제를 해결하려면 kubectl describe 명령을 사용하여 서비스 만들기 이벤트를 검토합니다. 다음 예제와 같이 YAML 매니페스트에 지정된 서비스의 이름을 입력합니다.

kubectl describe service azure-load-balancer

출력에는 Kubernetes Service 리소스에 대한 정보가 표시됩니다. “user supplied IP address was not found” 예제 출력은 EventsWarning을 보여 줍니다. 이 시나리오에서는 노드 리소스 그룹에 고정 공용 IP 주소를 만들었고 Kubernetes 서비스 매니페스트에 지정된 IP 주소가 올바른지 확인합니다.

Name:                     azure-load-balancer
Namespace:                default
Labels:                   <none>
Annotations:              <none>
Selector:                 app=azure-load-balancer
Type:                     LoadBalancer
IP:                       10.0.18.125
IP:                       40.121.183.52
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  32582/TCP
Endpoints:                <none>
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type     Reason                      Age               From                Message
  ----     ------                      ----              ----                -------
  Normal   CreatingLoadBalancer        7s (x2 over 22s)  service-controller  Creating load balancer
  Warning  CreatingLoadBalancerFailed  6s (x2 over 12s)  service-controller  Error creating load balancer (will retry): Failed to create load balancer for service default/azure-load-balancer: user supplied IP Address 40.121.183.52 was not found

다음 단계

애플리케이션의 네트워크 트래픽을 보다 세밀하게 제어하려면 AKS용 애플리케이션 라우팅 추가 기능을 사용합니다. 앱 라우팅 추가 기능에 대한 자세한 내용은 애플리케이션 라우팅 추가 기능을 사용한 관리 NGINX 수신을 참조하세요.