1. CoreDNS 확인
이번 실습은 Amazon EKS 원클릭 배포 환경에서 진행합니다.
그리고 새롭게 인프라를 배포하면 아래 기본 설정 명령을 입력 후 진행 바랍니다.
기본 설정 명령어
CoreDNS 확인
eksctl get addon \
--cluster $CLUSTER_NAME
Bash
복사
# 설치된 Add-on 정보 확인
kubectl get svc -n kube-system
kubectl describe svc kube-dns -n kube-system
Bash
복사
# kube-dns 서비스 확인
kubectl get pod -n kube-system -owide | grep coredns
Bash
복사
# coredns 파드 확인
kubectl get cm -n kube-system
kubectl describe cm coredns -n kube-system
Bash
복사
# coredns configmap 확인
ssh ec2-user@$N1 cat /etc/resolv.conf
Bash
복사
# 노드의 resolv.conf 확인
테스트용 디플로이먼트와 서비스 생성
curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/refs/heads/master/_data/red.yaml
curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/refs/heads/master/_data/blue.yaml
cat red.yaml
cat blue.yaml
Bash
복사
# 실습용 자원 yaml 다운로드 및 확인
kubectl apply -f red.yaml,blue.yaml
Bash
복사
# 실습용 자원 배포
kubectl get deploy,svc -n red
echo "-------"
kubectl get deploy,svc -n blue
Bash
복사
# 생성 자원 확인
kubectl exec -it deploy/red-deploy -n red -- cat /etc/resolv.conf
Bash
복사
# 파드에 resolv.conf 확인
kubectl get svc kube-dns -n kube-system
Bash
복사
# kube-dns 서비스 확인
kubectl exec -it deploy/red-deploy -n red -- nslookup red
kubectl exec -it deploy/red-deploy -n red -- curl red
kubectl exec -it deploy/red-deploy -n red -- nslookup red.red.svc.cluster.local
kubectl exec -it deploy/red-deploy -n red -- curl red.red.svc.cluster.local
kubectl exec -it deploy/red-deploy -n red -- nslookup blue
kubectl exec -it deploy/red-deploy -n red -- curl blue
kubectl exec -it deploy/red-deploy -n red -- nslookup blue.blue.svc.cluster.local
kubectl exec -it deploy/red-deploy -n red -- curl blue.blue.svc.cluster.local
Bash
복사
# [red 네임스페이스] 각 서비스에 통신 확인
kubectl exec -it deploy/red-deploy -n red -- nslookup ipinfo.io
kubectl exec -it deploy/red-deploy -n red -- curl ipinfo.io
Bash
복사
# [red 네임스페이스] 외부 도메인 질의 및 통신 확인
테스트용 디플로이먼트와 서비스 삭제
kubectl delete -f red.yaml,blue.yaml
Bash
복사
2. ExternalDNS 배포
2.1. AWS Route 53 설정
자신이 소유한 도메인을 변수로 지정하고 정보를 확인합니다.
도메인 변수 선언
MyDomain=<자신의 도메인>
echo "export MyDomain=$MyDomain" >> /etc/profile
echo $MyDomain
Bash
복사
# 도메인 주소 변수 지정
aws route53 list-hosted-zones-by-name --dns-name "${MyDomain}." | jq
Bash
복사
# 도메인의 Hosted Zone 정보 확인
MyDnsHostedZoneId=`aws route53 list-hosted-zones-by-name --dns-name "${MyDomain}." --query "HostedZones[0].Id" --output text`
echo "export MyDnsHostedZoneId=$MyDnsHostedZoneId" >> /etc/profile
echo $MyDnsHostedZoneId
Bash
복사
# 도메인 ID 변수 지정
도메인 레코드 확인
aws route53 list-resource-record-sets \
--output json --hosted-zone-id "${MyDnsHostedZoneId}" \
--query "ResourceRecordSets[?Type == 'NS']" | jq -r '.[0].ResourceRecords[].Value'
Bash
복사
# NS 레코드 조회
aws route53 list-resource-record-sets \
--hosted-zone-id "${MyDnsHostedZoneId}" \
--query "ResourceRecordSets[?Type == 'A']" | jq
Bash
복사
# A 레코드 조회
while true; do aws route53 list-resource-record-sets \
--hosted-zone-id "${MyDnsHostedZoneId}" \
--query "ResourceRecordSets[?Type == 'A'].Name" \
--output text ; date ; echo ; sleep 1; done
Bash
복사
# [신규 터미널] A 레코드 조회 모니터링
2.2. ExternalDNS 설치
Note:
Amazon EKS 원클릭 배포로 eksctl 명령에서 --external-dns-access 옵션을 추가해 노드의 IAM 역할에 ExternalDNS 권한을 부여했습니다.
external-dns-access 옵션 확인
eksctl create cluster --help
Bash
복사
# eksctl create cluster 옵션 확인
cat myeks.yaml | yh
Bash
복사
# myeks.yaml 확인
ExternalDNS 설치
curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/externaldns.yaml
Bash
복사
# yaml 파일 다운로드
cat externaldns.yaml | yh
Bash
복사
# yaml 파일 확인
MyDomain=$MyDomain MyDnsHostedZoneId=$MyDnsHostedZoneId envsubst < externaldns.yaml | kubectl apply -f -
Bash
복사
# yaml 파일에 변수 치환 후 배포
kubectl get pod -l app.kubernetes.io/name=external-dns -n kube-system
Bash
복사
# ExternalDNS 확인
신규 터미널 - ExternalDNS 로그 모니터링
kubectl logs deploy/external-dns -n kube-system -f
Bash
복사
# [신규 터미널] ExternalDNS 로그 모니터링
3. Service NLB와 ExternalDNS 연동
앞서 구성한 ExternalDNS를 통해 자신의 도메인을 Service NLB와 연동하고 확인합니다.
3.1. 디플로이먼트와 Service NLB 배포
신규 터미널 - 파드, 서비스 모니터링
watch -d kubectl get pod,svc
Bash
복사
# [신규 터미널] 파드, 서비스 모니터링
디플로이먼트(게임 파드 2대) & 서비스(NLB) 생성
curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/tetris.yaml
Bash
복사
# yaml 파일 다운로드
cat tetris.yaml | yh
Bash
복사
# yaml 파일 확인
kubectl apply -f tetris.yaml
Bash
복사
# 디플로이먼트 & 서비스 배포
3.2. ExternalDNS 연동 및 확인
NLB에 ExternalDNS로 연결
kubectl annotate service tetris "external-dns.alpha.kubernetes.io/hostname=tetris.$MyDomain"
Bash
복사
# NLB에 ExternalDNS 연결
도메인 주소 확인
dig +short tetris.$MyDomain
Bash
복사
# dig 명령으로 도메인 주소 확인
echo -e "My Domain Checker = https://www.whatsmydns.net/#A/tetris.$MyDomain"
Bash
복사
# whatsmydns 웹 페이지에서 도메인 주소 확인
echo -e "Tetris Game URL = http://tetris.$MyDomain"
Bash
복사
# Tetris 웹 접속 주소 확인
kube-ops-view에 ExternalDNS로 연결
kubectl annotate service kube-ops-view -n kube-system "external-dns.alpha.kubernetes.io/hostname=kubeopsview.$MyDomain"
Bash
복사
# NLB에 ExternalDNS 연결
4. 실습 환경 삭제
실습에 활용한 디플로이먼트와 서비스를 삭제합니다.
2장 전체 실습이 종료되어 Amazon EKS 원클릭 배포도 삭제해 모든 실습 환경을 삭제합니다.
디플로이먼트 & 서비스 삭제
kubectl delete deploy,svc tetris
Bash
복사
# 자원 삭제
kube-ops-view 삭제
helm uninstall kube-ops-view -n kube-system
Bash
복사
# kube-ops-view 삭제(helm)
IRSA 삭제
eksctl delete iamserviceaccount \
--cluster=$CLUSTER_NAME \
--namespace=kube-system \
--name=aws-load-balancer-controller
Bash
복사
# aws-load-balancer-controller irsa 삭제
IAM Policy 삭제
aws iam delete-policy \
--policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/AWSLoadBalancerControllerIAMPolicy
Bash
복사
# aws-load-balancer-controller iam policy 삭제
Amazon EKS 원클릭 배포 삭제
eksctl delete cluster --name $CLUSTER_NAME \
&& aws cloudformation delete-stack --stack-name $CLUSTER_NAME
Bash
복사
# eks 원클릭 배포 삭제
Warning:
Amazon EKS 원클릭 배포의 삭제는 약 15분 정도 소요됩니다. 삭제가 완료될 때 까지 SSH 연결 세션을 유지합니다.
Warning:
만약에 CloudFormation 스택이 삭제되지 않는다면 수동으로 VPC(myeks-VPC )를 삭제 후 CloudFormation 스택을 다시 삭제해 주세요.
여기까지 2장의 모든 실습을 마칩니다.
수고하셨습니다 :)