다음을 통해 공유


애플리케이션 라우팅 추가 항목을 사용하여 사용자 지정 도메인 이름 및 SSL 인증서 설정

수신은 AKS(Azure Kubernetes Service) 클러스터의 서비스에 대한 외부 액세스를 허용하는 규칙을 정의하는 API 개체입니다. 애플리케이션 라우팅 추가 항목 nginx 수신 클래스를 사용하는 수신 개체를 만들 때 추가 항목이 AKS 클러스터에서 수신 컨트롤러를 하나 이상 만들고 구성하고 관리합니다.

이 문서에서는 Azure Key Vault에 저장된 SSL/TLS 인증서를 사용하여 트래픽을 암호화하고 Azure DNS를 사용하여 DNS 영역을 관리하는 고급 수신 구성을 설정하는 방법을 보여줍니다.

nginx 기능을 사용하는 애플리케이션 라우팅 추가 항목

nginx를 사용하는 애플리케이션 라우팅 추가 항목은 다음을 제공합니다.

  • 관리되는 nginx 수신 컨트롤러를 간편하게 구성
  • 전역 및 프라이빗 영역 관리를 위해 외부 DNS(예 Azure DNS)와 통합
  • 키 자격 증명 모음(예: Azure Key Vault)에 저장된 인증서로 SSL 종료

필수 조건

  • 애플리케이션 라우팅 추가 기능이 있는 AKS 클러스터.
  • SSL 종료를 구성하고 Azure에서 호스트되는 자격 증명 모음에 인증서를 저장하려는 경우의 Azure Key Vault
  • 전역 및 프라이빗 영역 관리를 구성하고 Azure에서 호스트하려는 경우 Azure DNS
  • Azure Key Vault 또는 Azure DNS 영역을 연결하려면 Azure 구독에 소유자, Azure 계정 관리자 또는 Azure 공동 관리자 역할이 있어야 합니다.
  • 모든 퍼블릭 DNS 영역은 동일한 구독 및 리소스 그룹에 있어야 합니다.

AKS 클러스터에 연결

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

az aks get-credentials 명령을 사용하여 Kubernetes 클러스터에 연결하도록 kubectl을 구성합니다.

az aks get-credentials --resource-group <ResourceGroupName> --name <ClusterName>

Azure Key Vault의 인증서로 HTTPS 트래픽 종료

HTTPS 트래픽에 대한 지원을 사용하려면 다음 필수 조건을 참조하세요.

인증서를 저장할 Azure Key Vault 만들기

참고 항목

Azure Key Vault가 이미 있는 경우 이 단계를 건너뛸 수 있습니다.

az keyvault create 명령을 사용하여 Azure Key Vault를 만듭니다.

az keyvault create --resource-group <ResourceGroupName> --location <Location> --name <KeyVaultName> --enable-rbac-authorization true

자체 서명된 SSL 인증서 만들기 및 내보내기

테스트를 위해 CA(인증 기관)에서 서명한 인증서 대신 자체 서명된 공용 인증서를 사용할 수 있습니다. 인증서가 이미 있으면 이 단계를 건너뛸 수 있습니다.

주의

자체 서명된 인증서는 신뢰할 수 있는 타사 CA에서 서명하지 않은 디지털 인증서입니다. 자체 서명된 인증서는 서명되는 웹 사이트 또는 소프트웨어를 담당하는 회사 또는 개발자가 만들고, 발급하고, 서명합니다. 따라서 자체 서명된 인증서는 공용 웹 사이트 및 애플리케이션에 안전하지 않은 것으로 간주됩니다. Azure Key Vault는 일부 인증 기관과 신뢰할 수 있는 파트너 관계를 맺습니다.

  1. openssl req 명령을 사용하여 수신과 함께 사용할 자체 서명된 SSL 인증서를 만듭니다. <Hostname>을 사용 중인 DNS 이름으로 바꿔야 합니다.

    openssl req -new -x509 -nodes -out aks-ingress-tls.crt -keyout aks-ingress-tls.key -subj "/CN=<Hostname>" -addext "subjectAltName=DNS:<Hostname>"
    
  2. SSL 인증서를 내보내고 openssl pkcs12 -export 명령을 사용하여 암호 프롬프트를 건너뜁니다.

    openssl pkcs12 -export -in aks-ingress-tls.crt -inkey aks-ingress-tls.key -out aks-ingress-tls.pfx
    

Azure Key Vault로 인증서 가져오기

az keyvault certificate import 명령을 사용하여 SSL 인증서를 Azure Key Vault로 가져옵니다. 인증서가 암호로 보호된 경우 --password 플래그를 통해 암호를 전달할 수 있습니다.

az keyvault certificate import --vault-name <KeyVaultName> --name <KeyVaultCertificateName> --file aks-ingress-tls.pfx [--password <certificate password if specified>]

Important

추가 기능이 인증서가 변경될 때 Azure Key Vault에서 인증서를 다시 로드하도록 하려면 --enable-secret-rotation 인수를 사용하여 Secret Store CSI 드라이버의 비밀 자동 회전 기능을 사용하도록 설정해야 합니다. 자동 회전이 사용하도록 설정되면 드라이버는 개발자가 정의한 회전 폴링 간격을 기반으로 주기적으로 변경 내용을 폴링하여 Pod 탑재와 Kubernetes 비밀을 업데이트합니다. 회전 폴 간격의 기본값은 2분입니다.

Azure Key Vault 통합 사용

애플리케이션 라우팅 추가 항목을 사용하도록 설정된 클러스터에서 --enable-kv--attach-kv 인수를 사용하여 az aks approuting update 명령을 사용해 비밀 저장소 CSI 드라이버에 Azure Key Vault 공급자를 사용하도록 설정하고 필요한 역할 할당을 적용합니다.

Azure Key Vault는 관리 평면에서 작동하는 Azure RBAC(Azure 역할 기반 액세스 제어)와 관리 평면과 데이터 평면 모두에서 작동하는 액세스 정책 모델이라는 두 가지 권한 부여 시스템을 제공합니다. --attach-kv 작업에서 사용하는 데 적절한 액세스 모델을 선택합니다.

참고 항목

az aks approuting update --attach-kv 명령은 명령을 실행하는 사용자의 권한을 사용하여 Azure Key Vault 역할 할당을 만듭니다. 이 역할은 추가항목 관리 ID에 할당됩니다. AKS 관리 ID에 대한 자세한 내용은 관리 ID 요약을 참조하세요.

Azure Key Vault 리소스 ID를 검색합니다.

KEYVAULTID=$(az keyvault show --name <KeyVaultName> --query "id" --output tsv)

그런 다음, Azure Key Vault 비밀 저장소 CSI 드라이버를 사용하도록 설정하고 역할 할당을 적용하도록 앱 라우팅 추가 항목을 업데이트합니다.

az aks approuting update --resource-group <ResourceGroupName> --name <ClusterName> --enable-kv --attach-kv ${KEYVAULTID}

Azure DNS 통합 사용

DNS 영역에 대한 지원을 사용하도록 설정하려면 다음 필수 요소를 검토합니다.

  • 앱 라우팅 추가 항목을 구성하여 수신 리소스에 정의된 호스트에 대한 Azure 전역 및 프라이빗 DNS 영역에 레코드 하나 이상에서 레코드를 자동으로 만들 수 있습니다. 모든 전역 Azure DNS 영역은 같은 리소스 그룹에 있어야 하며 모든 프라이빗 Azure DNS 영역은 같은 리소스 그룹에 있어야 합니다. Azure DNS 영역이 없으면 영역을 만들 수 있습니다.

공용 Azure DNS 영역 만들기

참고 항목

Azure DNS 영역이 이미 있으면 이 단계를 건너뛸 수 있습니다.

  1. az network dns zone create 명령을 사용하여 Azure DNS 영역 만듭니다.

    az network dns zone create --resource-group <ResourceGroupName> --name <ZoneName>
    

애플리케이션 라우팅 추가 항목에 Azure DNS 영역 연결

참고 항목

az aks approuting zone add 명령은 명령을 실행하는 사용자의 권한을 사용하여 Azure DNS 영역 역할 할당을 만듭니다. 이 역할은 추가항목 관리 ID에 할당됩니다. AKS 관리 ID에 대한 자세한 내용은 관리 ID 요약을 참조하세요.

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

    ZONEID=$(az network dns zone show --resource-group <ResourceGroupName> --name <ZoneName> --query "id" --output tsv)
    
  2. az aks approuting zone 명령을 사용하여 Azure DNS와 통합을 사용하도록 추가 항목을 업데이트합니다. 쉼표로 구분된 DNS 영역 리소스 ID 목록을 전달할 수 있습니다.

    az aks approuting zone add --resource-group <ResourceGroupName> --name <ClusterName> --ids=${ZONEID} --attach-zones
    

Azure Key Vault에서 호스트 이름과 인증서를 사용하는 수신 만들기

애플리케이션 라우팅 추가 항목은 webapprouting.kubernetes.azure.com이라는 클러스터에 수신 클래스를 만듭니다. 이 클래스로 수신 개체를 만들면 추가 기능이 활성화됩니다.

  1. az keyvault certificate show 명령을 사용하여 Azure Key Vault의 수신에서 사용할 인증서 URI를 가져옵니다.

    az keyvault certificate show --vault-name <KeyVaultName> --name <KeyVaultCertificateName> --query "id" --output tsv
    

    다음 예제 출력에서는 명령에서 반환된 인증서 URI를 보여줍니다.

    https://KeyVaultName.vault.azure.net/certificates/KeyVaultCertificateName/ea62e42260f04f17a9309d6b87aceb44
    
  2. 다음 YAML 매니페스트를 ingress.yaml이라는 새 파일에 복사하고 파일을 로컬 컴퓨터에 저장합니다.

    DNS 호스트 이름으로 <Hostname>을 업데이트하고 위 1단계에서 Azure Key Vault를 쿼리하도록 명령에서 반환된 URI로 <KeyVaultCertificateUri>를 업데이트합니다. *<KeyVaultCertificateUri>* 문자열 값에는 https://yourkeyvault.vault.azure.net/certificates/certname이 포함되어야 합니다. 현재 버전을 가져오기 위해 URI 문자열 끝에 인증서 버전을 생략해야 합니다.

    tls 섹션의 secretName 키는 이 수신 리소스에 대한 인증서가 포함된 비밀의 이름을 정의합니다. 이 인증서는 클라이언트가 <Hostname> 키에 지정된 URL을 탐색할 때 브라우저에 표시됩니다. secretName 값이 keyvault-와 같고 그 뒤에 metadata.name의 수신 리소스 이름 값이 오는지 확인합니다. 예제 YAML에서 secretNamekeyvault-<your Ingress name>과 같아야 합니다.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        kubernetes.azure.com/tls-cert-keyvault-uri: <KeyVaultCertificateUri>
      name: aks-helloworld
      namespace: hello-web-app-routing
    spec:
      ingressClassName: webapprouting.kubernetes.azure.com
      rules:
      - host: <Hostname>
        http:
          paths:
          - backend:
              service:
                name: aks-helloworld
                port:
                  number: 80
            path: /
            pathType: Prefix
      tls:
      - hosts:
        - <Hostname>
        secretName: keyvault-<your ingress name>
    
  3. 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   webapprouting.kubernetes.azure.com   myapp.contoso.com   20.51.92.19   80, 443   4m

다음 단계

애플리케이션의 성능과 사용량 분석의 일환으로 Grafana에서 Prometheus를 사용하여 애플리케이션 라우팅 추가 항목에 포함된 Ingress-nginx 컨트롤러 메트릭을 모니터링하는 방법을 알아보세요.