Initial Implementation of K3S Cluster with YoshiK3S
This commit is contained in:
@@ -101,15 +101,6 @@ resource "aws_instance" "main" {
|
|||||||
"sudo /sbin/mkswap /var/swap.1",
|
"sudo /sbin/mkswap /var/swap.1",
|
||||||
"sudo chmod 600 /var/swap.1",
|
"sudo chmod 600 /var/swap.1",
|
||||||
"sudo /sbin/swapon /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 /sbin/mkswap /var/swap.1",
|
||||||
"sudo chmod 600 /var/swap.1",
|
"sudo chmod 600 /var/swap.1",
|
||||||
"sudo /sbin/swapon /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" {
|
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" {
|
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
35
kubernetes/config.tf
Normal 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
63
kubernetes/kubernetes.tf
Normal 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
78
main.tf
@@ -7,54 +7,74 @@ terraform {
|
|||||||
version = "~> 4.0"
|
version = "~> 4.0"
|
||||||
}
|
}
|
||||||
aws = {
|
aws = {
|
||||||
source = "hashicorp/aws"
|
source = "hashicorp/aws"
|
||||||
version = "5.17.0"
|
version = "5.17.0"
|
||||||
}
|
}
|
||||||
|
yoshik3s = {
|
||||||
|
source = "HideyoshiNakazone/yoshik3s"
|
||||||
|
version = "0.1.1"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
provider "aws" {
|
provider "aws" {
|
||||||
region = var.aws_region
|
region = var.aws_region
|
||||||
access_key = var.aws_access
|
access_key = var.aws_access
|
||||||
secret_key = var.aws_secret
|
secret_key = var.aws_secret
|
||||||
}
|
}
|
||||||
|
|
||||||
provider "cloudflare" {
|
provider "cloudflare" {
|
||||||
api_token = var.cloudflare_api_token
|
api_token = var.cloudflare_api_token
|
||||||
|
}
|
||||||
|
|
||||||
|
provider "yoshik3s" {
|
||||||
|
# No configuration needed
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
### MODULES
|
### MODULES
|
||||||
|
|
||||||
module "bucket" {
|
module "bucket" {
|
||||||
source = "./bucket"
|
source = "./bucket"
|
||||||
providers = {
|
providers = {
|
||||||
aws.main = aws
|
aws.main = aws
|
||||||
}
|
}
|
||||||
project_domain = var.project_domain
|
project_domain = var.project_domain
|
||||||
project_name = var.project_name
|
project_name = var.project_name
|
||||||
}
|
}
|
||||||
|
|
||||||
module "instances" {
|
module "instances" {
|
||||||
source = "./instances"
|
source = "./instances"
|
||||||
providers = {
|
providers = {
|
||||||
aws.main = aws
|
aws.main = aws
|
||||||
}
|
}
|
||||||
project_domain = var.project_domain
|
project_domain = var.project_domain
|
||||||
project_name = var.project_name
|
project_name = var.project_name
|
||||||
k3s_token = var.k3s_token
|
k3s_token = var.k3s_token
|
||||||
number_of_workers = var.number_of_workers
|
number_of_workers = var.number_of_workers
|
||||||
aws_region = var.aws_region
|
aws_region = var.aws_region
|
||||||
ssh_public_key_main = var.ssh_public_key_main
|
ssh_public_key_main = var.ssh_public_key_main
|
||||||
ssh_public_key_ci_cd = var.ssh_public_key_ci_cd
|
ssh_public_key_ci_cd = var.ssh_public_key_ci_cd
|
||||||
}
|
}
|
||||||
|
|
||||||
module "dns" {
|
module "dns" {
|
||||||
source = "./dns"
|
source = "./dns"
|
||||||
providers = {
|
providers = {
|
||||||
cloudflare = cloudflare
|
cloudflare = cloudflare
|
||||||
}
|
}
|
||||||
public_ip = module.instances.pool_master_public_ip
|
public_ip = module.instances.pool_master_public_ip
|
||||||
environment_name = var.environment_name
|
environment_name = var.environment_name
|
||||||
cloudflare_zone_id = var.cloudflare_zone_id
|
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
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user