
Kubernetes Service
Kubernetes Service는 Kubernetes 클러스터 내에서 실행 중인 애플리케이션을 네트워크를 통해 접근할 수 있도록 하는 추상화된 방법이다.
Service는 여러 Pod에 걸쳐 로드 밸런싱을 제공하고, Pod의 IP 주소가 변경되더라도 안정적인 네트워크 엔드포인트 즉, 동일한 서비스를 제공하는 Pod 그룹의 단일 진입점을 제공한다
Kuberntes에서 제공하는 Service는 총 4가지 종류가 있다.
- ClusterIP: 기본 서비스 유형으로, 클러스터 내부에서만 접근 가능
- NodePort: 클러스터 외부에서 접근할 수 있도록 각 노드의 특정 포트를 열어준다
- LoadBalancer: 클라우드 제공자의 로드 밸런서를 사용하여 외부 트래픽을 분산시킨다.
- ExternalName: DNS 이름을 외부 서비스로 매핑한다.
ClusterIP
ClusterIP 서비스는 Kubernetes에서 기본적으로 제공되는 서비스 유형으로, 클러스터 내부 IP를 통해 서비스를 노출한다.
Selector를 통해 pod 각각의 lable을 모아 Pod 그룹을 구분하므로, 당연히 각각의 파드가 어떤 워커노드에서 실행되는지 개발자는 알 필요가 없다.
이 서비스 유형은 클러스터 내부에서만 접근이 가능하며, 주로 클러스터 내의 다른 서비스 간의 내부 통신에 사용된다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 8080
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
maxSurge: 1
apiVersion: v1
kind: Service
metadata:
name: my-clusterip-service
labels:
app: nginx
spec:
type: ClusterIP
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 8080
Kuberntes의 Service를 사용해 Pod그룹의 단일 진입점을 만들때는 selector와 같은 label이 사용되도록 pod 그룹의 label을 설정 해주는 것이 포인트이다. 나머지는 kubernetes가 알아서 같은 그룹내의 pod로 loadbalancing 해줄것이다. 굉장히 편리하다..
여기서는 replicas=3 이니, 총 3개의 pod에 loadbalancing이 구현 될 것이다.
해당 서비스로 접속테스트 하는 방법은 포트포워딩을 한후 curl로 접속 테스트를 해보면 된다.
kubectl port-forward service/my-clusterip-service 9090:80
curl http://localhost:9090
NodePort
Kubernetes의 Service는 ClusterIP의 형태를 알고나면 나머지는 활용이므로 훨씬 이해하기 쉽다.
ClusterIP가 클러스터 내부에서만 접근이 가능한 Pod그룹내의 단일 진입점이라면,
NodePort는 클러스터 외부에서도 접근이 가능한 node의 특정 포트를 열어주는 서비스 유형이다.
말로만 설명하면 이해하기 쉽지 않으니 그림으로 이해해보자
보기엔 복잡해보이지만 ClusterIP의 그림에서 단지 node들의 IP에 port가 추가된 것뿐이다.
ClusterIP Service와 다른점을 비교하면서 보면 이해가 쉽다.
- ClusterIP Service
- Pod 그룹내의 단일진입점을 지원하므로, 진입하는 ip가 서비스에 할당된 Cluster 내부 IP로 정해져있다.
- Cluster 내부에서만 진입이 가능하다.
- Nodeport Service
- 각각의 노드에 외부에서 진입가능한 포트를 열어주는 것이므로 진입시 경로가 nodeHostIP:nodeport 가 된다. 따라서 진입점은 노드의 개수에 따라 가변적이다.
- Cluster 외부에서도 접근이 가능하다.
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
labels:
app: my-app
spec:
type: NodePort
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30001
Q,node1, node2, node3의 label이 nginx인 pod2개가 각각의 노드에 랜덤으로 배치되었을때,
pod가 배치되지않은 node의 hostIP:nodeport로 진입하면 어떤일이 생기는지?
NodePort 서비스는 모든 노드에서 포트를 열기 때문에, Pod가 없는 노드에서도 그 포트로 들어오는 트래픽을 수신할 수 있다. 따라서 이 트래픽은 Kubernetes의 kube-proxy에 의해 서비스에 연결된 Pod로 라우팅된다.
NodePort 자체는 로드 밸런싱 기능을 제공하지 않지만, Kubernetes는 kube-proxy를 통해 연결된 모든 Pod들로 트래픽을 분산시키는 특성을 가지고 있기 때문에 그런 것이지, NodePort에서 제공하는 기능은 아니다.
LoadBalancer vs Nodeport
Q,kube-proxy에 의해 관리되는 Kubernetes 서비스의 로드 밸런싱 메커니즘이 로드밸런싱을 지원한다면 nodeport service와 loadbalancer service는 차이점이 무엇일까? 결국 kube-proxy에 의해 관리되는 Kubernetes 서비스의 로드 밸런싱 메커니즘이 로드밸런싱을 지원하는데 loadbalancer service 존재의 의의가 없어지는 것이 아닌가?
라는, 의문이 들 수 있다.
NodePort 서비스와 LoadBalancer 서비스는 Kubernetes에서 외부 트래픽을 관리하는 데 사용되지만, 그 목적과 작동 방식에서 차이가 있고, 이 두 가지 서비스의 차이점과 각 서비스의 역할을 명확히 이해하면, LoadBalancer 서비스의 존재 이유도 이해할 수 있다.
NodePort 서비스
- 목적: NodePort 서비스는 클러스터 외부에서 Kubernetes 클러스터 내부의 서비스를 접근 가능하게 한다.
- 동작 방식:
- 클러스터의 각 노드에서 동일한 포트를 연다.
- 외부 트래픽이 이 포트를 통해 들어오면, kube-proxy가 트래픽을 적절한 Pod로 라우팅한다.
- 특징:
- 클러스터의 모든 노드에서 접근 가능한 포트를 열기 때문에, 트래픽을 수신할 수 있는 여러 진입 지점을 제공한다.
- 클라이언트는 노드의 IP와 NodePort를 알고 있어야 한다.
- 직접적인 로드 밸런싱 기능은 없지만, 서비스 내부에서 kube-proxy가 Pod들 간에 트래픽을 분산시킨다.
- 외부에서 접근하려면 클러스터 노드의 IP 주소와 포트를 알고 있어야 한다.
LoadBalancer 서비스
- 목적: LoadBalancer 서비스는 클라우드 제공자의 로드 밸런서를 사용하여 외부 트래픽을 Kubernetes 클러스터 내부의 서비스로 라우팅한다.
- 동작 방식:
- 클라우드 제공자 (예: AWS, GCP, Azure)에서 제공하는 로드 밸런서를 자동으로 생성하고 설정한다.
- 외부 트래픽이 클라우드 로드 밸런서를 통해 들어오면, 트래픽이 Kubernetes 서비스로 라우팅된다.
- 특징:
- 클라우드 제공자의 로드 밸런서를 통해 외부 트래픽을 분산시킨다.
- 클라이언트는 클라우드 로드 밸런서의 IP 주소만 알면 된다.
- 자동으로 외부 IP를 할당받아 관리하기 때문에 설정이 간편하다.
- 클라우드 제공자의 고유 기능을 활용할 수 있다. (예: SSL 종료, 헬스 체크, 고가용성 등).
차이점 요약
- 접근성:
- NodePort: 클러스터 노드의 IP 주소와 포트를 알고 있어야 접근 가능하다
- LoadBalancer: 클라우드 제공자의 로드 밸런서를 통해 접근 가능. 따라서 외부 IP 주소만 알면 된다.
- 설치 및 관리:
- NodePort: 설정이 간단하지만, 클러스터 노드의 IP 주소와 포트를 관리해야 한다.
- LoadBalancer: 클라우드 제공자가 로드 밸런서를 자동으로 설정하고 관리해 준다.
- 로드 밸런싱 기능:
- NodePort: Kubernetes 서비스가 내부적으로 로드 밸런싱을 수행하지만, 외부적으로는 클러스터 노드의 IP 주소와 포트를 직접 관리해야 한다.
- LoadBalancer: 클라우드 제공자의 로드 밸런서가 외부 트래픽을 분산시킨다.
정리
- NodePort 서비스: 간단하고, 클러스터 내 모든 노드에서 접근 가능한 포트를 제공하여 외부 트래픽을 클러스터 내부로 라우팅하는 기본적인 방법을 제공한다.
- LoadBalancer 서비스: 클라우드 환경에서 외부 트래픽을 쉽게 관리하고 분산할 수 있도록 도와줍니다. 클라우드 제공자의 로드 밸런싱 기능을 활용하므로 안정성과 활용성이 높다.
LoadBalancer 서비스는 특히 클라우드 환경에서 NodePort 서비스보다 더 높은 수준의 관리와 편의성을 제공하며, 클라우드 제공자의 고유한 로드 밸런싱 기능을 활용할 수 있다는 것이 핵심이다.
'Containar' 카테고리의 다른 글
kubernetes Deployment rollingupdate: 무중단 배포하기 (1) | 2024.07.23 |
---|---|
kubernetes controller - ReplicaSet VS ReplcationController (1) | 2024.07.20 |
Kubernetes Pod - livenessProbe, init & infra Container (0) | 2024.07.20 |
kubernetes Pod 기능 활용하기: namespace, multi container pod (0) | 2024.06.05 |
쿠버네티스 기초 다지기: 동작 원리, kubectl 사용법 (0) | 2024.06.01 |

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!