1. Ingress 란?
- Amazon EKS에서 Ingress는 클러스터 외부에서 내부 서비스로 HTTP 및 HTTPS 라우팅을 관리하는데 사용한다.
- Ingress는 단순히 서비스 앞에 배치된 로드 밸런서 역할을 하며, 보다 복잡한 HTTP 및 HTTPS 라우팅을 지원한다.
- Ingress를 사용하면 경로 기반 라우팅, 호스트 기반 라우팅, TLS/SSL 종료 등의 기능을 활용할 수 있다.
- EKS에서는 여러 Ingress Controller를 사용할 수 있으며, 일반적으로 AWS Load Balancer Controller, NGINX Ingress Controller 등이 있다.
2. AWS Load Balancer Controller
2-1. AWS Load Balancer Controller이란?

- AWS Load Balancer Controller는 Kubernetes 사용자가 클러스터에서 Ingress 리소스를 선언할 때마다 ALB 및 필요한 AWS 리소스 생성을 트리거한다.
- 작동 방식
- AWS Load Balancer Controller는 API 서버에서 Ingress 이벤트를 감시한다. 요구 사항을 충족하는 Ingress 리소스를 찾으면 AWS 리소스 생성을 시작한다.
- Ingress 리소스에 대한 ALB가 생성된다.
- TargetGroups는 Ingress 리소스에 지정된 각 백엔드에 대해 생성된다.
- Ingress 리소스 주석으로 지정된 모든 포트에 대해 리스너가 생성된다. 포트가 지정되지 않으면 기본값( 80또는 443)이 사용된다.
- Ingress 리소스에 지정된 각 경로에 대한 규칙이 생성된다. 이를 통해 특정 경로로의 트래픽이 올바르게 TargetGroup생성된 경로로 라우팅된다.
2-2. EKS 클러스터에 AWS Load Balancer Controller 설치
1) OIDC 설치
- EKS에서 AWS의 ALB를 사용하기 위해서는 AWS Load Balancer Controller를 설치해야한다.
- 이때, Load Balancer Controller는 ALB를 생성, 수정, 삭제하기 위해서 권한이 필요한데 이때 IRAS (IAM Roles for Service Account) 개념을 사용한다.
- IRAS (IAM Roles for Service Account
- Service Account에 Annotation을 통해 IAM Role 부여
- 해당 Service Account를 사용하는 Service는 해당 권한을 갖음
- Annotation을 통해서 role을 부여할 때 OIDC (OpenID Connec) issuer URL 사용
- EKS 에서 IRSA 라는 개념을 적용하여 사용하기 위한 도구로 OIDC identity provider 생성이 필요
- OIDC (OpenID Connect)
- 간단한 인증 레이어로 OAuth2.0 프로토콜을 기반으로 생성
- 동작하는 원리는 Oauth2.0의 인증과정과 흡사
- OAuth2.0은 단순 인가(Authorization) 이 목적이었다면 OIDC는 인가와 인증(Authentication)을 같이 하기 위한 목적이 있다.
- OIDC는 AccessToken과 ID Token이 발행되는데 이 ID Token이 신원정보를 갖고 있는 토큰이 된다.
# OIDC Provider enable로 설정
eksctl utils associate-iam-oidc-provider --region={Region ID} --cluster={EKS Cluster Name} --approve
2) eksctl을 사용하여 IAM 역할 생성
- 사용자 대신 AWS API를 호출할 수 있는 AWS Load Balancer Controller의 IAM 정책을 다운로드
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.7.2/docs/install/iam_policy.json
- 이전 단계에서 다운로드한 정책을 사용하여 IAM 정책 생성
aws iam create-policy \
--policy-name AWSLoadBalancerControllerIAMPolicy \
--policy-document file://iam_policy.json
- eksctl을 사용하여 IAM 역할 생성 (eksctl 설치)
- IAM 역할: AmazonEKSLoadBalancerControllerRole
- IAM 정책: AWSLoadBalancerControllerIAMPolicy
- IAM 신뢰할 수 있는 엔터티: oidc-provider/oidc.eks.ap-northeast/amazonaws.com/id/####
eksctl create iamserviceaccount \
--cluster={EKS Cluster Name} \
--namespace=kube-system \
--name=aws-load-balancer-controller \
--role-name AmazonEKSLoadBalancerControllerRole \
--attach-policy-arn=arn:aws:iam::{AWS Account ID}:policy/AWSLoadBalancerControllerIAMPolicy \
--approve
3) AWS Load Balancer Controller 설치
- eks-charts 차트 Helm 리포지토리를 추가
helm repo add eks https://aws.github.io/eks-charts
- 최신 차트가 적용되도록 로컬 리포지토리를 업데이트
helm repo update eks
- AWS Load Balancer Controller 설치
- Helm으로 AWS Load Balancer Controller를 설치할 때 aws-load-balancer-controller라는 이름의 Service Account가 함께 생성된다.
- 해당 Service Account는 사전에 생성한 IAM 역할인 AmazonEKSLoadBalancerControllerRole을 사용하여 생성된다.
- aws-load-balancer-controller가 올라간 Deployment의 yaml을 확인하였을 때 해당 Service Account가 사용되어 생성된 것을 확인할 수 있다.
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
-n kube-system \
--set clusterName={EKS Cluster Name} \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller \
--set region={Region ID} \
--set vpcId={VPC ID}
4) 컨트롤러가 설치되어 있는지 확인
kubectl get deployment -n kube-system aws-load-balancer-controller
2-3. Ingress 정의
1) VPC의 Subnet에 Tag 추가
- Amazon EKS에서 Application Load Balancer가 사용하는 서브넷을 자동으로 검색하기 위해 각 서브넷에 Tag가 필요하다.
- 참고: https://repost.aws/ko/knowledge-center/eks-vpc-subnet-discovery
종류 | key | value |
모든 서브넷 공통 | kubernetes.io/cluster/{eks cluster name} | shared |
internal load balancers가 사용하는 서브넷 | kubernetes.io/role/internal-elb | 1 또는 공백 |
internet-facing load balancers 가 사용하는 서브넷 | kubernetes.io/role/elb | 1 또는 공백 |
2) 샘플 애플리케이션 배포
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.7.2/docs/examples/2048/2048_full.yaml
3) 생성 확인
ubuntu@ip-10-10-1-33:~$ kubectl get ingress/ingress-2048 -n game-2048
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-2048 alb * k8s-game2048-ingress2-11de9430bf-682494172.ap-northeast-2.elb.amazonaws.com 80 104s
※ ALB가 생성된 모습

※ ALB의 리소스 맵
- 대상그룹에는 nodePort로 설정한 포트로 Pod의 IP가 자동으로 등록되어 있다.
- 만약 Ingress 생성 시 annotations에 "alb.ingress.kubernetes.io/target-type: instance"로 설정하면 대상그룹의 대상으로 노드의 인스턴스가 등록된다.

4) 브라우저에서 ADDRESS(ALB DNS)로 접속 테스트

참고
1. AWS ALB Ingress Controller 설명 및 설치 방법
https://aws.amazon.com/ko/blogs/opensource/kubernetes-ingress-aws-alb-ingress-controller/
2. Application Load Balancers를 사용한 HTTP 트래픽 라우팅 샘플 코드
3. eksctl 설치
'Cloud > AWS' 카테고리의 다른 글
[AWS] EKS에서 ExternalDNS 구성하기 (1) | 2024.11.16 |
---|---|
[AWS] DynamoDB를 활용하여 간단한 웹사이트 구성 (3) | 2024.10.12 |
[AWS] IAM 기초 (0) | 2024.07.28 |
1. Ingress 란?
- Amazon EKS에서 Ingress는 클러스터 외부에서 내부 서비스로 HTTP 및 HTTPS 라우팅을 관리하는데 사용한다.
- Ingress는 단순히 서비스 앞에 배치된 로드 밸런서 역할을 하며, 보다 복잡한 HTTP 및 HTTPS 라우팅을 지원한다.
- Ingress를 사용하면 경로 기반 라우팅, 호스트 기반 라우팅, TLS/SSL 종료 등의 기능을 활용할 수 있다.
- EKS에서는 여러 Ingress Controller를 사용할 수 있으며, 일반적으로 AWS Load Balancer Controller, NGINX Ingress Controller 등이 있다.
2. AWS Load Balancer Controller
2-1. AWS Load Balancer Controller이란?

- AWS Load Balancer Controller는 Kubernetes 사용자가 클러스터에서 Ingress 리소스를 선언할 때마다 ALB 및 필요한 AWS 리소스 생성을 트리거한다.
- 작동 방식
- AWS Load Balancer Controller는 API 서버에서 Ingress 이벤트를 감시한다. 요구 사항을 충족하는 Ingress 리소스를 찾으면 AWS 리소스 생성을 시작한다.
- Ingress 리소스에 대한 ALB가 생성된다.
- TargetGroups는 Ingress 리소스에 지정된 각 백엔드에 대해 생성된다.
- Ingress 리소스 주석으로 지정된 모든 포트에 대해 리스너가 생성된다. 포트가 지정되지 않으면 기본값( 80또는 443)이 사용된다.
- Ingress 리소스에 지정된 각 경로에 대한 규칙이 생성된다. 이를 통해 특정 경로로의 트래픽이 올바르게 TargetGroup생성된 경로로 라우팅된다.
2-2. EKS 클러스터에 AWS Load Balancer Controller 설치
1) OIDC 설치
- EKS에서 AWS의 ALB를 사용하기 위해서는 AWS Load Balancer Controller를 설치해야한다.
- 이때, Load Balancer Controller는 ALB를 생성, 수정, 삭제하기 위해서 권한이 필요한데 이때 IRAS (IAM Roles for Service Account) 개념을 사용한다.
- IRAS (IAM Roles for Service Account
- Service Account에 Annotation을 통해 IAM Role 부여
- 해당 Service Account를 사용하는 Service는 해당 권한을 갖음
- Annotation을 통해서 role을 부여할 때 OIDC (OpenID Connec) issuer URL 사용
- EKS 에서 IRSA 라는 개념을 적용하여 사용하기 위한 도구로 OIDC identity provider 생성이 필요
- OIDC (OpenID Connect)
- 간단한 인증 레이어로 OAuth2.0 프로토콜을 기반으로 생성
- 동작하는 원리는 Oauth2.0의 인증과정과 흡사
- OAuth2.0은 단순 인가(Authorization) 이 목적이었다면 OIDC는 인가와 인증(Authentication)을 같이 하기 위한 목적이 있다.
- OIDC는 AccessToken과 ID Token이 발행되는데 이 ID Token이 신원정보를 갖고 있는 토큰이 된다.
# OIDC Provider enable로 설정
eksctl utils associate-iam-oidc-provider --region={Region ID} --cluster={EKS Cluster Name} --approve
2) eksctl을 사용하여 IAM 역할 생성
- 사용자 대신 AWS API를 호출할 수 있는 AWS Load Balancer Controller의 IAM 정책을 다운로드
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.7.2/docs/install/iam_policy.json
- 이전 단계에서 다운로드한 정책을 사용하여 IAM 정책 생성
aws iam create-policy \
--policy-name AWSLoadBalancerControllerIAMPolicy \
--policy-document file://iam_policy.json
- eksctl을 사용하여 IAM 역할 생성 (eksctl 설치)
- IAM 역할: AmazonEKSLoadBalancerControllerRole
- IAM 정책: AWSLoadBalancerControllerIAMPolicy
- IAM 신뢰할 수 있는 엔터티: oidc-provider/oidc.eks.ap-northeast/amazonaws.com/id/####
eksctl create iamserviceaccount \
--cluster={EKS Cluster Name} \
--namespace=kube-system \
--name=aws-load-balancer-controller \
--role-name AmazonEKSLoadBalancerControllerRole \
--attach-policy-arn=arn:aws:iam::{AWS Account ID}:policy/AWSLoadBalancerControllerIAMPolicy \
--approve
3) AWS Load Balancer Controller 설치
- eks-charts 차트 Helm 리포지토리를 추가
helm repo add eks https://aws.github.io/eks-charts
- 최신 차트가 적용되도록 로컬 리포지토리를 업데이트
helm repo update eks
- AWS Load Balancer Controller 설치
- Helm으로 AWS Load Balancer Controller를 설치할 때 aws-load-balancer-controller라는 이름의 Service Account가 함께 생성된다.
- 해당 Service Account는 사전에 생성한 IAM 역할인 AmazonEKSLoadBalancerControllerRole을 사용하여 생성된다.
- aws-load-balancer-controller가 올라간 Deployment의 yaml을 확인하였을 때 해당 Service Account가 사용되어 생성된 것을 확인할 수 있다.
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
-n kube-system \
--set clusterName={EKS Cluster Name} \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller \
--set region={Region ID} \
--set vpcId={VPC ID}
4) 컨트롤러가 설치되어 있는지 확인
kubectl get deployment -n kube-system aws-load-balancer-controller
2-3. Ingress 정의
1) VPC의 Subnet에 Tag 추가
- Amazon EKS에서 Application Load Balancer가 사용하는 서브넷을 자동으로 검색하기 위해 각 서브넷에 Tag가 필요하다.
- 참고: https://repost.aws/ko/knowledge-center/eks-vpc-subnet-discovery
종류 | key | value |
모든 서브넷 공통 | kubernetes.io/cluster/{eks cluster name} | shared |
internal load balancers가 사용하는 서브넷 | kubernetes.io/role/internal-elb | 1 또는 공백 |
internet-facing load balancers 가 사용하는 서브넷 | kubernetes.io/role/elb | 1 또는 공백 |
2) 샘플 애플리케이션 배포
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.7.2/docs/examples/2048/2048_full.yaml
3) 생성 확인
ubuntu@ip-10-10-1-33:~$ kubectl get ingress/ingress-2048 -n game-2048
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-2048 alb * k8s-game2048-ingress2-11de9430bf-682494172.ap-northeast-2.elb.amazonaws.com 80 104s
※ ALB가 생성된 모습

※ ALB의 리소스 맵
- 대상그룹에는 nodePort로 설정한 포트로 Pod의 IP가 자동으로 등록되어 있다.
- 만약 Ingress 생성 시 annotations에 "alb.ingress.kubernetes.io/target-type: instance"로 설정하면 대상그룹의 대상으로 노드의 인스턴스가 등록된다.

4) 브라우저에서 ADDRESS(ALB DNS)로 접속 테스트

참고
1. AWS ALB Ingress Controller 설명 및 설치 방법
https://aws.amazon.com/ko/blogs/opensource/kubernetes-ingress-aws-alb-ingress-controller/
2. Application Load Balancers를 사용한 HTTP 트래픽 라우팅 샘플 코드
3. eksctl 설치
'Cloud > AWS' 카테고리의 다른 글
[AWS] EKS에서 ExternalDNS 구성하기 (1) | 2024.11.16 |
---|---|
[AWS] DynamoDB를 활용하여 간단한 웹사이트 구성 (3) | 2024.10.12 |
[AWS] IAM 기초 (0) | 2024.07.28 |