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? 참조
이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.