티스토리 뷰
https://subicura.com/k8s/guide/service.html
Service
Service(서비스)를 이용하여 Pod을 노출하고 클러스터 외부에서 접근할 수 있는 방법을 알아봅니다.
subicura.com
- 모든 Pod 들은 고유의 ip 를 갖고있다
- 하지만 Pod들은 deployment와 relicaSet에 의해 사라지기도 하기 때문에 Pod 과 직접 소통하는 것은 권장되지 않는다
- 따라서 별도의 고정된 IP를 갖는 서비스를 만들고 그 서비스를 통해 pod 에 접근한다
ClusterIP 서비스
ClusterIP는 클러스터 내부에 새로운 IP를 할당하고 여러 개의 Pod을 바라보는 로드밸런서 기능을 제공한다.
그리고 서비스 이름을 내부 도메인 서버에 등록하여 Pod 간에 서비스 이름으로 통신할 수 있다.
counter-redis-svc.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
spec:
selector:
matchLabels:
app: counter
tier: db
template:
metadata:
labels:
app: counter
tier: db
spec:
containers:
- name: redis
image: redis
ports:
- containerPort: 6379
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: redis
spec:
ports:
- port: 6379
protocol: TCP
selector: # deployment 의 라벨과 동일하다
app: counter
tier: db
Deployment와 Service를 하나씩 만든다.
Deployment 는 app=counter, tier=db 레이블을 찾고 없다면 template 에 정의된 스펙에 따라 만들어낸다.
Service의 selector 를 보면 deployment 의 라벨과 동일하다.
이렇게 되면 이 서비스는 해당 pod을 가르키게 된다.
service/redis 의 포트 6379로 들어오면 pod/redis의 포트 6379로 연결.
apply
yml 파일을 apply 한 결과다.
redis 서비스가 생성됐고, deployment 도 생성됐다 (이에따라 pod,rs 도 생성됨)
redis의 포트는 6379다.
현재 service/redis 와 pod/redis-77b9988d97-7dgb9 가 생성된 그림이다.
- 같은 클러스터에서 생성된 pod 이라면 'redis' 라는 도메인으로 redis pod 에 접근 할 수 있다 (서비스가 자동 등록)
서비스에 접근
위에서 만든 redis 서비스에 접근할 counter 앱을 deployment 로 만든다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: counter
spec:
selector:
matchLabels:
app: counter
tier: app
template:
metadata:
labels:
app: counter
tier: app
spec:
containers:
- name: counter
image: ghcr.io/subicura/counter:latest
env:
- name: REDIS_HOST
value: "redis"
- name: REDIS_PORT
value: "6379"
env 를 보면 환경변수로 REDIS_HOST, REDIS_PORT 를 준다.
같은 클러스터 내에서 redis 라는 도메인으로 접근가능하기 때문이다.
ssh 로 접속 하고,
redis 도메인 6379 포트로 연결하면 연결이 가능하다.
Endpoint
Endpoint 는 서비스의 접속 정보를 갖고 있다.
kubectl get endpoints
현재 service/redis 의 Endpoint 는 10.244.0.37 인데 이게 뭘 의미하는 걸까?
redis pod 의 IP 주소는 10.244.0.37 이다.
즉 redis 서비스가 redis pod 를 가르키고 있는 것.
NodePort 서비스
ClusterIP 는 클러스터 내부에서만 접근 할 수 있다.
NodePort는 클러스터 외부에서 접근할수 있다.
counter-nodepart.yml
apiVersion: v1
kind: Service
metadata:
name: counter-np
spec:
type: NodePort # type 없으면 디폴트 ClusterIP
ports:
- port: 3000 # 3000번 포트로 접속
protocol: TCP
nodePort: 31000 # 노드에 오픈되는 포트
selector: # pod의 레이블 지정
app: counter
tier: app
이 서비스는 pod 에 3000번 포트로 접속한다.
각 노드는 31000 포트를 오픈해서 접속할수 있게 한다.
apply
counter-np NodePort 가 생성됐다.
minikube ip
클러스터의 ip 는 172.30.11.131 이다.
그리고 31000 포트를 오픈했으므로 웹브라우저에서 '172.30.11.131:31000' 로 접근해보자.
이렇게 웹브라우저, 즉 클러스터 외부에서 접근 가능하다!
- service/counter-np NodePort가 31000포트를 열고 있다
- NodePort 로 접근하면 노드 내부의 ClusterIP를 거쳐서 pod 에 접근한다
- (service 의 CLUSTER-IP 는 서비스끼리 통신을 위한 ip로 외부에서 접근할때 사용하는 IP 가 아니다, 외부에서 접근할때는 노드의 ip 와 포트번호로 접근한다)
여러개의 노드
- NodePort는 ClusterIP의 기능을 기본으로 포함한다
- NodePort 는 클러스터의 모든 노드에 포트를 오픈한다
- 여러 개의 노드가 있다면 아무 노드로 접근해도 지정한 pod 로 접근할수 있다
LoadBalancer 서비스
NodePort의 단점
- 노드가 사라졌을때 자동으로 다른 노드를 통해 접근이 불가능하다
- 예를들어 3개의 노드가 있다면 3개 중 아무 노드로 접근해도 NodePort로 접근 가능하지만 해당 노드가 죽어있을 수도 있다
로드 밸런서는 이런 문제를 해결한다.
브라우저는 NodePort 에 직접 요청하지 않고 로드 밸런서에 요청을 보내고, 로드 밸런서가 알아서 살아 있는 노드에 접근한다.
counter-lb.yml
apiVersion: v1
kind: Service
metadata:
name: counter-lb
spec:
type: LoadBalancer # 로드밸런서
ports:
- port: 30000
targetPort: 3000
protocol: TCP
selector:
app: counter
tier: app
apply
<pending> (보류중) 이라고 나와있다.
로드밸런서는 AWS 같은 클라우드 환경이 아니면 사용이 제한적이고 현재 AWS 같은 외부 클라우드의 IP가 존재하지 않기 때문이다.
metallb 애드온으로 가상환경을 만들어 줄 수 있다.
'Web > Kubernetes' 카테고리의 다른 글
minikube addons enable ingress 시 MK_ADDON_ENABLE 에러 (0) | 2024.01.08 |
---|---|
Kubernetes로 배포하기, yml 정리 (0) | 2024.01.06 |
Kubernetes Deployment (0) | 2024.01.06 |
Kubernetes ReplicaSet (0) | 2024.01.05 |
Kubernetes Pod (0) | 2024.01.05 |
- Total
- Today
- Yesterday
- Tree
- CSS
- C++
- db
- 자료구조
- dfs
- priority queue
- binary search
- MVC
- Implementation
- Stack
- 조합
- Unity
- 재귀
- C
- Dijkstra
- Spring
- Kruskal
- two pointer
- back tracking
- floyd warshall
- 이분탐색
- DP
- permutation
- graph
- Brute Force
- BFS
- Python
- greedy
- recursion
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |