일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 분산처리
- 오블완
- 알고리즘
- 우선순위큐
- apache kafka
- Apache Hadoop
- 하둡
- 쿠버네티스
- 티스토리챌린지
- 리트코드
- leetcode
- 이진탐색
- 아파치 스파크
- 프로그래머스
- 아파치 하둡
- 도커
- 코딩테스트
- Python
- Apache Spark
- DP
- heapq
- 아파치 카프카
- 분산
- String
- docker
- programmers
- BFS
- 그래프
- Kubernetes
- 파이썬
- Today
- Total
래원
[Kubernetes] Kubernetes 기본 오브젝트 - Service 본문
[Kubernetes] Kubernetes 기본 오브젝트 - Service
Laewon Jeong 2025. 2. 6. 21:34
이번 글에서는 Kubernetes의 기본 오브젝트 중 하나인 Service에 대해 정리하려고 한다.
목차는 다음과 같다.
1. 기본 오브젝트 - Service
2. Service - ClusterIP
3. Service - NodePort
4. Service - LoadBalancer
5. Service 사용 상황
6. 마무리
1. 기본 오브젝트 - Service
Service 역시 Pod와 마찬가지로 자신의 Cluster IP를 가지게된다.
이러한 Service를 Pod에 연결하면 이 Service의 IP를 가지고 Pod에 접근이 가능해진다.
저번 글에서 Pod도 똑같이 클러스터 내에서 접근 가능한 IP가 존재한다고 했는데, 이러한 Service IP로 Pod에 접근하는 이유가 뭘까?? 이유는 다음과 같다.
Pod는 재생성 되면 IP가 변하기 때문에 신뢰성이 떨어지게되지만, Service는 사용자가 지우지 않는 한 변하지 않는다.
즉, Service를 만들어 놓고 재생성되는 Pod와 계속 연결한다면 Pod의 IP가 변하더라도 우리는 Service의 IP를 가지고 Pod에 접근할 수 있다.
이를 통해 클러스터 내 다른 서비스나 외부 애플리케이션이 특정 Pod에 직접 접근하지 않고도 지속적으로 통신할 수 있다.
Service는 사용 목적에 따라 여러 가지 유형이 있다.
- ClusterIP
- NodePort
- LoadBalancer
이제 각각에 대해 알아보자
2. Service - ClusterIP
ClusterIP 유형의 Service는 Pod와 마찬가지로 Kubernetes 클러스터내에서만 접근 가능하다.
따라서, 외부에서는 접근이 불가능하다.
그렇다면, 클러스터내에서 그냥 Pod로 접속하면 되지 왜 ClusterIP 유형의 Service를 만들고 이를 통해 접근을 해야할까?
그 이유는 ClusterIP Service가 여러 Pod과 연결될 수 있도록 해주기 때문이다.
이를 통해 트래픽이 특정 Pod에 집중되는 것을 방지하고, 부하를 여러 Pod로 효율적으로 분산할 수 있다.
이러한 Service를 구성하는 yaml 파일은 다음과 같이 구성할 수 있다.
apiVersion: v1
kind: Service
metadata:
name: svc-1
spec:
selector:
app: pod
ports:
- port: 9000
targetPort: 8080
type: ClusterIP # 생략 가능
yaml 파일 맨 아래줄에 type: ClusterIP를 확인할 수 있다.
Default 값이 ClusterIP이기 때문에 굳이 작성을 안해도 ClusterIP 유형으로 Service가 구성된다.
3. Service - NodePort
NodePort 유형의 Service를 생성하게 되면 이 역시 자신의 ClusterIP를 갖고, Kubernetes 클러스터에 연결되어 있는 모든 노드에 똑같은 포트가 할당된다.
이렇게 생성된 Port를 통해 외부에서 접근이 가능하다. 외부로 부터 어떤 노드든 간에 그 IP의 할당된 Port에 접근하면 NodePort 서비스에 연결된다.
서비스에 연결되면, 서비스는 자신한테 연결되어 있는 Pod에게 트래픽을 전달한다.
이를 통해 외부에서도 Kubernetes 내부의 Pod에 접근할 수 있게 된다.
주의할 점은 Pod가 있는 노드에만 Port가 할당되는 것이 아닌 모든 노드에 Port가 할당된다는 것이다. 따라서, 특정 노드를 알 필요 없이, 클러스터 내 어떤 노드를 통해서든 Service에 접근할 수 있다.
NodePort 유형에 Service를 구성하는 yaml 파일은 다음과 같이 구성할 수 있다.
apiVersion: v1
kind: Service
metadata:
name: svc-2
spec:
selector:
app: pod
ports:
- port: 9000
targetPort: 8080
nodePort: 30000
type: NodePort
ClusterIP와 비교했을 때, nodePort가 추가되었고, type을 NodePort로 변경되었다.
nodePort는 Kubernetes가 자동으로 30000~32767 범위 내에서 포트를 할당할 수도 있고, 직접 지정할 수도 있다.
위 yaml 파일에서 설정한 9000 포트는 cluster ip로 접근할 때 사용하는 port이고, 30000 포트는 노드로 접근할 때 사용하는 포트이다.
즉, Kubernetes 클러스터를 구성하고 있는 모든 노드에 30000 포트가 할당되고, 노드의 30000 포트로 접근하면 서비스와 연결된다.
4. Service - LoadBalancer
이는 앞서 설명한 NodePort와 LoadBalancer가 합쳐진 구성이며, 각각의 로드의 트래픽을 분산시켜주는 역할을 한다.
하지만, 이러한 Load Balancer에 접근하기 위한 외부 접속 IP 주소는 개별적으로 Kubernetes를 설치했을 때는 생기지 않는다.
이를 위해서는 별도로 외부 접속 IP를 할당해주는 Plugin이 있어야한다. 대표적으로는 GCP, AWS 등이 있다.
이를 구성하는 yaml 파일은 다음과 같다.
apiVersion: v1
kind: Service
metadata:
name: svc-3
spec:
selector:
app: pod
ports:
- port: 9000
targetPort: 8080
type: LoadBalancer
앞서 설명했듯이 개별적으로 Kubernetes를 설치하고, 위 yaml 파일을 통해 Service를 구성해도 external-ip를 할당해 주지않는다.
이제 이러한 유형의 Service들은 언제 사용해야 할지 알아보자.
5. Service 사용 상황
ClusterIP
ClusterIP는 외부에서 접근할 수 없고 클러스터 내에서만 사용하는 IP이다.
따라서, 클러스터 내부에 접근할 수 있는 운영자 같은 인가된 사람이 사용해야한다.
또한, Kubernetes 대시보드 관리 및 각 Pod의 서비스 상태를 디버깅하는 작업할 때 사용된다.
NodePort
NodePort는 물리적인 호스트의 IP를 통해서 Pod에 접근할 수 있다.
대부분 호스트 IP는 보안적으로 내부망에서만 접근할 수 있 게 네트워크를 구성하지만, NodePort는 클러스터 밖에 있지만 내부망 안에서 접근하기 위해 사용된다.
또한, 일시적인 외부연동용으로도 사용된다. 예를 들어, 내부에서 개발하다가 외부에 데모를 보여주고 싶은 경우 포트포워딩하여 외부에서 내부 시스템에 연결할 때 NodePort를 잠깐 뚫어 놓고 사용할 수 있다.
LoadBalancer
이는 실제적으로 외부에 서비스를 노출시킬 때 사용된다.
내부 IP를 노출시키지 않고 외부 IP를 통해서 안정적으로 서비스를 노출시킬 수 있다.
즉, 외부에 시스템을 노출하는 용도로 사용한다.
마무리
이번 글에서는 Kubernetes의 기본 오브젝트 중 하나인 Service에 대해 정리하였다.
다음글에서는 Volume에 대해 정리할 예정이다.
'Docker 및 Kubernetes > Kubernetes' 카테고리의 다른 글
[Kubernetes] Kubernetes 기본 오브젝트 - Pod (0) | 2025.02.04 |
---|---|
[Kubernetes] Kubernetes Dashboard 설정 (0) | 2025.01.23 |
[Kubernetes] Kubernetes 설치 (0) | 2025.01.23 |
[Kubernetes] Kubernetes란? (0) | 2025.01.22 |