Skip to content

Commit 5c92373

Browse files
committed
feat: Add K3S feature
1 parent fc95165 commit 5c92373

File tree

9 files changed

+213
-9
lines changed

9 files changed

+213
-9
lines changed

.terraform.lock.hcl

Lines changed: 18 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ This Terraform module can be used to create cheap and disposable development mac
77
## Examples
88

99
* [Full-featured development instance on a Scaleway DEV1-S instance running Ubuntu 20.04](examples/ubuntu_dev1-s_full)
10+
* [k3s cluster on 3 Scaleway DEV1-S instances running Debian Buster](examples/debian_dev1-s_k3s)
1011

1112
## Prerequisites
1213

cloud-init-user-data

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ runcmd:
4545
- 'apt-get update'
4646
- 'apt-get install -y docker-ce docker-ce-cli containerd.io'
4747
%{endif~}
48+
%{if feature_k3s ~}
49+
# install K3S
50+
- 'curl -sfL https://get.k3s.io | sh -s %{if node_index == "0" ~}server --tls-san ${public_ip} %{else~}agent --server https://${first_public_ip}:6443 %{endif~} --token ${k3s_token}'
51+
%{endif~}
4852
%{if feature_nvm ~}
4953
# install NVM
5054
- 'runuser -l ${user} -c "curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/$(curl -s https://api.github.com/repos/nvm-sh/nvm/releases/latest | jq -r .tag_name)/install.sh | bash"'

examples/debian_dev1-s_k3s/.terraform.lock.hcl

Lines changed: 58 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# Example : k3s cluster on 3 Scaleway DEV1-S instances running Debian Buster
2+
3+
Read the [module documentation](../../README.md) for further explanation.
4+
5+
## Prerequisites
6+
7+
* Terraform 1.0+
8+
* A [Scaleway project](https://console.scaleway.com/project/) (default project is fine but [creating a new one](https://www.scaleway.com/en/docs/scaleway-project/) is encouraged)
9+
* curl, OpenSSH
10+
* [jq](https://stedolan.github.io/jq/) (only for magic commands)
11+
12+
## Introduction
13+
14+
1. Create your SSH key pair and [add the public key in authorized keys of your Scleway project in the Scaleway console](https://console.scaleway.com/project/credentials)
15+
16+
```
17+
ssh-keygen -t rsa -b 4096 -q -C 'scaleway' -N '' -f ~/.ssh/scaleway
18+
```
19+
20+
> if using an existing SSH key, it is assumed its name is *~/.ssh/scaleway*
21+
22+
2. [Retrieve your project credentials](https://console.scaleway.com/project/credentials) and export them:
23+
24+
```
25+
export SCW_DEFAULT_PROJECT_ID=<REDACTED>
26+
export SCW_ACCESS_KEY=<REDACTED>
27+
export SCW_SECRET_KEY=<REDACTED>
28+
export SCW_DEFAULT_REGION=fr-par
29+
export SCW_DEFAULT_ZONE=fr-par-1
30+
```
31+
32+
## Usage
33+
34+
1. Retrieve the (root) Terraform module of this example
35+
36+
```
37+
mkdir debian_dev1-s_k3s
38+
cd debian_dev1-s_k3s
39+
curl -fsSL -O https://raw.githubusercontent.com/debovema/terraform-scaleway-dev-instance/main/examples/debian_dev1-s_k3s/main.tf
40+
```
41+
42+
2. Initialize Terraform
43+
44+
```
45+
terraform init
46+
```
47+
48+
3. Apply default plan
49+
```
50+
terraform apply
51+
```
52+
53+
4. SSH to the (first) created host
54+
55+
```
56+
eval `terraform output --json ssh_commands | jq -r ".[0]"`
57+
```
58+
59+
> To display the SSH command used to connect:
60+
> ```
61+
> echo $(terraform output --json ssh_commands | jq -r ".[0]")
62+
> ```

examples/debian_dev1-s_k3s/main.tf

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
//--------------------------------------------------------------------
2+
// Variables
3+
variable "dev_ssh_key_file" { default = "~/.ssh/scaleway" }
4+
variable "dev_username" { default = "developer" }
5+
6+
//--------------------------------------------------------------------
7+
// Modules
8+
module "dev" {
9+
source = "app.terraform.io/scwdev/dev/scaleway"
10+
version = "0.0.3"
11+
12+
node_count = 3
13+
server_image = "debian_buster"
14+
server_type = "DEV1-S"
15+
16+
feature_k3s = "true"
17+
feature_omz = "true"
18+
ssh_key_file = var.dev_ssh_key_file
19+
username = var.dev_username
20+
}
21+
22+
//--------------------------------------------------------------------
23+
// Outputs
24+
output "public_ips" {
25+
value = module.dev.public_ips
26+
}
27+
28+
output "ssh_commands" {
29+
value = module.dev.ssh_commands
30+
}

examples/ubuntu_dev1-s_full/main.tf

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,16 @@ module "dev" {
99
source = "app.terraform.io/scwdev/dev/scaleway"
1010
version = "0.0.2"
1111

12+
server_image = "ubuntu_focal"
13+
server_type = "DEV1-S"
14+
15+
ssh_key_file = var.dev_ssh_key_file
16+
username = var.dev_username
17+
1218
feature_docker = "true"
1319
feature_nvm = "true"
1420
feature_omz = "true"
1521
feature_sdkman = "true"
16-
ssh_key_file = var.dev_ssh_key_file
17-
username = var.dev_username
1822
}
1923

2024
//--------------------------------------------------------------------

main.tf

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,48 @@
11
data "template_file" "userdata" {
2+
count = var.node_count
23
template = file("${path.module}/cloud-init-user-data")
34

45
vars = {
5-
distrib = regex("^ubuntu|debian", var.server_image)
6-
user = var.username
6+
node_index = count.index
7+
distrib = regex("^ubuntu|debian", var.server_image)
8+
user = var.username
9+
first_public_ip = scaleway_instance_ip.node_public_ip[0].address
10+
public_ip = scaleway_instance_ip.node_public_ip[count.index].address
11+
712
feature_docker = var.feature_docker
13+
feature_k3s = var.feature_k3s
14+
k3s_token = var.feature_k3s ? random_password.k3s_token[0].result : ""
815
feature_nvm = var.feature_nvm
916
feature_omz = var.feature_omz
1017
feature_sdkman = var.feature_sdkman
1118
}
1219
}
1320

21+
resource "random_password" "k3s_token" {
22+
count = var.feature_k3s ? 1 : 0
23+
24+
length = 32
25+
special = false
26+
upper = false
27+
lower = true
28+
number = true
29+
}
30+
31+
resource "scaleway_instance_ip" "node_public_ip" {
32+
count = var.node_count
33+
}
34+
1435
resource "scaleway_instance_server" "node" {
1536
count = var.node_count
1637

1738
name = "${var.node_name}-${count.index}"
1839

19-
image = var.server_image
20-
type = var.server_type
21-
enable_dynamic_ip = true
40+
image = var.server_image
41+
type = var.server_type
42+
ip_id = scaleway_instance_ip.node_public_ip[count.index].id
2243

2344
# initialization sequence
24-
cloud_init = data.template_file.userdata.rendered
45+
cloud_init = data.template_file.userdata[count.index].rendered
2546
}
2647

2748
resource "null_resource" "wait_for_init" {
@@ -44,4 +65,4 @@ resource "null_resource" "wait_for_init" {
4465
provisioner "local-exec" {
4566
command = "sleep 80" # wait more than 1 minute for the instance to be rebooted
4667
}
47-
}
68+
}

variables.tf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ variable "feature_omz" {
4242
default = false
4343
}
4444

45+
variable "feature_k3s" {
46+
type = bool
47+
description = "Whether to install K3S or not"
48+
default = false
49+
}
50+
4551
variable "feature_docker" {
4652
type = bool
4753
description = "Whether to install Docker or not"

0 commit comments

Comments
 (0)