Virtual Nodes는 오픈 소스 CNCF(Cloud Native Computing Foundation)의 Virtual Kubelet 프로젝트를 사용하여 OCI Container Instance와 Kubernetes 간 변환 계층을 제공합니다.
Virtual Nodes 아키텍쳐
Virtual Nodes의 주요 요소는 다음과 같습니다.
기타 Virtual Node에 대한 제약 사항은 다음 문서의 Notable Kubernetes features and capabilities not supported when using virtual nodes 항목과 Common deployments not supported, and supported differently, when using virtual nodes 항목을 참고합니다.
이제 OKE Cluster는 기존 Managed Node 형태로 제공되는 Basic Cluster와 여러 기능을 포함하는 Enhanced Cluster로 구분됩니다. 아래 링크로 들어가면 OKE Enhanced Cluster의 릴리스 발표 내용을 볼 수 있습니다.
Enhanced Cluster에서 지원되는 기능은 다음과 같습니다.
OKE Cluster 생성 시 노드 유형을 가상(Virtual)를 선택하거나 Cluster Add-ons(빠른 생성이 아닌 사용자정의 생성인 경우 선택 가능) 기능을 선택하게 되면 해당 클러스터는 자동으로 Enhanced Cluster로 동작합니다. 참고로 Enhanced Cluster는 Basic Cluster와 다르게 Cluster 관리 비용이 발생합니다. ($0.10 / Cluster Per Hour)
이제 OKE Enhanced Cluster 및 Virtual Nodes Pool을 생성해 보도록 하겠습니다. 1) OCI Console에서 개발자 서비스 > Kubernetes 클러스터(OKE)를 차례로 클릭합니다.
2) 여기서는 빠른 생성 기능을 통해서 클러스터와 관련된 VCN도 자동으로 같이 생성하도록 하겠습니다.
3) 다음과 같이 입력 및 선택합니다.
4) 모든 내용을 검토한 후 클러스터 생성 버튼을 클릭합니다.
5) 클러스터 목록에서 생성된 클러스터를 확인할 수 있습니다.
6) 클러스터 세부 정보에서 클러스터 유형이 고급(Enhanced) 인 것을 확인할 수 있습니다.
Mushop은 오라클에서 제공하는 MSA 기반의 이커머스 데모 애플리케이션으로 여러 언어로 개발된 Polygrot 마이크로 서비스 애플리케이션입니다. 현재 Helm Chart 형태로 제공되고 있습니다.
1) 먼저 다음 git clone 명령어로 mushop Helm Chart를 다운받습니다.
$ git clone https://github.com/oracle-quickstart/oci-cloudnative.git mushop
2) mushop 폴더로 이동한 후 Helm Chart를 실행합니다. 사전에 Helm이 설치되어 있어야 합니다.
$ cd mushop
$ helm install mushop ./deploy/complete/helm-chart/mushop -f ./deploy/complete/helm-chart/mushop/values-virtual-nodes.yaml
3) 다음과 같이 총 7개의 Pod가 생성된 것을 확인할 수 있습니다.
$ kubectl get pod -n default
NAME READY STATUS RESTARTS AGE
mushop-api-6cbb9957fc-4qnr6 1/1 Running 0 84s
mushop-assets-687c574c68-7qm5h 1/1 Running 0 84s
mushop-assets-deploy-1-zl7pw 0/1 Completed 0 83s
mushop-edge-645bc886c7-swjtk 1/1 Running 0 84s
mushop-fulfillment-76f98cddbb-smfsx 1/1 Running 0 84s
mushop-session-67bc86d446-n6999 1/1 Running 0 84s
mushop-storefront-5747bd4644-b2ttp 1/1 Running 0 84s
4) External IP를 다음 명령어로 확인합니다.
$ kubectl get svc edge
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
edge LoadBalancer 10.96.251.27 140.83.xx.xxx 80:30392/TCP 2m17s
External IP로 접속이 안될 수 있습니다. 이 경우 VCN Subnet의 Security List 구성이 필요한데, Mushop 애플리케이션 접속을 위한 Security List 구성을 참고합니다.
5) Mushop의 HPA 구성을 보면, 최대 10개까지 Pod가 확장될 수 있음을 알 수 있습니다.
하나의 Virtual Node는 최대 500개까지 Pod를 확장할 수 있습니다. 또한 Pod에 대한 HPA 구성은 사용자가 직접 구성하여야 합니다. K8s HPA에 대한 내용은 https://kubernetes.io/ko/docs/tasks/run-application/horizontal-pod-autoscale/ 에서 확인합니다.
$ kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE mushop-api Deployment/mushop-api 0%/70% 1 10 1 3m44s mushop-assets Deployment/mushop-assets 0%/70% 1 10 1 3m44s mushop-edge Deployment/mushop-edge 0%/70% 1 10 3 3m44s mushop-storefront Deployment/mushop-storefront 0%/70% 1 10 2 3m44s
6) 부하를 주기위한 시뮬레이션 파드를 배포합니다.
$ kubectl create -f https://raw.githubusercontent.com/oracle-quickstart/oci-cloudnative/master/src/load/load-dep.yaml
7) 다시 확인해 보면 Replicas가 최대치로 늘어난 것을 확인할 수 있습니다.
$ kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
mushop-api Deployment/mushop-api 0%/70% 1 10 10 8m8s
mushop-assets Deployment/mushop-assets 0%/70% 1 10 10 8m8s
mushop-edge Deployment/mushop-edge 13%/70% 1 10 10 8m8s
mushop-storefront Deployment/mushop-storefront 8%/70% 1 10 10 8m8s
Managed Node와는 다르게 Load Balancer 서비스를 생성할 때 자동으로 Security List에 Ingress 및 Egress Rule이 추가되지 않습니다. 따라서 사용자는 수동으로 Security List의 Rule을 구성해줘야 합니다. 관련된 공식 문서는 다음 링크를 참고하세요.
1) 먼저 Load Balancer를 위한 Subnet에 대한 Security List를 구성해야 합니다. 만일 빠른 생성으로 클러스터를 생성하였다면 oke-svclbseclist-라는 이름으로 시작하는 Security List에 추가하면 됩니다.
State | Source | Protocol/Dest. Port | Description |
---|---|---|---|
Stateful | 0.0.0.0/0 or specific CIDR | TCP/443 | Allow inbound traffic to Load Balancer. |
Stateful | 0.0.0.0/0 or specific CIDR | TCP/80 | Allow inbound traffic to Load Balancer. |
State | Source | Protocol/Dest. Port | Description |
---|---|---|---|
Stateful | Worker nodes CIDR | ALL/30000-32767 | Allow traffic to worker nodes. |
Stateful | Worker node subnet CIDR | ALL/10256 | Allow OCI load balancer or network load balancer to communicate with kube-proxy on worker nodes. |
2) 다음은 Virtual Node를 위한 Subnet에 대한 Security List를 구성합니다. 만일 빠른 생성으로 클러스터를 생성하였다면 oke-nodeseclist-라는 이름으로 시작하는 Security List에 추가하면 됩니다.
State | Source | Protocol/Dest. Port | Description |
---|---|---|---|
Stateful | Load balancer or network load balancer subnet CIDR | ALL/10256 | Allow OCI load balancer or network load balancer to communicate with kube-proxy on worker nodes. |
Stateful | 0.0.0.0/0 or specific CIDR | ALL/30000-32767 | Allow worker nodes to receive connections through OCI Network Load Balancer. |
3) External IP로 접속하면 다음과 같은 화면을 볼 수 있습니다. http://140.83.xx.xxx/
이 글은 개인적으로 얻은 지식과 경험을 작성한 글로 내용에 오류가 있을 수 있습니다. 또한 글 속의 의견은 개인적인 의견으로 특정 회사를 대변하지 않습니다.
Donghu Kim CLOUDNATIVE
oke virtual nodes