테라폼(Terraform)으로 VM 생성 후 쿠버네티스(Kubernates) 환경 구축하기 (1)

반응형

✅ 설치 환경

  • Ubuntu 22.04 LTS VM (Local PC에서 구성)
  • CPU 4Core / Memory 4GB / Storage 40GB
  • Master Node 1대, Worker Node 2대

✅ 전체적인 구성 흐름

  1. Windows 워크스테이션에서 Ubuntu VM 생성 (과정 생략)
  2. Ubuntu VM에 KVM 설치 (Terraform이 VM 생성 가능하도록)
  3. Terraform으로 VM 여러 개 생성 // 여기까지 완료
  4. Kubernetes 설치 (Kind로 설치) -> 다음편부터!
  5. Cilium 설치 후 네트워크 테스트

* VM 사양이 CPU 4코어, RAM 4GB라서 Kubernetes 클러스터를 구성할 때 Node 개수를 2~3개 이하로 제한

 


1️⃣ 필수 패키지 설치 및 Ubuntu VM에 가상화 환경 설정 (KVM)

1. Ubuntu에 패키지 업데이트 및 필수 패키지 설치, kvm 설치

sudo apt update && sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager apt-transport-https ca-certificates curl gpg net-tools jq traceroute

 

sudo add-apt-repository ppa:rmescandon/yq
sudo apt update
sudo apt install yq -y

 

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.all.forwarding = 1
vm.overcommit_memory = 1
vm.panic_on_oom = 0
vm.max_map_count = 1048576
fs.file-max = 8388608
fs.inotify.max_user_watches = 12288
kernel.pid_max = 4194304
net.core.netdev_max_backlog = 1000
net.core.somaxconn = 1024
net.ipv4.tcp_fin_timeout = 60
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_syncookies = 1
EOF

 

sudo sysctl --system
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl containerd
sudo apt-mark hold kubelet kubeadm kubectl

mkdir -p /etc/containerd/
containerd config default > /etc/containerd/config.toml
sed -i "s/SystemdCgroup = false/SystemdCgroup = true/g" /etc/containerd/config.toml

sudo crictl config --set runtime-endpoint=unix:///run/containerd/containerd.sock --set image-endpoint=unix:///run/containerd/containerd.sock

systemctl daemon-reload
systemctl enable --now containerd
systemctl enable --now kubelet

 

2. KVM 서비스 활성화

sudo systemctl enable --now libvirtd
sudo usermod -aG libvirt $USER
newgrp libvirt

 

3. 설치 확인 (아래와 같이 빈 목록이 나와야 한다.)

virsh list --all


 Id   Name           State
------------------------------

 


2️⃣ Terraform 설치

curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list

// Terraform 설치
sudo apt update && sudo apt install -y terraform

// Terraform 설치 확인
terraform -v

위 과정으로 Terraform을 설치하는데 계속 "E: Unable to locate package terraform" 에러가 떠서, GPT에게 물어보니.. APT 대신 Snap으로 설치할 수 있다고 해서 아래의 명령어로 테라폼을 설치해주었다.

 

// Terraform snap으로 설치
sudo snap install terraform --classic

// Terraform 버전 확인
terraform -v


3️⃣ Terraform으로 VM 여러 개 생성 ( Master 1대, Worker 2대 필요)

: Terraform을 사용하여 가상 머신 3개(Master vm 1대, Worker vm 2대)를 자동 생성해보자.

 

1. Terraform 파일 (main.tf) 작성

: 아래의 명령어로 main.tf를 작성해주자.

mkdir ~/terraform-kvm && cd ~/terraform-kvm
nano main.tf

 

2. VM 3대 생성하는 Terraform 코드 작성

: Terraform 기본 저장소(registry.terraform.io/hashicorp/libvirt)에는 libvirt 프로바이더가 없기 때문에 별도로 설정해줘야 한다.

 

<main.tf>

terraform {
  required_providers {
    libvirt = {
      source  = "dmacvicar/libvirt"
      version = "~> 0.7.0"
    }
  }
}

provider "libvirt" {
  uri = "qemu:///system"
}

# 공통 Ubuntu VM 이미지 생성
resource "libvirt_volume" "ubuntu_base" {
  name   = "ubuntu_base"
  pool   = "default"
  source = "/home/ubuntu/ubuntu-22.04-server.qcow2" # 미리 다운받은 이미지
  format = "qcow2"
}

# 마스터 노드 생성 (1개)
resource "libvirt_domain" "master_node" {
  name   = "k8s-master"
  memory = "3072" # RAM 3GB (마스터는 조금 더 필요)
  vcpu   = 2      # CPU 2개 (여유있게 설정)
  
  disk {
    volume_id = libvirt_volume.ubuntu_base.id
  }

  network_interface {
    network_name = "default"
  }

  cloudinit = libvirt_cloudinit_disk.master_init.id
}

# 워커 노드 생성 (2개)
resource "libvirt_domain" "worker_nodes" {
  count  = 2
  name   = "k8s-worker-${count.index + 1}"
  memory = "2048" # RAM 2GB
  vcpu   = 2      # CPU 2개

  disk {
    volume_id = libvirt_volume.ubuntu_base.id
  }

  network_interface {
    network_name = "default"
  }

  cloudinit = libvirt_cloudinit_disk.worker_init.id
}

# 클라우드-이니트 (초기 SSH 설정)
resource "libvirt_cloudinit_disk" "master_init" {
  name = "master_init.iso"
  pool = "default"

  user_data = <<EOF
#cloud-config
hostname: k8s-master
EOF
}

resource "libvirt_cloudinit_disk" "worker_init" {
  name = "worker_init.iso"
  pool = "default"

  user_data = <<EOF
#cloud-config
hostname: k8s-worker
EOF
}

 

또 마스터 노드와 워커 노드에서 참조할 ubuntu qcow2에 대해 개별 디스크를 사용하도록 각각 생성해줘야 한다.

<워커 노드 디스크 생성>

cd /var/lib/libvirt/images/

# 워커 노드 1 디스크 생성
sudo qemu-img create -f qcow2 -b ubuntu_base.qcow2 -F qcow2 k8s-worker-1.qcow2 10G

# 워커 노드 2 디스크 생성
sudo qemu-img create -f qcow2 -b ubuntu_base.qcow2 -F qcow2 k8s-worker-2.qcow2 10G

# 권한 설정
sudo chown libvirt-qemu:kvm k8s-worker-1.qcow2 k8s-worker-2.qcow2
sudo chmod 644 k8s-worker-1.qcow2 k8s-worker-2.qcow2

위 사진과 같이 각 마스터와 워커 노드에 대해 qcow2가 별도로 생성되어 있고, 소유 권한이 노란색 표시한 부분과 같아야 한다.

 

💡 설명

  • KVM을 Terraform으로 관리 (provider "libvirt")
  • Ubuntu 22.04 VM 이미지 사용 (source = "/home/ubuntu/ubuntu-22.04-server.qcow2")
  • VM 3개 생성 (count = 3)
  • Master Node에 RAM 3GB, vCPU 2개 할당 / Worker Node에 RAM 2GB, vCPU 2개 할당
  • cloudinit 초기 설정 추가

4️⃣  Terraform 실행

1. Terraform 초기화

terraform init

 

terraform init 명령어로 초기화 확인!

 

2. 배포될 VM 확인

terraform plan

 

3. Terraform으로 VM 생성

terraform apply -auto-approve

4. 생성된 VM 목록 확인

: 아래와 같이 State에 running이 적혀있으면 성공!

virsh list --all


 

아래는 Terraform으로 vm 생성하고 실행하면서 겪은 자잘자잘한 에러들...

 

🔧  terraform plan 을 입력했을 때 "Terraform will perform the following actions~ 하며 몇개의 노드 정보가 뜨길래 apply 로 생성까지 하려고했으나.. 역시 바로 될 리가 없지 ^^.. 아래와 같이 에러가 떴다. can't find storage pool 'default' 와 Error: error while starting the creation of CloudInit's ISO image: exec: "mkisofs": executable file not found in $PATH 가 뜬 것..두둥

일단 can'f find storage pool 'default'는 Terraform이 libvirt의 기본 스토리지 풀을 찾지 못하는 문제로, virsh pool-list --all 를 입력하면 위 사진과 같이 비어있는 상태로 출력된다. 아래 명령어로 기본 스토리지 풀을 생성해준 뒤, 다시 terraform apply -auto-approve 명령어로 실행!

virsh pool-define-as --name default --type dir --target /var/lib/libvirt/images
virsh pool-start default
virsh pool-autostart default

 

🔧 그다음 에러인 exec: "mkisofs": executable file not found in $PATH 는 Terraform이 cloud-init ISO 파일을 만들 때 필요한 mkisofs 프로그램을 찾지 못하는 문제로 아래와 같이 설치해주고 다시 확인해보자.

// genisoimage 설치
sudo apt update && sudo apt install -y genisoimage

// 설치 확인
which mkisofs

// 출력 결과
/usr/bin/mkisofs

 

🔧 마지막으로 또 에러가 떴는데, Terraform 으로 Ubuntu VM 생성을 해주려면, 내 vm 안에 설치하려는 운영체제의 qcow2 파일이 필요하다. 까먹고 내가 설치를 안한것;;

 

🔧 그리고 가상화 설정도.. 해주어야 한다.

// 아래 명령어를 쳤을 때 숫자가 0이 아닌 1 이상의 숫자가 나와야 kvm 지원!
egrep -c '(vmx|svm)' /proc/cpuinfo

// KVM 모듈 로드
sudo modprobe kvm
sudo modprobe kvm_intel

// KVM 정상적으로 동작하는지 확인
kvm-ok

 

반응형