728x90
Service & AWS LoadBalancer Controller
- Service
- Pod는 생성 및 삭제 될때 마다 내부 IP가 변경하는 특성이 있음.
- Service는 이러한 Pod에 탑재된 애플리케이션이 외부와 상호 통신이 가능하도록 하는 역할 수행
- Pod가 외부와 통신할 수 있도록 클러스터 내부에서 고정 IP를 갖는 Service를 이용할 수 있도록 함
- Deployment, Statefulset 처럼 같은 애플리케이션을 구동하도록 구성된 여러 파드들에게 단일 네트워크 진입점을 부여하는 역할
- ClusterIP
- NodePort
- LoadBalancer
- ExternalName
- LoadBalancer Controller
- 일반적인 Service에서 Loadbalancer의 경우 로드벨런서를 거쳐 각 Node의 iptable 정책에 따라 Pod에 분산되게 설정
- VPC CNI의 경우, 로드밸런서에 Node의 IP가 아닌, Pod의 IP를 직접 매핑하여, 부하분산
- Pod의 IP를 직접 로드밸런서에 연결 할 수 있는 이유는 Loadbalancer Controller가 Pod의 정보를 AWS ELB에 제공하기 때문에 가능

- AWS LoadBalancer Controller 배포
# 설치 전 CRD 확인
kubectl get crd
# Helm Chart 설치
helm repo add eks https://aws.github.io/eks-charts
helm repo update
helm install aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system --set clusterName=$CLUSTER_NAME
## 설치 확인
kubectl get crd
kubectl explain ingressclassparams.elbv2.k8s.aws
kubectl explain targetgroupbindings.elbv2.k8s.aws
kubectl get deployment -n kube-system aws-load-balancer-controller
kubectl describe deploy -n kube-system aws-load-balancer-controller
kubectl describe deploy -n kube-system aws-load-balancer-controller | grep 'Service Account'
# 클러스터롤, 롤 확인
kubectl describe clusterrolebindings.rbac.authorization.k8s.io aws-load-balancer-controller-rolebinding
kubectl describe clusterroles.rbac.authorization.k8s.io aws-load-balancer-controller-role


- Service/Pod 배포 Test with NLB
# 모니터링
watch -d kubectl get pod,svc,ep,endpointslices
# 디플로이먼트 & 서비스 생성
cat << EOF > echo-service-nlb.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-echo
spec:
replicas: 2
selector:
matchLabels:
app: deploy-websrv
template:
metadata:
labels:
app: deploy-websrv
spec:
terminationGracePeriodSeconds: 0
containers:
- name: aews-websrv
image: k8s.gcr.io/echoserver:1.5
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: svc-nlb-ip-type
annotations:
service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
service.beta.kubernetes.io/aws-load-balancer-healthcheck-port: "8080"
service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: "true"
spec:
ports:
- port: 80
targetPort: 8080
protocol: TCP
type: LoadBalancer
loadBalancerClass: service.k8s.aws/nlb
selector:
app: deploy-websrv
EOF
kubectl apply -f echo-service-nlb.yaml


- 확인
# 확인
aws elbv2 describe-load-balancers --query 'LoadBalancers[*].State.Code' --output text
kubectl get deploy,pod
kubectl get svc,ep,ingressclassparams,targetgroupbindings
kubectl get targetgroupbindings -o json | jq
- 빠른 실습을 위해서 등록 취소 지연(드레이닝 간격) 수정 : 기본값 300초


- 부하분산 확인
NLB=$(kubectl get svc svc-nlb-ip-type -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
curl -s $NLB
for i in {1..100}; do curl -s $NLB | grep Hostname ; done | sort | uniq -c | sort -nr


- 파드 3개 설정
kubectl scale deployment deploy-echo --replicas=3


728x90
'2025_AEWS Study' 카테고리의 다른 글
2주차 - EKS Networking(6)(Topology Aware Routing) (0) | 2025.02.16 |
---|---|
2주차 - EKS Networking(5)(Ingress & ExternalDNS) (0) | 2025.02.15 |
2주차 - EKS Networking(3)(노드 내 파드 생성 갯수 제한) (0) | 2025.02.15 |
2주차 - EKS Networking(2)(노드 간 파드 통신/파드 외부 통신) (1) | 2025.02.15 |
2주차 - EKS Networking(1)(AWS VPC CNI) (0) | 2025.02.15 |