[EKS] ExternalDNS 구성하기
1. ExternalDNS 배포
이번 실습은 Amazon EKS 원클릭 배포 환경에서 진행합니다. Default 네임 스페이스 변경 워커 노드의 IP 변수 선언 kube-ops-view 설치 AWSLoadBalancerControllerIAMPolicy 생성 Note: 이미 AWSLoadBalancerControllerIAMPolicy가 존재하면 해당 작업은 스킵합니다. 존재한 상태에서 명령을 입력하면 중복된 정책에 따른 Error 메시지가 출력되나 무시하고 다음 작업을 진행합니다. IRSA 생성 AWS Load Balancer Controller 설치
인프라 배포를 진행하지 않은 경우 링크를 통해 배포 후 복귀 바랍니다.
그리고 새롭게 인프라를 배포하면 아래 기본 설정 명령을 입력 후 진행 바랍니다. 기본 설정 명령어
kubectl ns default
N1=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2a -o jsonpath={.items[0].status.addresses[0].address})
N2=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2b -o jsonpath={.items[0].status.addresses[0].address})
N3=$(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2c -o jsonpath={.items[0].status.addresses[0].address})
echo "export N1=$N1" >> /etc/profile
echo "export N2=$N2" >> /etc/profile
echo "export N3=$N3" >> /etc/profile
// kube-ops-view 설치
helm repo add geek-cookbook https://geek-cookbook.github.io/charts/
helm install kube-ops-view geek-cookbook/kube-ops-view --version 1.2.2 --set env.TZ="Asia/Seoul" --namespace kube-system
kubectl patch svc -n kube-system kube-ops-view -p '{"spec":{"type":"LoadBalancer"}}'
// kube-ops-view 접속 URL 확인 (1.5 배율)
kubectl get svc -n kube-system kube-ops-view -o jsonpath={.status.loadBalancer.ingress[0].hostname} | awk '{ print "KUBE-OPS-VIEW URL = http://"$1":8080/#scale=1.5"}'
// IAM Policy json 파일 다운로드
curl -o iam_policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.7/docs/install/iam_policy.json
// AWSLoadBalancerControllerIAMPolicy 생성
aws iam create-policy --policy-name AWSLoadBalancerControllerIAMPolicy --policy-document file://iam_policy.json
// IRSA 생성
eksctl create iamserviceaccount \
--cluster=$CLUSTER_NAME \
--namespace=kube-system \
--name=aws-load-balancer-controller \
--attach-policy-arn=arn:aws:iam::$ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy \
--override-existing-serviceaccounts \
--approve
// Helm Chart Repository 추가 및 업데이트
helm repo add eks https://aws.github.io/eks-charts
helm repo update
// Helm Chart - AWS Load Balancer Controller 설치
helm install aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system \
--set clusterName=$CLUSTER_NAME \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller
1.1. AWS Route 53 설정
자신이 소유한 도메인을 변수로 지정하고 정보를 확인합니다.
도메인 변수 선언
// 도메인 주소 변수 지정
MyDomain=<자신의 도메인>
echo "export MyDomain=$MyDomain" >> /etc/profile
echo $MyDomain
// 도메인의 Hosted Zone 정보 확인
aws route53 list-hosted-zones-by-name --dns-name "${MyDomain}." | jq
// 도메인 ID 변수 지정
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
도메인 레코드 확인
// NS 레코드 조회
aws route53 list-resource-record-sets \
--output json --hosted-zone-id "${MyDnsHostedZoneId}" \
--query "ResourceRecordSets[?Type == 'NS']" | jq -r '.[0].ResourceRecords[].Value'
// A 레코드 조회
aws route53 list-resource-record-sets \
--hosted-zone-id "${MyDnsHostedZoneId}" \
--query "ResourceRecordSets[?Type == 'A']" | jq
// 신규 터미널 - 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
1.2. ExternalDNS 설치
Note: Amazon EKS 원클릭 배포로 eksctl 명령에서 –external-dns-access 옵션을 추가해 노드의 IAM 역할에 ExternalDNS 권한을 부여했습니다.
external-dns-access 옵션 확인
// eksctl create cluster 옵션 확인
eksctl create cluster --help
// myeks.yaml 확인
cat myeks.yaml | yh
ExternalDNS 설치
// yaml 파일 다운로드 및 확인
curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/externaldns.yaml
cat externaldns.yaml | yh
// yaml 파일에 변수 치환 후 배포
MyDomain=$MyDomain MyDnsHostedZoneId=$MyDnsHostedZoneId envsubst < externaldns.yaml | kubectl apply -f -
// ExternalDNS 확인
kubectl get pod -l app.kubernetes.io/name=external-dns -n kube-system
신규 터미널 - ExternalDNS 로그 모니터링
// ExternalDNS 로그 모니터링
kubectl logs deploy/external-dns -n kube-system -f
2. Service NLB와 ExternalDNS 연동
앞서 구성한 ExternalDNS를 통해 자신의 도메인을 Service NLB와 연동하고 확인합니다.
2.1. 디플로이먼트와 Service NLB 배포
신규 터미널 - 파드, 서비스 모니터링
// 파드, 서비스 모니터링
watch -d kubectl get pod,svc
디플로이먼트(게임 파드 2대) & 서비스(NLB) 생성
// yaml 파일 다운로드 및 확인
curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/tetris.yaml
cat tetris.yaml | yh
// 디플로이먼트 & 서비스 배포
kubectl apply -f tetris.yaml
2.2. ExternalDNS 연동 및 확인
NLB에 ExternalDNS로 연결
// NLB에 ExternalDNS 연결
kubectl annotate service tetris "external-dns.alpha.kubernetes.io/hostname=tetris.$MyDomain"
도메인 주소 확인
// dig 명령으로 도메인 주소 확인
dig +short tetris.$MyDomain
// whatsmydns 웹 페이지에서 도메인 주소 확인
echo -e "My Domain Checker = https://www.whatsmydns.net/#A/tetris.$MyDomain"
// Tetris 웹 접속 주소 확인
echo -e "Tetris Game URL = http://tetris.$MyDomain"
kube-ops-view에 ExternalDNS로 연결
// NLB에 ExternalDNS 연결
kubectl annotate service kube-ops-view -n kube-system "external-dns.alpha.kubernetes.io/hostname=kubeopsview.$MyDomain"
3. 실습 환경 삭제
실습에 활용한 디플로이먼트와 서비스를 삭제합니다.
2장 전체 실습이 종료되어 Amazon EKS 원클릭 배포도 삭제해 모든 실습 환경을 삭제합니다.
디플로이먼트 & 서비스 삭제
kubectl delete deploy,svc tetris
kube-ops-view 삭제
helm uninstall kube-ops-view -n kube-system
Amazon EKS 원클릭 배포 삭제
eksctl delete cluster --name $CLUSTER_NAME \
&& aws cloudformation delete-stack --stack-name $CLUSTER_NAME
Warning: Amazon EKS 원클릭 배포의 삭제는 약 15분 정도 소요됩니다. 삭제가 완료될 때 까지 SSH 연결 세션을 유지합니다.
Warning: 만약에 CloudFormation 스택이 삭제되지 않는다면 수동으로 VPC(myeks-VPC )를 삭제 후 CloudFormation 스택을 다시 삭제해 주세요.
여기까지 2장의 모든 실습을 마칩니다.
수고하셨습니다 :)