外部 DNS を使用すると、Kubernetes ロード バランサ サービスに基づいて DNS レコードを動的に構成できます。外部 DNS 用 TKG 拡張機能をデプロイして、動的サービス検出をクラスタに提供できます。

拡張機能の前提条件

外部 DNS 用 TKG 拡張機能 v1.3.1 をデプロイする前に、次の要件を満たす必要があります。

その他の要件

外部 DNS 拡張機能で提供されるサンプル構成には、Contour Ingress コントローラを使用する例および使用しない例が含まれています。Contour を使用する場合は、外部 DNS 拡張機能をインストールする前に Contour をインストールします。Contour Ingress 用 TKG 拡張機能のデプロイと管理を参照してください。

外部 DNS 拡張機能を使用すると、動的サービス検出が使用可能になります。一般的なユースケースは、Harbor レジストリで使用する場合です。Harbor を使用するには、AWS Route53、Azure DNS、Google Cloud DNS などの RFC 2136 準拠の動的 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 Ingress がある場合とない場合のそれぞれについてデータ値ファイルのサンプルが用意されています。適切なサンプル ファイルを選んでコピーします。

    たとえば、Contour ありで AWS Route 53 を使用している場合は、次のコマンドを実行します。
    cp external-dns-data-values-aws-with-contour.yaml.example external-dns-data-values-aws-with-contour.yaml
    一方、Contour ありで Azure を使用している場合は、次のコマンドを実行します。
    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-XXXX は、 kubectl 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-
    外部 DSN 拡張機能が新しいデータ値で調整されます。
    注: デフォルトでは、kapp-controller によってアプリケーションが 5 分ごとに同期されます。更新は 5 分以内に有効になります。更新をすぐに有効にするには、 external-dns-extension 内の syncPeriod の値を小さくし、 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 拡張機能の構成

外部 DSN 拡張機能をカスタム設定で構成できます。

外部 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 image 文字列 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 のイメージ プル ポリシー 文字列 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> []