Add EKS test environment Terraform templates (#2290)
Co-authored-by: Francesco Renzi <rentziass@gmail.com>
This commit is contained in:
		
							parent
							
								
									dab900462b
								
							
						
					
					
						commit
						3886f285f8
					
				|  | @ -0,0 +1,16 @@ | |||
| **/.terraform/* | ||||
| .terraformrc | ||||
| terraform.rc | ||||
| 
 | ||||
| *.tfstate | ||||
| *.tfstate.* | ||||
| *.tfvars | ||||
| *.tfvars.json | ||||
| 
 | ||||
| crash.log | ||||
| crash.*.log | ||||
| 
 | ||||
| override.tf | ||||
| override.tf.json | ||||
| *_override.tf | ||||
| *_override.tf.json | ||||
|  | @ -0,0 +1,104 @@ | |||
| # This file is maintained automatically by "terraform init". | ||||
| # Manual edits may be lost in future updates. | ||||
| 
 | ||||
| provider "registry.terraform.io/hashicorp/aws" { | ||||
|   version     = "4.54.0" | ||||
|   constraints = ">= 3.72.0, >= 3.73.0, >= 4.47.0, ~> 4.54.0" | ||||
|   hashes = [ | ||||
|     "h1:j/L01+hlHVM2X2VrkQC2WtMZyu4ZLhDMw+HDJ7k0Y2Q=", | ||||
|     "zh:24358aefc06b3f38878680fe606dab2570cb58ab952750c47e90b81d3b05e606", | ||||
|     "zh:3fc0ef459d6bb4fbb0e4eb7b8adadddd636efa6d975be6e70de7327d83e15729", | ||||
|     "zh:67e765119726f47b1916316ac95c3cd32ac074b454f2a67b6127120b476bc483", | ||||
|     "zh:71aed1300debac24f11263a6f8a231c6432497b25e623e8f34e27121af65f523", | ||||
|     "zh:722043077e63713d4e458f3228be30c21fcff5b6660c6de8b96967337cdc604a", | ||||
|     "zh:76d67be4220b93cfaca0882f46db9a42b4ca48285a64fe304f108dde85f4d611", | ||||
|     "zh:81534c18d9f02648b1644a7937e7bea56e91caef13b41de121ee51168faad680", | ||||
|     "zh:89983ab2596846d5f3413ff1b5b9b21424c3c757a54dcc5a4604d3ac34fea1a6", | ||||
|     "zh:8a603ac6884de5dc51c372f641f9613aefd87059ff6e6a74b671f6864226e06f", | ||||
|     "zh:9b12af85486a96aedd8d7984b0ff811a4b42e3d88dad1a3fb4c0b580d04fa425", | ||||
|     "zh:b6fae6c1cda6d842406066dac7803d24a597b62da5fae33bcd50c5dae70140c2", | ||||
|     "zh:bc4c3b4bfb715beecf5186dfeb91173ef1a9c0b68e8c45cbeee180195bbfa37f", | ||||
|     "zh:c741a3fe7d085593a160e79596bd237afc9503c836abcc95fd627554cdf16ec0", | ||||
|     "zh:f6763e96485e1ea5b67a33bbd04042e412508b2b06946acf957fb68a314d893e", | ||||
|     "zh:fc7144577ea7d6e05c276b54a9f8f8609be7b4d0a128aa45f233a4b0e5cbf090", | ||||
|   ] | ||||
| } | ||||
| 
 | ||||
| provider "registry.terraform.io/hashicorp/cloudinit" { | ||||
|   version     = "2.2.0" | ||||
|   constraints = ">= 2.0.0, ~> 2.2.0" | ||||
|   hashes = [ | ||||
|     "h1:tQLNREqesrdCQ/bIJnl0+yUK+XfdWzAG0wo4lp10LvM=", | ||||
|     "zh:76825122171f9ea2287fd27e23e80a7eb482f6491a4f41a096d77b666896ee96", | ||||
|     "zh:795a36dee548e30ca9c9d474af9ad6d29290e0a9816154ad38d55381cd0ab12d", | ||||
|     "zh:9200f02cb917fb99e44b40a68936fd60d338e4d30a718b7e2e48024a795a61b9", | ||||
|     "zh:a33cf255dc670c20678063aa84218e2c1b7a67d557f480d8ec0f68bc428ed472", | ||||
|     "zh:ba3c1b2cd0879286c1f531862c027ec04783ece81de67c9a3b97076f1ce7f58f", | ||||
|     "zh:bd575456394428a1a02191d2e46af0c00e41fd4f28cfe117d57b6aeb5154a0fb", | ||||
|     "zh:c68dd1db83d8437c36c92dc3fc11d71ced9def3483dd28c45f8640cfcd59de9a", | ||||
|     "zh:cbfe34a90852ed03cc074601527bb580a648127255c08589bc3ef4bf4f2e7e0c", | ||||
|     "zh:d6ffd7398c6d1f359b96f5b757e77b99b339fbb91df1b96ac974fe71bc87695c", | ||||
|     "zh:d9c15285f847d7a52df59e044184fb3ba1b7679fd0386291ed183782683d9517", | ||||
|     "zh:f7dd02f6d36844da23c9a27bb084503812c29c1aec4aba97237fec16860fdc8c", | ||||
|   ] | ||||
| } | ||||
| 
 | ||||
| provider "registry.terraform.io/hashicorp/kubernetes" { | ||||
|   version     = "2.17.0" | ||||
|   constraints = ">= 2.10.0" | ||||
|   hashes = [ | ||||
|     "h1:I1L2R+OPgGSh+P6uBSycvvoyRIey/FqMwSvlJ9ccw0o=", | ||||
|     "zh:1cbafea8c404195d8ad2490d75dbeebef131563d3e38dec87231ceb3923a3012", | ||||
|     "zh:26d9584423ee77e607999b082de7d9dc3e937934aa83341e0832e7253caf4f51", | ||||
|     "zh:333527fc15fb43bbf1898a2f058598c596468a01d88c415627bb617878dc4d4d", | ||||
|     "zh:391b8c80e3115af485977d6e949d7260b7fc0b641089b884256bfd36a7077db2", | ||||
|     "zh:4d18ba55247486181759d60195777945bcd68e17ccd980820ca18e8a8b94aeb5", | ||||
|     "zh:607ae94d85d1c1ed3845bd71095daadea4b2468e16f57fa05c98eab0de6b14ae", | ||||
|     "zh:95c6cf22f8ef14e7a4f85e33cff5d6f11056c7880041b71d425d1b5ebbe246e7", | ||||
|     "zh:b077edcedb46a313b461ac1e49317872063b3871f2acbe1a50498612cefff387", | ||||
|     "zh:c6a7891683e44148b0c928fd4748b7abac727266ab551d679015f5fe8b72d1e6", | ||||
|     "zh:e5cebfdf873770c37a4304362003d3fea8d6c2fd819663ad121bc65bb81e4738", | ||||
|     "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c", | ||||
|     "zh:feb19269e7c0de473ad412b37818b48da0cc91e5c93dd4c77a72676ca97a16b1", | ||||
|   ] | ||||
| } | ||||
| 
 | ||||
| provider "registry.terraform.io/hashicorp/random" { | ||||
|   version     = "3.4.3" | ||||
|   constraints = "~> 3.4.3" | ||||
|   hashes = [ | ||||
|     "h1:xZGZf18JjMS06pFa4NErzANI98qi59SEcBsOcS2P2yQ=", | ||||
|     "zh:41c53ba47085d8261590990f8633c8906696fa0a3c4b384ff6a7ecbf84339752", | ||||
|     "zh:59d98081c4475f2ad77d881c4412c5129c56214892f490adf11c7e7a5a47de9b", | ||||
|     "zh:686ad1ee40b812b9e016317e7f34c0d63ef837e084dea4a1f578f64a6314ad53", | ||||
|     "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", | ||||
|     "zh:84103eae7251384c0d995f5a257c72b0096605048f757b749b7b62107a5dccb3", | ||||
|     "zh:8ee974b110adb78c7cd18aae82b2729e5124d8f115d484215fd5199451053de5", | ||||
|     "zh:9dd4561e3c847e45de603f17fa0c01ae14cae8c4b7b4e6423c9ef3904b308dda", | ||||
|     "zh:bb07bb3c2c0296beba0beec629ebc6474c70732387477a65966483b5efabdbc6", | ||||
|     "zh:e891339e96c9e5a888727b45b2e1bb3fcbdfe0fd7c5b4396e4695459b38c8cb1", | ||||
|     "zh:ea4739860c24dfeaac6c100b2a2e357106a89d18751f7693f3c31ecf6a996f8d", | ||||
|     "zh:f0c76ac303fd0ab59146c39bc121c5d7d86f878e9a69294e29444d4c653786f8", | ||||
|     "zh:f143a9a5af42b38fed328a161279906759ff39ac428ebcfe55606e05e1518b93", | ||||
|   ] | ||||
| } | ||||
| 
 | ||||
| provider "registry.terraform.io/hashicorp/tls" { | ||||
|   version     = "4.0.4" | ||||
|   constraints = ">= 3.0.0, ~> 4.0.4" | ||||
|   hashes = [ | ||||
|     "h1:pe9vq86dZZKCm+8k1RhzARwENslF3SXb9ErHbQfgjXU=", | ||||
|     "zh:23671ed83e1fcf79745534841e10291bbf34046b27d6e68a5d0aab77206f4a55", | ||||
|     "zh:45292421211ffd9e8e3eb3655677700e3c5047f71d8f7650d2ce30242335f848", | ||||
|     "zh:59fedb519f4433c0fdb1d58b27c210b27415fddd0cd73c5312530b4309c088be", | ||||
|     "zh:5a8eec2409a9ff7cd0758a9d818c74bcba92a240e6c5e54b99df68fff312bbd5", | ||||
|     "zh:5e6a4b39f3171f53292ab88058a59e64825f2b842760a4869e64dc1dc093d1fe", | ||||
|     "zh:810547d0bf9311d21c81cc306126d3547e7bd3f194fc295836acf164b9f8424e", | ||||
|     "zh:824a5f3617624243bed0259d7dd37d76017097dc3193dac669be342b90b2ab48", | ||||
|     "zh:9361ccc7048be5dcbc2fafe2d8216939765b3160bd52734f7a9fd917a39ecbd8", | ||||
|     "zh:aa02ea625aaf672e649296bce7580f62d724268189fe9ad7c1b36bb0fa12fa60", | ||||
|     "zh:c71b4cd40d6ec7815dfeefd57d88bc592c0c42f5e5858dcc88245d371b4b8b1e", | ||||
|     "zh:dabcd52f36b43d250a3d71ad7abfa07b5622c69068d989e60b79b2bb4f220316", | ||||
|     "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c", | ||||
|   ] | ||||
| } | ||||
|  | @ -0,0 +1,81 @@ | |||
| 
 | ||||
| # Context | ||||
| 
 | ||||
| Terraform templates to quickly create an EKS cluster with a managed node group. This is not a reference setup! It's a vanilla setup to be used when attempting to replicate issues and/or to test new features. | ||||
| 
 | ||||
| ⚠️ Do not use this setup in production. | ||||
| 
 | ||||
| ## Pre-requisites | ||||
| 
 | ||||
| - Terraform v1.3+ installed locally. | ||||
| - an AWS account | ||||
| - the AWS CLI v2.7.0/v1.24.0 or newer, installed and configured | ||||
| - AWS IAM Authenticator | ||||
| - kubectl v1.24.0 or newer | ||||
| 
 | ||||
| <details> | ||||
|     <summary>Download & Authenticate</summary> | ||||
| 
 | ||||
| ```bash | ||||
| brew install awscli aws-iam-authenticator terraform | ||||
| ``` | ||||
| 
 | ||||
| Configure & authenticate AWS CLI. This will vary based on your AWS account and IAM setup | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| ## Setup | ||||
| 
 | ||||
| ```bash | ||||
| # Export AWS region & profile env variables | ||||
| export AWS_REGION="eu-west-2"           # Replace with your region | ||||
| export AWS_PROFILE="actions-compute"    # Replace with your profile | ||||
| ``` | ||||
| 
 | ||||
| ```bash | ||||
| # You're free to use terraform cloud but you need to update main.tf first | ||||
| terraform init | ||||
| ``` | ||||
| 
 | ||||
| ```bash | ||||
| # Run terraform plan | ||||
| terraform plan | ||||
| ``` | ||||
| 
 | ||||
| ```bash | ||||
| # Verify the plan output from the previous step | ||||
| # Run terraform apply | ||||
| terraform apply | ||||
| ``` | ||||
| 
 | ||||
| ```bash | ||||
| # Retrieve access credentials for the cluster and configure kubectl | ||||
| aws eks --region "${AWS_REGION}" update-kubeconfig \ | ||||
|     --name "$(terraform output -raw cluster_name)" \ | ||||
|     --profile "${AWS_PROFILE}" | ||||
| 
 | ||||
| # If you get this error: 'NoneType' object is not iterable | ||||
| # Remove the ~/.kube/config file and try again | ||||
| # https://github.com/aws/aws-cli/issues/4843 | ||||
| ``` | ||||
| 
 | ||||
| ```bash | ||||
| # Verify your installation | ||||
| kubectl cluster-info | ||||
| ``` | ||||
| 
 | ||||
| Setup ARC by following [this quick-start guide](https://github.com/actions/actions-runner-controller/tree/master/docs/preview/actions-runner-controller-2). | ||||
| 
 | ||||
| ### Troubleshooting | ||||
| 
 | ||||
| #### dial tcp: lookup api.github.com: i/o timeout | ||||
| 
 | ||||
| If you see this error in the controller pod logs: | ||||
| 
 | ||||
| ```log | ||||
| ERROR   AutoscalingRunnerSet    Failed to initialize Actions service client for creating a new runner scale set {"autoscalingrunnerset": "arc-runners/arc-runner-set", "error": "failed to get runner registration token: Post \"https://api.github.com/app/installations/33454774/access_tokens\": POST https://api.github.com/app/installations/33454774/access_tokens giving up after 5 attempt(s): Post \"https://api.github.com/app/installations/33454774/access_tokens\": dial tcp: lookup api.github.com: i/o timeout"} | ||||
| ``` | ||||
| 
 | ||||
| This is because the controller pod is not able to resolve the `api.github.com` domain name. This is a good guide for [troubleshooting DNS failures in EKS](https://aws.amazon.com/premiumsupport/knowledge-center/eks-dns-failure/). For a fresh setup this is most likely **a security group configuration problem.** | ||||
| 
 | ||||
| The controller could have allocated to a node that cannot reach coredns. You need to allow the DNS (TCP / UDP) traffic to flow between the worker nodes' security groups. | ||||
|  | @ -0,0 +1,82 @@ | |||
| provider "aws" {} | ||||
| 
 | ||||
| data "aws_availability_zones" "available" {} | ||||
| 
 | ||||
| locals { | ||||
|   cluster_name = "arc-e2etests-eks-${random_string.suffix.result}" | ||||
| } | ||||
| 
 | ||||
| resource "random_string" "suffix" { | ||||
|   length  = 8 | ||||
|   special = false | ||||
| } | ||||
| 
 | ||||
| module "vpc" { | ||||
|   source  = "terraform-aws-modules/vpc/aws" | ||||
|   version = "3.19.0" | ||||
| 
 | ||||
|   name = "arc-e2etests-vpc" | ||||
| 
 | ||||
|   cidr = "10.0.0.0/16" | ||||
|   azs  = slice(data.aws_availability_zones.available.names, 0, 3) | ||||
| 
 | ||||
|   private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"] | ||||
|   public_subnets  = ["10.0.4.0/24", "10.0.5.0/24", "10.0.6.0/24"] | ||||
| 
 | ||||
|   enable_nat_gateway   = true | ||||
|   single_nat_gateway   = true | ||||
|   enable_dns_hostnames = true | ||||
| 
 | ||||
|   public_subnet_tags = { | ||||
|     "kubernetes.io/cluster/${local.cluster_name}" = "shared" | ||||
|     "kubernetes.io/role/elb"                      = 1 | ||||
|   } | ||||
| 
 | ||||
|   private_subnet_tags = { | ||||
|     "kubernetes.io/cluster/${local.cluster_name}" = "shared" | ||||
|     "kubernetes.io/role/internal-elb"             = 1 | ||||
|   } | ||||
| 
 | ||||
|   tags = { | ||||
|     # Critical: GitHub specific tag | ||||
|     "catalog_service" = "actions-runner-controller" | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| module "eks" { | ||||
|   source  = "terraform-aws-modules/eks/aws" | ||||
|   version = "19.5.1" | ||||
| 
 | ||||
|   cluster_name    = local.cluster_name | ||||
|   cluster_version = "1.24" | ||||
| 
 | ||||
|   vpc_id                         = module.vpc.vpc_id | ||||
|   subnet_ids                     = module.vpc.private_subnets | ||||
|   cluster_endpoint_public_access = true | ||||
| 
 | ||||
|   tags = { | ||||
|     # Critical: GitHub specific tag | ||||
|     # If removed, EC2 instance creation will fail | ||||
|     "catalog_service" = "actions-runner-controller" | ||||
|   } | ||||
| 
 | ||||
|   eks_managed_node_group_defaults = { | ||||
|     ami_type = "AL2_x86_64" | ||||
|   } | ||||
| 
 | ||||
|   eks_managed_node_groups = { | ||||
|     default = { | ||||
|       use_custom_launch_template = false | ||||
|     } | ||||
| 
 | ||||
|     primary = { | ||||
|       name = "primary-node-group" | ||||
| 
 | ||||
|       instance_types = ["t3.small"] | ||||
| 
 | ||||
|       min_size     = 1 | ||||
|       max_size     = 3 | ||||
|       desired_size = 2 | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | @ -0,0 +1,14 @@ | |||
| output "cluster_endpoint" { | ||||
|   description = "Endpoint for EKS control plane" | ||||
|   value       = module.eks.cluster_endpoint | ||||
| } | ||||
| 
 | ||||
| output "cluster_security_group_id" { | ||||
|   description = "Security group ids" | ||||
|   value       = module.eks.cluster_security_group_id | ||||
| } | ||||
| 
 | ||||
| output "cluster_name" { | ||||
|   description = "Cluster Name" | ||||
|   value       = module.eks.cluster_name | ||||
| } | ||||
|  | @ -0,0 +1,26 @@ | |||
| terraform { | ||||
| 
 | ||||
|   required_providers { | ||||
|     aws = { | ||||
|       source  = "hashicorp/aws" | ||||
|       version = "~> 4.54.0" | ||||
|     } | ||||
| 
 | ||||
|     random = { | ||||
|       source  = "hashicorp/random" | ||||
|       version = "~> 3.4.3" | ||||
|     } | ||||
| 
 | ||||
|     tls = { | ||||
|       source  = "hashicorp/tls" | ||||
|       version = "~> 4.0.4" | ||||
|     } | ||||
| 
 | ||||
|     cloudinit = { | ||||
|       source  = "hashicorp/cloudinit" | ||||
|       version = "~> 2.2.0" | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   required_version = "~> 1.3" | ||||
| } | ||||
		Loading…
	
		Reference in New Issue