일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- redash
- java
- 자동
- spring
- gradle
- 로그인
- hive
- 레디스
- Zeppelin
- Kafka
- 젠킨스
- 간단
- 예제
- login
- Mac
- EMR
- fastcampus
- config
- vue
- Cluster
- 머신러닝
- 자바
- 설정
- SpringBoot
- Jenkins
- Docker
- aws
- ec2
- Redis
- 클러스터
- Today
- Total
코알못
[kubernetes] Service - LoadBalancer로 Pod 노출 실습 본문
저번 시간에는 NodePort로 Pod 와 통신하는 실습을 진행하였다!
이번 시간에는 loadBalancer로 Pod와 통신하는 실습을 진행해보도록 하자!
order 서비스는 주문을 위해 외부 통신 해야하므로 LoadBalancer type 으로 지정하며
payment 서비스는 이전과 동일하게 외부 통신 하지 않으므로 Cluster type으로 지정한다.
이제 실습을 위한 yaml 파일을 생성하며 이전시간과 다른 부분은 order 서비스 오브젝트의 type 이 NodePort > LoadBalancer 타입인 부분이다.
# servie-v4.yaml
apiVersion: v1
kind: Service
metadata:
name: order
namespace: snackbar
labels:
service: order
project: snackbar
spec:
type: LoadBalancer
selector:
service: order
project: snackbar
ports:
- port: 80
targetPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: payment
namespace: snackbar
labels:
service: payment
project: snackbar
spec:
type: ClusterIP
selector:
service: payment
project: snackbar
ports:
- port: 80
targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: order
namespace: snackbar
labels:
service: order
project: snackbar
annotations:
kubernetes.io/change-cause: "image 1.0"
spec:
replicas: 2
selector:
matchLabels:
service: order
project: snackbar
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
template:
metadata:
labels:
service: order
project: snackbar
spec:
containers:
- name: order
image: yoonjeong/order:1.0
ports:
- containerPort: 8080
resources:
limits:
memory: "64Mi"
cpu: "50m"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: payment
namespace: snackbar
labels:
service: payment
project: snackbar
annotations:
kubernetes.io/change-cause: "image 1.0"
spec:
replicas: 2
selector:
matchLabels:
service: payment
project: snackbar
strategy:
type: Recreate
template:
metadata:
labels:
service: payment
project: snackbar
spec:
containers:
- name: payment
image: yoonjeong/payment:1.0
ports:
- containerPort: 8080
resources:
limits:
memory: "64Mi"
cpu: "50m"
클러스터에 적용한다.
$ kubectl apply -f service-v4.yaml
service/order created
service/payment created
deployment.apps/order created
deployment.apps/payment created
네임 스페이스가 snackbar인 부분에서 모든 오브젝트를 조회해보면 모두 정상이며 order 서비스의 경우 EXTERNAL-IP 이외에도 노드포트가 할당 된 부분을 볼 수 있는데 내부적으로는 노드 포트로 통신하기 때문이다.
만약 서비스 Extelnal IP:80으로 호출하면 적합한 노드를 찾아 노드 포트로 어떤 파드를 검색하면 될지 물어보고 적합한 파드 IP를 찾아서 해당 파드로 데이터를 얻어온다.
$ kubectl get all -n snackbar
NAME READY STATUS RESTARTS AGE
pod/order-55468df7b9-6hh96 1/1 Running 0 38s
pod/order-55468df7b9-ssnbl 1/1 Running 0 38s
pod/payment-5cb8974b5f-bpzmh 1/1 Running 0 37s
pod/payment-5cb8974b5f-t88pc 1/1 Running 0 37s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/order LoadBalancer 10.104.11.135 34.12.12.1 80:30668/TCP 42s
service/payment ClusterIP 10.104.5.232 <none> 80/TCP 41s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/order 2/2 2 2 41s
deployment.apps/payment 2/2 2 2 40s
NAME DESIRED CURRENT READY AGE
replicaset.apps/order-55468df7b9 2 2 2 41s
replicaset.apps/payment-5cb8974b5f 2 2 2 40s
서비스 오브젝트에 엔드 포인트가 적합하게 매핑 되었는지 확인 하면 정상적으로 2개씩 매핑 된것을 볼 수 있다.
$ kubectl get endpoints -o wide -n snackbar
NAME ENDPOINTS AGE
order 10.100.2.43:8080,10.100.3.51:8080 6m35s
payment 10.100.0.39:8080,10.100.3.52:8080 6m34s
이제 order 서비스의 External Ip , 서비스 포트 80으로 호출하면 정상적으로 통신 된다.
NodePort 와 다르게 노드IP를 찾아 볼 필요도 없고, 해당 노드에 대한 헬스체크하지 않아도 되며 해당 노드 포트에 대해 방화벽 오픈 하지 않아도 된다.
$ curl 34.12.12.1:80
Welcome to Snackbar!
Order what you want!
===== Host Info =====
HostIP: 10.100.2.43
HostName: order-55468df7b9-6hh96
$ curl 34.12.12.1:80
Welcome to Snackbar!
Order what you want!
===== Host Info =====
HostIP: 10.100.3.51
HostName: order-55468df7b9-ssnbl
$ curl 34.12.12.1:80
Welcome to Snackbar!
Order what you want!
===== Host Info =====
HostIP: 10.100.2.43
HostName: order-55468df7b9-6hh96%
이전 실습과 동일하게 환경 설정을 하고 메뉴를 order 서비스에 조회하면 정상적으로 데이터를 조회한다.
$ export ORDER=34.12.12.1
$ curl $ORDER/menus
We have 4 snacks!
1. Pizza: 10,000
2. Burger: 5,000
3. Coke: 1,000
4. Juice: 1000
===== Host Info =====
HostIP: 10.100.3.51
HostName: order-55468df7b9-ssnbl
주문 항목에 대해 얼마 나왔는지 체크 하기 위해 order 서비스에 호출 하면
order 파드에서 payment 파드와 payment 도메인(clusterIP)으로 payment 파드와 통신하여 정상적으로 가격 정보를 얻어 오는 것을 볼 수 있다.
$ curl --request POST http://$ORDER/checkout \
--header 'Content-Type: application/json' \
--data-raw '{
"Pizza": 1,
"Coke": 1,
"Burger": 0,
"Juice": 0
}'
Received from http://payment/receipt
Server is running on
- HostName: payment-5cb8974b5f-t88pc
- HostIP: 10.100.0.39
=== Here is Your Receipt! ===
[영수증]
주문한 메뉴
--------------------------
Pizza - 10000원
Coke - 1000원
Burger - 0원
Juice - 0원
--------------------------
주문금액 11000
부가세(10%) 1100
합계 12100
이제 실습을 종료하며 모두 삭제한다.
$ kubectl delete all -l project=snackbar -n snackbar
pod "order-55468df7b9-6hh96" deleted
pod "order-55468df7b9-ssnbl" deleted
pod "payment-5cb8974b5f-bpzmh" deleted
pod "payment-5cb8974b5f-t88pc" deleted
service "order" deleted
service "payment" deleted
deployment.apps "order" deleted
deployment.apps "payment" deleted
'ETC' 카테고리의 다른 글
[kubernetes] Probe(liveness,readiness) 소개 및 실습 (0) | 2023.06.03 |
---|---|
[kubernetes] Ingress 소개 및 실습 (0) | 2023.05.28 |
[kubernetes] Service - NodePort로 Pod 노출 실습 (0) | 2023.05.28 |
[kubernetes] Service 소개 및 ClusterIP로 Pod 노출 실습 (1) | 2023.05.27 |
[kubernetes] Deployment - 배포 전략 Recreate, RollingUpdate 및 롤백 (1) | 2023.05.26 |