외부 DNS를 사용하면 Kubernetes 로드 밸런싱된 서비스를 기반으로 DNS 레코드를 동적으로 구성할 수 있습니다. 외부 DNS용 TKG 확장을 배포하여 클러스터에 대한 동적 서비스 검색을 제공할 수 있습니다.

확장 사전 요구 사항

외부 DNS용 TKG 확장 v1.3.1을 배포하기 전에 다음 요구 사항을 준수합니다.

기타 요구 사항

외부 DNS 확장과 함께 제공되는 샘플 구성에는 Contour 수신 컨트롤러가 있거나 없는 예제가 포함되어 있습니다. Contour를 사용하는 경우에는 외부 DNS 확장을 설치하기 전에 Contour를 설치합니다. Contour 수신용 TKG 확장 배포 및 관리를 참조하십시오.

외부 DNS 확장을 사용하면 동적 서비스 검색이 가능합니다. 일반적인 사용 사례는 Harbor 레지스트리입니다. Harbor를 사용하려면 RFC 2136 규격 동적 DNS 제공자(예: AWS Route53, Azure DNS, Google Cloud DNS) 또는 로컬 DNS 서버(예: BIND)에 DNS 영역이 설정되어 있어야 합니다. Harbor 레지스트리용 TKG 확장 배포 및 관리를 참조하십시오.

외부 DNS 확장 배포

다음 단계를 완료하여 외부 DNS용 TKG 확장 v1.3.1을 설치합니다.

  1. 디렉토리를 외부 DNS 확장 파일을 다운로드한 위치로 변경합니다.
    cd /tkg-extensions-v1.3.1+vmware.1/extensions/service-discovery/external-dns
  2. 외부 DNS 확장에서 사용할 네임스페이스 및 여러 역할 기반 액세스 제어 개체를 생성합니다.
    kubectl apply -f namespace-role.yaml

    이 명령은 네임스페이스 tanzu-system-service-discovery 및 연결된 RBAC 개체를 생성합니다. kubect get ns를 실행하여 확인합니다.

  3. 데이터 값 파일을 생성합니다. 예제 데이터 값 파일은 필요한 최소 구성을 제공합니다.

    AWS, Azure 및 RFC 2136 규격 동적 DNS 제공자에 대한 예제 데이터 값 파일(각각 Contour 수신이 있거나 없음)이 있습니다. 적절한 예제 파일을 선택하고 복사합니다.

    예를 들어 AWS Route 53을 Contour와 함께 사용하는 경우 다음 명령을 실행합니다.
    cp external-dns-data-values-aws-with-contour.yaml.example external-dns-data-values-aws-with-contour.yaml
    또는 Azure를 Contour와 함께 사용하는 경우 다음 명령을 실행합니다.
    cp external-dns-data-values-azure-with-contour.yaml.example external-dns-data-values-azure-with-contour.yaml
  4. 외부 DNS 데이터 값을 구성합니다.

    예를 들어 다음은 Azure DNS에 대한 구성입니다. domain-filterazure-resource-group 값을 제공합니다.

    #@data/values
    #@overlay/match-child-defaults missing_ok=True
    ---
    externalDns:
      image:
        repository: projects.registry.vmware.com/tkg
      deployment:
        #@overlay/replace
        args:
        - --provider=azure
        - --source=service
        - --source=ingress
        - --domain-filter=my-zone.example.org #! zone where services are deployed
        - --azure-resource-group=my-resource-group #! Azure resource group
        #@overlay/replace
        volumeMounts:
        - name: azure-config-file
          mountPath: /etc/kubernetes
          readOnly: true
        #@overlay/replace
        volumes:
        - name: azure-config-file
          secret:
            secretName: azure-config-file
  5. 직접 채운 데이터 값 파일을 사용하여 일반 암호를 생성합니다.

    예를 들어 다음 명령은 Azure DNS 데이터 값 파일을 사용하여 암호를 생성합니다.

    kubectl create secret generic external-dns-data-values --from-file=values.yaml=external-dns-data-values-azure-with-contour.yaml -n tanzu-system-service-discovery

    tanzu-system-service-discovery 네임스페이스에 secret/external-dns-data-values created가 생성된 것을 볼 수 있습니다. kubectl get secrets -n tanzu-system-service-discovery 명령을 사용하여 확인할 수 있습니다.

  6. 외부 DNS 확장을 배포합니다.
    kubectl apply -f external-dns-extension.yaml

    성공하면 app.kappctrl.k14s.io/external-dns created가 표시됩니다.

  7. 확장 배포의 상태를 확인합니다.
    kubectl get app external-dns -n tanzu-system-service-discovery
    외부 DNS가 성공적으로 배포되면 애플리케이션 상태가 Reconciling에서 Reconcile succeeded로 변경됩니다. 상태가 Reconcile failed인 경우 배포 문제 해결 항목을 참조하십시오.
  8. 자세한 상태를 봅니다.
    kubectl get app external-dns -n tanzu-system-service-discovery -o yaml

배포 문제 해결

조정이 실패하면 kubectl get pods -A 명령을 실행하여 포드의 상태를 확인합니다. 정상적인 조건에서는 external-dns-XXXXX 포드가 Running인 것을 볼 수 있습니다. 조정이 실패하거나 포드 상태가 ImagePullBackOff 또는 ImagecRashLoopBackOff이면 저장소에서 컨테이너 이미지를 끌어올 수 없음을 의미합니다. 데이터 값 및 확장 YAML 파일에서 저장소 URL을 확인하고 정확한지 확인합니다.

컨테이너 로그를 확인하려면 다음 명령을 실행합니다. 여기서 name-XXXXkubectl get pods -A를 실행할 때 볼 수 있는 고유한 포드 이름입니다.
kubectl logs pod/external-dns-XXXXX -c external-dns -n tanzu-system-service-discovery

외부 DNS 확장 업데이트

Tanzu Kubernetes 클러스터에 배포된 외부 DNS 확장을 업데이트합니다.

  1. 암호에서 Contour 데이터 값을 얻습니다.
    kubectl get secret external-dns-data-values -n tanzu-system-service-discovery -o 'go-template={{ index .data "values.yaml" }}' | base64 -d > external-dns-data-values.yaml
  2. external-dns-data-values.yaml에서 외부 DNS 데이터 값을 업데이트합니다. 외부 DNS 확장 구성의 내용을 참조하십시오.
  3. Contour 데이터 값 암호를 업데이트합니다.
    kubectl create secret generic external-dns-data-values --from-file=values.yaml=external-dns-data-values.yaml -n tanzu-system-service-discovery -o yaml --dry-run | kubectl replace -f-
    외부 DNS 확장이 새 데이터 값으로 조정됩니다.
    참고: 기본적으로 kapp-controller는 5분마다 애플리케이션을 동기화합니다. 업데이트는 5분 이내에 적용됩니다. 업데이트를 즉시 적용하려면 external-dns-extensionsyncPeriod를 더 작은 값으로 변경하고 kubectl apply -f external-dns-extension을 사용하여 Contour 확장을 적용합니다.
  4. 확장의 상태를 확인합니다.
    kubectl get app external-dns -n tanzu-system-service-disovery

    업데이트되면 애플리케이션 상태가 Reconcile Succeeded로 변경됩니다.

  5. 자세한 상태를 살펴보고 문제를 해결합니다.
    kubectl get app external-dns -n tanzu-system-service-disovery -o yaml

외부 DNS 확장 삭제

Tanzu Kubernetes 클러스터에서 외부 DNS 확장을 삭제합니다.

참고: 순서대로 단계를 완료하십시오. 확장 및 애플리케이션이 삭제되기 전에 대상 네임스페이스 및 역할 개체를 삭제하지 마십시오. 네임스페이스 및 역할 개체를 삭제하면 kapp-controller에서 사용하는 서비스 계정이 삭제됩니다. 애플리케이션 및 확장을 삭제하기 전에 이 서비스 계정을 삭제하면 시스템 오류가 발생할 수 있습니다.
  1. 디렉토리를 확장 파일을 다운로드한 위치로 변경합니다.
    cd /tkg-extensions-v1.3.1+vmware.1/extensions/service-discovery/external-dns
  2. 외부 DNS 확장을 삭제합니다.
    kubectl delete -f external-dns-extension.yaml
  3. 확장이 삭제되었는지 확인합니다.
    kubectl get app contour -n tanzu-system-ingress

    예상 결과: 애플리케이션이 Not Found 상태입니다.

  4. 네임스페이스를 삭제합니다.
    Contour 확장 및 애플리케이션이 완전히 삭제된 것을 확인한 후에만 네임스페이스 및 역할 개체를 삭제해도 안전합니다.
    kubectl delete -f namespace-role.yaml
    예상 결과: 확장이 배포된 네임스페이스 및 연결된 역할 기반 액세스 제어 개체가 삭제됩니다.

외부 DNS 확장 구성

사용자 지정 설정을 사용하여 외부 DNS 확장을 구성할 수 있습니다.

외부 DNS 제공자에 대한 배포 매개 변수를 구성합니다. 추가 지침은 Kubernetes 사이트 https://github.com/kubernetes-sigs/external-dns#running-externaldns에서 참조하십시오.
표 1. Harbor 확장 구성 매개 변수
매개 변수 설명 유형 기본값
externalDns.namespace external-dns가 배포될 네임스페이스 문자열 tanzu-system-service-discovery
externalDns.image.repository external-dns 이미지가 포함된 저장소 문자열 projects.registry.vmware.com/tkg
externalDns.image.name external-dns의 이름 문자열 external-dns
externalDns.image.tag ExternalDNS 이미지 태그 문자열 v0.7.4_vmware.1
externalDns.image.pullPolicy ExternalDNS 이미지 Pull 정책 문자열 IfNotPresent
externalDns.deployment.annotations external-dns 배포에 대한 주석 map<string,string> {}
externalDns.deployment.args 명령줄을 통해 external-dns로 전달된 인수 list<string> [](필수 매개 변수)
externalDns.deployment.env external-dns에 전달할 환경 변수 list<string> []
externalDns.deployment.securityContext external-dns 컨테이너의 보안 컨텍스트 보안 컨텍스트 {}
externalDns.deployment.volumeMounts external-dns 컨테이너의 볼륨 마운트 list<VolumeMount> []
externalDns.deployment.volumes external-dns 포드의 볼륨 list<Volume> []