diff --git a/charts/karpenter/templates/node-pool.yaml b/charts/karpenter/templates/node-pool.yaml new file mode 100644 index 0000000..ce4ac63 --- /dev/null +++ b/charts/karpenter/templates/node-pool.yaml @@ -0,0 +1,68 @@ +{{- range .Values.nodePools }} +apiVersion: karpenter.sh/v1 +kind: NodePool +metadata: + name: {{ .name }} +spec: + template: + metadata: + labels: +{{- if .labels }} +{{- range $key, $value := .labels }} + {{ $key }}: {{ $value }} +{{- end }} +{{- else }} + {} # Empty labels object if no labels are defined +{{- end }} + annotations: +{{- if .annotations }} +{{- range $key, $value := .annotations }} + {{ $key }}: {{ $value }} +{{- end }} +{{- else }} + {} # Empty annotations object if no annotations are defined +{{- end }} + spec: + requirements: +{{- if .requirements | len }} +{{- range .requirements }} + - key: {{ .key }} + operator: {{ .operator }} + values: +{{ toYaml .values | indent 12 }} +{{- if .minValues }} + minValues: {{ .minValues }} +{{- end }} +{{- end }} +{{- else }} + [] # In case requirements is empty, an empty array will be passed +{{- end }} + + taints: +{{- if .taints }} +{{- range .taints }} + - key: {{ .key }} + {{- if .value }} + value: {{ .value }} + {{- end }} + effect: {{ .effect }} +{{- end }} +{{- else }} + [] # Empty taints array if no taints are defined +{{- end }} + nodeClassRef: + group: {{ .nodeClass.group | default "karpenter.k8s.aws" }} + kind: {{ .nodeClass.kind | default "EC2NodeClass" }} + name: {{ .nodeClass.name }} + expireAfter: {{ .expireAfter | default "720h" }} + limits: +{{- if .limits.cpu }} + cpu: {{ .limits.cpu }} +{{- end }} +{{- if .limits.memory }} + memory: {{ .limits.memory }} +{{- end }} + disruption: + consolidationPolicy: {{ .disruption.consolidationPolicy | default "WhenEmptyOrUnderutilized" }} + consolidateAfter: {{ .disruption.consolidateAfter | default "1m" }} +{{- end }} diff --git a/charts/karpenter/values.yaml b/charts/karpenter/values.yaml index 04915ef..ec26f0d 100644 --- a/charts/karpenter/values.yaml +++ b/charts/karpenter/values.yaml @@ -21,3 +21,69 @@ karpenter: cpu: "1" memory: "1Gi" +# Node Pool Configuration +nodePools: + - name: default + expireAfter: 720h + labels: + billing-team: my-team + environment: production + annotations: + example.com/owner: "my-team" + example.com/maintainer: "admin@company.com" + limits: + cpu: "1000" + memory: "1000Gi" + disruption: + consolidationPolicy: WhenEmptyOrUnderutilized + consolidateAfter: 1m + nodeClass: + group: karpenter.k8s.aws + kind: EC2NodeClass + name: default + taints: + - key: "example.com/special-taint" + value: "my-value" + effect: "NoSchedule" + - key: "example.com/another-taint" + effect: "NoExecute" + 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: + - "t" + - "m" + - "r" + minValues: 2 + - key: karpenter.k8s.aws/instance-family + operator: Exists + minValues: 5 + - key: karpenter.k8s.aws/instance-family + operator: In + values: + - "m5" + - "m5d" + - "c5" + - "c5d" + - "c4" + - "r4" + minValues: 3 + - key: node.kubernetes.io/instance-type + operator: Exists + minValues: 10 + - key: karpenter.k8s.aws/instance-generation + operator: Gt + values: + - "2"