본문 바로가기
Recent Study/Kubernetes 학습과정

4. Service - Cluster IP, NodePort, LoadBalancer

by Thinking 2024. 1. 4.

1.Service

: 기본적으로 자신의 Cluster IP를 가지고 있습니다. 그리고 이 서비스를 Pod에 연결시켜놓으면, 서비스의 IP를 통해서 Pod에 접근할 수 있습니다. 앞 글에서 Pod에서 똑같이 클러스터 내에서 접근할 수 있는 IP가 있었는데, 굳이 서비스를 사용하는 이유는 k8s에서 시스템 장애, 성능 장애 등 언제든지 죽을 수 있고, 그러면 다시 재생성되도록 설계되어 있는 오브젝트입니다. 파드의 IP는 재생성되면 변하기 때문에 Pod의 IP에 대한 신뢰성이 떨어집니다. 이 Service의 IP도 클러스터 내에 다른 모든 오브젝트들이 접근할 수 있지만 외부에서는 접근할 수 없습니다. Pod는 여러개 연결이 가능하고, 이렇게 여러개 연결 시켰을 때 서비스가 트래픽을 분산해서 Pod에 전달해줍니다. 

 

 즉, 클러스터 IP는 외부에서 접근할 수 없고, 클러스터 내에서만 사용하는 IP입니다. 그렇기 때문에 이 IP에 접근할 수 있는 대상은 클러스터 내부에 접근할 수 있는 운영자와 같은 사람입니다. 주된 작업은 k8s 대시보드를 관리하거나 각 Pod 서비스 상태를 디버깅할 때 사용이 됩니다.

 

 

2.NodePort

: 타입으로 만들어도 서비스에는 기본적으로 클러스터 IP가 할당되어, ClusterIP 타입과 같은 기능이 포함되고, Node 타입만의 큰 특징은 k8s 클러스터에 연결되어 있는 모든 노드한테 똑같은 포트가 할당되어 외부로부터 어느 노드건간에 그 IP의 포트로 접속하면 이 서비스에 연결이 됩니다. 서비스는 기본 역할인 자신한테 연결되어있는 Pod의 트래픽을 전달하고, 주의할 점은 Pod가 있는 노드에만 포트가 할당되는게 아니라 모든 노드에 포트가 만들어지는 것 입니다. nodeport는 30,000 ~ 32767 사이에서만 설정할 수 있습니다.

 

 즉, 물리적인 호스트 IP를 통해 Pod에 접근할 수 있는데 대부분 호스트 IP는 보안적으로 내부망에서만 접근할 수 있게 네트워크를 구성하기 때문에 클러스터 밖에는 있지만 그래도 내부망 안에서 접근을 해야할 때 쓰입니다. 일시적인 외부 연동용으로 사용할 수 있습니다.

*externalTrafficPolicy : 서비스한테 그 노드위에 올려져있는 Pod 한테만 트래픽이 가도록 해주는 것 입니다.

apiVersion: v1
kind: Service
metadata:
  name: svc-2
spec:
  selector:
    app: pod
  ports:
  - port: 9000
    targetPort: 8080
    nodePort: 30000
  type: NodePort
  externalTrafficPolicy: Local

 

 

3.LoadBalancer

: 타입으로 서비스를 만들면 기본적으로 앞에서 배운 nodeport의 성격을 가지고 있습니다. 추가로 로드 밸런서라는게 생겨서 각각의 노드의 트래픽을 분산해줍니다. 한가지 문제는 이 로드 밸런서에 접근하기 위해 외부 접속 ip주소는 개별적으로 k8s를 설치했을 때 기본으로 생성되지 않습니다. 별도로 플러그인 설치가 되어 있어야 생깁니다.

 

즉, 실제로 외부의 서비스를 노출시키려면 로드 밸런서를 이용해야 합니다. 그래야 내부 IP가 노출되지 않고, 외부 IP를 사용해서 서비스를 안전하게 노출할 수 있습니다.