일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
- notification system
- Buffered channel
- gitops
- Kubernetes
- System Design
- 디자인패턴
- body size
- intellij ide
- Infra
- GoF
- 배포 프로세스
- GoF 디자인패턴
- UnBuffered channel
- 대규모 시스템 설계
- elasticsearch
- golang
- go
- Helm V3
- apollo router
- 윈도우키보드
- 티스토리챌린지
- Intellij
- 컴포지트패턴
- Logrus
- 배포 파이프라인
- 오블완
- goland
- http 413
- AWS
- Golines
- Today
- Total
Fall in IT.
Kubernetes Service 개념정리 본문
Service Object 란?
파드에 접근할 수 있는 정책을 정의하는 개념.
서비스는 기본적으로 자신의 클러스터 IP를 가지고 있고 이 서비스를 파드에 연결하면 서비스의 아이피로 파드에 접근이 가능하다.
파드에도 자신의 클러스터 IP를 가지고 있다. 그렇다면 왜 서비스를 통해서 파드에 접근해야할까?
그 이유는, 파드라는 존재는 언제든지 죽을 수 있고 재생성될 수 있다. 파드의 아이피는 가변적이라 재생성되면 변한다.
그렇기 때문에 파드의 아이피는 신뢰성이 떨어지고 서비스 오브젝트는 지우지 않는 한 삭제되지 않는다.
따라서, 특정 파드에 일관된 아이피를 통한 접근을 가능하게 하기 때문에 서비스를 사용한다.
Service의 특징
- 고정된 IP 사용 가능
- 파드를 다양한 방식으로 외부에 노출 가능
- 트래픽 분산 가능
Service 의 종류
서비스의 종류는 세 가지가 있고 종류에 따라서 파드에 접근하는 방식이 다르다.
서비스의 종류는 아래와 같이 세 가지가 존재한다.
- ClusterIP (default)
- NodePort
- Load Balancer
ClusterIP
외부에서 접근 불가.
쿠버네티스 클러스터 내에서만 접근이 가능한 아이피이다. 클러스터내에 모든 오브젝트들이 접근 가능하고 외부에서는 접근이 불가능하다. 여러개의 파드에 연결이 가능하고, 이럴 경우 서비스가 트래픽을 분산해서 파드에 전달해준다.
# Define Service Object
apiVersion: v1
kind: Service
metadata:
name: svc-1
spec:
selector: # Pod의 Label과 매칭
app: pod
ports:
- port: 9000 # Service 자체의 port
target: 8080 # Pod의 Container Port
type: ClusterIP # 생략시 ClusterIP가 default값
# Define Pod Object
apiVersion: v1
kind: Pod
metadata:
name: pod-1
labels:
app: pod
spec:
containers:
- name: container
image: test-image/app
ports:
- containerPort: 8080
NodePort
NodePort는 외부에서 접근이 가능한 타입이다.
쿠버네티스 클러스터에 연결되어있는 모든 노드에 port가 할당이 되어서 외부로부터 어느 노드건 노드 아이피의 포트로 접속을 할 경우 해당 서비스에 연결이 된다. 서비스는 자신에게 연결되어 있는 파드에 트래픽을 전달한다. (모든 노드에 포트가 할당되는게 큰 특징이다.)
NodePort의 범위는 30000 ~ 32767 에서만 가능하며, 특정 포트를 지정하지 않을경우 해당 범위내에서 자동으로 할당이 된다.
추가적으로, externalTrafficPolicy: local 옵션을 사용하면 각 노드에 파드가 할당되어 있을때 특정 노드 포트의 아이피로 접근하는 트래픽은 서비스가 해당 노드위에 올라가있는 파드에 트래픽을 할당하도록 설정할 수 있다.
apiVersion: v1
kind: Service
metadata:
name: svc-2
spec:
selector:
app: pod
ports:
- port: 9000
target: 8080
nodePort: 30000
type: NodePort
Load Balancer (외부 시스템 노출용)
NodePort의 성격을 그대로 가지고 있다. 추가적으로 로드밸런서라는게 생겨서 각각의 노드에 트래픽을 분산시켜주는 역할을 한다.
로드밸런스에 접근을 하기위한 외부 접속 아이피 주소는 기본적으로 생기지 않고 별도로 외부접속 아이피를 할당해주는 플러그인이 있어야한다.
apiVersion: v1
kind: Service
metadata:
name: svc-3
spec:
selector:
app: pod
ports:
- port: 9000
targetPort: 8080
type: LoadBalancer
참조
https://medium.com/nerd-for-tech/kubernetes-services-f623c53213ed
'시스템구축' 카테고리의 다른 글
Github 계정 엑세스 토큰 생성 방법 (0) | 2023.01.05 |
---|---|
AWS S3, CloudFront, Lambda, Lambda@Edge를 활용한 이미지 리사이징 처리하기 (0) | 2023.01.01 |
Argo CD (GitOps) 간단하게 알아보기 (0) | 2021.06.10 |
리눅스(ubuntu)에서 sudo 패스워드 없이 사용하는법 (0) | 2018.06.28 |
리눅스 시간 UTC에서 KST로 변경하는 방법 (0) | 2018.06.27 |