TheKoguryo's 기술 블로그

 Version 2024.04.01

2.3 Virtual Nodes 앱 배포 및 비용 예시

앱 배포 및 Load Balancer 사용하기

1.4 앱 배포 및 Load Balancer 사용하기에서 한 과정을 동일하게 OKE Serverless 클러스터에서 수행해 봅니다.

Docker Hub 이미지 배포
  1. 가장 흔한 형태인 Public Container Registry에 이미지를 가져와서 OKE 클러스터에 배포를 해봅니다.

    kubectl create deployment nginx-docker-hub --image=nginx:latest
    
  2. 배포 결과를 확인합니다.

    • VCN-Native Pod Networking을 사용하고 있어, Pod의 IP로 Worker Nodes 서브넷 상의 IP를 사용하고 있습니다.
    $ kubectl create deployment nginx-docker-hub --image=nginx:latest
    deployment.apps/nginx-docker-hub created
    $ kubectl get pod -o wide
    NAME                                READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES
    nginx-docker-hub-67c59cc7d5-gkjxg   1/1     Running   0          86s   10.0.10.220   10.0.10.85   <none>           <none>
    
    • ContainerCreating 상태로 멈춘경우, Policy 적용여부를 확인합니다. 적용후 Pod를 재생성합니다.
Load Balancer 타입으로 서비스 만들기
  1. 클라이언트 서비스를 위해 LoadBalancer Type으로 서비스를 생성합니다.

    kubectl expose deployment nginx-docker-hub --port 80 --type LoadBalancer --name nginx-docker-hub-svc
    
  2. 서비스 생성 결과를 확인하면 아래와 같이 LoadBalancer 타입으로 생성되어 Public IP가 할당 된 것을 볼 수 있습니다.

    $ kubectl expose deployment nginx-docker-hub --port 80 --type LoadBalancer --name nginx-docker-hub-svc
    service/nginx-docker-hub-svc exposed
    $ kubectl get svc
    NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)             AGE
    kubernetes             ClusterIP      10.96.0.1       <none>          443/TCP,12250/TCP   10m
    nginx-docker-hub-svc   LoadBalancer   10.96.210.192   152.69.xxx.xx   80:31809/TCP        38s
    
  3. 서비스 주소인 Public IP로 접속하면, 다음과 같이 연결 오류가 발생합니다.

    $ curl http://152.69.xxx.xx
    curl: (56) Recv failure: Connection reset by peer
    
    • Comparing Virtual Nodes with Managed Nodes에서 Virtual Nodes상의 Load Balancing의 설명을 보면, 기존 OKE 클러스터에서 Load Balancer를 생성하면, 자동으로 Security List에 규칙에 추가가 되었지만, Virtual Nodes에서는 매뉴얼하게 해주어야 합니다.

    • VCN-Native Pod Networking을 사용하기 때문에 생성되는 <pod-ip>:<nodeport>에 대한 보안 규칙을 매뉴얼하게 추가합니다.

    • 또한 생성되는 Load Balancer가 Pod의 대한 Health Check시 사용하는 kube-proxy health port(10256)에 대한 보안 규칙 또한 추가해 줘야 합니다.

      image-20230523112531449

  4. Security List를 업데이트합니다.

    • pod-ip와 nodeport를 확인합니다.

      $ kubectl describe svc nginx-docker-hub
      Name:                     nginx-docker-hub-svc
      Namespace:                default
      ...
      NodePort:                 <unset>  31440/TCP
      Endpoints:                10.0.10.25:80
      ...
      
    • <pod-ip>:<nodeport>, <pod-ip>:10256만 매번 추가하거나, Pod가 속한 Worker Node 서브넷상의 모든 Node Port 범위(30000-32767)와 kube-proxy health port(10256)을 한번에 미리 추가해 놓는 방법이 있습니다. 여기서는 후자를 사용합니다.

    • Load Balancer -> Pod: oke-svclbseclist-~~ Security List 업데이트

      • Egress Rules:
      StatelessDestinationIP ProtocolSource Port RangeDestination Port Range
      No10.0.10.0/24TCPAll30000-32767
      No10.0.10.0/24TCPAll10256
    • Load Balancer -> Pod: oke-nodeseclist-~~ Security List 업데이트

      • Ingress Rules:
      StatelessSourceIP ProtocolSource Port RangeDestination Port Range
      No10.0.20.0/24TCPAll30000-32767
      No10.0.20.0/24TCPAll10256
  5. Load Balancer IP로 다시 테스트하면 정상적으로 연결됩니다.

    $ curl http://152.69.xxx.xx
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    ...
    </html>
    
Virtual Nodes에서 Pod에 대한 CPU, 메모리 할당

OCI Documentation > CPU and Memory Resources Allocated to Pods Provisioned by Virtual Nodes에서 pod spec에 정의된 requests와 limits 값을 기준으로 할당하며, 둘 다 없는 경우, 최소값으로 0.125 OCPU, 0.5GB 메모리를 할당합니다.

사용한 비용 추정

위 테스트 내용을 기준으로 가격 산정에 들어가는 항목은 아래와 같습니다. 아래 내용에 대해 시간당 비용이 발생할 것으로 추정됩니다.

  • Enhanced Cluster: 1개
  • Virtual Nodes: 3개
  • 1개 Pod 총 CPU: 0.125 OCPU -> Virtual Nodes의 최소 OCPU인 1 OCPU
  • 1개 Pod 총 Memory: 0.5 GB -> Virtual Nodes의 최소 메모리인 1 GB
  • 그외 Load Balancer 비용 등

가격 비교는 OCI Blog > Kubernetes cloud cost comparison: Who provides the best value? 참조



이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.

Last updated on 22 May 2023