이 항목에서는 ExternalDNS를 Tanzu Kubernetes Grid의 워크로드에 배포하는 방법을 설명합니다.
ExternalDNS 서비스는 선언적 Kubernetes 네이티브 인터페이스를 사용하여 애플리케이션의 DNS 레코드를 DNS 서버에 게시합니다. Tanzu Kubernetes Grid에서 CLI 관리 패키지로 패키지되어 있습니다.
로드 밸런싱이 있는 공유 서비스 클러스터(AWS, Azure, vSphere with NSX Advanced Load Balancer)에 Harbor가 배포된 환경에서 ExternalDNS를 사용하여 Harbor 서비스의 DNS 호스트 이름을 게시할 수 있습니다. 이렇게 하면 다른 클러스터에서 Harbor에 액세스할 수 있습니다. 자세한 내용은 Harbor 레지스토리 및 ExternalDNS를 참조하십시오.
kubectl
.tanzu context use
명령을 사용하여 Tanzu CLI에 로그인했습니다.ExternalDNS 서비스는 DNS 레코드를 내보낼 서비스와 동일한 클러스터에 배포되어야 합니다.
EnterternalDNS 패키지는 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 암호를 생성합니다.
ExternalDNS를 배포하는 클러스터에 kubectl
의 컨텍스트를 설정합니다. 예:
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
리소스 그룹 범위의 서비스 주체에 리더(reader) 역할을 할당합니다. 위의 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 암호를 생성합니다.
ExternalDNS를 배포하는 클러스터에 kubectl
의 컨텍스트를 설정합니다. 예:
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
로 설정할 수 있습니다. 자세한 내용은 패키지 설치 및 관리에서 패키지를 참조하십시오.
ExternalDNS를 배포하는 클러스터에 kubectl
의 컨텍스트를 설정합니다. 예:
kubectl config use-context tkg-services-admin@tkg-services
클러스터에 ExternalDNS 패키지가 설치된 패키지 저장소(예: tanzu-standard
저장소)가 없는 경우 설치합니다.
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
명령에 대한 자세한 내용은 패키지 설치 및 관리에서 패키지 업데이트를 참조하십시오. 이 명령을 사용하여 설치된 패키지의 버전 또는 구성을 업데이트할 수 있습니다.