네트워크는 VPN을 이용해 추상화 하므로, 아래의 조건에 맞는 환경이 준비되어야 한다.
control-plane 과 worker 용도로 생성control-plane 환경만 생성terraform init terraform apply를 수행하면 된다.provider "multipass" {}
terraform {
required_providers {
multipass = {
source = "larstobi/multipass"
version = "1.4.2"
}
}
}
variable "image_name" {
description = "Ubuntu image name, default noble LTS"
type = string
default = "noble"
}
variable "cpus" {
description = "Virtual CPU count"
type = number
default = 2
}
variable "memory" {
description = "Virtual VM memory allocation"
type = string
default = "2G"
}
variable "disks" {
description = "Thin provisioned disk size"
type = string
default = "30G"
}
variable "instance_count" {
description = "Number of instances to create"
type = number
default = 3
}
# 로컬의 ~/.ssh/id_rsa.pub 파일을 읽어 변수로 저장
data "local_file" "ssh_pubkey" {
filename = pathexpand("~/.ssh/id_rsa.pub")
}
# 사용자 정의 user_data.cfg 파일을 생성하는 리소스
resource "local_file" "user_data" {
content = <<-EOF
package_update: true
package_upgrade: true
users:
- name: 'ubuntu'
groups: users,adm,dialout,audio,netdev,video,plugdev,cdrom,games,input,gpio,spi,i2c,render,sudo
shell: /bin/bash
lock_passwd: true
ssh_authorized_keys:
- '${data.local_file.ssh_pubkey.content}' # 로컬 공개 키 삽입
ssh_deletekeys: false
packages:
- vim
- curl
- wget
EOF
filename = "${path.module}/user_data.cfg"
}
# Multipass 인스턴스 생성
resource "multipass_instance" "instances" {
count = var.instance_count
cloudinit_file = local_file.user_data.filename # 생성된 user_data.cfg 파일 참조
name = [
"control-plane-1",
"worker-1",
"worker-2"
][count.index]
cpus = var.cpus
image = var.image_name
memory = var.memory
disk = var.disks
}
sudo apt update
sudo apt install wireguard -y
sudo vim /etc/wireguard/wg0.conf
# 내용 붙여넣기 후 저장
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
ping 10.200.1.1
## 아래처럼 핑이 잘 날아가면 연결 성공
# PING 10.200.1.1 (10.200.1.1) 56(84) bytes of data.
# 64 bytes from 10.200.1.1: icmp_seq=1 ttl=64 time=9.22 ms
# 64 bytes from 10.200.1.1: icmp_seq=2 ttl=64 time=9.79 ms
# 64 bytes from 10.200.1.1: icmp_seq=3 ttl=64 time=10.7 ms
# 64 bytes from 10.200.1.1: icmp_seq=4 ttl=64 time=13.4 ms
모든 노드에 위 과정을 수행한다면 아래 사진처럼 wireguard ui에서 실행중인 걸 확인할 수 있다.
