DevOps/Kubernetes

Networking/Service

MiteDev 2023. 12. 28. 11:52

Service란?

  Service는 Pod에서 실행중인 어플리케이션을 네트워크에 노출시키기 위한 추상적인 객체입니다. 기본적으로 쿠버네티스에 존재하는 Pod는 클러스터 내부에서만 접근이 가능한데 Service는 클러스터 외부에서 Pod에 접근이 가능하도록 해줍니다. 또한 쿠버네티스 클러스터에 띄워져있는 Pod들의 단일 진입점을 제공해주는데 Deployment, ReplicaSet 등을 통해 여러 Node에 Pod를 배포하거나, 이미 생성되어 있는 Pod들이 삭제, 업데이트, scale-out 되었을 때 등 Pod의 Internal IP들이 계속해서 생성되고 삭제됩니다. 이때 해당 Pod들에 접근하기 위한 단 하나의 IP를 제공해주며 이를 ClusterIP라 합니다.  (Service에서 해당 Pod들에 대한 Load-Balancer 역할을 담당)

 

 (Service를 생성하는 경우 Endpoints와 EndpointSlice 객체가 생성되는데 이는 selector가 지정되지 않은 Service에 대한 설명과 함께 다른 문서에 작성할 예정)

   

Service Type

1. ClusterIP

  Service에 쿠버네티스 클러스터 내부에서만 접근이 가능한 ClusterIP를 할당해줍니다. spec.type을 할당하지 않은 경우의 Service Type은 자동으로 ClusterIP로 지정됩니다.

apiVersion: v1
kind: Service
metadata:
	name: service-nginx
spec:
    selector:
    	tier: frontend #Service를 물릴 Pod의 Label
    clusterIP: 10.96.144.52 #생략하면 자동으로 빈 IP가 할당됨
    ports:
      - targetPort: 80 #Service를 물릴 Pod의 Port
    	port: 80 #Service의 Port
        protocol: TCP
    type: ClusterIP #생략가능

  

2. NodePort

  Service가 물고있는 Pod가 배포된 Node의 Port를 열어 클러스터 외부에서 NodeIP:Port를 통해 Service에 접근할 수 있으며, 해당 Service에서 어떤 Node에 배포된 Pod로 요청을 보낼지 Load Balancing을 합니다.

apiVersion: v1
kind: Service
metadata:
	name: service-nginx
spec:
    selector:
    	tier: frontend #Service를 물릴 Pod의 Label
    clusterIP: 10.96.144.52 #생략하면 자동으로 빈 IP가 할당됨
    ports:
      - targetPort: 80 #Service를 물릴 Pod의 Port
    	port: 80 #Service의 Port
        nodePort: 30080 #외부로 노출시킬 Port > 30000-32767
        protocol: TCP
    type: NodePort

 

3. LoadBalancer

  AWS, GCP 등의 외부 클라우드 플랫폼에서만 사용할 수 있으며 플랫폼에서 제공하는 Load Balancer를 이용하는 방법입니다. NodePort와 같이 쿠버네티스 클러스터 외부에서 Pod에 접근이 가능합니다.