@@ -2,6 +2,7 @@ provider "aws" {
22 region = var. region
33}
44
5+
56module "eks-cluster" {
67 source = " ../../modules/eks"
78 cluster_name = var. cluster_name
@@ -17,286 +18,3 @@ module "eks-cluster" {
1718 vpc_id = var. vpc_id
1819}
1920
20- # provider "aws" {
21- # region = local.region
22- # }
23-
24- provider "aws" {
25- region = " us-west-2"
26- alias = " virginia"
27- }
28-
29- provider "aws" {
30- region = " us-east-1"
31- alias = " east1"
32- }
33-
34- data "aws_security_groups" "security_groups" {
35- filter {
36- name = " tag:aws:eks:cluster-name"
37- values = [var . cluster_name ]
38- }
39- }
40-
41- resource "aws_ec2_tag" "security_groups" {
42- for_each = toset (data. aws_security_groups . security_groups . ids )
43-
44- resource_id = each. value
45- key = " karpenter.sh/discovery"
46- value = var. cluster_name
47- }
48-
49- data "aws_eks_cluster" "cert_authority_data" {
50- provider = aws. virginia
51- name = var. cluster_name
52-
53- depends_on = [ module . eks-cluster ]
54- }
55-
56- data "aws_eks_cluster_auth" "cluster_auth" {
57- provider = aws. virginia
58- name = data. aws_eks_cluster . cert_authority_data . name
59-
60- depends_on = [ module . eks-cluster ]
61- }
62-
63- provider "helm" {
64- kubernetes {
65- host = data. aws_eks_cluster . cert_authority_data . endpoint
66- cluster_ca_certificate = base64decode (data. aws_eks_cluster . cert_authority_data . certificate_authority [0 ]. data )
67-
68- exec {
69- api_version = " client.authentication.k8s.io/v1beta1"
70- command = " aws"
71- args = [" eks" , " get-token" , " --cluster-name" , data . aws_eks_cluster . cert_authority_data . name , " --region" , local . region ]
72- }
73- }
74- }
75-
76-
77- provider "kubectl" {
78- apply_retry_count = 5
79- host = data. aws_eks_cluster . cert_authority_data . endpoint
80- cluster_ca_certificate = base64decode (data. aws_eks_cluster . cert_authority_data . certificate_authority [0 ]. data )
81- load_config_file = false
82-
83- exec {
84- api_version = " client.authentication.k8s.io/v1beta1"
85- command = " aws"
86- # This requires the awscli to be installed locally where Terraform is executed
87- args = [" eks" , " get-token" , " --cluster-name" , data . aws_eks_cluster . cert_authority_data . name ]
88- }
89- }
90-
91- data "aws_availability_zones" "available" {}
92- data "aws_ecrpublic_authorization_token" "token" {
93- provider = aws. east1
94- }
95-
96- locals {
97- name = " ex-${ basename (path. cwd )} "
98- region = " us-west-2"
99-
100- vpc_cidr = " 10.0.0.0/16"
101- azs = slice (data. aws_availability_zones . available . names , 0 , 3 )
102-
103- tags = {
104- Example = local.name
105- }
106- }
107-
108-
109- # Karpenter
110-
111- module "karpenter" {
112- source = " ../../modules/karpenter"
113-
114- create = var. create
115- tags = var. tags
116- cluster_name = var. cluster_name
117- create_iam_role = var. create_iam_role
118- iam_role_name = var. iam_role_name
119- iam_role_use_name_prefix = var. iam_role_use_name_prefix
120- iam_role_path = var. iam_role_path
121- iam_role_description = var. iam_role_description
122- iam_role_max_session_duration = var. iam_role_max_session_duration
123- iam_role_permissions_boundary_arn = var. iam_role_permissions_boundary_arn
124- iam_role_tags = var. iam_role_tags
125- iam_policy_name = var. iam_policy_name
126- iam_policy_use_name_prefix = var. iam_policy_use_name_prefix
127- iam_policy_path = var. iam_policy_path
128- iam_policy_description = var. iam_policy_description
129- iam_policy_statements = var. iam_policy_statements
130- iam_role_policies = var. iam_role_policies
131- ami_id_ssm_parameter_arns = var. ami_id_ssm_parameter_arns
132- enable_pod_identity = var. enable_pod_identity
133- enable_v1_permissions = var. enable_v1_permissions
134- enable_irsa = var. enable_irsa
135- irsa_oidc_provider_arn = var. irsa_oidc_provider_arn
136- irsa_namespace_service_accounts = var. irsa_namespace_service_accounts
137- irsa_assume_role_condition_test = var. irsa_assume_role_condition_test
138- create_pod_identity_association = var. create_pod_identity_association
139- namespace = var. namespace
140- service_account = var. service_account
141- enable_spot_termination = var. enable_spot_termination
142- queue_name = var. queue_name
143- queue_managed_sse_enabled = var. queue_managed_sse_enabled
144- queue_kms_master_key_id = var. queue_kms_master_key_id
145- queue_kms_data_key_reuse_period_seconds = var. queue_kms_data_key_reuse_period_seconds
146- create_node_iam_role = var. create_node_iam_role
147- cluster_ip_family = var. cluster_ip_family
148- node_iam_role_arn = var. node_iam_role_arn
149- node_iam_role_name = var. node_iam_role_name
150- node_iam_role_use_name_prefix = var. node_iam_role_use_name_prefix
151- node_iam_role_path = var. node_iam_role_path
152- node_iam_role_description = var. node_iam_role_description
153- node_iam_role_max_session_duration = var. node_iam_role_max_session_duration
154- node_iam_role_permissions_boundary = var. node_iam_role_permissions_boundary
155- node_iam_role_attach_cni_policy = var. node_iam_role_attach_cni_policy
156- node_iam_role_additional_policies = var. node_iam_role_additional_policies
157- node_iam_role_tags = var. node_iam_role_tags
158- create_access_entry = var. create_access_entry
159- access_entry_type = var. access_entry_type
160- create_instance_profile = var. create_instance_profile
161- rule_name_prefix = var. rule_name_prefix
162-
163- depends_on = [ module . eks-cluster ]
164-
165- }
166-
167- module "karpenter_disabled" {
168- source = " ../../modules/karpenter"
169-
170- create = false
171- }
172-
173- # Karpenter Helm chart & manifests
174-
175- resource "helm_release" "karpenter" {
176- namespace = " kube-system"
177- name = " karpenter"
178- repository = " oci://public.ecr.aws/karpenter"
179- repository_username = data. aws_ecrpublic_authorization_token . token . user_name
180- repository_password = data. aws_ecrpublic_authorization_token . token . password
181- chart = " karpenter"
182- version = " 1.3.0"
183- wait = false
184-
185- values = [
186- <<- EOT
187- serviceAccount:
188- name: karpenter
189- settings:
190- clusterName: ${ data . aws_eks_cluster . cert_authority_data . name }
191- clusterEndpoint: ${ data . aws_eks_cluster . cert_authority_data . endpoint }
192- interruptionQueue: ${ module . karpenter . queue_name }
193- EOT
194- ]
195-
196- depends_on = [ module . eks-cluster ]
197-
198- }
199-
200- resource "kubectl_manifest" "karpenter_node_class" {
201- yaml_body = <<- YAML
202- apiVersion: karpenter.k8s.aws/v1
203- kind: EC2NodeClass
204- metadata:
205- name: default
206- spec:
207- blockDeviceMappings:
208- - deviceName: /dev/xvda
209- ebs:
210- volumeSize: 80Gi
211- volumeType: gp3
212- deleteOnTermination: true
213-
214- amiSelectorTerms:
215- - alias: bottlerocket@latest
216-
217- role: ${ module . karpenter . node_iam_role_name }
218- subnetSelectorTerms:
219- - tags:
220- karpenter.sh/discovery: ${ data . aws_eks_cluster . cert_authority_data . name }
221- securityGroupSelectorTerms:
222- - tags:
223- karpenter.sh/discovery: ${ data . aws_eks_cluster . cert_authority_data . name }
224- tags:
225- karpenter.sh/discovery: ${ data . aws_eks_cluster . cert_authority_data . name }
226- YAML
227-
228- depends_on = [
229- helm_release . karpenter
230- ]
231- }
232-
233- resource "kubectl_manifest" "karpenter_node_pool" {
234- yaml_body = <<- YAML
235- apiVersion: karpenter.sh/v1
236- kind: NodePool
237- metadata:
238- name: default
239- spec:
240- template:
241- spec:
242- nodeClassRef:
243- group: karpenter.k8s.aws
244- kind: EC2NodeClass
245- name: default
246- requirements:
247- - key: "karpenter.k8s.aws/instance-category"
248- operator: In
249- values: ["c", "m", "r"]
250- - key: "karpenter.k8s.aws/instance-cpu"
251- operator: In
252- values: ["4", "8", "16", "32"]
253- - key: "karpenter.k8s.aws/instance-hypervisor"
254- operator: In
255- values: ["nitro"]
256- - key: "karpenter.k8s.aws/instance-generation"
257- operator: Gt
258- values: ["2"]
259- limits:
260- cpu: 1000
261- disruption:
262- consolidationPolicy: WhenEmpty
263- consolidateAfter: 30s
264- YAML
265-
266- depends_on = [
267- kubectl_manifest . karpenter_node_class
268- ]
269- }
270-
271- # Example deployment using the [pause image](https://www.ianlewis.org/en/almighty-pause-container)
272- # and starts with zero replicas
273- resource "kubectl_manifest" "karpenter_example_deployment" {
274- yaml_body = <<- YAML
275- apiVersion: apps/v1
276- kind: Deployment
277- metadata:
278- name: inflate
279- spec:
280- replicas: 0
281- selector:
282- matchLabels:
283- app: inflate
284- template:
285- metadata:
286- labels:
287- app: inflate
288- spec:
289- terminationGracePeriodSeconds: 0
290- containers:
291- - name: inflate
292- image: public.ecr.aws/eks-distro/kubernetes/pause:3.7
293- resources:
294- requests:
295- cpu: 1
296- YAML
297-
298- depends_on = [
299- helm_release . karpenter
300- ]
301- }
302-
0 commit comments