coredns cpa

 

개요

어느날 EKS Addon으로 배포 및 관리한 coredns에 파드 오토스케일링을 적용했습니다. 그런데 어째서인지 Horizontal Pod Autoscaler가 붙지 않은 것처럼 보여 조사하다가 발견한 새로운 사실을 정리한 문서입니다.

이 가이드는 EKS Addon 중 하나인 CoreDNS에 파드 오토스케일링을 적용(설정)하는 방법과 구체적인 파드 오토스케일링 동작 방식에 대한 자세한 설명이 담겨져 있습니다.

 

배경지식

CoreDNS의 파드 오토스케일링

EKS 에드온으로 설치한 coredns에 오토스케일링이 적용하면 CPACluster Proportional Autoscaler에 의해 coredns 파드 개수가 조절됩니다.

CPA 파드는 HPA와 다르게 컨트롤플레인에 포함되어 있기 때문에 일반적인 kubectl 명령어로 조회 및 관리할 수 없습니다.

 

Cluster Proportional Autoscaler

CPACluster Proportional Autoscaler 파드는 클러스터의 크기(예: 노드 수, CPU 코어 수 등)에 비례하여 CoreDNS 파드를 자동으로 스케일링합니다. 클러스터의 규모가 커지면 CPA가 그에 맞춰 CoreDNS 파드 수를 자동으로 조정하여 적절한 성능을 유지합니다.

CPA 동작방식

다른 파드 오토스케일러인 HPAHorziontal Pod Autoscaler, VPAVertical Pod Autoscaler와 다르게 CPA는 Metrics API에 의존하지 않기 때문에 Metrics Server가 필요하지 않습니다.

 

적용방법

사전준비 사항 확인

EKS에서 CoreDNS 에드온의 파드 오토스케일링 기능을 사용하려면 크게 2가지 요구사항이 있습니다.

EKS 버전CoreDNS 에드온 버전
1.29v1.11.1-eksbuild.9
1.28v1.10.1-eksbuild.11
1.27v1.10.1-eksbuild.11
1.26v1.9.3-eksbuild.15
1.25v1.9.3-eksbuild.15

Kubernetes 1.30 버전부터는 위와 같은 복잡한 표 상관할 필요 없이 초기 에드온 버전부터 바로 지원됩니다. (예: Kubernetes 버전 1.30에 CoreDNS eksbuild.1)

 

테라폼을 사용한 CoreDNS 에드온 설정 변경

Terraform 모듈을 사용하여 EKS 클러스터를 관리하는 경우, configuration_values를 통해 애드온 설정을 코드로 정의할 수 있습니다.

 

예시: CoreDNS 파드 오토스케일링 설정
아래는 coredns 애드온에 파드 오토스케일링 설정(autoScaling)을 추가한 Terraform 코드 예시입니다.

module "eks" {
  source  = "terraform-aws-modules/eks/aws"
  version = "~> 20.0"

  cluster_name                   = local.name
  cluster_version                = local.cluster_version
  cluster_endpoint_public_access = true

  cluster_addons = {
    coredns = {
      addon_version = "v1.11.1-eksbuild.9"
      configuration_values = jsonencode({
        autoScaling = {
          enabled     = true
          minReplicas = 2
          maxReplicas = 10
        }
      })
    }
  }

  # ... truncated ...

}

 

EKS 모듈 버전과 애드온 설정
cluster_addons 설정은 terraform-aws-modules/eks 모듈 v19.1.0 이상부터 지원됩니다. EKS 애드온을 테라폼 리소스로 선언하는 기능은 v18.0.0부터 가능하지만, 애드온의 세부 설정인 configuration_values까지 적용하려면 v19.1.0 이상이어야 합니다.

 

예시: EKS 모듈 v19.1.0에서 애드온 설정
아래는 EKS 모듈 v19.1.0에서 cluster_addons를 사용하여 애드온을 설정하는 테라폼 코드입니다. 여기서는 aws_eks_addon 리소스를 통해 각 애드온을 정의하고, configuration_values에 애드온의 세부 설정을 포함시킵니다.

# main.tf (terraform-aws-eks v19.1.0)

# ... truncated ...

################################################################################
# EKS Addons
################################################################################
resource "aws_eks_addon" "this" {
  # Not supported on outposts
  for_each = { for k, v in var.cluster_addons : k => v if local.create && !local.create_outposts_local_cluster }

  cluster_name = aws_eks_cluster.this[0].name
  addon_name   = try(each.value.name, each.key)

  addon_version            = try(each.value.addon_version, data.aws_eks_addon_version.this[each.key].version)
  configuration_values     = try(each.value.configuration_values, null)
  preserve                 = try(each.value.preserve, null)
  resolve_conflicts        = try(each.value.resolve_conflicts, "OVERWRITE")
  service_account_role_arn = try(each.value.service_account_role_arn, null)

  timeouts {
    create = try(each.value.timeouts.create, var.cluster_addons_timeouts.create, null)
    update = try(each.value.timeouts.update, var.cluster_addons_timeouts.update, null)
    delete = try(each.value.timeouts.delete, var.cluster_addons_timeouts.delete, null)
  }

  depends_on = [
    module.fargate_profile,
    module.eks_managed_node_group,
    module.self_managed_node_group,
  ]

  tags = var.tags
}

# ... truncated ...

이 코드는 EKS 콘솔에서 json 형식으로 설정을 추가할 수 있도록 지원합니다.

자세한 EKS Addon 관련 테라폼 코드는 Github 링크에서 확인할 수 있습니다.

 

AWS 콘솔을 사용한 CoreDNS 에드온 설정 변경

아래는 coredns 애드온에 파드 오토스케일링을 추가한 EKS Addon 설정의 JSON 포맷 예시입니다. 최소 파드 수minReplicas를 2개 이상으로 설정하여 고가용성(HA)을 유지하는 것을 권장합니다.

{
  "autoScaling": {
    "enabled": true,
    "maxReplicas": 10,
    "minReplicas": 2
  }
}

 

요약

autoScaling 설정을 적용한 이후, 클러스터 관리자가 kubectl get hpa -n kube-system 명령어로 horizontalPodAutoscaler를 조회해도 CoreDNS 관련 HPA 리소스가 조회되지 않으며, 이는 의도된 동작입니다.

kubectl get hpa -A
NAMESPACE   NAME                 REFERENCE                       TARGETS                                     MINPODS   MAXPODS   REPLICAS   AGE
argocd      argocd-repo-server   Deployment/argocd-repo-server   memory: <unknown>/60%, cpu: <unknown>/60%   1         10        4          3h14m
argocd      argocd-server        Deployment/argocd-server        memory: <unknown>/80%, cpu: <unknown>/80%   1         5         5          3h14m
...         ...                  ...                             ...                                         ...       ...       ...        ...

왜냐하면 일반적인 파드 오토스케일링 컨트롤러인 HPA 대신, CPACluster Proportional Autoscaler 파드가 CoreDNS의 파드 개수를 조절하기 때문입니다.

 

관련자료

EKS Terraform
EKS Addon configuration

CoreDNS
Autoscaling CoreDNS

CPA
cluster-proportional-autoscaler Github