목차
1. ExternalDNS 배포
    1.1. AWS Route 53 설정
    1.2. ExternalDNS 설치
2. Service NLB와 ExternalDNS 연동
    2.1. 디플로이먼트와 Service NLB 배포
    2.2. ExternalDNS 연동 및 확인
3. 실습 환경 삭제


1. ExternalDNS 배포


이번 실습은 Amazon EKS 원클릭 배포 환경에서 진행합니다.
인프라 배포를 진행하지 않은 경우 링크를 통해 배포 후 복귀 바랍니다.
그리고 새롭게 인프라를 배포하면 아래 기본 설정 명령을 입력 후 진행 바랍니다.

기본 설정 명령어


Default 네임 스페이스 변경

1
kubectl ns default


워커 노드의 IP 변수 선언

1
2
3
4
5
6
7
8
9
10
11
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 설치

1
2
3
4
5
6
7
8
9
// 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"}'


AWSLoadBalancerControllerIAMPolicy 생성

1
2
3
4
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

Note: 이미 AWSLoadBalancerControllerIAMPolicy가 존재하면 해당 작업은 스킵합니다. 존재한 상태에서 명령을 입력하면 중복된 정책에 따른 Error 메시지가 출력되나 무시하고 다음 작업을 진행합니다.


IRSA 생성

1
2
3
4
5
6
7
8
// 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


AWS Load Balancer Controller 설치

1
2
3
4
5
6
7
8
9
// 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 설정

자신이 소유한 도메인을 변수로 지정하고 정보를 확인합니다.


도메인 변수 선언

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 도메인 주소 변수 지정
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


도메인 레코드 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 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 옵션 확인

1
2
3
4
5
// eksctl create cluster 옵션 확인
eksctl create cluster --help

// myeks.yaml 확인
cat myeks.yaml | yh


ExternalDNS 설치

1
2
3
4
5
6
7
8
9
10
// 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 로그 모니터링

1
2
// ExternalDNS 로그 모니터링
kubectl logs deploy/external-dns -n kube-system -f




2. Service NLB와 ExternalDNS 연동


앞서 구성한 ExternalDNS를 통해 자신의 도메인을 Service NLB와 연동하고 확인합니다.


2.1. 디플로이먼트와 Service NLB 배포


신규 터미널 - 파드, 서비스 모니터링

1
2
// 파드, 서비스 모니터링
watch -d kubectl get pod,svc


디플로이먼트(게임 파드 2대) & 서비스(NLB) 생성

1
2
3
4
5
6
7
// 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로 연결

1
2
// NLB에 ExternalDNS 연결
kubectl annotate service tetris "external-dns.alpha.kubernetes.io/hostname=tetris.$MyDomain"


도메인 주소 확인

1
2
3
4
5
6
7
8
9
// 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로 연결

1
2
// NLB에 ExternalDNS 연결
kubectl annotate service kube-ops-view -n kube-system "external-dns.alpha.kubernetes.io/hostname=kubeopsview.$MyDomain"




3. 실습 환경 삭제


실습에 활용한 디플로이먼트와 서비스를 삭제합니다.
2장 전체 실습이 종료되어 Amazon EKS 원클릭 배포도 삭제해 모든 실습 환경을 삭제합니다.


디플로이먼트 & 서비스 삭제

1
kubectl delete deploy,svc tetris


kube-ops-view 삭제

1
helm uninstall kube-ops-view -n kube-system


Amazon EKS 원클릭 배포 삭제

1
2
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장의 모든 실습을 마칩니다.
수고하셨습니다 :)