본문 바로가기

Technical/Cloud, Virtualization, Containers

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