쿠버네티스/이론

쿠버네티스 Service 란?

황동리 2024. 11. 1. 11:30
반응형

Service 란?

Pod는 클러스터 내에서 동적으로 생성되고 삭제될 수 있기 때문에
쿠버네티스 Service는 쿠버네티스 클러스터 내에서 파드들과 안정적으로 다른 클라이언트들과 통신할 수 있도록 사용되는 리소스 입니다.

 

이제 서비스에 대해 좀 더 자세히 알아보도록 하겠습니다.

Service 생성

서비스는 파드들과 연결되어 클라이언트들과 통신을 하는데, 파드들과 어떻게 연결이 될까요?

 

이에 필요한 것이 Label Selector 입니다.

 

레플리카컨트롤러, 디플로이먼트, 파드를 생성을 할 때, Label을 생성을 해주어야


해당 Label을 Service가 보고 연결이 됩니다.

 

yaml 파일을 보면서 알아보겠습니다.

파드에서 label을 생성을 해주면, 서비스에서 해당 lable을 selector로 지정을 해주면 연결이 됩니다.

ex) 
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels: # Pod 생성 시에 labels 생성
    app.kubernetes.io/name: proxy 
spec:
  containers:
  - name: nginx
    image: nginx:stable
    ports:
      - containerPort: 80
        name: http-web-svc
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector: # app.kubernetes.io/name=proxy label에 있는 모든 파드가 해당 서비스에 연결
    app.kubernetes.io/name: proxy
  ports:
  - name: name-of-service-port
    protocol: TCP
    port: 80
    targetPort: http-web-svc

 

서비스에는 여러가지 Type이 있는 이에 대해 알아보겠습니다.

 


ClusterIP

  • 쿠버네티스 Service의 기본 서비스 유형 입니다.
  • Service의 Type을 지정하지 않거나, ClusterIP Type으로 지정을 해주어 사용할 수 있습니다.
  • 해당 Type으로 서비스를 생성을 하면, 클러스터 내에서만 통신이 가능합니다.

NodePort

  • 외부 클라이언트가 클러스터 내의 파드와 접근 할 수 있도록 노드의 특정 포트를 열어주어 통신 할 수 있게 해주는 서비스 입니다.
  • 아래 그림과 같이 서비스 Type을 NodePort로 해주면, 파드가 생성된 Worker Node에서 Open된 포트로 외부 클라이언트가 통신 할 수 있습니다.

가볍게 실습으로 알아보겠습니다.

아래와 같이 Pod와 그에 맞는 서비스 yaml을 작성해줍니다.

=>nginx.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app.kubernetes.io/name: proxy
spec:
  containers:
  - name: nginx
    image: nginx:stable
    ports:
      - containerPort: 80
        name: http-web-svc
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app.kubernetes.io/name: proxy
  type: NodePort # 서비스 Type을 NodePort로 설정
  ports:
  - name: name-of-service-port
    protocol: TCP
    port: 80
    targetPort: http-web-svc

해당 yaml 파일로 Pod와 서비스를 생성 해주면 아래와 같이 생성됩니다.

node4에 Pod가 생성이 되었고, NodePort는 32033 입니다.

이제 정상적으로 서비스와 파드가 연결이 된 것을 확인하려면,
URL에 <node4의 IP>:<생성된 NodePort>로 검색을 해보면 됩니다.

 

 

LoadBalancer

  • 외부 로드 밸런서를 통해 애플리케이션에 접근할 수 있도록 해줍니다.
  • Public Provider (AWS, GCP, Azure 등)에서는 Service의 Type을 LoadBalancer 지정만 하면 자동으로 생성이 됩니다.
  • 다만, 온프레미스에서 구성한 k8s 클러스터에서는 metallb와 같은 추가적인 솔루션을 구성해야 사용할 수 있습니다.
  • 외부 클라이언트는 LoadBalancer 가 생성해주는 Externel-IP로 접속하면, 서비스와 연결된 파드로 연결해줍니다.

 

ExternalName

  • ExternalName Type의 서비스는 클러스터 내부에서 외부의 DNS로 직접 연결 할 수 있도록 해주는 서비스 유형 입니다.
  • 외부에서 사용되는 서비스를 클러스터 내에서도 쉽게 접근 할 수 있게 해주는 역할을 합니다.

예를 들어, db.example.com이라는 도메인이 외부에 있고
해당 도메인으로 요청을 클러스터 내부에서 바로 사용할 수 있게 설정 해주는 것이 ExternalName 타입의 서비스 입니다.

아래 yaml 파일의 내용대로 Service를 생성 하면, 클러스터 내의 애플리케이션이 db-service로 접근을 하면 자동으로 db.example.com 으로 연결이 되는 것 입니다.

apiVersion: v1
kind: Service
metadata:
  name: db-service
spec:
  type: ExternalName
  externalName: db.example.com

 

이상 입니다.

반응형