코알못

[kubernetes] Service - LoadBalancer로 Pod 노출 실습 본문

ETC

[kubernetes] Service - LoadBalancer로 Pod 노출 실습

코린이s 2023. 5. 28. 15:02
728x90

저번 시간에는 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

 

728x90
Comments