훈훈훈
Kubernetes :: 외부 클라이언트 노출을 위한 Service 타입 정리 본문
해당 내용 및 그림은 공식문서, 블로그 등을 참고하였습니다. 출처는 글 하단에 작성하였습니다.
서비스(Service) 란?
- 파드에서 실행되고 있는 애플리케이션을 외부로 노출 시키는 추상적인 방법
- 디플로이먼트로 관리되고 있는 여러 파드들은 재시작 할 때마다 부여받은 IP 주소가 변경되기 때문에 관리가 어렵다.
- 위의 문제점은 서비스를 이용하여 해결할 수 있다.
- 서비스는 지정된 IP로 생성 및 여러 파드들을 묶어서 관리 할 수 있으며, DNS로 조회가 가능하다.
- 서비스도 파드와 마찬가지로 REST Object 이며, 서비스 생성 시 API Server에 POST하여 새 인스턴스를 생성할 수 있다.
- 기본 프로토콜은 TCP, 다른 프로토콜은 해당 링크 참고
- 예시
1
2
3
4
5
6
7
8
9
10
|
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
|
cs |
서비스를 외부로 노출 시키는 방법
- Cluster IP
- Node Port
- Load Balancer
- Ingress
Cluster IP
- Kubernetes 기본 서비스, 클러스터 내에서 접근 가능하지만, 클러스터 외부에서는 접근할 수 없다.
- 외부에서 접근하기 위해서는 Proxy를 사용하거나, 직접 Pod로 포워딩 시켜야한다.
- 프록시는 아래 커맨드로 설정할 수 있다.
1
|
kubectl proxy --port=8080
|
cs |
- 프록시를 설정하면 아래와 같이 접근할 수 있다.
1
|
http://localhost:8080/api/v1/proxy/namespaces/<NAMESPACE>/services/<SERVICE-NAME>:<PORT-NAME>/
|
cs |
Node Port
- 외부 트래픽을 서비스로 직접 가져옴
- 모든 노드의 (VM)에서 특정 포트 할당, 해당 포트로 모든 트래픽이 서비스로 전달
- 아래 그림을 살펴보면 노드당 한개의 포트로만 통신하는 것을 볼 수 있다. (사용 가능 포트 범위 : 30000 ~ 32767)
- 노드 / VM IP가 변경된 경우 처리를 해줘야하기 때문에 실 서비스에서 사용은 권장 안함
- 또한 모든 노드에 분산 요청을 처리하기 위해서는 NodePort 보다는 Load Balancer 사용이 적절하다.
- 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: NodePort
selector:
app: MyApp
ports:
# 기본적으로 그리고 편의상 `targetPort` 는 `port` 필드와 동일한 값으로 설정된다.
- port: 80
targetPort: 80
# 선택적 필드
# 기본적으로 그리고 편의상 쿠버네티스 컨트롤 플레인은 포트 범위에서 할당한다(기본값: 30000-32767)
nodePort: 30007
|
cs |
spec.type 을 NodePort로 설정하면, 컨트롤 플레인은 지정된 범위( 30000~32767 ) 내에서 포트를 할당한다.
위 예시처럼 포트를 직접 할당할 수 있지만, 그 외 컨트롤 플레인이 지정된 범위 내에서 할당한 포트와 충돌이 발생할 수 있기 때문에 적절하지 않다.
Load Balancer
- 외부 IP를 가지고 있는 로드밸런서 할당
- 단 1개의 IP를 제공하며, 해당 IP로 모든 트래픽을 서비스로 부하분산
- 주로 클라우드 벤더에서 제공하는 제품 사용
- 벤더 마다 설정 방법은 약간씩 상이하기 때문에 사용하는 벤더에 맞게 학습 필요
- HTTP, TCP, UDP, Websockets, gRPC 등 대부분의 프로토콜과 통신할 수 있다.
Ingress
- 클러스터 내에서 서비스에 대한 외부 접근 관리하는 API 오브젝트
- 클러스터 외부에서 내부 서비스로 HTTP / HTTPS 경로 노출
- HTTP / HTTPS 이외의 프로토콜을 사용하려면 NodePort 나 LoadBalancer 유형의 서비스 정의 필요
- 라우팅은 인그레스 리소스(매니페스트 파일)에 정의된 규칙에 의해 수행
출처
- kubernetes.io/ko/docs/concepts/services-networking/service/
- 기타 도서 : 쿠버네티스 인 액션
'인프라 > Kubernetes' 카테고리의 다른 글
Kubernetes :: Iiveness probe 정리 (0) | 2020.09.06 |
---|---|
Kubernetes :: HPA(Horizontal Pod Autoscaler) 정리 (0) | 2020.08.23 |
Kubernetes :: 로컬 환경에서 웹 서버 구축하기 (2) | 2020.07.06 |