다음을 통해 공유


애플리케이션 라우팅 추가 기능을 사용하여 Azure 프라이빗 DNS 영역을 지원하도록 NGINX 수신 컨트롤러 구성

이 문서에서는 Azure 내부 부하 분산 장치와 함께 작동하도록 NGINX 수신 컨트롤러를 구성하는 방법과 프라이빗 엔드포인트가 특정 도메인을 확인하기 위해 DNS 확인을 사용하도록 프라이빗 Azure DNS 영역을 구성하는 방법을 보여 줍니다.

시작하기 전에

AKS 클러스터에 연결

로컬 컴퓨터에서 Kubernetes 클러스터에 연결하려면 Kubernetes 명령줄 클라이언트인 kubectl을 사용합니다. az aks install-cli 명령을 사용하여 로컬로 설치할 수 있습니다. Azure Cloud Shell을 사용하는 경우 kubectl이 이미 설치되어 있습니다.

다음 예에서는 az aks get-credentials 명령을 사용하여 myResourceGroupmyAKSCluster라는 클러스터에 연결하도록 구성합니다.

az aks get-credentials --resource-group myResourceGroup --name myAKSCluster

가상 네트워크 만들기

가상 네트워크에 프라이빗 DNS 영역을 게시하려면 영역 내에서 레코드를 확인할 수 있는 가상 네트워크 목록을 지정해야 합니다. 이를 가상 네트워크 링크라고 합니다.

다음 예에서는 myResourceGroup 리소스 그룹 내에 myAzureVNet이라는 가상 네트워크를 만들고, 특정 주소 접두사를 사용하여 VNet 내에 mySubnet이라는 서브넷 하나를 만듭니다.

az network vnet create \
  --name myAzureVNet \
  --resource-group myResourceGroup \
  --location eastus \
  --address-prefix 10.2.0.0/16 \
  --subnet-name mysubnet \
  --subnet-prefixes 10.2.0.0/24

Azure 프라이빗 DNS 영역 만들기

참고 항목

수신 리소스에 정의된 호스트에 대해 하나 이상의 Azure 글로벌 및 프라이빗 DNS 영역에 레코드를 자동으로 만들도록 애플리케이션 라우팅 추가 기능을 구성할 수 있습니다. 모든 글로벌 Azure DNS 영역과 모든 프라이빗 Azure DNS 영역은 동일한 리소스 그룹에 있어야 합니다.

az network private-dns zone create 명령을 사용하여 DNS 영역을 만들고, 영역 이름과 영역을 만들 리소스 그룹을 지정합니다. 다음 예에서는 myResourceGroup 리소스 그룹에 private.contoso.com이라는 DNS 영역을 만듭니다.

az network private-dns zone create --resource-group myResourceGroup --name private.contoso.com

az network private-dns link vnet create 명령을 사용하여 이전에 만든 DNS 영역에 대한 가상 네트워크 링크를 만듭니다. 다음 예에서는 가상 네트워크 myAzureVNet에 대해 영역 private.contoso.com에 대한 myDNSLink라는 링크를 만듭니다. 링크 등록이 사용하도록 설정되지 않도록 지정하려면 --registration-enabled 매개 변수를 포함합니다.

az network private-dns link vnet create --resource-group myResourceGroup \
  --name myDNSLink \
  --zone-name private.contoso.com \
  --virtual-network myAzureVNet \
  --registration-enabled false

Azure DNS 프라이빗 영역 자동 등록 기능을 사용하면 가상 네트워크에 배포된 가상 머신에 대한 DNS 레코드 관리가 간편해집니다. 이 설정이 사용하도록 설정된 상태에서 가상 네트워크를 프라이빗 DNS 영역에 연결하면 가상 네트워크에 배포된 AKS 노드의 각 Azure 가상 머신에 대한 DNS 레코드가 만들어집니다.

애플리케이션 라우팅 추가 기능에 Azure 프라이빗 DNS 영역 연결

참고 항목

az aks approuting zone add 명령은 명령을 실행하는 사용자의 권한을 사용하여 Azure DNS 영역 역할 할당을 만듭니다. 프라이빗 DNS 영역 기여자 역할은 프라이빗 DNS 리소스를 관리하기 위한 기본 제공 역할이며 추가 기능의 관리 ID에 할당됩니다. AKS 관리 ID에 대한 자세한 내용은 관리 ID 요약을 참조하세요.

  1. az network dns zone show 명령을 사용하여 DNS 영역의 리소스 ID를 검색하고 출력을 ZONEID라는 변수에 대한 출력을 설정합니다. 다음 예에서는 리소스 그룹 myResourceGroup의 영역 private.contoso.com을 쿼리합니다.

    ZONEID=$(az network private-dns zone show --resource-group myResourceGroup --name private.contoso.com --query "id" --output tsv)
    
  2. az aks approuting zone 명령을 사용하여 Azure DNS와 통합을 사용하도록 추가 항목을 업데이트합니다. 쉼표로 구분된 DNS 영역 리소스 ID 목록을 전달할 수 있습니다. 다음 예에서는 리소스 그룹 myResourceGroup의 AKS 클러스터 myAKSCluster를 업데이트합니다.

    az aks approuting zone add --resource-group myResourceGroup --name myAKSCluster --ids=${ZONEID} --attach-zones
    

개인 IP 주소와 내부 부하 분산 장치를 사용하여 NGINX 수신 컨트롤러를 만듭니다.

애플리케이션 라우팅 추가 항목은 NginxIngressController라는 Kubernetes CRD(사용자 지정 리소스 정의)를 사용하여 NGINX 수신 컨트롤러를 구성합니다. 더 많은 수신 컨트롤러를 만들거나 기존 구성을 수정할 수 있습니다.

NginxIngressController CRD에는 부하 분산 장치 주석을 설정하여 NGINX 수신 컨트롤러 서비스의 동작을 제어하는 loadBalancerAnnotations 필드가 있습니다.

개인 IP 주소가 있는 내부에 연결된 Azure Load Balancer가 있는 NGINX 수신 컨트롤러를 만들려면 다음 단계를 수행합니다.

  1. 다음 YAML 매니페스트를 nginx-internal-controller.yaml이라는 새 파일에 복사하고 로컬 컴퓨터에 파일을 저장합니다.

    apiVersion: approuting.kubernetes.azure.com/v1alpha1
    kind: NginxIngressController
    metadata:
      name: nginx-internal
    spec:
      ingressClassName: nginx-internal
      controllerNamePrefix: nginx-internal
      loadBalancerAnnotations: 
        service.beta.kubernetes.io/azure-load-balancer-internal: "true"
    
  2. kubectl apply 명령을 사용하여 NGINX 수신 컨트롤러 리소스를 생성합니다.

    kubectl apply -f nginx-internal-controller.yaml
    

    다음 예제 출력은 생성된 리소스를 보여줍니다.

    nginxingresscontroller.approuting.kubernetes.azure.com/nginx-internal created
    
  3. 수신 컨트롤러가 생성되었는지 확인

    kubectl get nginxingresscontroller 명령을 사용하여 NGINX 수신 컨트롤러의 상태를 확인할 수 있습니다.

    kubectl get nginxingresscontroller
    

    다음 예제 출력에서는 생성된 리소스를 보여줍니다. 컨트롤러를 사용할 수 있으려면 몇 분 정도 걸릴 수 있습니다.

    NAME             INGRESSCLASS                         CONTROLLERNAMEPREFIX   AVAILABLE
    default          webapprouting.kubernetes.azure.com   nginx                  True
    nginx-internal   nginx-internal                       nginx-internal         True
    

애플리케이션 배포

애플리케이션 라우팅 추가 기능은 Kubernetes 수신 개체에 주석을 사용하여 적절한 리소스를 만듭니다.

  1. kubectl create namespace 명령을 사용하여 예제 Pod를 실행하는 hello-web-app-routing이라는 애플리케이션 네임스페이스를 만듭니다.

    kubectl create namespace hello-web-app-routing
    
  2. 다음 YAML 매니페스트를 deployment.yaml이라는 새 파일에 복사하여 배포를 만들고 이 파일을 로컬 컴퓨터에 저장합니다.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: aks-helloworld  
      namespace: hello-web-app-routing
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: aks-helloworld
      template:
        metadata:
          labels:
            app: aks-helloworld
        spec:
          containers:
          - name: aks-helloworld
            image: mcr.microsoft.com/azuredocs/aks-helloworld:v1
            ports:
            - containerPort: 80
            env:
            - name: TITLE
              value: "Welcome to Azure Kubernetes Service (AKS)"
    
  3. 다음 YAML 매니페스트를 service.yaml이라는 새 파일에 복사하여 서비스를 만들고 이 파일을 로컬 컴퓨터에 저장합니다.

    apiVersion: v1
    kind: Service
    metadata:
      name: aks-helloworld
      namespace: hello-web-app-routing
    spec:
      type: ClusterIP
      ports:
      - port: 80
      selector:
        app: aks-helloworld
    
  4. kubectl apply 명령을 사용하여 클러스터 리소스를 만듭니다.

    kubectl apply -f deployment.yaml -n hello-web-app-routing
    

    다음 예제 출력에서는 생성된 리소스를 보여줍니다.

    deployment.apps/aks-helloworld created created
    
    kubectl apply -f service.yaml -n hello-web-app-routing
    

    다음 예제 출력에서는 생성된 리소스를 보여줍니다.

    service/aks-helloworld created created
    

Azure 프라이빗 DNS 영역의 호스트 이름과 개인 IP 주소를 사용하는 수신 리소스를 만듭니다.

  1. 다음 YAML 매니페스트를 ingress.yaml이라는 새 파일에 복사하고 파일을 로컬 컴퓨터에 저장합니다.

    <Hostname>을 DNS 호스트 이름(예: helloworld.private.contoso.com)으로 업데이트합니다. ingressClassName에 대해 nginx-internal을 지정했는지 확인합니다.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: aks-helloworld
      namespace: hello-web-app-routing
    spec:
      ingressClassName: nginx-internal
      rules:
      - host: <Hostname>
        http:
          paths:
          - backend:
              service:
                name: aks-helloworld
                port:
                  number: 80
            path: /
            pathType: Prefix
    
  2. kubectl apply 명령을 사용하여 클러스터 리소스를 만듭니다.

    kubectl apply -f ingress.yaml -n hello-web-app-routing
    

    다음 예제 출력에서는 생성된 리소스를 보여줍니다.

    ingress.networking.k8s.io/aks-helloworld created
    

관리되는 수신이 만들어졌는지 확인

kubectl get ingress 명령을 사용하여 관리되는 수신이 만들어졌는지 확인할 수 있습니다.

kubectl get ingress -n hello-web-app-routing

다음 예제 출력에서는 생성된 관리되는 수신을 보여 줍니다.

NAME             CLASS            HOSTS                            ADDRESS      PORTS   AGE
aks-helloworld   nginx-internal   helloworld.private.contoso.com   10.224.0.7   80      98s

Azure 프라이빗 DNS 영역이 업데이트되었는지 확인합니다.

몇 분 안에 az network private-dns record-set a list 명령을 실행하여 Azure 프라이빗 DNS 영역에 대한 A 레코드를 확인합니다. 리소스 그룹의 이름과 DNS 영역의 이름을 지정합니다. 이 예에서 리소스 그룹은 myResourceGroup이고 DNS 영역은 private.contoso.com입니다.

az network private-dns record-set a list --resource-group myResourceGroup --zone-name private.contoso.com

다음 출력 예는 만들어진 레코드를 보여 줍니다.

[
  {
    "aRecords": [
      {
        "ipv4Address": "10.224.0.7"
      }
    ],
    "etag": "188f0ce5-90e3-49e6-a479-9e4053f21965",
    "fqdn": "helloworld.private.contoso.com.",
    "id": "/subscriptions/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx/resourceGroups/foo/providers/Microsoft.Network/privateDnsZones/private.contoso.com/A/helloworld",
    "isAutoRegistered": false,
    "name": "helloworld",
    "resourceGroup": "foo",
    "ttl": 300,
    "type": "Microsoft.Network/privateDnsZones/A"
  }
]

다음 단계

SSL 암호화, 기타 고급 NGINX 수신 컨트롤러 및 수신 리소스 구성과 관련된 기타 구성 정보는 DNS 및 SSL 구성애플리케이션 라우팅 추가 기능 구성을 검토합니다.