반응형

개요

  • AutoScaling 동작구조 비교
  • Node Scaler
  • Pod Scaler


요즘 EKS를 공부하고 있는데 와... addons가 너무많다

진짜 그냥 addons 조합인 것 같다.

 

진짜 추후에는 K8S를 효과적으로 사용하려면 addons 버전도 리스팅해서 사용해야 할 판이다.

하여튼, AutoScaling 구조를 한번 파악해보자...

 

K8S 에서는 주로 Node / Pod 의 대한 스케일 정책이 존재한다. 그냥 간단히 정리하면...

  • Node === EC2
  • Pod === Container 

용량이 급증하면 한개의 Deployment는 여러개의 Replica ( Pod ) 를 가지게 되고 -> Pod Scaler

한 Node안에 Pod를 더이상 배치할 수 없다면? -> 노드를 증가시켜 증가된 노드에 파드를 배치한댜 -> Node Sclaer

 

그럼 뭐가 이렇게 많은건데...

 

Node Scaler

Cluster AutoScaler

CA는 의외로 간단하다.

 

api-server 간의 계속 적인 통신을 진행한다.

  • pod가 pending 상태가 아닌지?
  • node의 사용량이 적절한지?
  • nodegroup -> 각각의 pod가 어디 소속인지?

그 과정에서 이벤트가 발생하게 되면, ASG에게 요청을 한다

  • desired +1 
  • desired -1

ASG가 대신 노드 (EC2)를 스케일아웃 , 스케일인 진행을 해준다.

 

Scale in 진행시에는 어떻게 될까?

  • CA는 각 Node를 주기적으로 점검
  • 유후노드를 발견하면 다른 Pod들을 선정된 노드로 옮길 수 있는가 평가
  • 대신... 아래 Pod가 있다면 해당 노드는 제거 불가
    • DeamonSet
    • Larget Storage
    • Static Pod
    • Unreplicated Pod
    • PodDisruptionBudget 위반

결국, CA는 ASG를 통해서 AutoScaling을 한다.

그리고 ASG는 알다시피 느리다...

Karpenter

카펜터도 일단 api-server와의 통신을 계속 유지한다.

  • Pending 파드 감지
  • 요구 리소스 분석
  • 인스턴스 타입 결정 -> 가장 적절한 인스턴스 타입을 스스로 선택 (여기서 비용절감이 이뤄짐)
  • EC2 인스턴스 Launch
  • 노드 Join 감시
  • 유후 시 EC2 Terminate

그 이후에 작업은 ASG가 아닌 본인이 직접 AWS EC2 API를 활용해서 호출한다

AWS EC2 API 는 ASG보다 더 빠르게 동작한다.

 

어떤게 더 좋은가?

당연히, Karpenter

  • 적절한 인스턴스를 선택한다는 점에서 -> 비용 효율적
  • OnDemand 뿐만 아닌, SPOT 인스턴스로 고려한다는 점
  • AWS API를 사용한 방식으로 인해, ASG보다 몇배 빠르다는 점

어떻게 사용해야 할까? (이거 관련해서도 Poc 해봐야 할듯)

  • 스팟인스턴스를 우선 사용하되, 없으면 온디맨드를 사용하게 끔 구성 (어차피 AutoScaling 이라 안정되면 스케일인 될거기에)
  • 특정 워크로드만 GPU , ARM 인스턴스로 보내도록 제어가능
  • TTLSecondsAfterEmpty 활용해서 노드 자동 회수 기능
  • taints 와 labels을 사용해서 워크로드 분리

 

Pod Scaler

 

HPA (Horizontal) + metrics server 꼭 필요함

HPA는 굉장히 간단하다. CPU / Memory 또는 Custom 한 메트릭을 기반으로 파드의 개수를 조절한다

보통 Helm 으로 Deployment를 구성하면 쉽게 사용이 가능하다

 

  • HPA는 주기적으로 Metric API에서 리소스 사용률을 확인
  • TargetValue와 현재 리소스 사용률을 비교해서 적절한 Replica 수를 조정
  • Deployment에 Patch를 요청해서 Replica 수를 조정
  • Scheduler가 새로운 파드를 스케쥴링

스케일 계산공식은 아래와 같다

desiredReplicas = ceil[
  currentReplicas × ( currentMetricValue / targetMetricValue )
]

예를들면,

현재 3개의 파드가 존재하고
CPU 사용률 평균이 80%, 목표가 50% 라면

3 * ( 80 / 50 ) = 4.8 -> 5개로 늘리는건다.

그럼...

현재 Pod가 1개고
CPU 사용률 평균이 90%고, 목표가 40% 라면

3 * ( 90 / 40 ) = 6.75 -> 7개

 

VPA (Vertical) -> 개발초기 때나 한번 해보려나? / 배치작업?

VPA는 파드의 실제 리소스 사용량을 모니터링 하고, 

리소스 요청값과 제한값에 의해 동적으로 조정하는 컨트롤러 <- 이게 무슨 얘기야...

 

아... 그러니까 VPA는 기본적으로 Deployment에 기재된 request, limit 을 기준으로

데이터를 분석해서, 자동으로 request 와 limit을 조절해준다... (재배포)

 

약간, 아래와 같은 형태라면 VPA를 사용해봄직 하다

  • 아직 서비스의 알맞은 리소스 값을 모를 때 (cpu, mem)
  • 리소스 사용량이 점진적으로 변하는 서비스일때 (데이터 처리 배치작업 ...)
  • 수평확장이 안되는 경우

 

KEDA (Event Driven 가능)

사실 이걸 제일 공부해보고 싶다

외부 이벤트에 상태를 감지해서 파드 수를 동적으로 스케일링 하는 Auto Sclaer 

 

  • 기본적으로 Keda Operator 를 활용해서 다른 외부시스템과 연동한다
  • 이벤트 상태를 주기적으로 체크
  • 이벤트 수량이 임계값을 초과한다면 -> HPA Replica 수 조절을 요청한다

아... HPA랑 같이 사용하는거군요...

 

만약... 구성하게 된다면

  • NodeScaler 는 무조건 Karpetner
  • PodScaler는 모두 사용할 것 같음
    • 간단한 CPU / Memory 스케일링은 HPA를 활용
    • VPA를 사용해서 최적값을 찾아나가게끔 모니터링 진행 (updateMode : off)
    • SQS, Kafka 와 같은 메시지 큐 부하에 의해 자체적인 스케일링을 하기위해 KEDA 설정
반응형

'Architecture > K8S' 카테고리의 다른 글

K8S - 시작 ( 용량산정 / 고려사항 )  (2) 2025.06.02
K8s - Karpenter  (2) 2025.06.01
반응형

이제... 드디어 K8S 를 실무에서 사용해볼 수 있는 기회가 왔다.

이제 앞으로 나도 왜 K8S를 사용하는지 장점이 뭔지, 단점이 뭔지 더 디테일하게 토론할 수 있을것이다.

 

하지만, EKS를 구성하기전에 몇몇 고려사항등을 검토해봐야 한다.

 

용량 산정

집(용량) 구하기 Let'go

 

 

기본적으로 K8S는 Cluster 구조로 이루어져 있고, 1개의 Master Node와 여러개의 Worker Node로 이루어져 있다.

우리는 Pod라는 서비르를 Worker Node에 띄우지만, 이 구성을 어떤 방식으로 할 것이고 Node 의 용량을 어떻게 산정해야 할 것인가는 

중요한 문제이다.

 

용량을 산정하지 못하면, Pod는 Pending 상태로 계속 유지될 것이고 서비스는 정상적으로 동작하지 못할 것이다.

 

만약 Cluster 총 용량에 따라서 Node를 작게, 크게 나눈다라면...

클러스터 용량 작은 노드 여러개 큰 노드 여러개
8 CPU , 16 GB Memory - 2 core 4 GB Memory 
- 총 4 노드
- 8 core 16 GB Memory
- 총 1 노드
400 CPU, 800 GB Memory - 2 core 4 GB Memory
- 총 200 노드
- 8 core 16 GB Memory
- 총 50 노드

 

각각의 장단점은 뭘까?

  장점 단점
작은 노드 여러개 - 노드 장애 시, 클러스터 전체에서 피해가 적다 (노드 여러개니까...)
- HA 구성 시 유리
- 관리하는 노드가 많아 -> 마스터 노드 부하증가
- 공식적으로 5000개의 이하 권장 ( 500개정도여도 부하가 생김) -> Master Node 스펙업하면 됨
- 노드마다 기본적으로 사용되는 리소스 존재

리소스 스펙이 낮다면 (전체 리소스 대비 실제로 사용하는 서비스 리소스가 적을 수 있음)
- Karpenter...
- Keda...
- DeamonSet...
큰 노드 여러개 - 관리의 편의성
- 장비의 대한 업데이트 / 트러블슈팅이 적다
- 총 예산이 저렴하다 ( 10 > 1 )
- 큰 어플리케이션을 돌릴 때 유용
- 하나의 노드에 많은 pod가 실행된다 
- Kubelet, Container Runtime에 부하
- 노드 당, 최대 110개의 pod를 추천

- Rplicaiton 효율이 떨어짐 (HA 의미가 없음)
- 장애발생 시 위험함 (다른 노드에 부하가 클 수 있음)

 

결론적으로

 

큰 노드 여러개는

  • 관리가 편하고, 장비 및 업데이트의 대한 트러블 슈팅이 적고, 큰 어플리케이션을 돌릴때 유용하나...
  • 하나의 노드에 많은 Application이 동작하는 만큼 부하 및 서비스 장애 시, 다른 노드 즉 Cluster 전체의 대한 장애가 발생할 수 있다

작은 노드 여러개는

  • 장애발생 시, 클러스터 전체에 피해가 적을 수 있고 HA 구성할때 유리하다... -> 작은 서비스가 여러개라면 최적임
  • Node가 많아지는건 Master Node에 대해 부하가 발생할 수 있으며
  • 기본적으로 Node 마다 구성되는 리소스들이 존재한다 (기본 구성의 Spec을 미리 알아야 할듯하다)
    • Karpenter
    • Keda
    • CSI
    • Kube Proxy...
    • DeamonSet
  • 이러한 리소스들이 어느정도 잡아먹는데, Node 스펙이 낮다면 Application이 얼마 못들어감

 

좋아.. 그럼 모든걸 고려했다면 아래 사이트에 이동해서 

결과적으로 내가 만든 서비스가 어떤 K8S Node Type이 적당한지 계산을 해보자...

https://learnk8s.io/kubernetes-instance-calculator

 

Kubernetes instance calculator

Explore the best instance types for your Kubernetes cluster interactively.

learnk8s.io

 

 

고려사항

  • 스토리지 및 네트워크 연동
  • 쿠버네티스 업그레이드 및 패치
  • 모니터링 및 로깅환경 구축
  • 마스터노드에 대한 장애복구

 

클러스터 모니터링

클러스터 로깅

 

아티펙트 저장소

  • 기본적으로 Docker Hub나 외부 Helm 저장소를 사용하나,
  • 외부 저장소에 오류로 인해서 실제 Application에 문제가 발생할 여지가 존재하기에 -> 내부 저장소를 사용하자

CI/CD 파이프라인

반응형

'Architecture > K8S' 카테고리의 다른 글

k8s AutoScaling 동작구조 비교  (0) 2025.06.21
K8s - Karpenter  (2) 2025.06.01
반응형

개요

  • K8S AutoScaling
  • AutoScaler vs Karpenter
  • Karpenter 동작원리
  • Karpenter Terraform

K8S AutoScaling

K8S 는 기본적으로 Node / Pod 기반으로 서비스가 동작한다

여기서의 Node는 EC2, Pod 는 Container로 해당된다.

 

이때, Node 즉 EC2의 경우 서비스가 많아짐에 따라 EC2 AutoScaling을 진행하게 된다.

  1. Pod AutoScaling 구성 
  2. Worker Node에 Pod가 많아짐 
  3. 기존 Node 용량보다 Pod가 많아질 경우, EC2 Node 가 더 생김

그럼 그냥 EC2 AutoScaling 을 Default 하게 사용하면 안되나? 

그렇게 써도 되긴하는데, 좀더 효율적인 방법의 AutoScaling 방법을 사용해야 한다.

 

EC2 Launch Template vs AutoScaler vs Karpenter

 

EC2 Launch Template + ASG

EC2 Launch Template + ASG

가장 기본적인 방식이다.

EC2 인스턴스 그룹을 미리 정의해두고, 트래픽에 따라 인스턴스를 수동 / 자동으로 확장할 수 있다.

Kubernetest 의 Pod 상태를 직접적으로 알기 어렵기 때문에 과잉 할당으로 인한 불필요한 비용이 발생할 여지가 존재함

운영자가 직접 Scale 정책을 설계해야 하기때문에, 유지관리 비용이 크다.

AutoScaler

AutoScaler

K8S 에서 주로 사용하는 AutoScaling 컴포넌트

Pod가 Node에 스케쥴링되지 못할 때 -> 필요에 따라 EC2를 자동으로 생성한다.

ASG완 연동되어 작동하며, 기본적으로 NodeGroup 단위로 동작한다.

다만, 아래와 같은 단점이 존재한다.

  • 각 NodeGroup의 대한 설정이 필요
  • 리소스 낭비가 발생하기 쉽다.
  • 스케일 속도가 느리다 ( AutoScaling 자체가 기본적으로 느림 )

Karpenter (밑에 사진 참조)

AWS 가 만든 오픈소스 Kubernetes AutoScaler (참 잘만듬)

Pod 스케쥴링 요청에 따라, 가장 적합한 인스턴스 타입과 크기를 실시간으로 계산하여 자동 생성한다

NodeGroup이 아닌, 단일 프로비저닝 정책만으로도 다양한 EC2 타입을 활용할 수 있다. (SPOT도 가능)

프로비저닝 속도가 빠르다 (awscli 사용해서 EC2를 생성하기 때문에 AutoScaling 보다 빠르다)

 

그냥 결론적으로 보면... (주관적)

  • 빠른가? -> Karpenter >>>>>> Launch Template == AutoScaler
  • 비용최적화로 EC2를 설정하는가? -> Karpenter 
  • 설정이 어렵나? -> Karpenter == Launch Template == AutoScaler

 

Karpenter 동작원리

 

pod 생성 후 -> node attach

 

Academic 한 이론으로는 아래와 같다.

  1. Pending Pod를 감지한다 -> Kubernetes에 Scheduling Cycle 중 스케쥴되지 못한 Pod를 감지한다
  2. Pod의 요구 리소스를 분석한다 (이 Pod를 수용할 수 있는 최적의 인스턴스를 구하는 단계)
    1. CPU / Memory / GPU 리소스 요구량
    2. NodeSelector, Trolerations, Affinity 제약 조건
    3. Storage / Zone / OS 특수 요구사항
  3. 적합한 인스턴스 타입 탐색
    1. 리전 및 가용역역
    2. on-Demand or SPOT 인스턴스 여부
  4. 인스턴스 프로비저닝
    1. 위 단계를 지나치고 선택된 EC2 타입을 직접 API로 생성 (아주 빠름)
      1. AMI
      2. Kubernetes Kubelet
      3. IAM Role, SG, Subnet 설정
  5. Pod 스케쥴링 및 Node 연결
    1. 생성된 EC2 인스턴스를 K8S Node로 Join
    2. Pending Pod를 해당 Node에 스케쥴링
  6. 유후 Node 감지 및 제거
    1. consolidation, ttlSecondsAfterEmpty, expiration 등의 설정으로 유휴 노드 제거 전략 조절 가능

 

하지만 난, 저걸 이해못함 -> 내가 이해한 바로는 ...

처음 카펜터를 구성하면 4가지? 를 생성 및 참조하게된다.

  1. 태그 참조
  2. Karpenter IRSA
  3. Karpenter Controller
  4. Karpenter Provisioner

태그참조

카펜터는 참 신기한 놈이다.

카펜터를 사용하겠다를 태그를 활용해서 구성한다.

  • 카펜터가 구성되는 EC2
  • 카펜터를 사용해서 Provisioning 되는 EC2의 SG
  • 카펜터를 사용해서 Provisioning 되는 EC2가 속한 Subnet 

에 올바른 Tag가 기입이 되어야 한다.

설정마다 다르겠지만, 나는 Blueprint

 

Karpenter IRSA

k8s에 장점이자 단점인, Service Account이다

즉, pod의 권한을 IAM Role로서 제한을 할 수 있다.

 

Node안에는 다양한 서비스의 Pod들이 떠있다. 그렇기 때문에 IRSA를 사용해서

namespace 별로, 각각 다른 serviceAccount (SA) 를 만들고 해당 Pod에 각각 다른 IAM Role을 부여해서 사용한다.

 

Karpenter Controller (언제 노드를 만들까?)

  • Deployment
  • 실제로 노드를 프로비저닝하는 실행 컴포넌트
  • 기본적으로 1개의 replica로 실행된다 (namespace = karpenter)

Karpenter Provisioner (어떤 노드를 만들까?)

  • Custom Resource (CR)
  • 노드 프로비저닝의 정책을 정의하는 설정 컴포넌트 <- 여기에 적힌 구성대로 Karpenter가 최적의 EC2를 찾아줌

 

Karpenter Terraform

variable "eks_attr" {
  default = {
    "name" : "donggyu-eks"
    "version" : "1.32"
  }
}

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

  cluster_name                    = lookup(var.eks_attr, "name")
  cluster_version                 = lookup(var.eks_attr, "version")
  cluster_endpoint_public_access  = true // 외부에서 접근 가능
  cluster_endpoint_private_access = true // 내부에서 접근 가능

  create_cluster_security_group = false
  create_node_security_group    = false

  # Optional: Adds the current caller identity as an administrator via cluster access entry
  enable_cluster_creator_admin_permissions = true

  vpc_id     = local.vpc.vpc_id
  subnet_ids = values(local.vpc.was_subnets)

  # EKS Addons
  cluster_addons = {
    coredns = {
      most_recent = true
    }
    kube-proxy = {
      most_recent = true
    }
    vpc-cni = {
      most_recent = true
    }
    aws-ebs-csi-driver = {
      most_recent = true
    }
    # eks-pod-identity-agent = {}
  }

  eks_managed_node_groups = {
    karpenter = {
      instance_types = ["t4g.medium"]
      ami_type = "AL2_ARM_64"
      min_size = 2
      max_size = 5
      desired_size = 2
      # capacity_type = "SPOT"

      iam_role_additional_policies = {
        "AmazonSSMManagedInstanceCore" = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
      }
    }
  }

  node_security_group_additional_rules = {
    ingress_karpenter_webhook_tcp = {
      description                   = "Control plane invoke Karpenter webhook"
      protocol                      = "tcp"
      from_port                     = 8443
      to_port                       = 8443
      type                          = "ingress"
      source_cluster_security_group = true ## 해당 규칙의 소스를 cluster가 가지고있는 보안그룹으로 지정 (node간 통신허용)
    }
  }


  tags = merge({
    Blueprint = lookup(var.eks_attr, "name")
    }, {
    "karpenter.sh/discovery" = lookup(var.eks_attr, "name")
  })
}

################################################################
######## karpenter
################################################################
resource "aws_iam_instance_profile" "karpenter" {
    name = "KarpenterNodeInstanceProfile-${module.eks.cluster_name}"
    role = module.eks.eks_managed_node_groups["karpenter"].iam_role_name
}



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

  manage_aws_auth_configmap = true

  aws_auth_roles = [
    {
      rolearn  = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:role/AWSReservedSSO_AdministratorAccess_18f0ecd34fab4ea6"
      username = "admin"
      groups   = ["system:masters"]
    },
    {
      rolearn = module.eks.eks_managed_node_groups["karpenter"].iam_role_arn
      username = "system:node:{{EC2PrivateDNSName}}"
      groups   = ["system:nodes", "system:bootstrappers"]
    }
  ]

  aws_auth_users = [
    {
      userarn  = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:user/admin"
      username = "admin"
      groups   = ["system:masters"]
    }
  ]
}
## karpenter pod가 AWS에 접글할 수 있도록 IRSA를 생성
module "karpenter_irsa" {
  source  = "terraform-aws-modules/iam/aws//modules/iam-role-for-service-accounts-eks"
  version = "~> 4.21.1"

  role_name                          = "karpenter-controller-${module.eks.cluster_name}"
  attach_karpenter_controller_policy = true

  karpenter_controller_cluster_id = module.eks.cluster_arn
  karpenter_controller_node_iam_role_arns = [
    module.eks.eks_managed_node_groups["karpenter"].iam_role_arn
  ]

  karpenter_controller_ssm_parameter_arns = [
    "arn:aws:ssm:*:*:parameter/aws/service/eks/optimized-ami/*"
  ]

  oidc_providers = {
    ex = {
      provider_arn               = module.eks.oidc_provider_arn
      namespace_service_accounts = ["karpenter:karpenter"]
    }
  }
}

# EKS 클러스터 접근 권한을 위한 IAM 정책
resource "aws_iam_policy" "karpenter_eks_access" {
  name        = "karpenter-eks-access-${module.eks.cluster_name}"
  description = "Policy for Karpenter to access EKS cluster"

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect = "Allow"
        Action = [
          "eks:DescribeCluster",
          "eks:ListClusters",
        ]
        Resource = module.eks.cluster_arn
      },
      {
        Effect = "Allow",
        "Action" : [
            "ec2:RunInstances",
            "ec2:TerminateInstances",
            "ec2:DescribeSpotPriceHistory",
            "pricing:GetProducts"
        ],
        "Resource" : "*"
      }
    ]
  })
}

# IAM 정책을 Karpenter IRSA 역할에 연결
resource "aws_iam_role_policy_attachment" "karpenter_eks_access" {
  role       = module.karpenter_irsa.iam_role_name
  policy_arn = aws_iam_policy.karpenter_eks_access.arn
}

# karpenter_helm.tf

resource "helm_release" "karpenter" {
  name       = "karpenter"
  repository = "oci://public.ecr.aws/karpenter"
  chart      = "karpenter"
  version    = "v0.27.0"
  namespace  = "karpenter"
  create_namespace = true

  set {
    name  = "serviceAccount.annotations.eks\\.amazonaws\\.com/role-arn"
    value = module.karpenter_irsa.iam_role_arn
  }

  set {
    name  = "settings.aws.clusterName"
    value = module.eks.cluster_name
  }

  set {
    name  = "settings.aws.defaultInstanceProfile"
    value = "KarpenterNodeInstanceProfile-${module.eks.cluster_name}"
  }

  set {
    name  = "settings.aws.interruptionQueueName"
    value = module.eks.cluster_name
  }

  wait = true
}

# karpenter_manifest.tf
resource "kubectl_manifest" "karpenter_node_template" {
  yaml_body = file("${path.module}/karpenter.yaml")

  depends_on = [helm_release.karpenter]
}
apiVersion: karpenter.sh/v1alpha5
kind: Provisioner
metadata:
  name: provisioner
spec:
  requirements:
    - key: "node.kubernetes.io/instance-type"
      operator: In
      values: [ "t4g.medium" ]
    - key: "topology.kubernetes.io/zone"
      operator: In
      values: [ "ap-northeast-2a", "ap-northeast-2b", "ap-northeast-2c" ]
    - key: "eks.amazonaws.com/capacityType"
      operator: In
      values: [ "ON_DEMAND" ]
    - key: "kubernetes.io/arch"
      operator: In
      values: [ "arm64" ]
  
  # 생성할 인스턴스의 최대 리소스
  limits:
    resources:
      cpu: "10"
      memory: 20Gi
      # nvidia.com/gpu: 16
  
  # karpenter 프로비저닝 메커니즘 사용
  # ttlSecondsAfterEmpty 와 consolidation 은 동시에 사용 불가
  # consolidation:
  #   enabled: true
  #   ttlSecondsUntilExpired: 2592000 # 30 Days = 60 * 60 * 24 * 30 Seconds;      
  ttlSecondsAfterEmpty: 30

  # 생성된 인스턴스(worker node)에 지정되는 label
  labels:
    environment: donggyu-eks
    managed-by: karpenter
    Blueprint: donggyu-eks

  # 생성된 인스턴스(worker node)에 지정되는 taints
  # taints:
  #   - key: nvidia.com/gpu
  #     value: "true"
  #     effect: NoSchedule

  provider:
    # 생성한 인스턴스에 어느 보안 그룹을 적용할 것인지 보안 그룹의 태그로 지정
    securityGroupSelector:
      Blueprint: donggyu-eks
    
    # 어느 서브넷에 인스턴스를 생성할 것인지 태그로 지정
    subnetSelector:
      environment: donggyu-eks
      managed-by: karpenter
    
    # 생성된 인스턴스의 태그를 지정  
    tags:
      Blueprint: donggyu-eks

 

 

반응형

'Architecture > K8S' 카테고리의 다른 글

k8s AutoScaling 동작구조 비교  (0) 2025.06.21
K8S - 시작 ( 용량산정 / 고려사항 )  (2) 2025.06.02

+ Recent posts