본문 바로가기

네트워크/k8s

[k8s] 4. Service - ClusterIP, NodePort, LoadBalancer

Service

  • 서비스는 자신의 클러스터 아이피를 가지고 있음
  • 서비스를 파드에 연결하면 서비스의 아이피를 가지고 파드에 접근 가능
  • 파드에도 똑같이 클러스터 내에서 접근 가능한 아이피가 존재
  • 그럼 왜 서비스 아이피가 필요한가? --> 파드는 k8s에서 언제든지 뒈질 수 있고 다시 생성돼어야 함
  • 파드는 재생성되면 아이피가 변하기 때문에 신뢰성이 떨어짐
  • 서비스 아이피는 사용자가 지우지 않는 한 변하지 않음
  • 서비스의 종류는 다양함

1. ClusterIP

  • 쿠버네티스 클러스터 내에서만 접근 가능 --> 파드랑 똑같음
  • 외부에서 접근 불가능
  • 클러스터 내 여러 파드와 연결 가능
  • 여러 대의 파드와 연결하면 서비스가 트래픽을 분산하여 파드와 연결시킴

Sample YAML

apiVersion: v1
kind: Service
metadata:
  name: svc-1
spec:
  selector:
    app: pod
  ports:
  - port: 9000
    targetPort: 8080
  type: ClusterIP
  • type이 ClusterIP임
  • type은 옵션인데, 생략하면 자동으로 ClusterIP
  • 9000번 포트로 연결이 오면 8080으로 파드에 연결시킨다는 뜻
apiVersion: v1
kind: Pod
metadata:
  name: pod-1
  labels:
     app: pod
spec:
  nodeSelector:
    kubernetes.io/hostname: k8s-node1
  containers:
  - name: container
    image: kubetm/app
    ports:
    - containerPort: 8080

2. NodePort

  • 노드포트 서비스도 클러스터 아이피가 있음
  • 쿠버네티스 클러스터에 연결되어 있는 모든 노드에 똑같은 포트가 할당 됨
  • 외부로부터 어떤 노드든 간에 그 아이피의 포트에 접근하면 노드포트 서비스에 연결 됨
  • 서비스는 기본 역할인 자신한테 연결되어 있는 파드에 트래픽 전달
  • 파드가 있는 노드에만 포트가 할당되는게 아니라 모든 노드에 포트가 만들어 짐

Sample YAML

apiVersion: v1
kind: Service
metadata:
  name: svc-2
spec:
  selector:
    app: pod
  ports:
  - port: 9000
    targetPort: 8080
    nodePort: 30000
  type: NodePort
  externalTrafficPolicy: Local
  • type은 NodePort
  • nodePort가 30000인데, 보통 30000~32767의 범위를 가짐

externalTrafficPolicy: Local

원래 노드포트 서비스는 정해진 포트에 들어오면 서비스를 통해 모든 노드에 트래픽을 주는데 이 설정을 하면 특정 노드포트의 아이피로 접근하는 트래픽은 서비스가 해당 노드위에 올려져있는 파드에만 트래픽을 줌

3. Load Balancer

  • 노드포트 + 로드밸런서 구성
  • 로드밸런서가 트래픽을 분산시켜줌
  • 로드밸런서에 접근하기 위한 외부 접속 아이피주소는 개별적으로 쿠버네티스를 설치했을 때 생기지 않음 --> 별도로 외부접속 아이피를 할당해주는 플러그인이 있어야함 --> 구글 클라우드 플랫폼, AWS, AZURE...

Sample YAML

apiVersion: v1
kind: Service
metadata:
  name: svc-3
spec:
  selector:             # Pod의 Label과 매칭
    app: pod
  ports:
  - port: 9000          # Service 자체 Port
    targetPort: 8080    # Pod의 Container Port
  type: ClusterIP, NodePort, LoadBalancer  # 생략시 ClusterIP
  externalTrafficPolicy: Local, Cluster    # 트래픽 분배 역할

각 서비스 사용방법

1. ClusterIP

  • 클러스터 아이피는 외부에서 접근할 수 없고 클러스터 내에서만 사용하는 아이피
  • 따라서 클러스터 내부에 접근할 수 있는 운영자같은 인가된 사람
  • 주요 작업은 쿠버네티스 대시보드 관리, 각 파드의 서비스 상태를 디버깅하는 작업할 때 사용

2. NodePort

  • 노드포트는 특징이 물리적인 호스트의 아이피를 통해서 파드에 접근할 수 있음
  • 대부분 호스트 아이피는 보안적으로 내부망에서만 접근할 수 있게 네트워크를 구성
  • 노드포트는 클러스터 밖에 있지만 내부망 안에서 접근하기 위해 사용
  • 일시적인 외부연동용으로도 사용
  • 내부에서 개발하다가, 외부에 데모를 보여주고 싶을 때, 네트워크 중계기에 포트포워딩을 하여 외부에서 내부 시스템에 연결할 때 노드포트를 잠깐 뚫어놓고 사용
  • 쓰는 나도 뭔 말을 쓰는지 잘..

3. Load Balancer

  • 로드밸런서는 실제적으로 외부에 서비스를 노출시킬 때 사용
  • 내부 아이피를 노출시키지 않고 외부 아이피를 통해서 안정적으로 서비스를 노출시킬 수 있음
  • 외부에 시스템을 노출하는 용도로 사용

출처

인프런 대세는 쿠버네티스 강의

'네트워크 > k8s' 카테고리의 다른 글

[k8s] 6. Volume - emptyDir, hostPath, PV/PVC  (0) 2021.02.04
[k8s] 5. Service - 실습  (0) 2021.02.03
[k8s] 3. Pod - 실습  (0) 2021.01.31
[k8s] 2. 쿠버네티스 설치  (1) 2021.01.31
[k8s] 1. Pod - Container, Label, NodeSchedule  (0) 2021.01.27