使用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
}

如何解决Terraform libvirt在/var/lib/libvirt/images目录上的权限被拒绝问题| Christian Nygaard博客
广告
将在 10 秒后关闭
bannerAds