IT/Container&k8s

[k8s] Kube DNS & External DNS

Hayley Shim 2023. 10. 29. 00:37

안녕하세요. CloudNet@ K8S Study를 진행하며 해당 내용을 이해하고 공유하기 위해 작성한 글입니다. DevOps 이정훈님의 도서 ‘24단계 실습으로 정복하는 쿠버네티스’ 의 내용을 바탕으로 스터디를 하며 어떻게 k8s에 적용할지 고민하며 정리해봤습니다.

[Kube DNS]

  • k8s는 Kube DNS를 내부 DNS 서버로 활용합니다.
 

GKE kube-dns architecture

각 노드에서 실행되는 kubelet은 kube-dns 서비스의 ClusterIP를 사용하도록 Pod의 etc/resolv.conf를 구성합니다. kube-dns는 클러스터 도메인(cluster.local)의 권한 있는 네임서버이며 외부 이름을 재귀적으로 확인합니다.

kube-dns의 ConfigMap을 수정하여 클러스터 내에서 DNS 인프라에 속한 Stub 도메인을 설정할 수 있습니다.

apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    addonmanager.kubernetes.io/mode: EnsureExists
  name: kube-dns
  namespace: kube-system
data:
  stubDomains: |
    {
      "example.com": [
        "8.8.8.8",
        "8.8.4.4",
        "1.1.1.1",
        "1.0.0.1"
      ]
    }

[참고] Kube DNS

[External DNS]

Route53(AWS), Cloud DNS(GCP) 등 같은 다른 DNS 공급자를 사용하기 위해서는 external dns를 추가적으로 설치해 사용합니다.

[참고]External DNS github

External DNS for K8S

[External DNS 실행 방법]

ExternalDNS를 실행하는 두 가지 방법은 다음과 같습니다.

클러스터 내 External DNS Addon 설치 방법에 대해 설명합니다.

# 모니터링
$ watch -d kubectl get pod -A

# 정책 생성 -> 마스터/워커노드에 정책 연결
$ curl -s -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/AKOS/externaldns/externaldns-aws-r53-policy.json

$ aws iam create-policy --policy-name AllowExternalDNSUpdates --policy-document file://externaldns-aws-r53-policy.json

# ACCOUNT_ID 변수 지정
$ export ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)

# EC2 instance profiles 에 IAM Policy 추가(attach)
$ aws iam attach-role-policy --policy-arn arn:aws:iam::$ACCOUNT_ID:policy/AllowExternalDNSUpdates --role-name masters.$KOPS_CLUSTER_NAME
$ aws iam attach-role-policy --policy-arn arn:aws:iam::$ACCOUNT_ID:policy/AllowExternalDNSUpdates --role-name nodes.$KOPS_CLUSTER_NAME

# 설치
$ kops edit cluster
--------------------------
spec:
  certManager:
    enabled: true
  externalDns:
    provider: external-dns
--------------------------

# 업데이트 적용
$ kops update cluster --yes && echo && sleep 3 && kops rolling-update cluster

# externalDns 컨트롤러 파드 확인
$ kubectl get pod -n kube-system -l k8s-app=external-dns
NAME                            READY   STATUS    RESTARTS   AGE
external-dns-797c59bcbc-l8b85   0/1     Running   0          16s

[Mario 서비스에 도메인 연결 실습]

  • 미리 Mario 게임 service/pod를 띄웁니다.
# 수퍼마리오 디플로이먼트 배포
$ curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/1/mario.yaml
$ kubectl apply -f mario.yaml

# 배포 확인 : CLB 배포 확인 >> 5분 이상 소요
$ kubectl get deploy,svc,ep mario
$ watch kubectl get svc mario

# 마리오 게임 접속 : CLB 주소로 웹 접속
$ kubectl get svc mario -o jsonpath={.status.loadBalancer.ingress[0].hostname} | awk '{ print "Maria URL = http://"$1 }'

[ Mario 서비스에 도메인 연결 실습]

# CLB에 ExternanDNS 로 도메인 연결
$ kubectl annotate service mario "external-dns.alpha.kubernetes.io/hostname=mario.$KOPS_CLUSTER_NAME"
CLUSTER_NAME"
service/mario annotated

# 확인
$ dig +short mario.$KOPS_CLUSTER_NAME
$ kubectl logs -n kube-system -l k8s-app=external-dns
time="2023-03-06T13:02:24Z" level=info msg="All records are already up to date"
time="2023-03-06T13:03:24Z" level=info msg="Applying provider record filter for domains: [wellbeconnected.com. .wellbeconnected.com.]"
time="2023-03-06T13:03:24Z" level=info msg="All records are already up to date"
time="2023-03-06T13:04:24Z" level=info msg="Applying provider record filter for domains: [wellbeconnected.com. .wellbeconnected.com.]"
time="2023-03-06T13:04:24Z" level=info msg="All records are already up to date"
time="2023-03-06T13:04:55Z" level=info msg="Applying provider record filter for domains: [wellbeconnected.com. .wellbeconnected.com.]"
time="2023-03-06T13:04:55Z" level=info msg="Desired change: CREATE cname-mario.wellbeconnected.com TXT [Id: /hostedzone/Z06204681HPKV2R55I4OR]"
time="2023-03-06T13:04:55Z" level=info msg="Desired change: CREATE mario.wellbeconnected.com A [Id: /hostedzone/Z06204681HPKV2R55I4OR]"
time="2023-03-06T13:04:55Z" level=info msg="Desired change: CREATE mario.wellbeconnected.com TXT [Id: /hostedzone/Z06204681HPKV2R55I4OR]"
time="2023-03-06T13:04:55Z" level=info msg="3 record(s) in zone wellbeconnected.com. [Id: /hostedzone/Z06204681HPKV2R55I4OR] were successfully updated"

# 웹 접속 주소 확인 및 접속
$ echo -e "Maria Game URL = http://mario.$KOPS_CLUSTER_NAME"
Maria Game URL = http://mario.wellbeconnected.com

# 도메인 체크
$ echo -e "My Domain Checker = https://www.whatsmydns.net/#A/mario.$KOPS_CLUSTER_NAME"
My Domain Checker = https://www.whatsmydns.net/#A/mario.wellbeconnected.com

자, 이제 마리오 게임을 즐깁니다(네버엔딩 마리오)

 

 

blog migration project

written in 2023.3.6

https://medium.com/techblog-hayleyshim/k8s-kube-dns-external-dns-2ad6c7409f38

'IT > Container&k8s' 카테고리의 다른 글

[k8s] Storage  (0) 2023.10.29
[k8s] Network  (0) 2023.10.29
[k8s] Kubernetes Operations (kOps) Install in AWS  (0) 2023.10.29
[k8s] OpenInfra & Cloud Native Day Korea 2022  (0) 2023.10.29
[k8s] Network Resources  (0) 2023.10.29