본문 바로가기
공부/Kubernetes

[Cluster-Autoscaler] Over Provisioning with Terraform

by haejang 2023. 11. 26.
728x90
728x90

 

 

# 현상

대충 비슷하게만 재현

  • node의 cpu / memory가 거의 대부분 점유되고 있는 상황에서도 node가 늘어나지 않고 있다.
  • 내가 생각했을 때 CA를 사용하면 노드 리소스가 80% 이상 사용 중일 때 새로 노드 추가 ~ 뭐 이런식으로 진행될 줄 알았는데, 그게 아니었다.
  • 노드가 새로 추가되는건 노드에 자리가 없어서 배치되지 못하는 pod가 존재할 때 … 이다. 사실 쿠버네티스 사용 목적 등을 생각하면 그게 맞다.
  • 하지만 파드가 하나 새로 떠야되는데 그 때서야 노드 프로비저닝을 시작한다? → 느리다. → 어느정도의 over provisioning이 필요하다.

 

# Over Provisioning

https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md#how-can-i-configure-overprovisioning-with-cluster-autoscaler

생각보다 간단한 over provisioning 구현방법

  1. 낮은 priority를 갖는 dummy pod들을 생성해둔다.
  2. 노드에 자리가 없을 때, dummy 파드가 먼저 죽고 필요한 파드는 먼저 뜬다.
  3. → 배치되지 못하고 있는 dummy 파드를 위해 노드가 미리 새로 프로비저닝된다.

참조 : overprovisioning

 

overprovisioning

overprovisioning node를 scale out할때는 instace를 새로 띄우는거다보니 pod를 scale out하는 것보다 시간이 오래 걸리는데요 이 scale out 시간 절약을 위해서 미리 프로비저닝할 수 있습니다. 방법은 직관적

tommypagy.tistory.com

 

# with Terraform

## modules/eks/k8s_node_overprovisioning.tf

# priority가 -10인 priority class 생성
resource "kubernetes_priority_class_v1" "overprovisioning" {
  metadata {
    name   = "overprovisioning"
    labels = local.kube_labels
  }

  value          = -10
  global_default = false
  description    = "Priority class used by overprovisioning."
}

# 위 class 를 사용하는 pod를 생성하는 deployment 생성
resource "kubernetes_deployment_v1" "overprovisioning" {
  metadata {
    name      = "overprovisioning"
    namespace = "default"
    labels    = local.kube_labels
  }

  spec {
    replicas = 2

    selector {
      match_labels = {
        run = "overprovisioning"
      }
    }

    template {
      metadata {
        name = "overprovisioning"
        labels = {
          run = "overprovisioning"
        }
      }
      spec {
        priority_class_name              = kubernetes_priority_class_v1.overprovisioning.id
        termination_grace_period_seconds = 0
        container {
          name  = "reserve-resources"
          image = "registry.k8s.io/pause:3.9"
          resources {
            requests = {
              cpu    = 1
              memory = "2G"
            }
          }
        }
      }
    }
  }
}

 

 

# 더 고려할 점

  • 우선 cpu 1 / mem 2G 짜리 파드 2개로 더미를 구성해 두었는데, 이들이 죽어도 배치가 안될만큼의 큰 파드는 결국 바로 프로비저닝될 수 없다.
  • 그런 일이 자주 있진 않겠지만, 아무튼 이정도는 임시방편 정도라고 생각이 된다.
  • 나중에 노드 resource의 request / limit 점유량을 직접 모니터링해서 미리 프로비저닝할 수 있는 데몬셋을 개발하거나 / 카펜터를 쓰거나 해야할 것 같다.

 

 

 

728x90
728x90

댓글