본문 바로가기
  • lakescript
스터디 이야기/AWS EKS

[AEWS] 2-4. Amazon EKS Networking - Ingress

by lakescript 2024. 3. 13.

사전 준비

더보기

 

위와 같이 사전 준비가 필요합니다.

저번 글에서 설명했듯이, EKS를 배포하기 위한 VPC를 생성하고, Public Subnet, Private Subnet을 생성합니다. 그 후 EKS Cluster에 접근하기 위한 bastion EC2를 미리 생성합니다.

 

Ingress

ChatGPT가 알려주는 Ingress
Ingress는 클러스터 외부에서 내부의 서비스로 HTTP와 HTTPS 트래픽을 관리하는 방법을 제공하는 API 객체입니다. 즉, Ingress를 사용하면 외부 요청을 적절한 서비스로 라우팅 할 수 있으며, 단일 IP 주소를 통해 클러스터 내의 여러 서비스에 접근할 수 있게 됩니다. 이는 특히 웹 애플리케이션에 유용하며, 로드 밸런싱, SSL 종료, 이름 기반의 가상 호스팅 등을 제공합니다.

 

L7영역에 대한 트래픽 처리 규칙을 정의하고 해당 트래픽을 Ingress Controller를 통해 처리합니다. Ingress Contorller는 NGINX Controller나 CSP(AWS, Azure, GCP등)에서 제공하는 Controller를 선택하여 설치할 수 있습니다.

 

EKS에서는, 외부 Endpoint 역할을 하는 Ingress Contoller(ALB)가 자동으로 생성되며 ALB 생성을 위해 ELB 권한을 갖는 IAM Role을 생성하여 연결해야 합니다.

 

즉, 앞에 공부했던 Service의 AWS LoadBalancer Controller + NLB와 비슷한 개념으로 클러스터 내부의 서비스(ClusterIP, NodePort, Loadbalancer)를 외부로 노출(HTTP/HTTPS) 합니다. 하지만 다른 점은 NLB 대신 Ingress (ALB)를 배치한다는 점입니다.(복잡한 라우팅 및 L7 로드 밸런싱에 용이)

 

서비스/파드 배포  with Ingress(ALB)

Ingress Contoller를 설치하여 Pod와 Service를 배포하여 ALB에 연결하고 HTTP 접근을 해보겠습니다.

실습하기 전에 퍼블릭 영역의 AWS Route53 호스팅 영역과 AWS LoadBalancer Controller와 NLB가 생성되어 있어야 합니다.
설치 내용 보기

 

게임 파드와 Service, Ingress 배포

curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/3/ingress1.yaml
cat ingress1.yaml | yh
kubectl apply -f ingress1.yaml

 

위의 명령어를 통해 실습파일을 받아오고 실행시키도록 하겠습니다.

 

생성된 리소스 확인

kubectl get-all -n game-2048

 

위의 명령어를 통해 game-2048 네임스페이스에 있는 모든 kubernetes 리소스들을 확인해보겠습니다.

 

Deployment로 배포된 Pod와 Service, Endpoint, ingress controller, targetgroupbinding을 확인하실 수 있습니다.

 

ALB 생성 확인

aws elbv2 describe-load-balancers --query 'LoadBalancers[?contains(LoadBalancerName, `k8s-game2048`) == `true`]' | jq

 

실습 코들르 배포하고 바로 위의 명령어를 실행한다면 아래의 사진과 같이 State.code의 값이 provisioning인 것을 확인하실 수 있습니다. 

 

 

일정 시간(대략 1분~5분)정도 후 다시 확인해보면 active로 바뀐 값을 확인할 수 있고 AWS Manage Console - EC2 - 로그밸런서 메뉴에서 확인해보시면 정상적으로 활성화된 ingress ALB를 확인하실 수 있습니다.

 Pod IP 정보 확인

이제 실제로 Pod의 IP와 ALB가 연결된 것인지 확인해보도록 하겠습니다.

 

리소스맵

 

먼저, AWS Manage Console - EC2 - 로그밸런서에서 해당 Ingress ALB의 리소스맵을 확인해보시면 리스너 - 규칙 - 대상그룹 - 대상에 2개의 Pod IP가 연결된 것을 확인하실 수 있습니다.

kubectl

kubectl get po -o wide -n game-2048

 

그 후 터미널에서 위의 명령어로 pod들의 IP주소를 확인해보겠습니다.

AWS VPC CNI로 인해 pod의 IP로 바로 접근하고 있는 것을 확인하실 수 있습니다!

 

 

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 }'

 

위의 명령어로 현재 배포된 ALB로 인해 외부로 노출된 URL을 확인 후 연결하여 정상적으로 외부로 연결된 것을 확인하실 수 있습니다.

게임 고고링~!

 

 


Reference

- https://gasidaseo.notion.site/K8S-Ingress-b38c1cbed5f9481bafa4d5315999e66a

- https://docs.aws.amazon.com/eks/latest/userguide/alb-ingress.html