[도전과제8]
Exposing Kubernetes Applications, Part 2: AWS Load Balancer Controller
AWS LoadBalancer Controller (ALB) 개요
AWS 오픈소스 Ingress Controller 구현인 AWS LoadBalancer Controller (ALB) 개요입니다.
K8S 애플리케이션을 노출하는 두 가지 접근 방식
- 트래픽을 애플리케이션의 Pod로 직접 라우팅하는 외부 로드밸런서
- 애플리케이션의 단일 진입점 역할을 하고 트래픽을 Pod로 라우팅하는 클러스터 내 역방향 프록시
AWS LoadBalancer는 Ingress Controller가 Ingress(대상그룹, 라우팅 정의), IngressClass(LB 엔진 정의)를 참조하여 생성합니다.
IngressClass
ㆍIngress 리소스가 어떤 컨트롤러에 의해 처리될지 정의하는 리소스
ㆍIngress 리소스의 엔진(ex. Nginx, Traefik, HAProxy)을 정하는 역할
흐름
사용자 → ALB → Prefix에 의한 대상 그룹(Service) 라우팅→ Node(NodePort로 접근) → Service → Pod
NodePort
ㆍCluster 외부에서 접근할 수 있도록 Node에 특정 Port 오픈
ㆍ외부(LB)에서 Node의 IP:NodePort로 접근 가능
ㆍ주로 외부 접근용 (30000-32767)
ClusterIP
ㆍCluster 내부에서 Pod들에게 접근하기 위한 고정 IP 제공
ㆍPod IP가 급변해도 ClusterIP는 고정
ㆍ주로 클러스터 내부 통신용
8.1 AWS LoadBalancer 배포
AWS Load Balancer Controller는 AWS K8S용 ELB를 관리합니다.
# OIDC 조회
aws eks describe-cluster --name $CLUSTER_NAME --query "cluster.identity.oidc.issuer" --output text
aws iam list-open-id-connect-providers | jq
8.1.1 IAM Policy 생성
##### IAM Policy (AWSLoadBalancerControllerIAMPolicy) 생성 #####
# AWS Load Balancer Controller가 필요한 권한(IAM Policy) 다운로드
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.5.4/docs/install/iam_policy.json
# 다운로드 파일 기반 정책(IAM Policy) 생성
aws iam create-policy --policy-name AWSLoadBalancerControllerIAMPolicy --policy-document file://iam_policy.json
## 혹시 이미 IAM 정책이 있지만 예전 정책일 경우 아래의 명령어와 같이, 업데이트 ##
# aws iam update-policy ~~~
# 생성된 IAM Policy Arn 확인
aws iam list-policies --scope Local | jq
aws iam get-policy --policy-arn arn:aws:iam::$ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy | jq
aws iam get-policy --policy-arn arn:aws:iam::$ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy --query 'Policy.Arn'
AWS LoadBalaner가 EC2, ELB, IAM 관련 리소스에 대한 권한이 필요합니다.
AWS LoadBalacner를 위한 IAM Policy 생성을 진행합니다.
8.1.2 Service Account(SA) 생성
# IAM 역할 생성. AWS Load Balancer Controller의 kube-system 네임스페이스에 aws-load-balancer-controller라는 Kubernetes 서비스 계정을 생성하고 IAM 역할의 이름으로 Kubernetes 서비스 계정에 주석을 답니다
eksctl create iamserviceaccount --cluster=$CLUSTER_NAME --namespace=kube-system --name=aws-load-balancer-controller --role-name AmazonEKSLoadBalancerControllerRole \
--attach-policy-arn=arn:aws:iam::$ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy --override-existing-serviceaccounts --approve
# IRSA 정보 확인
eksctl get iamserviceaccount --cluster $CLUSTER_NAME
# Service Account(SA) 확인
kubectl get serviceaccounts -n kube-system aws-load-balancer-controller -o yaml | yh
K8S LoadBalancer Controller가 AWS IAM Role을 사용하도록 Service Account(SA)를 생성합니다.
EKS에서는 IRSA(IAM Roles for Service Accounts)를 사용해서 K8S 서비스가 AWS IAM Role을 사용할 수 있습니다.
eksctl 를 활용하면 자동으로 매칭되는 IAM Role 을 CloudFormation 으로 생성됩니다.
8.1.3 AWS LoadBalacner Controller 배포
# Helm Chart 저장소 추가
helm repo add eks https://aws.github.io/eks-charts
# Helm 저장소 업데이트(최신화)
helm repo update
# AWS LoadBalancer 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
Helm Chart를 사용하면 Controller의 설치, 업데이트, 삭제를 쉽게 관리할 수 있습니다.
AWS Load Balancer Controller를 쿠버네티스 클러스터에 배포하는 과정입니다.
8.1.4 AWS LoadBalacner Controller 배포 확인
## 설치 확인 : aws-load-balancer-controller:v2.7.1 ##
# CRD(Custom Resource Definitions) 목록 조회
kubectl get crd
# LoadBalancer Controller 상태 확인(상세정보 조회)
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'
LoadBalancer 가 설치한 CRD를 확인하고 LoadBalancer Controller 상세정보를 조회합니다.
8.2 Ingress 배포
도전과제5 참조
[도전과제9]
Exposing Kubernetes Applications, Part 3: NGINX Ingress Controller
9.1 Ingress-Nginx 컨트롤러 아키텍처
# helm repo 추가
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
# helm chart 업그레이드
helm upgrade -i ingress-nginx ingress-nginx/ingress-nginx \
--version 4.2.3 \
--namespace kube-system \
--set controller.service.type=ClusterIP
# Ingress nginx Controller
kubectl -n kube-system rollout status deployment ingress-nginx-controller
kubectl get deployment -n kube-system ingress-nginx-controller
[도전과제10]
EC2 ENA의 linklocal_allowance_exceeded 메트릭을 프로메테우스로 수집
참조 : https://kimalarm.tistory.com/51
1.1 IPv4 Prefix Delegation (접두사 위임) 활성화
[도전과제11]
Leveraging CNI custom networking alongside security groups for pods in Amazon EKS
참조 : https://kimalarm.tistory.com/51
1.1 IPv4 Prefix Delegation (접두사 위임) 활성화
[도전과제12]
Using AWS Load Balancer Controller for blue/green deployment, canary deployment and A/B testing
참조 : https://kimalarm.tistory.com/51
1.1 IPv4 Prefix Delegation (접두사 위임) 활성화
[도전과제13]
How to use Application Load Balancer and Amazon Cognito to authenticate users for your Kubernetes web apps
참조 : https://kimalarm.tistory.com/51
1.1 IPv4 Prefix Delegation (접두사 위임) 활성화
'세미나 & 교육 & Tech' 카테고리의 다른 글
[Amazon EKS STUDY] #2주차 (도전과제1~7) (0) | 2025.02.18 |
---|---|
[Amazon EKS STUDY] #2주차 (이론) AWS VPC CNI (2) (0) | 2025.02.18 |
[Amazon EKS STUDY] #2주차 (이론) AWS VPC CNI (1) (0) | 2025.02.16 |
[Amazon EKS STUDY] #1주차 (도전과제6~9) (0) | 2025.02.10 |
[Amazon EKS STUDY] #1주차 (도전과제1~5) EKS 원클릭 배포 가이드 (0) | 2025.02.10 |