서비스
- 클라이언트 입장에서 늘 변하는 파드의 IP 주소를 알기 어렵기 때문에, Kubernets에서는 서비스라는 오브젝트가 존재한다.
- 매니페스트에 서비스 타입을 지정함으로써 접근이 가능한 클라이언트의 범위를 한정한다
CluseterIP | (기본) 클러스터 내부의 파드에서 서비스의 이름으로 접근 |
NodePort | (+ClusterIP) 클러스터 외부에서도 노드 IP/포트로 접근 |
LoadBalancer | (+NodePort) 클러스터 외부에서 대표 IP주소로 접근 |
ExternalName | 클러스터 내의 파드에서 외부 IP 주소에 서비스 이름으로 접근 |
## Deployment Manifest
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deploy
spec:
replicas: 3
selector: # deployment - pod 대응용
matchLabels:
app: web
template: # 여기서부터 파드 템플릿
metadata:
labels:
app: web # 파드의 라벨
spec:
containers:
- name: nginx
image: nginx:latest
## Service Manifest
apiVersion: v1
kind: Service
metadata:
name: web-service
spec: # type을 생략하여 ClusterIP가 적용된다.
selector: # service - 백엔드 pod와 연결
app: web
ports:
- protocol: TCP
port: 80
1. ClusterIP
- 클러스터 내부에서 내부 DNS에 등록한 이름으로 특정 파드 집합에 요청을 전송할 수 있게 해준다
- 매니페스트에 clusterIP : None 으로 지정 시, 헤드리스 설정으로 서비스가 동작한다. 대표 IP 주소도 없고, 부하분산도 이뤄지지 않지만, 파드들의 IP 주소를 내부 DNS에 등록하여 파드의 IP 주소 변경에 대응하여 최신 상태를 유지한다.
2. NodePort
- ClusterIP의 기능에 추가
- 노드의 IP 주소에 공개 포트가 열린다. 클러스터 외부에서 내부의 파드에 요청을 보낼 수 있게 된다.
- 사용자가 특정 노드를 지정해서 접속하는데, 해당 노드가 셧다운되면 서비스 이용이 안된다.
- 사용 중인 포트를 설정하면 배포 과정에서 실패한다.
- 쉽고 편리하게 설정할 수 있지만, 정식 서비스에는 추천하지 않는다.
3. LoadBalancer
- 로드밸런서와 연동하여 파드의 애플리케이션을 외부에 공개한다.
- ClusterIP/ NodePort 기능에 추가
4. ExternalName
- 파드에서 K8s 클러스터 외부의 엔드포인트에 접속하기 위한 이름을 해결해 준다.
- 퍼블릭 클라우드의 DB / 인공지능 API 서비스 접근 시 사용되기에 하이브리드 구성의 어플리케이션 개발에 유용하다.
- 동일한 클라이언트에서 온 요청을 언제나 같은 파드에 요청하고 전송하고 싶다면, 매니페스트의 SessionAffinity를 ClientIP로 설정하면 된다.
- 서비스의 부하분산 알고리즘은 기본적으로 랜덤이다.
- LoadBalancer는 가용성도 있고, HTTP / HTTPS를 사용할 수 있어 정식 서비스에 적합하다.
kubectl get svc | 서비스 목록 출력 |
kubectl describe svc | 서비스의 자세한 내용을 표시 |
'서버' 카테고리의 다른 글
Kubernetes : Deployment (0) | 2022.08.15 |
---|---|
Kubernetes : Pod & Manifest (0) | 2022.08.07 |