Service는 Pod를 추상화한 오브젝트이고 Pod들의 단일 엔드포인트를 제공하고 로드밸런싱 기능을 사용할 수 있습니다.
로드 밸런싱 알고리즘
- 서비스가 Pod들에 부하를 분산할때 디폴트 알고리즘은 Pod 간에 랜덤으로 부하 분산
Pod Client는 ServiceIP:Port를 이용하여 Pod와 통신 가능
<service-name>:<service-port>
<service-name>:<service-port>.<namespace>
Pod는 변경이 잦고 수시로 삭제되었다 생겨나기 때문에 Pod IP가 매번 변경이 됩니다.
Pod IP는 클러스터 내부에서만 접근할 수 있습니다.
[NodePort 이미지 출처: https://kim-dragon.tistory.com/52]
[ClusterIp 이미지 출처: https://kim-dragon.tistory.com/52]
ClusterIP는 내부 클러스터에서 사용하는 가상 IP 주소를 할당하여 해당 서비스에 대한 엔드포인트를 생성합니다. 이 서비스는 클러스터 내부에서만 사용 가능하며, 외부에서는 접근할 수 없습니다.
NodePort는 ClusterIP의 모든 기능을 포함하면서, 클러스터 외부에서도 해당 서비스에 접근할 수 있도록 노드의 IP 주소와 포트를 사용하여 해당 서비스를 노출합니다. 이 방식은 외부에서 해당 서비스에 접근해야 하는 경우 유용합니다.
즉, ClusterIP는 내부에서만 서비스에 접근할 수 있으며, NodePort는 외부에서도 접근할 수 있는 방식입니다.
apiVersion: v1
kind: Service
metadata:
name: order # Service 명
namespace: snackbar
labels:
app: order
spec:
type: ClusterIP
selector:
app: order # request를 전달할 Pod 집합
ports:
- port: 80 # 노출할 Service Port
targetPort: 8080 # Service Port와 연결할 컨테이너 Port, containerPort와 일치해야함
Service가 노출하는 Pod Ip와 Port의 최신 목록
[ClusterIp 이미지 출처: https://kim-dragon.tistory.com/52]
Deployment의 포트포워딩은 개발자나 운영자가 로컬 컴퓨터에서 쿠버네티스 클러스터 내부의 Pod로 직접 접근할 수 있도록 하는 것입니다. 이를 통해 로컬 환경에서 개발 중인 애플리케이션을 테스트하거나 디버깅 할 수 있습니다.
LoadBalancer 서비스는 클러스터 외부에서 애플리케이션에 접근하도록 허용하는 것입니다. 즉, 클러스터 외부에서 트래픽을 로드밸런싱하고, 서비스 디스커버리를 제공하여 클러스터 내부의 Pod로 요청을 전달합니다.
Deployment의 포트포워딩은 로컬 환경에서의 개발 및 디버깅을 위한 것이며, 로컬 환경 외부에서는 사용되지 않습니다. 반면에 LoadBalancer 서비스는 클러스터 외부에서 애플리케이션에 접근하기 위한 것이며, 고객 또는 사용자가 애플리케이션에 접근할 수 있습니다.
또한, LoadBalancer 서비스는 클라우드 제공업체에서 제공하는 로드밸런서를 사용하므로, 대규모 애플리케이션에 적합하며 안정적인 서비스 제공이 가능합니다. 반면에, Deployment의 포트포워딩은 개발 및 디버깅 단계에서만 사용되기 때문에, 일반적으로 작은 규모의 애플리케이션에서 사용됩니다.
reference:
- Kubernetes와 Docker로 한 번에 끝내는 컨테이너 기반 MSA
- subicura - kubernetes
- ChatGPT
- https://bcho.tistory.com/1262