このトピックでは、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」を参照してください。
kubectl
。tanzu context use
コマンドを使用して Tanzu CLI にログインしている。ExternalDNS サービスは、DNS レコードをエクスポートするサービスと同じクラスタに展開する必要があります。
ExternalDNS パッケージは、AWS (Route 53)、Azure DNS、および RFC2136 (BIND) で検証されています。提供されている構成では、Contour HTTPProxy リソースとタイプ LoadBalancer
の Kubernetes Services
の両方のレコードがエクスポートされます。
外部 DNS コミュニティは、さまざまなレベルの安定性において多くの DNS プロバイダとの統合を維持します。特に記載がある場合を除き、VMware は ExternalDNS パッケージと特定のプロバイダの統合を保証しません。
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": [
"*"
]
}
]
}
上記で作成したポリシーを使用して、ExternalDNS の IAM ユーザーを作成します。AWS コンソールで、[ユーザー (Users)] 画面に移動し、[ユーザーの追加 (Add users)] をクリックします。IAM ユーザーの名前を入力し、[プログラムによるアクセス (Programmatic access)] が有効になっていることを確認します。ウィザードの [権限 (Permissions)] 画面で、[既存のポリシーを直接添付 (Attach existing policies directly)] をクリックし、前の手順で作成したポリシーを選択します。
ウィザードの最後のページに進みます。[アクセス キー ID (Access key ID)] および [シークレット アクセス キー (Secret access key)] を記録します。これらの Route 53 認証情報を ExternalDNS で使用できるようにするには、ExternalDNS が実行される名前空間に Kubernetes シークレットを作成します。
kubectl
のコンテキストを ExternalDNS を展開するクラスタに設定します。例:
kubectl config use-context tkg-services-admin@tkg-services
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
は、上記で記録した認証情報です。
パッケージのデフォルト構成を取得して、ExternalDNS パッケージの構成ファイルを作成します。
tanzu package available get external-dns.tanzu.vmware.com/PACKAGE-VERSION --default-values-file-output FILE-PATH
ここで、PACKAGE-VERSION
はインストールする ExternalDNS パッケージのバージョンで、FILE-PATH
は external-dns-data-values.yaml
などの構成ファイルを保存する場所です。
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
は、yaml
、json
、または table
に設定できます。詳細については、「パッケージのインストールと管理」の「パッケージ」を参照してください。
サーバの 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
パッケージのデフォルト構成を取得して、ExternalDNS パッケージの構成ファイルを作成します。
tanzu package available get external-dns.tanzu.vmware.com/PACKAGE-VERSION --default-values-file-output FILE-PATH
ここで、PACKAGE-VERSION
はインストールする ExternalDNS パッケージのバージョンで、FILE-PATH
は external-dns-data-values.yaml
などの構成ファイルを保存する場所です。
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
は、yaml
、json
、または table
に設定できます。詳細については、「パッケージのインストールと管理」の「パッケージ」を参照してください。
az
CLI にログインします。
az login
サブスクリプションを設定します。
az account set -s SUBSCRIPTION-ID-GUID
サービス プリンシパルを作成します。
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"
}
サービス プリンシパルに権限を割り当てます。
リソース グループの ID を取得します。
az group show --name RESOURCE-GROUP --query id
リソース グループ範囲のサービス プリンシパルにリーダー ロールを割り当てます。上記の az ad sp create-for-rbac
コマンドの出力からの appId
が必要です。
az role assignment create --role "Reader" --assignee APP-ID-GUID --scope RESOURCE-GROUP-RESOURCE-ID
DNS ゾーンの ID を取得します。
az network dns zone show --name DNS-ZONE-NAME -g RESOURCE-GROUP-NAME --query id
DNS ゾーン範囲のサービス プリンシパルにコントリビュータ ロールを割り当てます。
az role assignment create --role "Contributor" --assignee APP-ID-GUID --scope DNS-ZONE-RESOURCE-ID
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
は、サービス プリンシパルの出力からのパスワードです。Azure 認証情報を ExternalDNS で使用できるようにするには、ExternalDNS が実行される名前空間に Kubernetes シークレットを作成します。
kubectl
のコンテキストを ExternalDNS を展開するクラスタに設定します。例:
kubectl config use-context tkg-services-admin@tkg-services
前の手順の azure.json
構成ファイルを使用してシークレットを作成します。
kubectl -n tanzu-system-service-discovery create secret generic azure-config-file --from-file=azure.json
パッケージのデフォルト構成を取得して、ExternalDNS パッケージの構成ファイルを作成します。
tanzu package available get external-dns.tanzu.vmware.com/PACKAGE-VERSION --default-values-file-output FILE-PATH
ここで、PACKAGE-VERSION
はインストールする ExternalDNS パッケージのバージョンで、FILE-PATH
は external-dns-data-values.yaml
などの構成ファイルを保存する場所です。
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
は、yaml
、json
、または table
に設定できます。詳細については、「パッケージのインストールと管理」の「パッケージ」を参照してください。
kubectl
のコンテキストを ExternalDNS を展開するクラスタに設定します。例:
kubectl config use-context tkg-services-admin@tkg-services
クラスタに、tanzu-standard
リポジトリなどの ExternalDNS パッケージがインストールされたパッケージ リポジトリがない場合は、次の方法でインストールします。
tanzu package repository add PACKAGE-REPO-NAME --url PACKAGE-REPO-ENDPOINT --namespace tkg-system
ここで、
PACKAGE-REPO-NAME
はパッケージ リポジトリの名前です。tanzu-standard
や、ADDITIONAL_IMAGE_REGISTRY
変数で構成されたプライベート イメージ レジストリの名前が入ります。PACKAGE-REPO-ENDPOINT
はパッケージ リポジトリの URL です。
tanzu-standard
の URL は projects.registry.vmware.com/tkg/packages/standard/repo:v2023.10.16
です。Tanzu CLI からこの値を取得するには、「パッケージ リポジトリの一覧表示」を参照してください。また、Tanzu Mission Control では [クラスタ (Cluster)] ペインの [アドオン (Addons)] > [リポジトリ (Repositories)] リストを参照してください。ExternalDNS パッケージの名前を取得します。
tanzu package available list -A
ExternalDNS パッケージのバージョンを取得します。
tanzu package available list external-dns.tanzu.vmware.com -A
external-dns-data-values.yaml
ファイルにコメントが含まれている場合は、パッケージをインストールする前にコメントを削除します。
yq -i eval '... comments=""' external-dns-data-values.yaml
このパッケージをインストールします。
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.10.0+vmware.1-tkg.1 \
--values-file external-dns-data-values.yaml \
--namespace my-packages
external-dns
パッケージがインストールされていることを確認します。
tanzu package installed list -A
パッケージの詳細を表示するために、次のコマンドを実行することもできます。
tanzu package installed get external-dns --namespace PACKAGE-NAMESPACE
ここで、PACKAGE-NAMESPACE
は、external-dns
パッケージがインストールされている名前空間です。
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
ExternalDNS ポッドが tanzu-system-service-discovery
名前空間で実行されていることを確認します。
kubectl get pods -A
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 パッケージを更新します。
external-dns-data-values.yaml
で ExternalDNS 構成を更新します。
インストール済みパッケージの構成を更新します。
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.10.0+vmware.1-tkg.1 \
--values-file external-dns-data-values.yaml \
--namespace my-packages
ExternalDNS パッケージは、追加した新しい値を使用して調整されます。kapp-controller
が変更を適用するまでに最大 5 分かかることがあります。
tanzu package installed update
コマンドの詳細については、「パッケージのインストールと管理」の「パッケージの更新」を参照してください。 このコマンドを使用して、インストールされているパッケージのバージョンまたは構成を更新できます。