1. AWS Load Balancer Controller 배포
이번 실습은 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"}'
1.1. IRSA 구성
AWS Load Balancer Controller 배포에 앞서 권한을 위임하기 위한 인증 절차로 IRSA 구성을 선행합니다.
OIDC 정보 확인
1
2
3
aws eks describe-cluster --name $CLUSTER_NAME \
--query "cluster.identity.oidc.issuer" \
--output text
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
IRSA 생성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 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
// IRSA 정보 확인
eksctl get iamserviceaccount --cluster $CLUSTER_NAME
// Kubernetes 서비스 어카운트 확인
kubectl get serviceaccounts -n kube-system aws-load-balancer-controller -o yaml | yh
1.2. AWS Load Balancer Controller 설치
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
AWS Load Balancer Controller 설치 확인
1
2
3
4
5
6
7
8
9
10
// Kubernetes CRD 확인
kubectl get crd
// AWS Load Balancer Controller 확인
kubectl get deployment -n kube-system aws-load-balancer-controller
kubectl describe deploy -n kube-system aws-load-balancer-controller
// AWS Load Balancer Controller Role 확인
kubectl describe clusterroles.rbac.authorization.k8s.io aws-load-balancer-controller-role
2. Service (NLB) 배포 및 확인
AWS Load Balancer Controller를 배포한 상태에서 Service의 LoadBalancer인 NLB를 구성하고 통신을 확인합니다.
2.1. Service NLB 배포 및 확인
신규 터미널 1개 - 모니터링
1
2
// 파드, 서비스, 엔드포인트 모니터링
watch -d kubectl get pod,svc,ep
디플로이먼트(파드 2대) & 서비스(NLB) 생성
1
2
3
4
5
6
7
8
9
10
11
12
// yaml 파일 다운로드 및 확인
curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/echo-service-nlb.yaml
cat echo-service-nlb.yaml | yh
// 디플로이먼트 & 서비스 배포
kubectl apply -f echo-service-nlb.yaml
// 정보 확인
kubectl get pod -owide
kubectl get targetgroupbindings
통신 확인
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 신규 터미널 - 웹 접근 로그 모니터링
kubectl logs -l app=deploy-websrv -f
// 웹 접속 주소 확인
kubectl get svc svc-nlb-ip-type -o jsonpath={.status.loadBalancer.ingress[0].hostname} | awk '{ print "Pod Web URL = http://"$1 }'
// NLB 도메인 변수 선언
NLB=$(kubectl get svc svc-nlb-ip-type -o jsonpath={.status.loadBalancer.ingress[0].hostname})
echo $NLB
// 웹 접속 확인 (1회)
curl -s $NLB
// 웹 접속 확인 (100회 - 카운팅)
for i in {1..100}; do curl -s $NLB | grep Hostname ; done | sort | uniq -c | sort -nr
2.2. 파드 수량 변경에 따른 동작 확인
파드 수량 조정
1
2
3
4
5
6
7
8
// 파드 1대로 조정
kubectl scale deployment deploy-echo --replicas=1
// 파드 3대로 조정
kubectl scale deployment deploy-echo --replicas=3
// 웹 접속 확인 (100회 - 카운팅)
for i in {1..100}; do curl -s $NLB | grep Hostname ; done | sort | uniq -c | sort -nr
AWS Load Balancer Controller 정보 확인
1
2
3
4
5
// AWS Load Balancer Controller Rolebinding 확인
kubectl describe clusterrolebindings.rbac.authorization.k8s.io aws-load-balancer-controller-rolebinding
// AWS Load Balancer Controller Cluster Role 확인
kubectl describe clusterroles.rbac.authorization.k8s.io aws-load-balancer-controller-role
디플로이먼트 & 서비스 삭제
1
kubectl delete deploy deploy-echo; kubectl delete svc svc-nlb-ip-type
3. Ingress (ALB) 배포 및 확인
AWS Load Balancer Controller를 배포한 상태에서 Ingress의 LoadBalancer인 ALB를 구성하고 통신을 확인합니다.
3.1. Ingress ALB 배포 및 확인
신규 터미널 1개 - 모니터링
1
2
// 파드, 서비스, 인그레스, 엔드포인트 모니터링
watch -d kubectl get pod,ingress,svc,ep -n game-2048
디플로이먼트(게임 파드 2대) & 인스레스 생성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// yaml 파일 다운로드 및 확인
curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/ingress1.yaml
cat ingress1.yaml | yh
// 디플로이먼트 & 인그레스 배포
kubectl apply -f ingress1.yaml
// 정보 확인
kubectl get pod -n game-2048 -owide
kubectl get targetgroupbindings -n game-2048
// Ingress 확인
kubectl describe ingress -n game-2048 ingress-2048
// 웹 접속 ALB 주소 확인
kubectl get ingress -n game-2048 ingress-2048 -o jsonpath={.status.loadBalancer.ingress[0].hostname} | awk '{ print "Game URL = http://"$1 }'
3.2. 파드 수량 변경에 따른 동작 확인
파드 수량 조정
1
2
3
4
5
// 파드 3대로 조정
kubectl scale deployment -n game-2048 deployment-2048 --replicas 3
// 파드 1대로 조정
kubectl scale deployment -n game-2048 deployment-2048 --replicas 1
디플로이먼트 & 서비스 & 인그레스 삭제
1
2
3
kubectl delete ingress ingress-2048 -n game-2048
kubectl delete svc service-2048 -n game-2048 && kubectl delete deploy deployment-2048 -n game-2048 && kubectl delete ns game-2048
Warning: 다음 섹션의 실습을 이어서 진행할 것으로 Amazon EKS 원클릭 배포를 유지합니다. 혹시나 다음 섹션을 진행하지 않을 경우 Amazon EKS 원클릭 배포를 삭제해 주길 바랍니다.
여기까지 2장의 AWS Load Balancer Controller 부하분산 환경 실습을 마칩니다.
수고하셨습니다 :)