devnoong.log
article thumbnail
728x90

인그레스 컨트롤러란?

인그레스(Ingress) 는 주로 클러스터 외부에서 쿠버네티스 내부로 접근할 때, 요청들을 어떻게 처리할지 정의해놓은 규칙이자 리소스 오브젝트입니다.

 

한마디로 외부의 요청이 내부로 접근하기 위한 관문의 역할을 합니다.

 

인그레스는 외부 요청 처리에 대한 규칙들을 설정해놓은 것을 의미하며, 이런 설정이 동작하기 위해서 필요한 것이 인그레스 컨트롤입니다.

인그레스 컨트롤러는 클러스터와 함께 생성되지 않기 때문에 직접 구현해야 합니다.

 

ALB(Application Load Balancer) 컨트롤러란?

 

인그레스 자원이 생성될 때에 ALB(Application Load Balancer) 및 필요한 자원이 생성되도록 트리거하는 컨트롤러입니다.

AWS Load Balancer 컨트롤러에서 지원하는 트래픽 모드Instance(default) Mode , IP Mode 입니다. 

 

Instance(default) Mode

 

클러스터 내 노드를 ALB의 대상으로 등록합니다.

ALB에 도달하는 트래픽은 NodePort로 라우팅 된 다음 파드로 프록시됩니다.

 

IP Mode :

 

파드를 ALB 대상으로 등록합니다.

ALB에 도달하는 트래픽은 파드로 직접 라우팅 됩니다.

해당 트래픽 모드를 사용하기 위해선 ingress.yaml 파일에 주석을 사용하여 명시적으로 지정해야 합니다.

 

 

1.  인그레스 컨트롤러 관련 폴더 만들기

ALB 인그레스 컨트롤러 관련 폴더들을 만들어줍니다.

cd ~/environment
mkdir -p manifests/alb-ingress-controller && cd manifests/alb-ingress-controller

2.   AM OIDC (OpenID Connect) 공급자 조회

 

서비스 계정에 IAM 역할을 사용하려면 클러스터에 IAM OIDC 공급자가 있어야 합니다.

 

클러스터에 기존 IAM OIDC 공급자가 있는지 확인하기 위해

아래 명령어를 입력하여 클러스터의 OIDC 공급자 URL을 확인합니다.

aws eks describe-cluster --name eks-demo-yh --query "cluster.identity.oidc.issuer" --output text

 

출력된 값들 중 id 뒤에 있는 값이 공급자 url입니다.

 

위에서 반환된 공급자 url 값을 이용하여 계정의 IAM OIDC 공급자를 나열합니다. 

aws iam list-open-id-connect-providers | grep url

 

출력이 반환되지 않은 경우 클러스터에 대한 공급자가없는 것이기 때문에  IAM OIDC 공급자를 생성해야 합니다.

 

3.   AM OIDC (OpenID Connect) 공급자 만들기

쿠버네티스가 직접 관리하는 사용자 계정을 의미하는 service account에 IAM role을 사용하기 위해 클러스터 IAM OIDC provider를 만들도록 하겠습니다.

 

eksctl utils associate-iam-oidc-provider \
    --region ${AWS_REGION} \
    --cluster eks-demo-yh \
    --approve

생성이 완료되었습니다.

 

생성 후 다시 url을 조회해보면 출력되는 것을 확인해 보실 수 있습니다.

4.   IAM Policy 만들기

AWS Load Balancer Controller에 부여할 IAM Policy를 생성하도록 하겠습니다.

aws iam create-policy \
    --policy-name AWSLoadBalancerControllerIAMPolicy_yh \
    --policy-document https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.1/docs/install/iam_policy.json

 

생성이 완료 되면 아래와 같이 출력됩니다.

 

5.    ServiceAccount 만들기

AWS Load Balancer Controller를 위한 ServiceAccount를 생성하도록 하겠습니다.

eksctl create iamserviceaccount \
    --cluster eks-demo-yh \
    --namespace kube-system \
    --name aws-load-balancer-controller \
    --attach-policy-arn arn:aws:iam::$ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy_yh \
    --override-existing-serviceaccounts \
    --approve

6.    AWS Load Balancer controller 클러스터 추가하기

먼저 인증서 구성을 웹훅에 삽입할 수 있도록 cert-manager를 설치하도록 하겠습니다.

 Cert-manager쿠버네티스 클러스터 내에서 TLS인증서를 자동으로 프로비저닝 및 관리하는 오픈 소스입니다.

 

kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.5.3/cert-manager.yaml

 

추가적으로 Load balancer controller yaml 파일도 다운로드하겠습니다.

wget https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.4.1/v2_4_1_full.yaml

 

다운로드 받은 yaml 파일에서 클러스터의 cluster-name을  your-cluster-name 에서 eks-demo-yh로 수정하도록 하겠습니다.

 vi v2_4_1_full.yaml

 

ServiceAccount yaml spec 부분을 주석 처리 하도록 하겠습니다.

AWS Load Balancer Controller를 위한 ServiceAccount를 이미 생성했기 때문입니다.

 

 

파일 수정을 완료했으면 수정된 내용으로 AWS Load Balancer controller파일 배포를 진행하도록 하겠습니다.

kubectl apply -f v2_4_1_full.yaml

 

배포가 성공적으로 되고 컨트롤러가 실행되는지 아래의 명령어를 통해 확인하도록 하겠습니다.

결과 값이 도출되면 정상적으로 배포가 성공했음을 뜻합니다.

kubectl get deployment -n kube-system aws-load-balancer-controller

 

service account가 생성되었는지도 아래의 명령어를 통해서 확인해보겠습니다.

kubectl get sa aws-load-balancer-controller -n kube-system -o yaml

7.   파드 확인하기

클러스터 내부에서 필요한 기능들을 위해 실행되는 파드들을 애드온(Addon) 이라고 합니다.

애드온에 사용되는 파드들은 디플로이먼트, 리플리케이션 컨트롤러 등에 의해 관리됩니다. 

 

이 애드온이 사용하는 네임스페이스가 kube-system입니다. 

 

Yaml 파일에서 네임스페이스를 kube-system으로 명시했기에 위의 명령어로 파드 이름이 도출되면 정상적으로 배포된 것으로 아래의 명령어를 통해 로그를 확인해보도록 하겠습니다.

kubectl logs -n kube-system $(kubectl get po -n kube-system | egrep -o "aws-load-balancer[a-zA-Z0-9-]+")

 

728x90