Home

Published

- 3 min read

Kubecost 설치

img of Kubecost 설치

개요

EKS 전환 후 Right-sizing을 위해 참고할만한 자료를 얻기 위해 kubecost를 설치했던 과정에 대한 내용이다.

EKS Add-on으로 설치하고 싶었으나 우리 서비스는 EKS 1.32로 설치 시점(약 3월경)에는 Add-on 미지원으로 인해 helm으로 설치하였다.

현재는 1.32까지 지원하고 있다. (1.33은 아직 미지원이다.)

참고: AWS 공식문서

Kubecost 설치

PV의 경우 EBS, EFS 둘 다 가능하나 현재 노드가 MultiAZ로 구성되어 있어 EFS로 선택하였다.

1. EKS module 내에 efs-csi-driver addon 추가

   aws-efs-csi-driver = {
addon_version = "v2.1.7-eksbuild.1"
}

2. EFS생성, PV 및 PVC 생성

   resource "aws_efs_file_system" "shared_storage" {
  creation_token = "${var.name}-efs"
  encrypted      = true
  kms_key_id     = var.kms_key_id
}

resource "aws_efs_mount_target" "shared_storage" {
  for_each       = toset(var.subnet_ids)
  file_system_id = aws_efs_file_system.shared_storage.id
  subnet_id      = each.value
}

resource "kubernetes_persistent_volume" "shared_storage" {
  metadata {
    name = "${var.name}-pv"
  }

  spec {
    capacity = {
      storage = "20Gi"
    }

    volume_mode  = "Filesystem"
    access_modes = ["ReadWriteMany"]

    persistent_volume_reclaim_policy = "Retain"

    storage_class_name = "efs-sc"

    persistent_volume_source {
      csi {
        driver        = "efs.csi.aws.com"
        volume_handle = aws_efs_file_system.shared_storage.id
        fs_type       = "ext4"
      }
    }
  }
}

resource "kubernetes_persistent_volume_claim" "shared_storage" {
  metadata {
    name      = "kubecost-cost-analyzer"
    namespace = "kubecost"
  }

  spec {
    access_modes = ["ReadWriteMany"]

    resources {
      requests = {
        storage = "20Gi"
      }
    }

    volume_name        = kubernetes_persistent_volume.shared_storage.metadata[0].name
    storage_class_name = "efs-sc"
  }
}

resource "kubernetes_storage_class" "efs_sc" {
  metadata {
    name = "efs-sc"
    annotations = {
      "storageclass.kubernetes.io/is-default-class" = "true"
    }
  }

  storage_provisioner = "efs.csi.aws.com"
  reclaim_policy      = "Retain"

  parameters = {
    type      = "gp3"
    encrypted = "true"
  }
}

3. helm을 통해 kubecost 설치

위에서 PV 구성 완료하였으므로 자동생성 옵션 제거

   helm upgrade -i kubecost oci://public.ecr.aws/kubecost/cost-analyzer --version 2.7.0 \
    --namespace kubecost --create-namespace \
    --set persistentVolume.enabled=false \
    --set prometheus.server.persistentVolume.enabled=false \
    -f https://raw.githubusercontent.com/kubecost/cost-analyzer-helm-chart/develop/cost-analyzer/values-eks-cost-monitoring.yaml

4. 포트포워딩하여 접속

   kubectl port-forward --namespace kubecost deployment/kubecost-cost-analyzer 9090

마치며

kubecost_example

노드 타입 선택에도 도움이 됐지만 처음에 OOM으로 죽던 파드들의 Memory 조절에 가장 도움이 되었다.