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
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
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