IaaS/퍼블릭클라우드

EKS, GKE 비용 절감을 위한 Scaling 스케쥴러 개발

armyost 2024. 11. 5. 09:43
728x90

Public Clous가 제공하는 Managed Kubernetes Cluster를 사용할때 비용절감 방안도 중요하다

 

이때는 사용자가 많은 시간대에 NodePool(WorkerNode Group)을 Scale Out 하고 사용자가 없는 시간대에 NodePool(WorkerNode Group)을 Scale In 하는 방식으로 야간 동안의 Cost를 절감할 수 있다.

 

이를 구현하기 위해서는 

AWS Lambda, GCP CloudFunction 를 통하여 Cloud Developer SDK를 활용하면 된다. 그리고 이 FaaS를 GCP Cloud Schduler 또는 AWS EventTrigger로 주기적으로 실행시켜주면 된다.

 

아래는 GCP 예제를 담았다.

아래와 같이 ClusterManagerClient 를 통하여 SetNodePoolSizeRequest Class를 전달하면된다. 이때 이 Class에는 필요한 정보가 담겨있다.

from google.cloud import container_v1

// ...

def scale_out_function(argument):
    # Create a client
    client = container_v1.ClusterManagerClient()

    # Initialize request argument(s)
    request_val = container_v1.SetNodePoolSizeRequest(
        name="projects/sample-prj-XXXX/locations/us-central1-c/clusters/my-first-cluster-1/nodePools/default-pool",
        node_count=val_scale_out
    )
    
    # Make the request
    response = client.set_node_pool_size(request=request_val)

    # Handle the response
    print("### START - Send request ")
    print(response)
    print("### END - Send request ")

    return 200

// ...

def scale_in_function(argument):
    # Create a client
    client = container_v1.ClusterManagerClient()

    # Initialize request argument(s)
    request_val = container_v1.SetNodePoolSizeRequest(
        name="projects/sample-prj-XXXX/locations/us-central1-c/clusters/my-first-cluster-1/nodePools/default-pool",
        node_count=val_scale_in
    )
    
    # Make the request
    response = client.set_node_pool_size(request=request_val)

    # Handle the response
    print("### START - Send request ")
    print(response)
    print("### END - Send request ")

    return 200

 

소스코드에 대한 이해를 돕기 위하여 아래에 Git Repository 링크를 제공한다.

https://github.com/armyost/gke-scaler

 

GitHub - armyost/gke-scaler

Contribute to armyost/gke-scaler development by creating an account on GitHub.

github.com

 

해당 Class 정보는 다음과 같다.

 

- [Class Definition - ClusterManagerClient](https://cloud.google.com/python/docs/reference/container/latest/google.cloud.container_v1.services.cluster_manager.ClusterManagerClient)
- [Class Definition - SetNodePoolSizeRequest](https://cloud.google.com/python/docs/reference/container/latest/google.cloud.container_v1.types.SetNodePoolSizeRequest)