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