Fall in IT.

Kubernetes Service 개념정리 본문

시스템구축

Kubernetes Service 개념정리

D.Y 2022. 2. 3. 17:15

Service Object 란?

파드에 접근할 수 있는 정책을 정의하는 개념.

 

서비스는 기본적으로 자신의 클러스터 IP를 가지고 있고 이 서비스를 파드에 연결하면 서비스의 아이피로 파드에 접근이 가능하다.

 

파드에도 자신의 클러스터 IP를 가지고 있다. 그렇다면 왜 서비스를 통해서 파드에 접근해야할까?

그 이유는, 파드라는 존재는 언제든지 죽을 수 있고 재생성될 수 있다. 파드의 아이피는 가변적이라 재생성되면 변한다.

그렇기 때문에 파드의 아이피는 신뢰성이 떨어지고 서비스 오브젝트는 지우지 않는 한 삭제되지 않는다.

 

따라서, 특정 파드에 일관된 아이피를 통한 접근을 가능하게 하기 때문에 서비스를 사용한다.


Service의 특징

  • 고정된 IP 사용 가능
  • 파드를 다양한 방식으로 외부에 노출 가능
  • 트래픽 분산 가능


Service 의 종류

서비스의 종류는 세 가지가 있고 종류에 따라서 파드에 접근하는 방식이 다르다.

서비스의 종류는 아래와 같이 세 가지가 존재한다.

  1. ClusterIP (default)
  2. NodePort
  3. Load Balancer

 

ClusterIP

외부에서 접근 불가.

쿠버네티스 클러스터 내에서만 접근이 가능한 아이피이다. 클러스터내에 모든 오브젝트들이 접근 가능하고 외부에서는 접근이 불가능하다. 여러개의 파드에 연결이 가능하고, 이럴 경우 서비스가 트래픽을 분산해서 파드에 전달해준다.

# Define Service Object 
apiVersion: v1
kind: Service
metadata:
	name: svc-1
spec:
	selector:         # Pod의 Label과 매칭
		app: pod
	ports:
		- port: 9000    # Service 자체의 port
		  target: 8080  # Pod의 Container Port
	type: ClusterIP   # 생략시 ClusterIP가 default값


# Define Pod Object
apiVersion: v1
kind: Pod
metadata:
	name: pod-1
	labels:
		app: pod
spec:
	containers:
		- name: container
			image: test-image/app
			ports:
				- containerPort: 8080

 

NodePort

NodePort는 외부에서 접근이 가능한 타입이다.

쿠버네티스 클러스터에 연결되어있는 모든 노드에 port가 할당이 되어서 외부로부터 어느 노드건 노드 아이피의 포트로 접속을 할 경우 해당 서비스에 연결이 된다. 서비스는 자신에게 연결되어 있는 파드에 트래픽을 전달한다. (모든 노드에 포트가 할당되는게 큰 특징이다.)

NodePort의 범위는 30000 ~ 32767 에서만 가능하며, 특정 포트를 지정하지 않을경우 해당 범위내에서 자동으로 할당이 된다.

추가적으로, externalTrafficPolicy: local 옵션을 사용하면 각 노드에 파드가 할당되어 있을때 특정 노드 포트의 아이피로 접근하는 트래픽은 서비스가 해당 노드위에 올라가있는 파드에 트래픽을 할당하도록 설정할 수 있다.

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

 

Load Balancer (외부 시스템 노출용)

NodePort의 성격을 그대로 가지고 있다. 추가적으로 로드밸런서라는게 생겨서 각각의 노드에 트래픽을 분산시켜주는 역할을 한다.

로드밸런스에 접근을 하기위한 외부 접속 아이피 주소는 기본적으로 생기지 않고 별도로 외부접속 아이피를 할당해주는 플러그인이 있어야한다.

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

 

참조

https://medium.com/nerd-for-tech/kubernetes-services-f623c53213ed

https://kubetm.github.io/k8s/

Comments