LIBVIRT_HYPERVISOR_URI := "qemu:///system"
LIBVIRT_TEMPLATES_IMAGES_POOL := "templates"
LIBVIRT_TEMPLATES_IMAGES_POOL_DIR := "/var/lib/libvirt/images/templates"
LIBVIRT_IMAGE_NAME := "debian11-5.qcow2"
ROOT_PASSWORD := "rootPassword"
$(eval SSH_IDENTITY=$(shell find ~/.ssh/ -name 'id_*' -not -name '*.pub' | head -n 1))
默认使用 ${HOME}/.ssh/id_rsa 的密钥对作为 SSH 免密访问的密钥,如果没有,请先创建一个。
执行 make image 进行镜像的构建,以及在本地虚拟化环境创建名为 templates 的存储池,并将镜像上传到该存储池中,命名为 debian11-5.qcow2 的卷,具体的代码,请查看 Makefile 。
❯ make image
...
完成之后,我们可以通过 virsh 命令查看镜像卷
❯ sudo virsh vol-list --pool templates
名称 路径
------------------------------------------------------------------------
debian11-5.qcow2 /var/lib/libvirt/images/templates/debian11-5.qcow2
补充: 在文件 base.pkr.hcl 中,对 iso 文件源的配置
iso_url = "https://mirrors.ustc.edu.cn/debian-cd/current/amd64/iso-cd/debian-11.5.0-amd64-netinst.iso"
配置网络地址时,在 packer 进行构建时,可能会下载 iso 文件超时而导致构建失败。可通过预先下载对应的 iso 文件到本地文件系统,然后将 iso_url 配置为本地路径,例如
iso_url = "/data/debian-11.5.0-amd64-netinst.iso"
这样可以避免由于网络问题导致构建失败。
创建虚拟机实例
接下来,我们将使用 Terraform 创建并初始化集群所需要的虚拟机实例,进入 k3scluster/terraform/ 目录
❯ cd ../terraform/
该目录下包含了创建集群所需虚拟机资源的定义,首先看 provider.tf 文件
terraform {
required_providers {
libvirt = {
source = "dmacvicar/libvirt"
version = "0.7.0"
}
}
required_version = ">= 0.13"
}
provider "libvirt" {
uri = var.libvirt_uri
}
因为我们需要通过 libvirt 创建虚拟机,因此这里需要 dmacvicar/libvirt 的 Provider,该 Provider 的 uri 配置为变量 var.libvirt_uri,默认为 qemu:///system,也就是本地虚拟环境。
其他需要的变量定义都放在 variables.tf 文件中。资源文件 vms.tf 定义了需要创建的资源,其中包括
resource "libvirt_network" "network" {
name = var.net_name
mode = "nat"
domain = var.net_domain
addresses = [var.subnet]
dhcp {
enabled = true
}
dns {
enabled = true
local_only = true
}
}