diff --git a/LimeChain/README.md b/LimeChain/README.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/LimeChain/terraform-k8s/.gitignore b/LimeChain/terraform-k8s/.gitignore new file mode 100644 index 0000000000..dc825268a9 --- /dev/null +++ b/LimeChain/terraform-k8s/.gitignore @@ -0,0 +1,34 @@ +# Local .terraform directories +**/.terraform/* + +# .tfstate files +*.tfstate +*.tfstate.* + +# Crash log files +crash.log +crash.*.log + +# Exclude all .tfvars files, which are likely to contain sensitive data, such as +# password, private keys, and other secrets. These should not be part of version +# control as they are data points which are potentially sensitive and subject +# to change depending on the environment. +*.tfvars +*.tfvars.json + +# Ignore override files as they are usually used to override resources locally and so +# are not checked in +override.tf +override.tf.json +*_override.tf +*_override.tf.json + +# Include override files you do wish to add to version control using negated pattern +# !example_override.tf + +# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan +# example: *tfplan* + +# Ignore CLI configuration files +.terraformrc +terraform.rc \ No newline at end of file diff --git a/LimeChain/terraform-k8s/README.md b/LimeChain/terraform-k8s/README.md new file mode 100644 index 0000000000..3ad79c9b47 --- /dev/null +++ b/LimeChain/terraform-k8s/README.md @@ -0,0 +1,13 @@ +This is terraform code that will create a kubernetes cluster create deployment there. Please perform the following steps. + +1. Install latest `aws cli` +2. Export credential + +``` +export AWS_ACCESS_KEY_ID=<> +export AWS_SECRET_ACCESS_KEY=<> +export AWS_SESSION_TOKEN=<> +``` + +3. Run `terraform init`, `terrafrom apply` +4. Set up kubernetes credentials via `aws eks --region $(terraform output -raw region) update-kubeconfig --name $(terraform output -raw cluster_name)` diff --git a/LimeChain/terraform-k8s/kubernetes-task.tf b/LimeChain/terraform-k8s/kubernetes-task.tf new file mode 100644 index 0000000000..c5588720e8 --- /dev/null +++ b/LimeChain/terraform-k8s/kubernetes-task.tf @@ -0,0 +1,67 @@ +provider "kubernetes" { + host = module.eks.cluster_endpoint + cluster_ca_certificate = base64decode(module.eks.cluster_certificate_authority_data) + exec { + api_version = "client.authentication.k8s.io/v1beta1" + args = ["eks", "get-token", "--cluster-name", local.cluster_name] + command = "aws" + } +} + + + + +resource "kubernetes_deployment" "ethereum-node" { + metadata { + name = "ethereum-node" + labels = { + app = "eth-dev" + } + } + + spec { + replicas = 1 + + selector { + match_labels = { + app = "eth-dev" + } + } + + template { + metadata { + labels = { + app = "eth-dev" + } + } + + spec { + container { + image = "vatman/client-go-hardhat:latest" + name = "ethereum-node" + args = ["--dev", "--http", "--http.api", "eth,web3,net", "--http.corsdomain", "http://remix.ethereum.org"] + } + } + } + } +} + + + +resource "kubernetes_service" "example" { + metadata { + name = "ethereum-node-service" + } + spec { + selector = { + app = "eth-dev" + } + + port { + port = 8545 + target_port = 8545 + } + + type = "ClusterIP" + } +} \ No newline at end of file diff --git a/LimeChain/terraform-k8s/main.tf b/LimeChain/terraform-k8s/main.tf new file mode 100644 index 0000000000..ac1380ca56 --- /dev/null +++ b/LimeChain/terraform-k8s/main.tf @@ -0,0 +1,113 @@ +provider "aws" { + region = var.region +} + +data "aws_availability_zones" "available" { + filter { + name = "opt-in-status" + values = ["opt-in-not-required"] + } +} + +locals { + cluster_name = "education-eks-${random_string.suffix.result}" +} + +resource "random_string" "suffix" { + length = 8 + special = false +} + +module "vpc" { + source = "terraform-aws-modules/vpc/aws" + version = "5.1.2" + + name = "education-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 + } +} + +module "eks" { + source = "terraform-aws-modules/eks/aws" + version = "19.19.0" + + cluster_name = local.cluster_name + cluster_version = "1.27" + + vpc_id = module.vpc.vpc_id + subnet_ids = module.vpc.private_subnets + cluster_endpoint_public_access = true + + eks_managed_node_group_defaults = { + ami_type = "AL2_x86_64" + + } + + eks_managed_node_groups = { + one = { + name = "node-group-1" + + instance_types = ["t3.small"] + + min_size = 1 + max_size = 3 + desired_size = 2 + } + + two = { + name = "node-group-2" + + instance_types = ["t3.small"] + + min_size = 1 + max_size = 2 + desired_size = 1 + } + } +} + + +# https://aws.amazon.com/blogs/containers/amazon-ebs-csi-driver-is-now-generally-available-in-amazon-eks-add-ons/ +data "aws_iam_policy" "ebs_csi_policy" { + arn = "arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy" +} + +module "irsa-ebs-csi" { + source = "terraform-aws-modules/iam/aws//modules/iam-assumable-role-with-oidc" + version = "5.30.1" + + create_role = true + role_name = "AmazonEKSTFEBSCSIRole-${module.eks.cluster_name}" + provider_url = module.eks.oidc_provider + role_policy_arns = [data.aws_iam_policy.ebs_csi_policy.arn] + oidc_fully_qualified_subjects = ["system:serviceaccount:kube-system:ebs-csi-controller-sa"] +} + +resource "aws_eks_addon" "ebs-csi" { + cluster_name = module.eks.cluster_name + addon_name = "aws-ebs-csi-driver" + addon_version = "v1.20.0-eksbuild.1" + service_account_role_arn = module.irsa-ebs-csi.iam_role_arn + tags = { + "eks_addon" = "ebs-csi" + "terraform" = "true" + } +} \ No newline at end of file diff --git a/LimeChain/terraform-k8s/outputs.tf b/LimeChain/terraform-k8s/outputs.tf new file mode 100644 index 0000000000..3610001958 --- /dev/null +++ b/LimeChain/terraform-k8s/outputs.tf @@ -0,0 +1,22 @@ +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: MPL-2.0 + +output "cluster_endpoint" { + description = "Endpoint for EKS control plane" + value = module.eks.cluster_endpoint +} + +output "cluster_security_group_id" { + description = "Security group ids attached to the cluster control plane" + value = module.eks.cluster_security_group_id +} + +output "region" { + description = "AWS region" + value = var.region +} + +output "cluster_name" { + description = "Kubernetes Cluster Name" + value = module.eks.cluster_name +} diff --git a/LimeChain/terraform-k8s/terraform.tf b/LimeChain/terraform-k8s/terraform.tf new file mode 100644 index 0000000000..a02bd9f1c9 --- /dev/null +++ b/LimeChain/terraform-k8s/terraform.tf @@ -0,0 +1,31 @@ +terraform { + + required_providers { + kubernetes = { + source = "hashicorp/kubernetes" + version = ">= 2.0.0" + } + aws = { + source = "hashicorp/aws" + version = "~> 5.7.0" + } + + random = { + source = "hashicorp/random" + version = "~> 3.5.1" + } + + tls = { + source = "hashicorp/tls" + version = "~> 4.0.4" + } + + cloudinit = { + source = "hashicorp/cloudinit" + version = "~> 2.3.2" + } + } + + required_version = "~> 1.3" +} + diff --git a/LimeChain/terraform-k8s/variables.tf b/LimeChain/terraform-k8s/variables.tf new file mode 100644 index 0000000000..c2460042fd --- /dev/null +++ b/LimeChain/terraform-k8s/variables.tf @@ -0,0 +1,5 @@ +variable "region" { + description = "AWS region" + type = string + default = "us-east-2" +}