Karpenter CRD
NodePool
NodePool는 NodePool에 명시된 제약사항과 Workload에 명시된 제약사항 중 처리 가능한 제약사항을 고려하여 프로비저닝을 수행합니다. 옵션이 다양한 만큼 여러 제약사항의 조합을 만들 수 있도록 하여 유언성을 제공합니다.
또한 kube-scheduler나 Node가 준비 상태가 되기 전에 Pod가 배치되기 위한 작 업을 미리 수행해서 노드 시작 대기 시간을 줄여 줍니다.
경고
Node는 NodePool가 소유합니다. 따라서 NodePool를 삭제하면 소유하고 있는 Node들도 삭제됩니다.
kubectl explain nodepool.spec
apiVersion: karpenter.sh/v1beta1
kind: NodePool
metadata:
name: <name>
spec.template
spec:
template:
metadata:
labels:
<key>: <value>
annotations:
<key>: <value>
spec:
nodeClassRef:
name: <nodeClassName>
taints:
- key: <key>
value: <value>
effect: <NoSchedule|PreferNoSchedule|NoExecute>
# startupTaints: []
requirements:
- key: <key>
operator: <In|NotIn|Exists|DoesNotExist|Gt|Lt>
values:
- <value>
kubelet:
clusterDNS:
- <ip|url>
spec.template.spec.requirements
잘 알려진 label을 key로 하는 조건을 설정 할 수 있습니다
key
,values
operator
In
NotIn
Exists
DoesNotExist
Gt
: 정수값이 주어졌을 때만 사용 가능, 설정한 값보다 큰 경우 매칭됩니다.Lt
: 정수값이 주어졌을 때만 사용 가능, 설정한 값보다 작은 경우 매칭됩니다.
경고
values
에는 숫자도"
로 감싸서 문자열로 입력해야 합니다.- 하나도 선언을 안하면 기본값으로 설정되므로 유의해야합니다.
default
spec:
template:
spec:
requirements:
- key: kubernetes.io/arch
operator: In
values: ["amd64"]
- key: kubernetes.io/os
operator: In
values: ["linux"]
- key: karpenter.sh/capacity-type
operator: In
values: ["on-demand"]
- key: karpenter.k8s.aws/instance-category
operator: In
values: ["c", "m", "r"]
- key: karpenter.k8s.aws/instance-generation
operator: Gt
values: ["2"]
spec.template.spec.kubelet
spec.disruption
Karpenter는 각 Node에 Finalizer
를 설정하여 Node 삭제 프로세스를 개선해줍니다.
kubectl delete node <node>
또는 kubectl delete node -l <key>[=<value>]
로 Node를 제거할 때에도 Karpenter가 관리하는 Node는 미리 Finalizer를 설정해놨기 때문에 Node 삭제에 의해 생길 수 있는 문제를 최소화 해줍니다.
spec:
disruption:
consolidationPolicy: WhenUnderutilized # WhenUnderutilized|WhenEmpty
# WhenEmpty 정책을 사용 시, 노드에 Daemonset을 제외한 Pod가 없을 때,
# consolidateAfter 시간이 지나면 노드를 정리합니다.
consolidateAfter: 30s # 00h00m00s|Never
# expireAfter 시간이 지나면 노드를 정리합니다.
expireAfter: 720h # 00h00m00s|Never
경고
Spot의 경우 WhenUnderutilized에 의한 정리는 아직 지원되지 않습니다. https://github.com/kubernetes-sigs/descheduler 를 고려해보세요.
spec.limits
spec:
limits:
# 관리하는 리소스의 총 합이 아래 설정 값을 넘어가면 더이상 노드를 생성하지
# 않습니다.
# cpu: "10" 으로 설정되더라도 72 코어 인스턴스가 생성될 수 있습니다.
cpu: <DecimalSI> # m|""|k|M|G|T|P|E
memory: <BinarySI> # Ki|Mi|Gi|Ti|Pi|Ei