AWS/[AEWS] EKS

[ AEWS 2주차 ] #2 Service & AWS Loadbalancer Controller & Ingress

BigCo 2024. 3. 15. 19:02

안녕하세요 오늘은 EKS Service와 Ingress에 대해서 알아보겠습니다. 

Service란 ?

네트워크 서비스를 추상화하여 여러 파드(Pod)에 대한 로드 밸런싱, DNS 이름의 생성 및 관리, 그리고 클러스터 내부 또는 외부의 네트워크 연결을 쉽게 설정할 수 있습니다. 이를 통해 서비스 간 통신을 관리하고, 클러스터 외부에서 서비스에 접근할 수 있도록 합니다.

 

AWS Loadbalancer Controller 란?

AWS Load Balancer Controller는 Kubernetes 클러스터 내에서 AWS 로드 밸런서를 동적으로 프로비저닝하고 관리하는 오픈 소스 프로젝트입니다. 이 컨트롤러는 AWS 로드 밸런서 유형에 대한 Ingress 및 Service 리소스를 관리하여, 클러스터 외부에서 파드에 대한 트래픽을 분산하고 로드 밸런서를 설정합니다.

 

# 1. Service 종류

 

Cluster IP 타입

ClusterIP 서비스는 Kubernetes 클러스터 내에서만 접근 가능한 가상 IP 주소를 제공합니다. 이 서비스 유형은 클러스터 내부의 파드들끼리 통신할 때 사용됩니다. 외부에서 이 서비스에 접근할 수 없습니다.

 

 

NodePort 타입

NodePort 서비스는 클러스터의 모든 노드에 대해 특정 포트를 열고, 해당 포트를 통해 외부에서 서비스에 접근할 수 있도록 합니다. 클라이언트가 노드의 IP 주소와 해당 포트로 접근하면, 해당 포트로 요청이 전달됩니다.

 

 

Loadbalancer 타입

 LoadBalancer 서비스는 클라우드 제공업체에서 제공하는 로드 밸런서를 프로비저닝하여 서비스에 대한 외부 액세스를 제공합니다. 이 서비스 유형은 클러스터 외부에서 서비스에 접근할 수 있는 가장 일반적인 방법입니다.

 

 

service (LoadBalancer Controller) 타입

AWS에서 지원하는 서비스 타입으로, Kubernetes 클러스터 내에서 AWS 로드 밸런서를 동적으로 프로비저닝하여 서비스에 대한 외부 액세스를 제공합니다. 앞서 설명한 LoadBalancer와 비슷하지만, AWS 환경에서 특별히 AWS 리소스를 사용하여 로드 밸런서를 관리합니다.

 

# 2. AWS LoadBalancer Controller 배포

 

해당 명령어로 EKS OIDC를 확인합니다. 

 

aws loadbalancer controller를 사용하는데 필요한 AMI를 생성합니다. 

명령어를 입력하면 aws iam 정책에서 생성된 정책을 확인할 수 있습니다. 

 

 eksctl을 사용하여 AWS Load Balancer Controller를 위한 ServiceAccount를 생성하는 명령어입니다

 

## IRSA 정보 확인

 

## 서비스 어카운트 확인

 

# Helm Chart 설치

Helm은 Kubernetes 애플리케이션을 손쉽게 배포, 관리 및 업그레이드하기 위한 오픈 소스 패키지 관리 도구입니다

 

#설치 확인

 

# OIDC 확인
aws eks describe-cluster --name $CLUSTER_NAME --query "cluster.identity.oidc.issuer" --output text
aws iam list-open-id-connect-providers | jq

# IAM Policy (AWSLoadBalancerControllerIAMPolicy) 생성
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.5.4/docs/install/iam_policy.json
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 Load Balancer Controller를 위한 ServiceAccount를 생성 >> 자동으로 매칭되는 IAM Role 을 CloudFormation 으로 생성됨!
# 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

## 서비스 어카운트 확인
kubectl get serviceaccounts -n kube-system aws-load-balancer-controller -o yaml | yh

# 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 \
  --set serviceAccount.create=false --set serviceAccount.name=aws-load-balancer-controller

## 설치 확인 : aws-load-balancer-controller:v2.7.1
kubectl get crd
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'
  Service Account:  aws-load-balancer-controller
 
# 클러스터롤, 롤 확인
kubectl describe clusterrolebindings.rbac.authorization.k8s.io aws-load-balancer-controller-rolebinding
kubectl describe clusterroles.rbac.authorization.k8s.io aws-load-balancer-controller-role

 

 

# Ingress

Ingress란?

Kubernetes에서의 "Ingress"는 클러스터 외부에서 내부의 서비스로의 HTTP 및 HTTPS 경로 기반의 요청을 라우팅하는 리소스를 말합니다. 쉽게 말해, 인그레스는 클러스터 외부에서 내부의 애플리케이션에 접근하기 위한 진입점을 정의합니다.

 

 

# 게임 파드와 Service, Ingress 배포
curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/3/ingress1.yaml
cat ingress1.yaml | yh
kubectl apply -f ingress1.yaml

# 모니터링
watch -d kubectl get pod,ingress,svc,ep -n game-2048

# 생성 확인
kubectl get-all -n game-2048
kubectl get ingress,svc,ep,pod -n game-2048
kubectl get targetgroupbindings -n game-2048
NAME                               SERVICE-NAME   SERVICE-PORT   TARGET-TYPE   AGE
k8s-game2048-service2-e48050abac   service-2048   80             ip            87s

# ALB 생성 확인
aws elbv2 describe-load-balancers --query 'LoadBalancers[?contains(LoadBalancerName, `k8s-game2048`) == `true`]' | jq
ALB_ARN=$(aws elbv2 describe-load-balancers --query 'LoadBalancers[?contains(LoadBalancerName, `k8s-game2048`) == `true`].LoadBalancerArn' | jq -r '.[0]')
aws elbv2 describe-target-groups --load-balancer-arn $ALB_ARN
TARGET_GROUP_ARN=$(aws elbv2 describe-target-groups --load-balancer-arn $ALB_ARN | jq -r '.TargetGroups[0].TargetGroupArn')
aws elbv2 describe-target-health --target-group-arn $TARGET_GROUP_ARN | jq

# Ingress 확인
kubectl describe ingress -n game-2048 ingress-2048
kubectl get ingress -n game-2048 ingress-2048 -o jsonpath="{.status.loadBalancer.ingress[*].hostname}{'\n'}"

# 게임 접속 : ALB 주소로 웹 접속
kubectl get ingress -n game-2048 ingress-2048 -o jsonpath={.status.loadBalancer.ingress[0].hostname} | awk '{ print "Game URL = http://"$1 }'

# 파드 IP 확인
kubectl get pod -n game-2048 -owide

 

ALB 대상 그룹에 등록된 대상 확인 : ALB에서 파드 IP로 직접 전달

 

감사합니다. 

'AWS > [AEWS] EKS' 카테고리의 다른 글

[ AEWS 4주차 ] 정리  (0) 2024.03.30
[ AEWS 3주차 ] EKS 스토리지 & 노드 그룹  (1) 2024.03.22
[ AEWS 2주차 ] #1 EKS VPC CNI란?  (0) 2024.03.12
[ AEWS 1주차 ] #1 EKS란?  (0) 2024.03.08
[ AEWS 1주차 ] #2 Cluster 배포  (0) 2024.03.08