Merge pull request #44 from HideyoshiSolutions/staging

Staging - Implementation of K3S Cluster with YoshiK3S
This commit is contained in:
2024-07-11 03:59:17 -03:00
committed by GitHub
4 changed files with 163 additions and 44 deletions

View File

@@ -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
}
]
}

35
kubernetes/config.tf Normal file
View File

@@ -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]"
}

63
kubernetes/kubernetes.tf Normal file
View File

@@ -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",
]
}

78
main.tf
View File

@@ -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
}