스케쥴링-Karpenter (Old)
Update: 2025-01-29
Karpenter 소개

Karpenter는 Kubernetes 클러스터의 애플리케이션을 처리하는 데 적합한 컴퓨팅 리소스만 자동으로 시작하고 빠르고 간단한 컴퓨팅 프로비저닝으로 클라우드를 최대한 활용할 수 있도록 설계 되었습니다.
Karpenter는 AWS로 구축된 유연한 오픈 소스의 고성능 Kubernetes 클러스터 오토스케일러입니다. 애플리케이션 로드의 변화에 대응하여 적절한 크기의 컴퓨팅 리소스를 신속하게 실행함으로써 애플리케이션 가용성과 클러스터 효율성을 개선할 수 있습니다. 또한 Karpenter는 애플리케이션의 요구 사항을 충족하는 컴퓨팅 리소스를 적시에 제공하며, 앞으로 클러스터의 컴퓨팅 리소스 공간을 자동으로 최적화하여 비용을 절감하고 성능을 개선 할수 있습니다.
Karpenter 이전에는 Kubernetes 사용자가 Amazon EC2 Auto Scaling 그룹과 Kubernetes Cluster Autoscaler를 사용하는 애플리케이션을 지원하기 위해 클러스터의 컴퓨팅 파워를 동적으로 조정해야 했습니다. EKS를 사용하는 많은 고객들이 Kubernetes Cluster Autoscaler를 사용하여 클러스터 Auto Scaling을 구성하기가 어렵고 구성할 수 있는 범위가 제한적인 것에 대해 개선을 요구했습니다
Karpenter가 클러스터에 설치되면 Karpenter는 예약되지 않은 포드의 전체 리소스 요청을 관찰하고 새 노드를 시작하고 종료하는 결정을 내림으로써 예약 대기 시간과 인프라 비용을 줄입니다. 이를 위해 Karpenter는 Kubernetes 클러스터 내의 이벤트를 관찰한 다음 Amazon EC2와 같은 기본 클라우드 공급자의 컴퓨팅 서비스로 명령을 전송합니다.

Karpenter는 Apache License 2.0을 통해 라이선스가 부여되는 오픈 소스 프로젝트입니다. 모든 주요 클라우드 공급업체 및 온프레미스 환경을 포함하여, 모든 환경에서 실행되는 모든 Kubernetes 클러스터와 함께 작동하도록 설계되었습니다.
상세한 내용은 아래 URL을 참조하기 바랍니다.
Karpenter 설치
1.환경설정 및 VPC 구성
ap-northeast-1 (도쿄) region에 새로운 Cluster를 설치하기 위한 환경변수를 설정합니다.
KMS 를 ap-northeast-1 도쿄리전에서 사용할 수 있도록 설정합니다.
ap-northeast-1 에서 사용할 VPC를 구성합니다.
아래와 같이 Karpenter 설치를 위한 환경변수들을 추가로 설정합니다.
Karpenter Version Check - https://github.com/aws/karpenter-provider-aws/releases
eksctl을 사용해서 새로운 Cluster를 생성하기 위해, 앞서 구성한 VPC들의 주요 정보들을 환경 변수에 저장합니다.
2.Cluster 구성
새로운 Cluster 구성을 위해 yaml 파일을 생성합니다.
생성된 clsuter yaml파일이 정상적으로 구성되었는지 dry-run을 통해 확인해 봅니다.
아래와 같이 명령을 실행시켜 eks cluster를 생성합니다.
3.Karpenter 구성을 위한 환경 구성
Karpenter 시험 환경 구성을 위해 아래와 같이 환경변수를 구성합니다.
Subnet에 karpenter 환경을 위한 새로운 Tag를 설정합니다. Tag가 설정된 Subnet에 배포될 것입니다.
4. Karpenter 노드 권한 설정
kubernetes와 IAM간 인증을 위해 OIDC Provider를 생성합니다.
Karpenter Node들을 위한 IAM Role을 생성합니다. karpenter node를 위한 IAM Role Template을 다운로드 합니다.
Karpenter Node들을 위해 생성된 IAM Role을 eksctl을 통해 kubernetes 권한에 Mapping 합니다.
Kube-system Configmap/aws-auth에 정상적으로 Mapping 되었는지 확인합니다.
kube krew를 설치하고, 아래와 같은 Plugin을 구성합니다.
아래와 같이 kubect ctx 명령을 통해서 도쿄리전에 설치된 Cluster로 이동합니다.
도쿄리전에 구성된 kube 인증을 확인해 봅니다.
아래와 같이 추가되었습니다.
5. Service Account 생성 (ISRA)
eksctl로 Kubernetes Service Account를 생성하고, 앞서 생성한 IAM Role을 Mapping 합니다.
6. Karpenter Pod설치
Helm을 사용하여 Karpenter Pod를 클러스터에 배포합니다.
Helm Chart 를 설치하기 전에 Repo를 Helm에 추가해야 하므로 다음 명령을 실행하여 Repo를 추가합니다. 사전 준비 단계에서 이미 설치되었으므로 생략합니다.
Cluster의 상세 정보 및 Karpenter Role ARN을 전달하는 Helm Chart를 설치합니다.
karpenter pod가 정상적으로 설치 되었는지 확인합니다.
Karpenter Pod는 Controller와 Webhook을 담당하는 컨테이너가 배치되어 있습니다.
6.Provisioner 구성
Karpenter 구성은 Provisioner CRD(Custom Resource Definition) 형식으로 제공됩니다. 단일 Karpenter Provisioner는 다양한 Pod를 구성할 수 있습니다. Karpenter는 Label 및 Affinity와 같은 Pod의 속성을 기반으로 Scheduling 및 프로비저닝 결정을 할 수 있습니다. Karpenter는 다양한 노드 그룹을 관리할 필요가 없습니다.
아래 명령을 사용하여 기본 프로비저닝 도구를 만들기 위한 yaml을 정의합니다.이 프로비저닝 도구는 securityGroupSelector 및 subnetSelector를 사용하여 노드를 시작하는 데 사용되는 리소스를 검색합니다. 위의 eksctl 명령에 karpenter.sh/discovery 태그를 적용했습니다.
아래와 같이 Spot 인스턴스를 사용하는 Provisioner를 먼저 생성해 봅니다.
instanceProfile: Karpenter에서 시작한 인스턴스는 컨테이너를 실행하고 네트워킹을 구성하는 데 필요한 권한을 부여하는 InstanceProfile로 실행해야 합니다.requirements: Provisioner CRD는 인스턴스 type 및 AZ와 같은 노드 속성을 선택할 수 있습니다. 예를 들어 topology.kubernetes.io/zone=ap-northeast-2a 레이블에 대한 응답으로 Karpenter는 해당 가용성 영역에 노드를 프로비저닝합니다. 이 예에서는 karpenter.sh/capacity-type을 설정하여 EC2 스팟 인스턴스를 사용합니다. 여기에서 사용할 수 있는 다른 속성을 확인할 수 있습니다. 이번 랩에서 몇 가지 더 작업할 것입니다.limit: provisioner는 클러스터에 할당된 CPU 및 메모리 수의 제한을 정의할 수 있습니다. ttlSecondsAfterEmpty: 값은 빈 노드를 종료하도록 Karpenter를 구성합니다.provider:tags: EC2 인스턴스가 생성될 때 가지게 되는 Tag를 정의할 수도 있습니다. 이것은 EC2 수준에서 Billing 및 거버넌스를 활성화하는 데 도움이 됩니다.ttlSecondsAfterEmpty: 값은 Karpenter가 노드에 자원이 배치가 없는 경우 종료하도록 구성합니다.값을 정의하지 않은 상태로 두면 이 동작을 비활성화할 수 있습니다. 이 경우 빠른 시연을 위해 30초 값으로 설정했습니다.
7. 자동 노드 프로비저닝 1
Spot을 구동하기 위해 아래와 같이 EC2 Spot Service에 대한 설정을 합니다.
Deployment 하기 전에 웹브라우저에서 앞서 생성한 kube-ops-view를 열어두고 배포를 살펴 봅니다.
아래 kube-ops-view를 먼저 설치합니다.
kube-ops-view 의 FQDN LB 주소를 확인하고 접속해 봅니다.
아래와 같은 현재 Node와 Pod의 구성 배치도를 확인 할 수 있습니다.

아래와 같이 eks-node-viewer를 설치합니다.
아래와 같이 새로운 터미널에서 노드의 상태를 확인 할 수 있습니다.

Karpenter는 이제 활성화되었으며 노드 프로비저닝을 시작할 준비가 되었습니다. Deployment를 사용하여 Pod를 만들고 Karpenter가 노드를 프로비저닝하는 것을 확인해 봅니다.자동 노드 프로비저닝 이 배포는 pause image를 사용하고 replica가 없는 상태에서 시작합니다.
replica를 늘려가면서 시험해 봅니다.
Terminal 에서 로그를 확인해 봅니다.
아래에서 처럼 새로운 Spot Instance가 할당되는 것을 확인할 수 있습니다.
kube-ops-view 에서도 신규 노드가 할당된 것을 확인 할 수 있습니다.


8. 자동 노드 프로비저닝 2
Karpenter Provisioner CRD를 새로운 형태로 만들어 봅니다.
이 구성은 특정 인스턴스 타입을 Taint와 Toleration 등을 조합하여, 적용해 보는 예제입니다.
인스턴스 타입 : C5.xlarge
Zone : ap-northeast-1a
인스턴스 Capa: On Demand
새로운 Deployment Yaml을 배포합니다.
아래와 같이 5개 Pod를 배포하고, ap-northeast-1a Zone에 C5.xlarge 인스턴스가 배치 되는 지 확인해 봅니다.
아래 로그에서 확인이 가능합니다.

Last updated
Was this helpful?