Amazon Route53, Google cloud DNS 를 활용한 kubernetes service DNS 자동화 (1/3)
1. AWS Route53 도메인을 parent domain으로 Google cloud DNS sub-domain 등록 활용하기
이번에는 하나의 목표를 위한 3개의 글로 이루어진 시리즈물을 포스팅을 해 보려 한다.
최종 목표는 Public cloud의 managed DNS 서비스를 통해, 특정 도메인(FQDN, 여기서는 본인이 보유 중인 Route53 managed 도메인 중 kube.click 이라는 도메인의 subdomain 을 route53.kube.click 또는 gcloud.kube.click로 만들어서 사용)의 서브도메인이 자동으로 만들어지고, 해당 도메인을 통해 Kubernetes service로 외부에서 접속 가능하도록 구성해 보는 것이다. 즉, kubernetes service(또는 ingress host) 이름을 svc1 이라고 하면 svc1.route53.kube.click 으로 A record 가 생성되고 kubernetes 내에서 svc1 이 삭제되면 이 A record 도 삭제되도록 하면 상당히 간편하게 자동화 된 외부 노출 주소 관리가 가능해질 것이다.
이 기능은, 마치 OpenShift 로 app을 expose하면 app.openshift.base.domain 으로 그 app의 endpoint 가 자동으로 만들어지는 것과 유사한 사용자 경험을 제공하게 되는데, 그를 위해 현존 거의 대다수 잘 알려진 23개 Public DNS 들과 잘 연동되는 external-dns(CNCF incubation project; https://github.com/kubernetes-sigs/external-dns) 을 적용해 보고자 한다.
물론 Public cloud로는 제목에 언급된 Route53과 Google cloud DNS 각각에 대해 모두 다루어 볼 것이며, 이번 글은 다음의 2개의 글에 대한 준비 과정으로 보면 될 듯하다. 보너스로, Route53 에서 관리되는 하나의 도메인을 parent 로 해서, Google cloud DNS에 그 subdomain 을 hosted zone으로 등록하고 사용하는 과정과 방법을 같이 기록 정리해 두고자 한다.
- Pre-requisites
- manageable FQDN(Route53 - kube.click)
- aws sdk
- gcloud sdk
Route53 domain 정보(parent domain)
$ aws route53 list-hosted-zones
----------
{
"HostedZones": [
...
{
"Id": "/hostedzone/REDACTEDHOSTEDZONEID",
"Name": "kube.click.",
"CallerReference": "RISWorkflow-RD:REDACTEDUUID",
"Config": {
"Comment": "HostedZone created by Route53 Registrar",
"PrivateZone": false
},
"ResourceRecordSetCount": 2
}
]
}
Google cloud project 및 managed zone 생성
$ export PROJECT_NAME="dns-hosting-poc"
$ gcloud config set project $PROJECT_NAME
$ export CUSTOM_DOMAIN="gcloud.kube.click"
$ export DNS_ZONE_NAME="subdomain-route53"
$ gcloud dns managed-zones create $DNS_ZONE_NAME \
--dns-name $CUSTOM_DOMAIN \
--description "Automatically managed zone by kubernetes.io/external-dns"
----------
Created [https://dns.googleapis.com/dns/v1/projects/dns-hosting-poc/managedZones/subdomain-route53].
$ gcloud dns record-sets list \
--zone=$DNS_ZONE_NAME \
--name=$CUSTOM_DOMAIN
----------
NAME TYPE TTL DATA
gcloud.kube.click. NS 21600 ns-cloud-e1.googledomains.com.,ns-cloud-e2.googledomains.com.,ns-cloud-e3.googledomains.com.,ns-cloud-e4.googledomains.com.
gcloud.kube.click. SOA 21600 ns-cloud-e1.googledomains.com. cloud-dns-hostmaster.google.com. 1 21600 3600 259200 300
Route53 parent domain에 NS record 추가
-
변경 전 record-sets 확인
$ export AWS_ZONE_ID=$(aws route53 list-hosted-zones-by-name --output json --dns-name kube.click | jq -r '.HostedZones[0].Id' | cut -f3 -d'/') $ aws route53 list-resource-record-sets --hosted-zone-id $AWS_ZONE_ID
-
NS record 추가(단순 레코드 정의)
-
변경 후 record-sets 확인
$ export AWS_ZONE_ID=$(aws route53 list-hosted-zones-by-name --output json --dns-name kube.click | jq -r '.HostedZones[0].Id' | cut -f3 -d'/') $ aws route53 list-resource-record-sets --hosted-zone-id $AWS_ZONE_ID
-
NS resolving 확인
$ dig gcloud.kube.click ns ---------- ; <<>> DiG 9.10.6 <<>> gcloud.kube.click ns ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20417 ;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;gcloud.kube.click. IN NS ;; ANSWER SECTION: gcloud.kube.click. 300 IN NS ns-cloud-e2.googledomains.com. gcloud.kube.click. 300 IN NS ns-cloud-e4.googledomains.com. gcloud.kube.click. 300 IN NS ns-cloud-e3.googledomains.com. gcloud.kube.click. 300 IN NS ns-cloud-e1.googledomains.com. ;; Query time: 1007 msec ;; SERVER: 210.220.163.82#53(210.220.163.82) ;; WHEN: Mon Sep 14 03:10:31 KST 2020 ;; MSG SIZE rcvd: 167
Google cloud DNS에 A record 등록 후 resolving 확인
$ gcloud dns record-sets list --zone=subdomain-route53
----------
NAME TYPE TTL DATA
gcloud.kube.click. NS 21600 ns-cloud-e1.googledomains.com.,ns-cloud-e2.googledomains.com.,ns-cloud-e3.googledomains.com.,ns-cloud-e4.googledomains.com.
gcloud.kube.click. SOA 21600 ns-cloud-e1.googledomains.com. cloud-dns-hostmaster.google.com. 1 21600 3600 259200 300
test.gcloud.kube.click. A 30 192.2.0.91
$ host test.gcloud.kube.click
----------
test.gcloud.kube.click has address 192.2.0.91
다음 포스팅(https://bryan.wiki/306)에서는 Route53 DNS와 external-dns 를 이용해서 kubernetes service 와 domain 주소를 통한 연결을 구성해 보도록 하자.
Barracuda