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