サービス検出のための ExternalDNS のインストール

このトピックでは、Tanzu Kubernetes Grid のワークロード クラスタに ExternalDNS を展開する方法について説明します。

ExternalDNS サービスは、宣言型の Kubernetes ネイティブ インターフェイスを使用して、アプリケーションの DNS レコードを DNS サーバに公開します。Tanzu Kubernetes Grid では CLI で管理されるパッケージとしてパッケージ化されています。

ロード バランシング(AWS、Azure、および NSX Advanced Load Balancer を使用した vSphere)を使用して Harbor が共有サービス クラスタに展開されている環境では、ExternalDNS を使用して Harbor サービスの DNS ホスト名を公開できます。これにより、他のクラスタから Harbor にアクセスできます。詳細については、「Harbor Registry and ExternalDNS」を参照してください。

前提条件

ExternalDNS 展開用のクラスタの準備

ExternalDNS サービスは、DNS レコードをエクスポートするサービスと同じクラスタに展開する必要があります。

  • Harbor をインストールするには、「サービス レジストリ用の Harbor のインストール」の前提条件と手順に従います。
  • ExternalDNS は、Kubernetes サービスと Contour HTTPProxy リソースの両方のレコードの作成をサポートします。ワークロード クラスタで Contour HTTPProxy リソースのレコードを作成する場合は、クラスタに Contour パッケージをインストールする必要があります。手順については、「入力方向制御のための Contour のインストール」を参照してください。Contour パッケージは Harbor でも必要です。

ExternalDNS パッケージの構成ファイルの準備

ExternalDNS パッケージは、AWS (Route 53)、Azure DNS、および RFC2136 (BIND) で検証されています。提供されている構成では、Contour HTTPProxy リソースとタイプ LoadBalancer の Kubernetes Services の両方のレコードがエクスポートされます。

外部 DNS コミュニティは、さまざまなレベルの安定性において多くの DNS プロバイダとの統合を維持します。特に記載がある場合を除き、VMware は ExternalDNS パッケージと特定のプロバイダの統合を保証しません。

AWS (Route 53)
構成ファイルを準備して ExternalDNS パッケージを AWS に展開するには、次の手順を実行します。
  1. サービスが使用するドメインを使用して、Route 53 内にホスト ゾーンを作成します。
  2. [ホスト ゾーン ID (Hosted zone ID)] を記録します。この ID は、後で ExternalDNS を構成するときに使用します。
  3. ExternalDNS が Route 53 を更新できるようにする ExternalDNS の IAM ポリシーを作成します。AWS コンソールで IAM ダッシュボードに移動し、[アクセス管理 (Access Management)][ポリシー (Policies)] 画面に移動します。[ポリシーの作成 (Create Policy)] をクリックし、[JSON] タブに切り替えます。次のポリシーに貼り付けます。必要に応じて、作成したホスト ゾーンの更新を許可するようにポリシーを微調整できます。ウィザードを終了します。

    {
     "Version": "2012-10-17",
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "route53:ChangeResourceRecordSets"
         ],
         "Resource": [
           "arn:aws:route53:::hostedzone/*"
         ]
       },
       {
         "Effect": "Allow",
         "Action": [
           "route53:ListHostedZones",
           "route53:ListResourceRecordSets"
         ],
         "Resource": [
           "*"
         ]
       }
     ]
    }
    
  4. 上記で作成したポリシーを使用して、ExternalDNS の IAM ユーザーを作成します。AWS コンソールで、[ユーザー (Users)] 画面に移動し、[ユーザーの追加 (Add users)] をクリックします。IAM ユーザーの名前を入力し、[プログラムによるアクセス (Programmatic access)] が有効になっていることを確認します。ウィザードの [権限 (Permissions)] 画面で、[既存のポリシーを直接添付 (Attach existing policies directly)] をクリックし、前の手順で作成したポリシーを選択します。

  5. ウィザードの最後のページに進みます。[アクセス キー ID (Access key ID)] および [シークレット アクセス キー (Secret access key)] を記録します。これらの Route 53 認証情報を ExternalDNS で使用できるようにするには、ExternalDNS が実行される名前空間に Kubernetes シークレットを作成します。

    1. kubectl のコンテキストを ExternalDNS を展開するクラスタに設定します。例:

      kubectl config use-context tkg-services-admin@tkg-services
      
    2. Kubernetes シークレットを作成します。

      kubectl -n tanzu-system-service-discovery create secret generic route53-credentials \
      --from-literal=aws_access_key_id=YOUR-ACCESS-KEY-ID \
      --from-literal=aws_secret_access_key=YOUR-SECRET-ACCESS-KEY
      

      ここで、YOUR-ACCESS-KEY-ID および YOUR-SECRET-ACCESS-KEY は、上記で記録した認証情報です。

  6. パッケージのデフォルト構成を取得して、ExternalDNS パッケージの構成ファイルを作成します。

    tanzu package available get external-dns.tanzu.vmware.com/PACKAGE-VERSION --default-values-file-output FILE-PATH
    

    ここで、PACKAGE-VERSION はインストールする ExternalDNS パッケージのバージョンで、FILE-PATHexternal-dns-data-values.yaml などの構成ファイルを保存する場所です。

  7. external-dns-data-values.yaml ファイルで次の設定を構成します。このファイルは、ExternalDNS パッケージを構成します。

    ---
    
    # Namespace in which to deploy ExternalDNS pods.
    namespace: tanzu-system-service-discovery
    
    # Deployment-related configuration.
    deployment:
    args:
      - --source=service
      - --source=ingress
      - --source=contour-httpproxy # Provide this to enable Contour HTTPProxy support. Must have Contour installed or ExternalDNS will fail.
      - --domain-filter=DOMAIN # Makes ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones.
      - --policy=upsert-only # Prevents ExternalDNS from deleting any records, omit to enable full synchronization.
      - --registry=txt
      - --txt-owner-id=HOSTED-ZONE-ID
      - --txt-prefix=txt # Disambiguates TXT records from CNAME records.
      - --provider=aws
      - --aws-zone-type=public # Looks only at public hosted zones. Valid values are public, private, or no value for both.
      - --aws-prefer-cname
    env:
      - name: AWS_ACCESS_KEY_ID
         valueFrom:
         secretKeyRef:
            name: route53-credentials
            key: aws_access_key_id
      - name: AWS_SECRET_ACCESS_KEY
         valueFrom:
         secretKeyRef:
            name: route53-credentials
            key: aws_secret_access_key
    securityContext: {}
    volumeMounts: []
    volumes: []
    

    external-dns-data-values.yaml ファイルのプレースホルダを自分の値に置き換えます。詳細な構成オプションについては、「ExternalDNS」のドキュメントを参照してください。

    external-dns-data-values.yaml ファイルで追加の構成オプションを設定する前に、ExternalDNS パッケージの値スキーマを確認します。値スキーマを取得するには、次のコマンドを実行します。

    tanzu package available get external-dns.tanzu.vmware.com/AVAILABLE-VERSION --values-schema
    

    ここで、AVAILABLE-VERSION は ExternalDNS パッケージのバージョンです。--values-schema フラグは、ExternalDNS パッケージの Package API リソースから valuesSchema セクションを取得します。値スキーマの出力形式 --output は、yamljson、または table に設定できます。詳細については、「パッケージのインストールと管理」の「パッケージ」を参照してください。

RFC2136 (BIND) サーバ
RFC2136 プロバイダを使用すると、BIND など、RFC2136 互換の DNS サーバを ExternalDNS のプロバイダとして使用できます。
  1. サーバの TSIG キーを要求または作成します。更新するゾーンを更新および転送するには、このキーが許可されている必要があります。キーは次のようになります。

    key "externaldns-key" {
    algorithm hmac-sha256;
    secret "/2avn5M4ndEztbDqy66lfQ+PjRZta9UXLtToW6NV5nM=";
    };
    

    独自の DNS サーバを管理している場合は、tsig-keygen -a hmac-sha256 externaldns コマンドを使用して TSIG キーを作成できます。DNS サーバ構成に出力をコピーします。たとえば、BIND の場合は、キーを named.conf ファイルに追加し、allow-transfer および update-policy フィールドを使用してゾーンを構成します。例:

    key "externaldns-key" {
    algorithm hmac-sha256;
    secret "/2avn5M4ndEztbDqy66lfQ+PjRZta9UXLtToW6NV5nM=";
    };
    zone "k8s.example.org" {
    type master;
    file "/etc/bind/zones/k8s.zone";
          allow-transfer {
          key "externaldns-key";
          };
          update-policy {
          grant externaldns-key zonesub ANY;
          };
    };
    

    上記は、次のようなゾーン ファイルもあることを前提としています。

    $TTL 60 ; 1 minute
    @         IN SOA  k8s.example.org.  root.k8s.example.org. (
                      16  ; serial
                      60  ; refresh (1 minute)
                      60  ; retry (1 minute)
                      60  ; expire (1 minute)
                      60  ; minimum (1 minute)
                      )
                NS   ns.k8s.example.org.
    ns           A    1.2.3.4
    
  2. パッケージのデフォルト構成を取得して、ExternalDNS パッケージの構成ファイルを作成します。

    tanzu package available get external-dns.tanzu.vmware.com/PACKAGE-VERSION --default-values-file-output FILE-PATH
    

    ここで、PACKAGE-VERSION はインストールする ExternalDNS パッケージのバージョンで、FILE-PATHexternal-dns-data-values.yaml などの構成ファイルを保存する場所です。

  3. external-dns-data-values.yaml ファイルで次の設定を構成します。このファイルは、ExternalDNS パッケージを構成します。

    ---
    
    # Namespace in which to deploy ExternalDNS pods.
    namespace: tanzu-system-service-discovery
    
    # Deployment-related configuration.
    deployment:
    args:
       - --source=service
       - --source=ingress
       - --source=contour-httpproxy # Provide this to enable Contour HTTPProxy support. Must have Contour installed or ExternalDNS will fail.
       - --domain-filter=DOMAIN # For example, k8s.example.org. Makes ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones.
       - --policy=upsert-only # Prevents ExternalDNS from deleting any records, omit to enable full synchronization.
       - --registry=txt
       - --txt-owner-id=k8s
       - --txt-prefix=external-dns- # Disambiguates TXT records from CNAME records.
       - --provider=rfc2136
       - --rfc2136-host=IP-ADDRESS-OF-RFC2136-DNS-SERVER
       - --rfc2136-port=53
       - --rfc2136-zone=DNS-ZONE # For example, k8s.example.org.
       - --rfc2136-tsig-secret=TSIG-SECRET-FROM-STEP-1
       - --rfc2136-tsig-secret-alg=hmac-sha256
       - --rfc2136-tsig-keyname=TSIG-KEY-NAME # For example, externaldns-key.
       - --rfc2136-tsig-axfr
    env: []
    securityContext: {}
    volumeMounts: []
    volumes: []
    

    external-dns-data-values.yaml ファイルのプレースホルダを自分の値に置き換えます。詳細な構成オプションについては、「ExternalDNS」のドキュメントを参照してください。

    external-dns-data-values.yaml ファイルで追加の構成オプションを設定する前に、ExternalDNS パッケージの値スキーマを確認します。値スキーマを取得するには、次のコマンドを実行します。

    tanzu package available get external-dns.tanzu.vmware.com/AVAILABLE-VERSION --values-schema
    

    ここで、AVAILABLE-VERSION は ExternalDNS パッケージのバージョンです。--values-schema フラグは、ExternalDNS パッケージの Package API リソースから valuesSchema セクションを取得します。値スキーマの出力形式 --output は、yamljson、または table に設定できます。詳細については、「パッケージのインストールと管理」の「パッケージ」を参照してください。

Azure
構成ファイルを準備して ExternalDNS パッケージを Azure に展開するには、次の手順を実行します。
  1. az CLI にログインします。

    az login
    
  2. サブスクリプションを設定します。

    az account set -s SUBSCRIPTION-ID-GUID
    
  3. サービス プリンシパルを作成します。

    az ad sp create-for-rbac -n SERVICE-PRINCIPAL-NAME
    

    コマンドの JSON 出力は次のようになります。

    {
      "appId": "a72a7cfd-7cb0-4b02-b130-03ee87e6ca89",
      "displayName": "foo",
      "name": "http://foo",
      "password": "515c55da-f909-4e17-9f52-236ffe1d3033",
      "tenant": "b35138ca-3ced-4b4a-14d6-cd83d9ea62f0"
    }
    
  4. サービス プリンシパルに権限を割り当てます。

    1. リソース グループの ID を取得します。

      az group show --name RESOURCE-GROUP --query id
      
    2. リソース グループ範囲のサービス プリンシパルにリーダー ロールを割り当てます。上記の az ad sp create-for-rbac コマンドの出力からの appId が必要です。

      az role assignment create --role "Reader" --assignee APP-ID-GUID --scope RESOURCE-GROUP-RESOURCE-ID
      
    3. DNS ゾーンの ID を取得します。

      az network dns zone show --name DNS-ZONE-NAME -g RESOURCE-GROUP-NAME --query id
      
    4. DNS ゾーン範囲のサービス プリンシパルにコントリビュータ ロールを割り当てます。

      az role assignment create --role "Contributor" --assignee APP-ID-GUID --scope DNS-ZONE-RESOURCE-ID
      
  5. ExternalDNS サービスを Azure DNS サービスに接続するには、ローカル マシンに azure.json という名前の構成ファイルを作成し、次のようなコンテンツを含めます。

    {
     "tenantId": "01234abc-de56-ff78-abc1-234567890def",
     "subscriptionId": "01234abc-de56-ff78-abc1-234567890def",
     "resourceGroup": "MyDnsResourceGroup",
     "aadClientId": "01234abc-de56-ff78-abc1-234567890def",
     "aadClientSecret": "uKiuXeiwui4jo9quae9o"
    }
    

    上記の例の値は、次のように独自の値に置き換えます。

    • tenantId を取得するには、az account show --query "tenantId" コマンドを実行します。
    • subscriptionId を取得するには、az account show --query "id" コマンドを実行します。
    • resourceGroup は、DNS ゾーンが含まれるリソース グループの名前です。
    • aadClientId は、サービス プリンシパルの出力からの appId です。
    • aadClientSecret は、サービス プリンシパルの出力からのパスワードです。
  6. Azure 認証情報を ExternalDNS で使用できるようにするには、ExternalDNS が実行される名前空間に Kubernetes シークレットを作成します。

    1. kubectl のコンテキストを ExternalDNS を展開するクラスタに設定します。例:

      kubectl config use-context tkg-services-admin@tkg-services
      
    2. 前の手順の azure.json 構成ファイルを使用してシークレットを作成します。

      kubectl -n tanzu-system-service-discovery create secret generic azure-config-file --from-file=azure.json
      
  7. パッケージのデフォルト構成を取得して、ExternalDNS パッケージの構成ファイルを作成します。

    tanzu package available get external-dns.tanzu.vmware.com/PACKAGE-VERSION --default-values-file-output FILE-PATH
    

    ここで、PACKAGE-VERSION はインストールする ExternalDNS パッケージのバージョンで、FILE-PATHexternal-dns-data-values.yaml などの構成ファイルを保存する場所です。

  8. external-dns-data-values.yaml ファイルで次の設定を構成します。このファイルは、ExternalDNS パッケージを構成します。

    ---
    
    # Namespace in which to deploy ExternalDNS.
    namespace: tanzu-system-service-discovery
    
    # Deployment-related configuration.
    deployment:
     args:
       - --source=service
       - --source=ingress
       - --source=contour-httpproxy # Provide this to enable Contour HTTPProxy support. Must have Contour installed or ExternalDNS will fail.
       - --domain-filter=DOMAIN # For example, k8s.example.org. Makes ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones.
       - --policy=upsert-only # Prevents ExternalDNS from deleting any records, omit to enable full synchronization.
       - --registry=txt
       - --txt-prefix=externaldns- # Disambiguates TXT records from CNAME records.
       - --provider=azure
       - --azure-resource-group=RESOURCE-GROUP # Azure resource group.
     env: []
     securityContext: {}
     volumeMounts:
       - name: azure-config-file
         mountPath: /etc/kubernetes
         readOnly: true
     volumes:
       - name: azure-config-file
         secret:
           secretName: azure-config-file
    

    external-dns-data-values.yaml ファイルのプレースホルダを自分の値に置き換えます。詳細な構成オプションについては、「ExternalDNS」のドキュメントを参照してください。

    external-dns-data-values.yaml ファイルで追加の構成オプションを設定する前に、ExternalDNS パッケージの値スキーマを確認します。値スキーマを取得するには、次のコマンドを実行します。

    tanzu package available get external-dns.tanzu.vmware.com/AVAILABLE-VERSION --values-schema
    

    ここで、AVAILABLE-VERSION は ExternalDNS パッケージのバージョンです。--values-schema フラグは、ExternalDNS パッケージの Package API リソースから valuesSchema セクションを取得します。値スキーマの出力形式 --output は、yamljson、または table に設定できます。詳細については、「パッケージのインストールと管理」の「パッケージ」を参照してください。


ExternalDNS パッケージのインストール

  1. kubectl のコンテキストを ExternalDNS を展開するクラスタに設定します。例:

    kubectl config use-context tkg-services-admin@tkg-services
    
  2. まだ standard パッケージ リポジトリをクラスタに追加していない場合は、追加します。

    プランベースのクラスタ(レガシー)をターゲットとする場合は、この手順をスキップします。プランベースのクラスタの場合は、tanzu-standard パッケージ リポジトリは、すべてのクラスタの tanzu-package-repo-global 名前空間で自動的に有効になります。

    tanzu package repository add tanzu-standard --url PACKAGE-REPOSITORY-ENDPOINT --namespace tkg-system
    

    ここで、PACKAGE-REPOSITORY-ENDPOINTstandard パッケージ リポジトリの URL です。このリリースでは、URL は projects.registry.vmware.com/tkg/packages/standard/repo:v2.1.1 です。

    Tanzu CLI からこの値を取得するには、「パッケージ リポジトリの一覧表示」を参照してください。また、Tanzu Mission Control では [クラスタ (Cluster)] ペインの [アドオン (Addons)] > [リポジトリ (Repositories)] リストを参照してください。

  3. ExternalDNS パッケージの名前を取得します。

    tanzu package available list -A
    
  4. ExternalDNS パッケージのバージョンを取得します。

    tanzu package available list external-dns.tanzu.vmware.com -A
    
  5. external-dns-data-values.yaml ファイルにコメントが含まれている場合は、パッケージをインストールする前にコメントを削除します。

    yq -i eval '... comments=""' external-dns-data-values.yaml
    
  6. このパッケージをインストールします。

    tanzu package install external-dns \
    --package external-dns.tanzu.vmware.com \
    --version AVAILABLE-PACKAGE-VERSION \
    --values-file external-dns-data-values.yaml \
    --namespace TARGET-NAMESPACE
    

    ここで、

    • TARGET-NAMESPACE は、ExternalDNS パッケージをインストールする名前空間です。たとえば、my-packages または tanzu-cli-managed-packages 名前空間などです。

      • --namespace フラグが指定されていない場合、Tanzu CLI は default 名前空間にパッケージをインストールします。ExternalDNS ポッドおよび ExternalDNS コンポーネントに関連付けられているその他のリソースは、tanzu-system-service-discovery 名前空間に作成されます。この名前空間には ExternalDNS パッケージをインストールしないでください。
      • 指定された名前空間は、たとえば kubectl create namespace my-packages を実行することによってすでに存在している必要があります。
    • AVAILABLE-PACKAGE-VERSION は、上で取得したバージョンです。

    例:

    tanzu package install external-dns \
    --package external-dns.tanzu.vmware.com \
    --version 0.8.0+vmware.1-tkg.1 \
    --values-file external-dns-data-values.yaml \
    --namespace my-packages
    
  7. external-dns パッケージがインストールされていることを確認します。

    tanzu package installed list -A
    

    パッケージの詳細を表示するために、次のコマンドを実行することもできます。

    tanzu package installed get external-dns --namespace PACKAGE-NAMESPACE
    

    ここで、PACKAGE-NAMESPACE は、external-dns パッケージがインストールされている名前空間です。

  8. external-dns アプリケーションが PACKAGE-NAMESPACE で正常に調整されていることを確認します。

    kubectl get apps -A
    

    ステータスが Reconcile Succeeded でない場合は、external-dns アプリケーションの完全なステータスの詳細を表示します。完全なステータスを表示すると、問題のトラブルシューティングに役立ちます。

    kubectl get app external-dns --namespace PACKAGE-NAMESPACE -o yaml
    

    ここで、PACKAGE-NAMESPACE は、パッケージをインストールした名前空間です。トラブルシューティングを行っても問題を解決できない場合は、パッケージをアンインストールしてから再度インストールする必要があります。

    tanzu package installed delete external-dns --namespace PACKAGE-NAMESPACE
    
  9. ExternalDNS ポッドが tanzu-system-service-discovery 名前空間で実行されていることを確認します。

    kubectl get pods -A
    

ExternalDNS の検証

Contour で構成されている場合、ExternalDNS は HTTPProxy リソースの指定された名前空間を自動的に監視し、構成されたドメイン フィルタに一致するホスト名を持つサービスの DNS レコードを作成します。

ExternalDNS は、注釈 external-dns.alpha.kubernetes.io/hostname を使用して Kubernetes サービスを自動的に監視し、構成されたドメイン フィルタに一致する注釈を持つサービスの DNS レコードを作成します。

たとえば、注釈 external-dns.alpha.kubernetes.io/hostname: foo.k8s.example.org のサービスの場合、ExternalDNS は foo.k8s.example.org の DNS レコードを作成します。作成したゾーンを調べることで、レコードが存在することを検証できます。

実行中の ExternalDNS 展開の更新

展開後に ExternalDNS パッケージの構成を変更する必要がある場合は、次の手順に従って、展開された ExternalDNS パッケージを更新します。

  1. external-dns-data-values.yaml で ExternalDNS 構成を更新します。

  2. インストール済みパッケージの構成を更新します。

    tanzu package installed update external-dns \
    --version INSTALLED-PACKAGE-VERSION \
    --values-file external-dns-data-values.yaml \
    --namespace INSTALLED-PACKAGE-NAMESPACE
    

    ここで、

    • INSTALLED-PACKAGE-VERSION は、インストールされている ExternalDNS パッケージのバージョンです。
    • INSTALLED-PACKAGE-NAMESPACE は、ExternalDNS パッケージがインストールされている名前空間です。

    例:

    tanzu package installed update external-dns \
    --version 0.8.0+vmware.1-tkg.1 \
    --values-file external-dns-data-values.yaml \
    --namespace my-packages
    

ExternalDNS パッケージは、追加した新しい値を使用して調整されます。kapp-controller が変更を適用するまでに最大 5 分かかることがあります。

tanzu package installed update コマンドの詳細については、「パッケージのインストールと管理」の「パッケージの更新」を参照してください。 このコマンドを使用して、インストールされているパッケージのバージョンまたは構成を更新できます。

check-circle-line exclamation-circle-line close-line
Scroll to top icon