본문 바로가기

⭐ AWS/NLB (NerworkLoadBalancer)

EKS에 NLB 적용시 리스너 여러개 등록하기

# EKS에서 NLB 적용시 리스너를 여러개 등록하는 과정을 알아보자.

1. TargetGroupBinding을 활용한 구현

- 설치하기

kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller//crds?ref=master"
kubectl get crd

- 설치 완료

kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller//crds?ref=master"
customresourcedefinition.apiextensions.k8s.io/ingressclassparams.elbv2.k8s.aws configured
customresourcedefinition.apiextensions.k8s.io/targetgroupbindings.elbv2.k8s.aws configured

2. 사전 준비

- Jenkins를 NLB로 설치 한다. 아래의 코드 참고

- 실행 명령어 : kubectl apply -f {yamlfile_name}

apiVersion: v1
kind: Service
metadata:
  name: ingress-nlb
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
    #service.beta.kubernetes.io/group.name: nlb-group-01
spec:
  selector:
    app: jenkins
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
      #nodePort: 30011
  type: LoadBalancer

여기서 ARN 정보가 매우 중요한다. ARN 정보는 아래의 URL에서 확인할 수 있다.

2021.08.10 - [⭐ AWS/AWS 용어정리] - ARN 이란?

 

ARN 이란?

Amazon 리소스 이름(ARN) Amazon 리소스 이름(ARN)은 AWS 리소스를 고유하게 식별합니다. 모든 전반에 리소스를 명료 하게 지정해야 하는 경우 ARN 이 필요합니다. AWS에서 IAM 정책, Amazon RDS (Amazon Realtional

may9noy.tistory.com

2021.04.15 - [⭐ AWS] - ARN 이란?

 

ARN 이란?

ARN 이란? - AWS의 리소스를 고유하게 식별하기 위해 사용하는 것 - 태그 , API호출과 같은 모든 AWS 리소스를 지정해야할 필요가 있는 경우 ARN을 사용한다 ARN 예제 1. Elastic Beanstalk의 Application Version을

may9noy.tistory.com

- 정상적으로 생성이 되면 아래와 같이 NLB 서비스가 생성되고 해당 NLB 서비스안에 리스너 및 타겟그룹도 함께 생성된다.

3. TargetGroupBinding 적용하기

- 예제 애플리케이션 실행하기, 위에서 생성된 타겟그룹에 포함시킬 nginx 웹서버를 생성한다.

- service.yaml 생성 예시, 타입은 노드포트로 생성하면 된다.

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  annotations:
    alb.ingress.kubernetes.io/healthcheck-path: "/healthy"
spec:
  selector:
     app: nginx
  type: NodePort
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 80

- nginx 생성은 아래의 url의 6번을 확인한다.

https://may9noy.tistory.com/517

 

eks클러스터 생성 및 ALB 사용하기

1. CloudFormation으로 기본 인프라 구성 2022.03.03 - [책) k8s 실전 프로젝트/1. EKS 환경구축] - 1. CloudFormation 으로 기본 환경 생성하기 1. CloudFormation 으로 기본 환경 생성하기 # 클라우드 포메이션 기반 기

may9noy.tistory.com

- 생성된 nginx 리소스 조회

kubectl get pod -n nginx && kubectl get svc -n nginx
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6595874d85-4gnbg   1/1     Running   0          4h49m
NAME            TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
nginx-service   NodePort   100.00.100.100   <none>        80:31876/TCP   16m

4. 위에서 생성된 nginx 서비스를 jenkins의 리스너 그룹에 포함시키기

- 수동작업 진행 : 일단 Target-Group를 생성해 줘야 한다... 이걸 수동으로 해야한다. ALB는 자동으로 만들어 줬는데... 쩝

아래 URL을 참고하여 타겟그룹을 생성한다.

2023.03.17 - [⭐ AWS/Load Balancing & TargetGroup] - 대상그룹 (TargetGroup) 생성하고 리스너에 등록하기

 

대상그룹 (TargetGroup) 생성하고 리스너에 등록하기

# 대상그룹 TargetGroup을 생성하는 방법 - 로드밸런서 서비스로 이동 후 대상그룹을 생성하려는 로드밸런서 서비스로 이동한다. 그리고 화면 중간쯤에 리스너 항목을 보면 아래와 같을 것이다. 1.

may9noy.tistory.com

- 파일명: targetgroup-binding.yaml → 수동으로 생성한 대상그룹의 arn 주소만 아래에 맵핑 시키고 포트만 잘 맞춰주면 문제없이 서비스를 생성하여 사용 할 수 있다.

apiVersion: elbv2.k8s.aws/v1beta1
kind: TargetGroupBinding
metadata:
  name: nginx-targategroups-binding
  namespace: nginx # service_namespace
spec:
  serviceRef:
    name: nginx-service #K8s Service Name
    port: 80 #K8s Service Port
  targetGroupARN: arn:aws:elasticloadbalancing:ap-northeast-2:{tg_arn}
  targetType: instance

- 생성 후 targetgroupbinding 조회, 정상적으로 생성이 되었다.

kubectl get targetgroupbinding -A
NAMESPACE   NAME                             SERVICE-NAME             SERVICE-PORT   TARGET-TYPE   AGE
nginx       nginx-targategroups-binding      nginx-service            80             instance      5m51s

5. 서비스 확인하기

- nginx

- jenkins

6. 예제로 sonarqube 서비스 등록하기

- sonarqube 서비스 확인하기, 일단 웹서비스는 아래에 NodePort로 등록된 demo-sonarqube-sonarqube 일 것이다.

kubectl get svc -n sonar-demo
NAME                               TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
demo-postgre-postgresql            ClusterIP   172.20.68.206    <none>        5432/TCP         2d1h
demo-postgre-postgresql-headless   ClusterIP   None             <none>        5432/TCP         2d1h
demo-sonarqube-sonarqube           NodePort    172.20.204.209   <none>        9000:30530/TCP   2d1h

- TargetGroupBinding 일명 tgb 생성하기, arn 정보는 위에서 예제를 통해 생성 하였으므로, 해당 정보를 입력해주면 된다.

apiVersion: elbv2.k8s.aws/v1beta1
kind: TargetGroupBinding
metadata:
  name: sonarqube-tgb
  namespace: sonar-demo # service_namespace
spec:
  serviceRef:
    name: demo-sonarqube-sonarqube #K8s Service Name
    port: 9000 #K8s Service Port
  targetGroupARN: arn:aws:elasticloadbalancing:ap-northeast-2:{tg_arn}
  targetType: instance

- 실행하기

kubectl apply -f tgb-sonarqube.yaml
targetgroupbinding.elbv2.k8s.aws/sonarqube-tgb created

- 적용하면 해당 대상그룹이 아래와 같이 적용 된다. 9000번 포트의 서비스가 삭제되고 NodePort번호가 맵핑된다.

- 약 5분뒤, 정상적으로 서비스가 등록 되었다.

7. sonarqube 서비스 접속하기

- 접속 주소 : nlb주소:9000을 통해 서비스에 접속이 가능하다.

- 위와 같이 모든 서비스가 정상적으로 등록된 것을 확인 할 수 있다.

- 이제 여러 상용 오픈소스들을 포트 기반으로 구분하여 하나의 NLB에서 서비스 할 수 있게 되었다.

번외, ALB에서 TargetGroupBinding 하기

apiVersion: elbv2.k8s.aws/v1beta1
kind: TargetGroupBinding
metadata:
  name: api-binding
  namespace: api-namespace
spec:
  serviceRef:
    name: api-service #Service Name
    port: 8080 #Service Port
  targetGroupARN: arn:{arn_address}
  targetType: ip #Target Type ip/instance
  networking:
    ingress:
    - from:
      - securityGroup:
          groupID: sg-name #ALB SG
      ports:
      - protocol: TCP

 

- 끝 -