본문 바로가기
CICD

[Kubernetes] Service(기본 오브젝트)

by 장중앙 2022. 1. 3.

Service란

Pod의 경우 IP가 랜덤하게 지정되고 재기동마다 변경, 따라서 고정된 엔드포인트 호출이 어려움

Pod간의 로드밸런싱을 지원해야하는데 Service가 이러한 역할을 수행

Service는 지정된 IP로 생성이 가능, 여러 Pod를 묶어서 로드 밸런싱 가능, 고유한 DNS 이름을 가질 수 있음

 

 

Service의 종류

Service는 Pod에 접근을 도와주는 방식에 따라 몇가지로 나뉨

Service 생성시 type에 지정가능(기본값 = Cluster IP)

  1. Cluster IP
    • Pod의 IP와 마찬가지로 쿠버네티스 Cluster내에서만 접근이 가능(외부에서는 접근 불가, Cluster 내부에서만 사용하는 IP)
    • 여러개의 Pod 연결 가능
    • 트래픽을 분산하여 Pod에 전달
  2. Node Port
    • 물리적인 Host의 IP를 통해 Pod에 접근 가능
    • NodePort타입으로 만들어도 기본적으로 Cluster IP가 할당되어 같은 기능이 포함
    • 쿠버네티스 Cluster에 연결되어 있는 모든 Node에 같은 Port를 할당(30000 ~ 32767의 범위를 가짐)
      • Pod가 있는 Node가 아닌 모든 Node에 Port가 할당됨
      • 외부로부터 어느 Node든 해당 IP와 Port로 접속한다면 해당 Service에 연결, Service는 연결된 Pod에 트랙픽 전달
  3. Load Balancer
    • 실질적으로 외부 시스템에 노출할 때 사용
      • 내부 IP를 노출하지 않고 외부 IP에 안정적으로 서비스 노출 가능
    • NodePort의 특징을 그대로 가짐
    • Load Balancer가 생겨서 각각의 Node에 트래픽을 분산
    • Load Balancer에 접근하기위한 외부 IP는 자동적으로 생성 X
      • 별도의 플로그 인을 설치하여 외부접속 IP를 할당해야함
      • 단, AWS, GCP와 같은 클라우드 플랫폼 사용 시에는 자체적으로 플러그인이 설치되어 있음

 


Service 실습


기본적인 Pod 생성 및 확인

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


 


Cluster IP를 이용한 Pod 연결 실습

Cluster IP Service 생성 (type의 기본값이 Cluster IP기 때문에 기입할 필요 없음) 

selector로 위에서 생성한 Pod 연결

apiVersion: v1
kind: Service
metadata:
  name: svc-1
spec:
  selector:
    app: pod
  ports:
  - port: 9000
    targetPort: 8080

생성된 Cluster IP Service 확인

 

master node(쿠버네티스 Cluster 내부)에서 cluster IP/port로 hostname에 접근가능을 확인

Pod 삭제 후 재생성

Pod 생성 및 Service와 연결 확인

Pod가 재생성되더라도 label과 selector가 자동적으로 Pod와 연결(모든 Service에서 적용됨)

Cluster 내부 접근 역시 정상적으로 작동


NodePort를 이용한 Pod 연결 실습

NodePort Service 생성, 위의 Pod와 Selector을 이용하여 연결

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

생성된 Service 확인

 

Master에서 NodePort를 이용한 접근

node1, node2에 의한 접근 모두 정상 작동

NodePort는 모든 Node에 Port가 할당되며, 어느 Node로 접속하든 Port번호에 맞는 Service로 연결되기 때문

 

추가적인 Pod 생성(기존의 Pod와 다른 Node에 생성)

apiVersion: v1
kind: Pod
metadata:
  name: pod-2
  labels:
     app: pod
spec:
  nodeSelector:
    kubernetes.io/hostname: k8s-node2
  containers:
  - name: container
    image: kubetm/app
    ports:
    - containerPort: 8080

NodePort Service에 2개의 Pod가 연결된 것을 확인

 

Master에서 NodePort를 이용한 접근

Node 각각의 연결된 Pod로 접근 -> node1, node2 각각 연결된 Pod에 트래픽을 분산하여 전달

* 기존 한개의 Pod에 대해 Node의 접근은 둘다 가능했지만, Node에 적용한 Pod를 삭제할 경우 해당 Node로의 접근은 불가 

 


Load Balancer를 이용한 Pod 연결은 실습 X

Load Balancer 생성, 위의 Pod와 Selector을 이용하여 연결해도 생성 불가

  -> 외부 접속을 위한 플러그인이 없기 때문

Cloud 환경을 위한 Kubernetes 학습이기 때문에 로컬, VM환경에서는 실습 진행 X

댓글