목차
1. AWS Load Balancer Controller 배포
    1.1. IRSA 구성
    1.2. AWS Load Balancer Controller 설치
2. Service (NLB) 배포 및 확인
    2.1. Service NLB 배포 및 확인
    2.2. 파드 수량 변경에 따른 동작 확인
3. Ingress (ALB) 배포 및 확인
    3.1. Ingress ALB 배포 및 확인
    3.2. 파드 수량 변경에 따른 동작 확인


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 부하분산 환경 실습을 마칩니다.
수고하셨습니다 :)