Background
The last post covered how to deploy virtual machines in Proxmox with Terraform. This post shows the template for deploying 4 Kubernetes virtual machines in Proxmox using Terraform.
Youtube Video Link
Kubernetes Proxmox Terraform Template
Without further ado, below is the template I used to create my virtual machines. The main LAN network is 10.98.1.0/24, and the Kube internal network (on its own bridge) is 10.17.0.0/24.
This template creates a Kube server, two agents, and a storage server.
Update 2022-04-26: bumped Telmate provider version to 2.9.8 from 2.7.4
terraform { required_providers { proxmox = { source = "telmate/proxmox" version = "2.9.8" } } } provider "proxmox" { pm_api_url = "https://prox-1u.home.fluffnet.net:8006/api2/json" # change this to match your own proxmox pm_api_token_id = [secret] pm_api_token_secret = [secret] pm_tls_insecure = true } resource "proxmox_vm_qemu" "kube-server" { count = 1 name = "kube-server-0${count.index + 1}" target_node = "prox-1u" # thanks to Brian on YouTube for the vmid tip # http://www.youtube.com/channel/UCTbqi6o_0lwdekcp-D6xmWw vmid = "40${count.index + 1}" clone = "ubuntu-2004-cloudinit-template" agent = 1 os_type = "cloud-init" cores = 2 sockets = 1 cpu = "host" memory = 4096 scsihw = "virtio-scsi-pci" bootdisk = "scsi0" disk { slot = 0 size = "10G" type = "scsi" storage = "local-zfs" #storage_type = "zfspool" iothread = 1 } network { model = "virtio" bridge = "vmbr0" } network { model = "virtio" bridge = "vmbr17" } lifecycle { ignore_changes = [ network, ] } ipconfig0 = "ip=10.98.1.4${count.index + 1}/24,gw=10.98.1.1" ipconfig1 = "ip=10.17.0.4${count.index + 1}/24" sshkeys = <<EOF ${var.ssh_key} EOF } resource "proxmox_vm_qemu" "kube-agent" { count = 2 name = "kube-agent-0${count.index + 1}" target_node = "prox-1u" vmid = "50${count.index + 1}" clone = "ubuntu-2004-cloudinit-template" agent = 1 os_type = "cloud-init" cores = 2 sockets = 1 cpu = "host" memory = 4096 scsihw = "virtio-scsi-pci" bootdisk = "scsi0" disk { slot = 0 size = "10G" type = "scsi" storage = "local-zfs" #storage_type = "zfspool" iothread = 1 } network { model = "virtio" bridge = "vmbr0" } network { model = "virtio" bridge = "vmbr17" } lifecycle { ignore_changes = [ network, ] } ipconfig0 = "ip=10.98.1.5${count.index + 1}/24,gw=10.98.1.1" ipconfig1 = "ip=10.17.0.5${count.index + 1}/24" sshkeys = <<EOF ${var.ssh_key} EOF } resource "proxmox_vm_qemu" "kube-storage" { count = 1 name = "kube-storage-0${count.index + 1}" target_node = "prox-1u" vmid = "60${count.index + 1}" clone = "ubuntu-2004-cloudinit-template" agent = 1 os_type = "cloud-init" cores = 2 sockets = 1 cpu = "host" memory = 4096 scsihw = "virtio-scsi-pci" bootdisk = "scsi0" disk { slot = 0 size = "20G" type = "scsi" storage = "local-zfs" #storage_type = "zfspool" iothread = 1 } network { model = "virtio" bridge = "vmbr0" } network { model = "virtio" bridge = "vmbr17" } lifecycle { ignore_changes = [ network, ] } ipconfig0 = "ip=10.98.1.6${count.index + 1}/24,gw=10.98.1.1" ipconfig1 = "ip=10.17.0.6${count.index + 1}/24" sshkeys = <<EOF ${var.ssh_key} EOF }
After running Terraform plan and apply, you should have 4 new VMs in your Proxmox cluster:

Conclusion
You now have 4 VMs ready for Kubernetes installation. The next post shows how to deploy a Kubernetes cluster with Ansible.
5 replies on “Deploying Kubernetes VMs in Proxmox with Terraform”
[…] glad I worked through everything and can pass it along. Check back soon for my next post on using Terraform to deploy a full set of Kubernetes machines to a Proxmox cluster (and thrilling sequel to that post, Using Ansible to bootstrap a Kubernetes […]
Hi, I just discovered your blog over the terraform proxmox video on youtube. I hope you will continue for a long time because i am already addicted to your straight forward and reasonable tutorials.
Greetings from Germany
Hi Eike, I do plan to continue! We have a 15 month old at home though so time is sparse. These Proxmox/Terraform articles are some of the most popular so my next post will probably be ‘using Ansible to bootstrap a Kubernetes cluster’, which I mentioned in the post and video (quite a while ago at this point). It is overdue!
Awesome post! Thank you. Please, please, continue writing.
awesome work ! thanks mate !