diff --git a/instances/instance.tf b/instances/instance.tf index 636b9f3..0f6d23a 100644 --- a/instances/instance.tf +++ b/instances/instance.tf @@ -101,15 +101,6 @@ resource "aws_instance" "main" { "sudo /sbin/mkswap /var/swap.1", "sudo chmod 600 /var/swap.1", "sudo /sbin/swapon /var/swap.1", - "echo 'curl -sfL https://get.k3s.io | sh -s - server --disable traefik --tls-san ${var.project_domain} --token \"${var.k3s_token}\" --node-label node_type=master' >> $HOME/setup.sh", - "echo 'curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash' >> $HOME/setup.sh", - "echo 'mkdir -p $HOME/.kube' >> $HOME/setup.sh", - "echo 'sudo chmod 644 /etc/rancher/k3s/k3s.yaml' >> $HOME/setup.sh", - "echo 'cp /etc/rancher/k3s/k3s.yaml $HOME/.kube/k3s.yaml' >> $HOME/setup.sh", - "echo 'chmod g+r $HOME/.kube/k3s.yaml' >> $HOME/setup.sh", - "echo 'export KUBECONFIG=$HOME/.kube/k3s.yaml' >> $HOME/.profile", - "chmod +x $HOME/setup.sh", - "exec $HOME/setup.sh | tee logs.txt", ] } @@ -150,10 +141,6 @@ resource "aws_instance" "worker" { "sudo /sbin/mkswap /var/swap.1", "sudo chmod 600 /var/swap.1", "sudo /sbin/swapon /var/swap.1", - "echo 'curl -sfL https://get.k3s.io | sh -s - agent --node-label node_type=worker --token ${var.k3s_token} --server https://${var.project_domain}:6443' >> $HOME/setup.sh", - "chmod +x $HOME/setup.sh", - "while ! nc -z ${aws_instance.main.public_ip} 6443; do sleep 0.1; done", - "exec $HOME/setup.sh | tee logs.txt", ] } @@ -170,9 +157,23 @@ output "pool_master_public_ip" { } output "pool_master_instance" { - value = aws_instance.main + value = [ + { + host: aws_instance.main.public_ip + port: 22 + user: "ubuntu" + private_key: tls_private_key.terraform_ssh_key.private_key_pem + } + ] } output "pool_worker_instances" { - value = aws_instance.worker + value = [ + for instance in aws_instance.worker : { + host: instance.public_ip + port: 22 + user: "ubuntu" + private_key: tls_private_key.terraform_ssh_key.private_key_pem + } + ] } diff --git a/kubernetes/config.tf b/kubernetes/config.tf new file mode 100644 index 0000000..334050c --- /dev/null +++ b/kubernetes/config.tf @@ -0,0 +1,35 @@ +variable "cluster_token" { + type = string + description = "cluster token" + sensitive = true +} + +variable "cluster_domain" { + type = string + description = "cluster domain" +} + +variable "master_server_address" { + type = string + description = "master server address" +} + +variable "cluster_main_node" { + type = list(object({ + host = string + port = string + user = string + private_key = string + })) + description = "map of objects - main cluster nodes - [host, port]" +} + +variable "cluster_worker_node" { + type = list(object({ + host = string + port = string + user = string + private_key = string + })) + description = "map of objects - worker cluster nodes - [host, port]" +} diff --git a/kubernetes/kubernetes.tf b/kubernetes/kubernetes.tf new file mode 100644 index 0000000..d6b22ff --- /dev/null +++ b/kubernetes/kubernetes.tf @@ -0,0 +1,63 @@ +terraform { + required_providers { + yoshik3s = { + source = "HideyoshiNakazone/yoshik3s" + version = "0.1.1" + } + } +} + + +# Cluster Configuration + +resource "yoshik3s_cluster" "main_cluster" { + name = "main-cluster" + token = var.cluster_token + k3s_version = "v1.30.2+k3s2" +} + + +resource "yoshik3s_master_node" "master_node" { + cluster = { + token = yoshik3s_cluster.main_cluster.token + k3s_version = yoshik3s_cluster.main_cluster.k3s_version + } + + count = length(var.cluster_main_node) + + node_connection = { + host = var.cluster_main_node[count.index].host + port = var.cluster_main_node[count.index].port + user = var.cluster_main_node[count.index].user + private_key = var.cluster_main_node[count.index].private_key + } + + node_options = [ + "--disable traefik", + "--node-label node_type=master", + "--tls-san ${var.cluster_domain}" + ] +} + + +resource "yoshik3s_worker_node" "worker_node" { + master_server_address = var.master_server_address + + cluster = { + token = yoshik3s_cluster.main_cluster.token + k3s_version = yoshik3s_cluster.main_cluster.k3s_version + } + + count = length(var.cluster_worker_node) + + node_connection = { + host = var.cluster_worker_node[count.index].host + port = var.cluster_worker_node[count.index].port + user = var.cluster_worker_node[count.index].user + private_key = var.cluster_worker_node[count.index].private_key + } + + node_options = [ + "--node-label node_type=worker", + ] +} diff --git a/main.tf b/main.tf index 692b583..c03897b 100644 --- a/main.tf +++ b/main.tf @@ -7,54 +7,74 @@ terraform { version = "~> 4.0" } aws = { - source = "hashicorp/aws" + source = "hashicorp/aws" version = "5.17.0" } + yoshik3s = { + source = "HideyoshiNakazone/yoshik3s" + version = "0.1.1" + } } } provider "aws" { - region = var.aws_region - access_key = var.aws_access - secret_key = var.aws_secret + region = var.aws_region + access_key = var.aws_access + secret_key = var.aws_secret } provider "cloudflare" { - api_token = var.cloudflare_api_token + api_token = var.cloudflare_api_token +} + +provider "yoshik3s" { + # No configuration needed } ### MODULES module "bucket" { - source = "./bucket" - providers = { - aws.main = aws - } - project_domain = var.project_domain - project_name = var.project_name + source = "./bucket" + providers = { + aws.main = aws + } + project_domain = var.project_domain + project_name = var.project_name } module "instances" { - source = "./instances" - providers = { - aws.main = aws - } - project_domain = var.project_domain - project_name = var.project_name - k3s_token = var.k3s_token - number_of_workers = var.number_of_workers - aws_region = var.aws_region - ssh_public_key_main = var.ssh_public_key_main - ssh_public_key_ci_cd = var.ssh_public_key_ci_cd + source = "./instances" + providers = { + aws.main = aws + } + project_domain = var.project_domain + project_name = var.project_name + k3s_token = var.k3s_token + number_of_workers = var.number_of_workers + aws_region = var.aws_region + ssh_public_key_main = var.ssh_public_key_main + ssh_public_key_ci_cd = var.ssh_public_key_ci_cd } module "dns" { - source = "./dns" - providers = { - cloudflare = cloudflare - } - public_ip = module.instances.pool_master_public_ip - environment_name = var.environment_name - cloudflare_zone_id = var.cloudflare_zone_id + source = "./dns" + providers = { + cloudflare = cloudflare + } + public_ip = module.instances.pool_master_public_ip + environment_name = var.environment_name + cloudflare_zone_id = var.cloudflare_zone_id +} + +module "kubernetes" { + source = "./kubernetes" + providers = { + yoshik3s = yoshik3s + } + cluster_token = var.k3s_token + cluster_domain = var.project_domain + master_server_address = module.instances.pool_master_public_ip + cluster_main_node = module.instances.pool_master_instance + cluster_worker_node = module.instances.pool_worker_instances } \ No newline at end of file