2.3 Virtual Nodes 앱 배포 및 비용 예시
앱 배포 및 Load Balancer 사용하기
1.4 앱 배포 및 Load Balancer 사용하기에서 한 과정을 동일하게 OKE Serverless 클러스터에서 수행해 봅니다.
Docker Hub 이미지 배포
가장 흔한 형태인 Public Container Registry에 이미지를 가져와서 OKE 클러스터에 배포를 해봅니다.
kubectl create deployment nginx-docker-hub --image=nginx:latest
배포 결과를 확인합니다.
- 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 타입으로 서비스 만들기
클라이언트 서비스를 위해 LoadBalancer Type으로 서비스를 생성합니다.
kubectl expose deployment nginx-docker-hub --port 80 --type LoadBalancer --name nginx-docker-hub-svc
서비스 생성 결과를 확인하면 아래와 같이 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
서비스 주소인 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)에 대한 보안 규칙 또한 추가해 줘야 합니다.
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:
Stateless Destination IP Protocol Source Port Range Destination Port Range No 10.0.10.0/24 TCP All 30000-32767 No 10.0.10.0/24 TCP All 10256 Load Balancer -> Pod: oke-nodeseclist-~~ Security List 업데이트
- Ingress Rules:
Stateless Source IP Protocol Source Port Range Destination Port Range No 10.0.20.0/24 TCP All 30000-32767 No 10.0.20.0/24 TCP All 10256
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? 참조
이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.