Skip to main content

Karpenter CRD


NodePool

NodePool는 NodePool에 명시된 제약사항Workload에 명시된 제약사항 중 처리 가능한 제약사항을 고려하여 프로비저닝을 수행합니다. 옵션이 다양한 만큼 여러 제약사항의 조합을 만들 수 있도록 하여 유언성을 제공합니다.

또한 kube-scheduler나 Node가 준비 상태가 되기 전에 Pod가 배치되기 위한 작업을 미리 수행해서 노드 시작 대기 시간을 줄여 줍니다.

warning

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: 정수값이 주어졌을 때만 사용 가능, 설정한 값보다 작은 경우 매칭됩니다.
warning
  • 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
warning

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

EC2NodeClass

kubectl explain ec2nodeclass.spec
apiVersion: karpenter.k8s.aws/v1beta1
kind: EC2NodeClass
metadata:
name: <name>
spec:
amiFamily: AL2
# 리스트는 OR 조건으로 처리됩니다
subnetSelectorTerms:
# <value>는 ''(모두 일치), '*XX*'(와일드카드)를 사용할 수 있습니다.
- tags:
<key>: <value>
# kubernetes.io/cluster/<clusterName>: '*'
# karpenter.sh/discovery: <clusterName>
- id: <subnetID>
securityGroupSelectorTerms:
# <value>는 ''(모두 일치), '*XX*'(와일드카드)를 사용할 수 있습니다.
- tags:
<key>: <value>
# kubernetes.io/cluster/<clusterName>: '*'
# karpenter.sh/discovery: <clusterName>
# - name: <SGName>
# - id: <SGID>
# role 또는 instanceProfile 중 하나를 설정해야합니다.
role: <instanceAWSRoleName>
# instanceProfile: <instanceProfile>
tags:
# 추가적으로 설정할 태그를 설정합니다.
<key>: <value>
blockDeviceMappings:
- deviceName: /dev/xvda
ebs:
volumeType: gp3
volumeSize: 50Gi
encrypted: true
deleteOnTermination: true
# AMIFamily의 기본 userData에 병합되거나 앞에 추가됩니다.
userData: |
#!/bin/bash
echo "Hello, World!"