[k8s] Karpenter 개요

Woong·2025년 8월 20일
0

Docker, k8s

목록 보기
24/26

Karpenter

  • k8s cluster 내 node life cycle 을 자동화하는 오픈소스 프로젝트
    • pod 스케줄링 요구에 따라 node 를 동적으로 프로비저닝,종료하는 auto scaler
  • 리소스 문제로 스케줄링되지 않은(unschedulable) pod 를 모니터링
  • pod의 스케줄링 요구에 따라 node의 프로비저닝 및 프로비저닝 해제를 자동화
    • 스케줄링 요구사항: resource requests, node selectors, affinities, tolerations 등
  • pod 요구사항에 맞는 node 를 프로비저닝
  • 더이상 사용되지 않는 노드 제거

NodePool

  • 노드를 어떤 정책으로 만들지, 프로비저닝에 대한 전역 정책을 정의
    • 0.x 버전에서는 Provisioner 를 사용했으나 1.x 버전부터 NodePool 로 대체
    • taints, labels, nodeSelector, limits 등 정의
    • 어떤 클라우드 프로바이더를 사용할지, node의 최소/최대 개수, 스팟 사용 여부, 선호 인스턴스 타입, 가용 영역, OS/아키텍처, 태인트/레이블 규칙 등을 지정
      • NodePool 은 정책이고, 실제 resource 는 NodeClass 에서 정의
kubectl get nodepool -A  
NAME      NODECLASS   NODES   READY   AGE
default   default     1       True    44d
  • ex)
apiVersion: karpenter.sh/v1beta1
kind: NodePool
metadata:
  name: general-pool
spec:
  template:
    metadata:
      labels:
        type: general
    spec:
      nodeClassRef:
        name: general-linux
      taints: []
      requirements:
        - key: "karpenter.k8s.aws/instance-category"
          operator: In
          values: ["t", "m"]
  disruption:
    consolidationPolicy: WhenEmpty
    expireAfter: 720h

NodeClass

  • node 를 어떻게 프로비저닝할지 정의하는 리소스
    • Karpenter가 실제로 클라우드 리소스를 생성할 때 참고하는 물리적 스펙 정의
      • NodePool 은 정책이고, NodeClass 는 물리적인 스펙을 정의
    • AWS 의 경우 EC2NodeClass CRD 로 제공
      • EC2 인스턴스의 속성 정의
      • AMI, 인스턴스 타입, 서브넷, 보안 그룹 등
 kubectl get ec2nodeclass -A
NAME      READY   AGE
default   True    44d
  • ex)
apiVersion: karpenter.k8s.aws/v1beta1
kind: EC2NodeClass
metadata:
name: general-linux
spec:
amiFamily: AL2
subnetSelectorTerms:
- tags:
karpenter.sh/discovery: <cluster-name>
securityGroupSelectorTerms:
- tags:
karpenter.sh/discovery: <cluster-name>
instanceProfile: <karpenter-instance-profile-name>

NodeClaim

  • Karpenter 내부에서 node lifecycle을 추적하는 리소스
    • 프로비저닝된 node 에 대한 메타데이터 관리
      • Karpenter 컨트롤러가 노드를 관리하기 위한 정보로 활용
      • node 와 1:1 매핑
      • Karpenter 에서 노드를 프로비저닝하면 생성
      • node가 어떤 NodePool/NodeClass에 의해 생성되었는지, life cycle 은 어떤지, 등
 kubectl get nodeclaims -A
NAME            TYPE        CAPACITY    ZONE              NODE                                                READY   AGE
default-gvjzh   c6i.large   on-demand   ap-northeast-1a   <node_name>   True    13d

reference

0개의 댓글