使用Terraform在KVM上构建基于CoreOS的Minikube
简述
使用 Terraform Libvirt Provider,在 KVM 上进行配置,创建一个虚拟机,其中安装了 CoreOS + Minikube。
先决条件
-
- Terraform
-
- Container engine (docker, podman, or nerdctl, …)
-
- KVM 関連パッケージ
qemu-kvm
libvirt-clients
libvirt-daemon
bridge-utils
virt-manager
(OS: Ubuntu 22.04)
示例代码
请参考此处的 GitHub 代码库。
操作步骤
获取 CoreOS 镜像
请从CoreOS的官方下载页面下载适用于QEMU的映像文件。本文将介绍如何进行下载。
https://builds.coreos.fedoraproject.org/prod/streams/testing/builds/37.20230303.2.0/x86_64/fedora-coreos-37.20230303.2.0-qemu.x86_64.qcow2.xz
使用
将下载的图像解压并将fedora-coreos-37.20230303.2.0-qemu.x86_64.qcow2移动到/var/lib/libvirt/images/目录下(*补充)。
$ unxz -k fedora-coreos-37.20230303.2.0-qemu.x86_64.qcow2.xz
$ sudo mv fedora-coreos-37.20230303.2.0-qemu.x86_64.qcow2 /var/lib/libvirt/images/
Ignition的制作
解答如下:
Ignition是一种用于自动设置操作系统的机制,它在CoreOS以及其他几个Linux发行版中得到支持。
设置以JSON格式的文件进行描述。然而,通常情况下会先使用易于人类理解的YAML进行描述,然后使用Butane(前身为Fedora CoreOS Config Transpiler, FCCT)将其转换为JSON。
(根据惯例,文件的扩展名从转换之前的YAML改为.bu,转换之后的JSON为.ign)。
创建一个如下的.bu文件。
variant: fcos
version: 1.1.0
passwd:
users:
- name: core
groups:
ssh_authorized_keys:
- "<YOUR_SSH_KEY>"
# Docs of ignition storage.files: https://coreos.github.io/butane/examples/#storage-and-files
storage:
files:
# minikube: https://minikube.sigs.k8s.io/docs/start/
- path: /usr/local/bin/minikube
overwrite: true
mode: 0755
contents:
source: https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
# kubectl: https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/
- path: /usr/local/bin/kubectl
overwrite: true
mode: 0755
contents:
source: https://dl.k8s.io/release/v1.26.2/bin/linux/amd64/kubectl
passwd ブロック で core ユーザの作成
storage.files ブロックで minikube および kubectl のインストール
将其指定为(将上述的ssh_authorized_keys替换为您自己的SSH公钥)。
使用 quay.io 上提供的 Butane 容器,将上述的 ignition.bu 转换为 ignition.ign。
$ docker run -i --rm quay.io/coreos/butane:release --pretty --strict < ignition.bu > ignition.ign
使用Terraform libvirt-provider进行虚拟机的供应
使用dmacvicar/libvirt提供程序来管理Terraform中的libvirt虚拟化环境。
预先准备
为了避免在执行Terraform的libvirt-provider时出现权限错误,Libvirt默认限制外部应用程序访问相关资源。因此,需要事先授予权限。可以按照以下方式编辑/etc/apparmor.d/libvirt/TEMPLATE.qemu,并为相关资源授予权限。
# This profile is for the domain whose UUID matches this file.
#
#include <tunables/global>
profile LIBVIRT_TEMPLATE flags=(attach_disconnected) {
#include <abstractions/libvirt-qemu>
/var/lib/libvirt/images/** rwk,
/tmp/** rwk,
}
重新启动libvirt。
$ sudo systemctl restart libvirtd
执行配备
创建一个类似于下面的 main.tf 文件,用于创建一台虚拟机(规格应为最低要求,详见官方文档):
-
- 2 vCPUs
-
- 2GB RAM
- 20GB Volume
terraform {
required_providers {
libvirt = {
source = "dmacvicar/libvirt"
version = "0.7.1"
}
}
}
provider "libvirt" {
uri = "qemu:///system"
}
variable coreos_image_uri {
#source: "https://builds.coreos.fedoraproject.org/prod/streams/stable/builds/37.20230205.3.0/x86_64/fedora-coreos-37.20230205.3.0-qemu.x86_64.qcow2.xz"
default = "/var/lib/libvirt/images/fedora-coreos-37.20230205.3.0-qemu.x86_64.qcow2"
}
resource "libvirt_ignition" "ignition" {
name = "ignition.ign"
content = "${path.module}/ignition.ign"
}
resource "libvirt_domain" "minikube" {
name = "minikube"
memory = 2000 # in MiB
vcpu = 2
disk {
volume_id = libvirt_volume.coreos_minikube_volume.id
}
coreos_ignition = libvirt_ignition.ignition.id
network_interface {
network_name = "default"
wait_for_lease = true
}
}
resource "libvirt_volume" "coreos_minikube_volume" {
name = "coreos_minikube.qcow2"
pool = "default"
format = "qcow2"
base_volume_id = var.coreos_image_uri
size = 20 * 1024 * 1024 * 1024 # 20 GB
}
执行Terraform并进行虚拟机的编配。
$ terraform init
$ terraform apply -auto-approve
确认虚拟机已被创建。
$ virsh list --all
Id Name State
---------------------------
418 minikube running
SSH 登录到虚拟机
查找已创建的虚拟机的 IP 地址。
$ virsh domifaddr minikube
Name MAC address Protocol Address
-------------------------------------------------------------------------------
vnet512 52:54:00:8e:8f:dd ipv4 192.168.122.204/24
核心用户应确认能够通过SSH登录。
$ ssh core@192.168.122.204
启动Minikube。
[core@localhost ~]$ minikube start
? minikube v1.29.0 on Fedora 37 (kvm/amd64)
...
确认 kubectl 已连接到 Kubernetes API 服务器。
[core@localhost ~]$ kubectl cluster-info
kubectl cluster-info
Kubernetes control plane is running at https://192.168.49.2:8443
CoreDNS is running at https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
填補
/var/lib/libvirt/images/是libvirt的默认池,在这里,Terraform Libvirt Provider通常会查找基础映像文件qcow2。
base_volume_name -(可选)用于此卷的后备卷(CoW)的名称。请注意:如果未指定base_volume_pool,则会在池中搜索该卷。 – libvirt_volume | 资源 | dmacvicar/libvirt | Terraform注册表
如果要指定除此地点之外的游泳池(例如,将qcow2放置在/hoge下),请将main.tf修改为以下内容:
# `/hoge` 直下の qcow2 ファイルの URI を指定する
variable "coreos_image_uri" {
default = "/hoge/fedora-coreos-37.20230205.3.0-qemu.x86_64.qcow2"
}
# (2) 次の "libvirt_pool" ブロックを追加し、`/hoge` プール を作成する。
resource "libvirt_pool" "image_pool" {
name = "image_pool"
type = "dir"
path = "/hoge"
}
# ...
resource "libvirt_volume" "coreos_minikube_volume" {
name = "coreos_minikube.qcow2"
#(3) base_volume_pool に新たに作成したプールを指定する
base_volume_pool = libvirt_pool.image_pool.id
format = "qcow2"
base_volume_id = var.coreos_image_uri
size = 20 * 1024 * 1024 * 1024 # 20 GB
}