본문 바로가기
CSP (Cloud Service Provider)/AWS

[AWS] EKS Service Type 4가지

by BTC_남요정 2023. 5. 21.

베하~!

안녕하세요 여러분! 블랙아웃입니다.

 

저희는 최근 EKS에 대해 짧게 공부해보았는데요!

오늘은 EKS에서 사용되는 서비스 타입 4가지에 대해 알아보고 실습 해보도록 하겠습니다~!

 


 

다들 아시다시피 파드는 생성될 때마다 IP가 계속해서 바뀌는데요.

이러한 파드에 탑재된 애플리케이션이 외부와 상호 통신할 수 있도록 해주는 것이 바로 서비스(Service)입니다.

오늘은 이 서비스 타입 4가지에 대해 알아보고, 직접 yaml 파일을 생성해서 서비스를 만들어보도록 하겠습니다!

 

먼저 Service Type에는 크게 4가지의 유형이 있습니다.

  • ClusterIP
  • NodePort
  • LoadBalancer
  • ExternalName

각각 하나씩 살펴 보도록 하겠습니다.

 


1. Cluster IP

  • 같은 label을 가진(Selector로 지정) pod의 엔드포인트를 묶어서 단일 진입점을 제공해주는 역할을 하는 서비스입니다.
  • Etcd에서 같은 Label을 가지는 Pod를 묶어서 하나의 Virtual IP 를 만들고, 클러스터 내에서 이 IP와 포트를 사용하여 서비스로 접근이 가능합니다.
  • 클러스터 내부에서만 사용이 가능하기 때문에, 클러스터 외부에서는 ClusterIP에 접근할 수 없습니다.

ClusterIP를 만드는 Yaml 파일입니다. 

apiVersion: v1
kind: Service
metadata:
  name: svc-clusterip
spec:
  type: ClusterIP    # type을 생략해도 기본적으로 clusterIP로 생성
  selector:          # 파드를 만들 때 지정해둔 레이블을 선택해서  
    app: web         # 같은 레이블을 가진 파드를 만들어 단일 진입점인 clusterIP를 생성해 줍니다.
  ports:
    - protocol: TCP
      port: 80             # 사용자가 접속하는 포트 (웹서버라면 80)
      targetPort: 80       # 서비스와 파드를 연결하는 포트 


kubectl apply -f svc-clusterip.yaml

 

 

 

kubectl get svc -o wide 를 통해 저희가 만든 ‘svc-clusterip’가 잘 만들어 진 것을 확인할 수 있습니다.

 

curl 'clusterIP'를 해보면 외부에서 접근이 안되는 것을 확인할 수 있습니다.

 


2. NodePort

  • 해당 ClusterIP로 연결되어 있는 pod에 외부 접속이 가능하도록 포트를 열어주는 역할을 하는 서비스입니다.
  • NodePort 서비스를 사용하면 외부에서 클러스터로 연결하기 위해 노드의 IP 주소와 포트 번호를 사용하여 접근이 가능합니다.
  • 30000 이상 번호로 포트 예약이 가능하고, 예를 들어, 30001번으로 NodePort를 생성하게 되면 모든 노드에 30001번 포트가 열리게 되는 구조입니다.

NodePort를 만드는 Yaml 파일입니다. 

apiVersion: v1
kind: Service
metadata:
  name: svc-nodeport
spec:
  type: NodePort
  selector:
    app: web
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 30123       #노드1과 노드2 모두에 30123 포트가 열리게 됩니다.      


kubectl apply -f svc-nodeport.yaml

 

curl ‘node1의 privateIP:포트번호’를 하게 되면 해당 서비스에 엮여 있는 파드들이 차례대로 호출되는 것을 확인할 수 있습니다.

 


3. LoadBalancer

  • AWS나 Azure, GCP처럼 클라우드 공급자의 로드밸런서를 자동으로 프로비저닝하는 서비스입니다.
  • 저희는 AWS에 제공하는 EKS를 사용하는 만큼 LoadBalancer 서비스를 사용하게 되면 ELB가 생성되게 됩니다.
  • 실제 로드밸런서(AWS ELB)의 포트와 NodePort에 열려 있는 포트를 연결해 주는 작업을 하게 됩니다.
    • AWS의 경우 기본적으로 CLB가 생성이 되지만, Annotation을 활용하면 NLB도 생성이 가능합니다.
  • 자동으로 쿠버네티스 클러스터 내부의 파드를 대상으로 로드 밸런서를 프로비저닝하기 때문에 이 로드밸런서를 통해서 클러스터 외부에서 서비스로 액세스가 가능합니다.

AWS에서 NLB를 만드는 Yaml 파일입니다.

apiVersion: v1
kind: Service
metadata:
  name: svc-nlb
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb"       #nlb를 만드는 annotation 추가
spec:
  type: LoadBalancer
  selector:
    app: web
  ports:
    - protocol: TCP
      port: 80         # 사용자가 접속하는 포트
      targetPort: 80   # 서비스와 파드를 연결하는 포트

 

NLB가 다 만들어진 후에 curl NLB를 해보면 묶여있는 파드들이 로드밸런싱 되어 호출되는 것을 확인하실 수 있습니다!

'LoadBalancer' 서비스 타입은 실제 CSP의 로드밸런서를 직접 만드는 것이기 때문에 

해당 Yaml 파일로 NLB를 만들게 되면 AWS 콘솔 화면에서도 nlb가 생성된 것을 확인하실 수 있습니다! 

 


 

4. ExternalName

  • 클러스터 안에서 사용하는 도메인입니다.
  • 서비스를 생성하면, 쿠버네티스는 서비스의 CNAME 레코드를 생성하게 됩니다. 그래서 클러스터 내부에서 서비스를 찾을 때, 이 CNAME 레코드를 사용하여 외부 서비스와 통신하게 되는 것이죠.
  • 즉, 클러스터 안에서 외부로 접속할 때 사용할 도메인을 ExternalName에 등록해서 사용하는 구조입니다.

 

EKS에서 ExternalName 서비스를 생성하는  Yaml 파일입니다.

apiVersion: v1
kind: Service
metadata:
  name: svc-externalname
spec:
  type: ExternalName
  externalName: example.com

 


 

 

여기까지 Service Type 4가지의 개념을 보고 직접 생성도 해보았는데요.

글로만 읽는 것과 간단하지만 직접 만들어보면서 이해하는 것은 큰 차이가 있다고 생각합니다.

그러니 여러분들도 함께 따라하시면서 EKS Service Type을 더 잘 이해하셨으면 좋겠습니다!

 

 

그럼 다음에 만나요

베빠~!

댓글