diff --git a/charts/karpenter/templates/nodePool.yaml b/charts/karpenter/templates/nodePool.yaml new file mode 100644 index 0000000..9b027ba --- /dev/null +++ b/charts/karpenter/templates/nodePool.yaml @@ -0,0 +1,73 @@ +{{- 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 }} +{{- if gt (len .requirements) 0 }} +{{- range .requirements }} + - key: {{ .key }} + operator: {{ .operator }} + values: +{{ toYaml .values | indent 12 }} +{{- if .minValues }} + minValues: {{ .minValues }} +{{- end }} +{{- end }} +{{- else }} + [] # Render an empty array explicitly when no requirements are defined +{{- end }} +{{- else }} + [] # Ensure that an empty array is rendered even if the user does not specify requirements +{{- 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 ec26f0d..bc3bcb9 100644 --- a/charts/karpenter/values.yaml +++ b/charts/karpenter/values.yaml @@ -1,29 +1,80 @@ # Custom values for your chart -clusterName: "" -awsPartition: "" -awsAccountId: 3849 -karpenterVersion: +clusterName: "" # Name of the EKS cluster (for identification in the chart and Karpenter) +awsPartition: "" # AWS partition, default is 'aws' (used in multi-region or partitioned environments) +awsAccountId: 3333 # AWS account ID where the resources will be provisioned +karpenterVersion: 1.1.1 # Version of Karpenter to be installed # Karpenter chart overrides karpenter: settings: - clusterName: "" - # interruptionQueue: test-demo-cluster + clusterName: "" # Cluster name for the Karpenter controller to identify and manage nodes in this cluster + serviceAccount: annotations: - eks.amazonaws.com/role-arn: arn:aws:iam::3849:role/KarpenterControllerRole-test-demo-cluster + eks.amazonaws.com/role-arn: arn:aws:iam::3333:role/KarpenterControllerRole-demo-eks # IAM role for Karpenter controller's access to AWS services + controller: resources: requests: - cpu: "1" - memory: "1Gi" + cpu: "1" # CPU resource request for the Karpenter controller (minimum resources Karpenter will be allocated) + memory: "1Gi" # Memory resource request for the Karpenter controller limits: - cpu: "1" - memory: "1Gi" + cpu: "1" # CPU resource limit for the Karpenter controller (maximum resources Karpenter can consume) + memory: "1Gi" # Memory resource limit for the Karpenter controller -# Node Pool Configuration +# NodePools define groups of nodes with specific requirements nodePools: - - name: default + - name: default # Name of the node pool, used for identification + requirements: # Node pool requirements for instance types and other properties + - key: kubernetes.io/arch + operator: In # Specifies the architecture for nodes + values: + - "amd64" + - key: kubernetes.io/os + operator: In # Specifies the OS type for nodes + values: + - "linux" # The node pool requires Linux OS + - key: karpenter.sh/capacity-type + operator: In # Specifies the capacity type for nodes + values: + - "on-demand" + - key: karpenter.k8s.aws/instance-category + operator: In # Specifies allowed EC2 instance categories + values: + - "t" # Instance category t (e.g., T2, T3) + - "m" + - "r" + minValues: 2 # Minimum number of instances of each category + + - key: karpenter.k8s.aws/instance-family + operator: Exists # Specifies that instances in the family must exist (e.g., m5, r5) + minValues: 5 # Minimum number of instances in the specified family + + - key: karpenter.k8s.aws/instance-family + operator: In # Specifies that the instance family must match one of the listed values + values: + - "m5" + - "m5d" + - "c5" + - "c5d" + - "c4" + - "r4" + minValues: 3 # Minimum number of instances from these families + + - key: node.kubernetes.io/instance-type + operator: Exists # Ensures that the node pool has specific instance types + minValues: 10 # Minimum number of instances of the specified types + + - key: karpenter.k8s.aws/instance-generation + operator: Gt # Specifies that the instance generation must be greater than a particular value + values: + - "2" # Instance generation must be greater than 2 (i.e., newer generation) + + nodeClass: + group: karpenter.k8s.aws # Node class group for Karpenter + kind: EC2NodeClass # Kind of node class, EC2NodeClass indicates AWS EC2 instances + name: default # The name of the node class (default for this pool) + - name: default1 expireAfter: 720h labels: billing-team: my-team