이번 글에서는 Kubernetes의 구성 요소 중 하나인 Service의 기초에 대해 작성하고자 합니다. 해당 글은 Inflearn의 '대세는 쿠버네티스 [초급~중급]' 강의를 학습하면서 작성한 글임을 미리 알려드립니다. Kubernetes의 pod는 재생성될 때마다 IP가 초기화되는 것과 같이 영구적이지 않다는 특성을 가지고 있습니다. 따라서 pod가 재생성되더라도 외부 혹은 내부에서 접근이 용이하도록 Service를 사용합니다. Service의 유형은 크게 1) ClusterIP, 2) NodePort, 3) Load Balancer 등이 있으며, 차례대로 살펴보도록 하겠습니다.
위에서 간단하게 언급한 것처럼, pod는 메모리 및 CPU 이슈로 인해 언제든지 내려갈 수 있고, 재생성되기는 하지만 IP가 변하게 됩니다. 반면 service는 사용자가 직접 삭제하지 않는 이상 재생성되지 않기 때문에, service의 IP로 항상 pod에 접근하는 것이 가능합니다. 이러한 특성으로 인해 service를 주로 사용하게 되고, service가 기본적으로 가지고 있는 IP가 ClusterIP입니다. 또한, Service에는 하나 이상의 pod를 연결할 수 있으며, pod가 여러 개일 경우에는 트래픽을 분산해서 전달한다는 특징을 가지고 있습니다.
ClusterIP는 cluster 내에서는 모든 object에 접근하는 것이 가능하지만, 외부에서는 접근하는 것이 불가능합니다. 따라서 ClusterIP에 접근할 수 있는 대상은 운영자와 같은 인가된 사용자 등으로 제한되며, kubernetes 대시보드 관리 및 pod 디버깅 작업을 진행할 때 ClusterIP를 주로 사용합니다.
관련된 코드는 다음과 같습니다. Pod에서 지정한 label을 service 생성 시 selector를 통해 지정해 주고, type을 ClusterIP로 설정하면 됩니다. ClusterIP는 service의 default type이기 때문에 생략해도 무방합니다. service IP의 9000번 port로 접속을 하면, 8080번 port를 가진 pod-1로 연결됩니다.
apiVersion: v1
kind: Pod
metadata:
name: pod-1
labels:
app: pod
spec:
containers:
- name: container
image: kube/app
ports:
- containerPort: 8080
apiVersion: v1
kind: Service
metadata:
name: svc-1
spec:
selector:
app: pod
ports:
- port: 9000
targetPort: 8080
type: ClusterIP
다음 유형은 NodePort로, ClusterIP가 할당되는 것은 기본이고, 해당 cluster에 연결되어있는 모든 node에 동일한 port를 부여합니다. 따라서 연결된 각 node에 port만 동일하게 입력하면, 같은 service로 연결됩니다. 다만 service에 연결된 pod가 node에 없더라도, cluster에 연결되어 있으면 port가 부여되는 특징이 있습니다. NodePort는 host IP를 통해 pod에 접근한다는 특징이 있어, 내부망 안에서 접근해야하는 경우 혹은 데모와 같은 일시적인 외부 연동용으로 사용이 됩니다.
NodePort와 관련된 코드는 다음과 같습니다. nodePort는 30000~32767 사이값을 사용해야 합니다. 만약 접속하는 node에 위치한 pod에만 트래픽을 전달하고 싶으면, externalTrafficPolicy: Local 옵션을 추가하면 됩니다.
apiVersion: v1
kind: Service
metadata:
name: svc-2
spec:
selector:
app: pod
ports:
- port: 9000
targetPort: 8080
nodePort: 30000
type: NodePort
마지막 유형은 LoadBalancer로, nodePort의 특성을 비롯하여 각 node에 트래픽을 분산시켜주는 기능을 수행합니다. LoadBalancer로 접속하기 위해서는 external(외부) IP가 필요하기 때문에, 외부 IP를 할당해 주는 plugin을 설치해야 합니다. AWS, GCP 등의 CSP를 사용할 경우, 자체적인 plugin이 있어 따로 설치가 필요하지는 않습니다. 외부 IP가 할당되면, 내부 IP를 노출시키지 않고 외부에서 접속하는 것이 가능해지므로, 실제 서비스를 노출시키는데 LoadBalancer를 활용합니다.
코드는 다음과 같이 간단합니다.
apiVersion: v1
kind: Service
metadata:
name: svc-3
spec:
selector:
app: pod
ports:
- port: 9000
targetPort: 8080
type: LoadBalancer
* 강의 내용을 복습하면서 정리한 것이므로, 내용적으로 유사한 부분이 많다는 점 양해부탁드립니다.
<참고>
대세는 쿠버네티스 [초급~중급] - 인프런 | 강의
쿠버네티스는 앞으로 어플리케이션 배포/운영에 주류가 될 기술 입니다. 이 강좌를 통해 여러분도 대세에 쉽게 편승할 수 있게 됩니다., 현존 최고의 앱 운영 및 배포 기술, 쿠버네티스를 만나
www.inflearn.com
https://honggg0801.tistory.com/48
Kubernetes - Service
Service란 쿠버네티스 외부 또는 내부에서 Pod에 접근할 때 사용하는 기능이다. service를 사용하는 이유는 Pod는 서버와 같이 영구적인 것이 아니라 일회적인 것이기 때문이다. 서버는 문제가 생기면
honggg0801.tistory.com
'MLOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] Volume 기초 - emptyDir, hostPath, PVC/PV (2) | 2023.12.10 |
---|---|
[Kubernetes] PostgreSQL 설치 및 실행 (4) | 2023.11.29 |
[Kubernetes] Helm 설치 (1) | 2023.11.15 |
[Kubernetes] Pod 기초 (0) | 2023.11.13 |
[Kubernetes] minikube 설치 및 실행 (Linux) (2) | 2023.11.10 |
댓글