KubeVirt通过ISO安装Windows

Lance.Wu 发表于: 2022-10-25   最后更新时间: 2022-10-25 10:28:37  
{{totalSubscript}} 订阅, 1,900 游览

通过ISO安装Windows

在这篇博文中,我们将解释如何准备虚拟机的ISO文件和所需的驱动程序,以继续安装微软Windows。

现在,每个操作系统供应商都有自己的云映像可供下载,可以在KubeVirt的Kubernetes中导入和部署新的虚拟机(VM),但是如果您想按照传统方式使用作为CD-ROM附带的现有iso安装虚拟机,该怎么办呢?

前置准备

  • 一个Kubernetes集群已经启动并运行
  • KubeVirtCDI已经安装
  • 集群中有足够的空闲CPU、内存和磁盘空间来部署Microsoft Windows虚拟机,本例中使用2012 R2版本的虚拟机

准备

为了继续安装步骤,列出了涉及的不同元素:

注意
在安装部分之前,不需要执行任何命令。

  1. KubeVirt安装虚拟机
apiVersion: kubevirt.io/v1alpha3
kind: VirtualMachine
metadata:
  name: win2k12-iso
spec:
  running: false
  template:
    metadata:
      labels:
        kubevirt.io/domain: win2k12-iso
    spec:
      domain:
        cpu:
          cores: 4
        devices:
    ...
        machine:
          type: q35
        resources:
          requests:
            memory: 8G
      volumes:
    ...
  1. 在上传文件时,将使用virtctl命令自动创建一个带有Microsoft Windows ISO文件作为CD-ROM挂载到虚拟机的PVC.

    首先要下载的是微软Windows的ISO文件,因为微软评估中心提供ISO文件供下载用于评估:

    screenshot

为了能够开始评估,必须填写一些个人数据。之后,要检查的架构为“64位”,语言选择如下图所示:

screenshot

  • 一旦ISO文件被下载,它必须通过virtctl上传,在这个例子中使用的参数如下:

    • image-Upload:上传虚拟机镜像到persistentvolumecclaim
    • --image-path: ISO文件的路径
    • -- PVC -name:用于存储ISO文件的PVC的名称,本例中为ISO -win2k12
    • -- access-mode: PVC的访问模式,在示例中已经使用了ReadOnlyMany。
    • -- PVC -size: PVC的大小,是ISO将被存储的地方,在这种情况下,ISO是4.3G,所以一个PVC OS 5G应该足够了
    • -- uploadproxy-url: cdi-upload代理服务的URL,以CLUSTER-IP为10.96.164.35,PORT为443为例

信息
要上传数据到集群,cdi-uploadproxy服务必须可以从集群外部访问。在生产环境中,这可能涉及到设置Ingress或LoadBalancer服务。

   $ kubectl get services -n cdi
   NAME              TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
   cdi-api           ClusterIP   10.96.117.29   <none>        443/TCP   6d18h
   cdi-uploadproxy   ClusterIP   10.96.164.35   <none>        443/TCP   6d18h

在本例中,ISO文件被复制到Kubernetes节点,以允许virtctl找到它,并简化操作。

  • -- insecure:使用HTTPS时允许不安全的服务器连接
  • -- wait-secs:等待上传荚启动的时间,以秒为单位。60(默认)
    带有参数和值的最后一个命令如下所示:
   $ virtctl image-upload \
   --image-path=/root/9600.17050.WINBLUE_REFRESH.140317-1640_X64FRE_SERVER_EVAL_EN-US-IR3_SSS_X64FREE_EN-US_DV9.ISO \
   --pvc-name=iso-win2k12 \
   --access-mode=ReadOnlyMany \
   --pvc-size=5G \
   --uploadproxy-url=https://10.96.164.35:443 \
   --insecure \
   --wait-secs=240

1.用于安装操作系统的硬盘驱动器的PVC,在本例中称为winhd,所需空间为15Gi:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: winhd
spec:
  accessModes:
    - ReadWriteOnce
resources:
  requests:
    storage: 15Gi
storageClassName: hostpath

2.将virtio驱动程序作为CD-ROM附加到虚拟机的容器。容器映像必须被拉出,以便在本地镜像他库中。

docker pull kubevirt/virtio-container-disk

而且它必须在VM YAML中被引用,在本例中,containerDisk的名称是virtiocontainerdisk

- disk:
    bus: sata
  name: virtiocontainerdisk
---
- containerDisk:
    image: kubevirt/virtio-container-disk
  name: virtiocontainerdisk

如果满足了这些先决条件,最终的YAML (win2k12.yml)将如下所示:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: winhd
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 15Gi
  storageClassName: hostpath

apiVersion: kubevirt.io/v1alpha3
kind: VirtualMachine
metadata:
  name: win2k12-iso
spec:
  running: false
  template:
    metadata:
      labels:
        kubevirt.io/domain: win2k12-iso
    spec:
      domain:
        cpu:
          cores: 4
        devices:
          disks:
          - bootOrder: 1
            cdrom:
              bus: sata
            name: cdromiso
          - disk:
              bus: virtio
            name: harddrive
          - cdrom:
              bus: sata
            name: virtiocontainerdisk
        machine:
          type: q35
        resources:
          requests:
            memory: 8G
      volumes:
      - name: cdromiso
        persistentVolumeClaim:
          claimName: iso-win2k12
      - name: harddrive
        persistentVolumeClaim:
          claimName: winhd
      - containerDisk:
          image: kubevirt/virtio-container-disk
        name: virtiocontainerdisk

信息
特别注意第一个磁盘中的bootOrder: 1参数,因为它是包含ISO的卷,必须将其标记为要从其启动的第一个设备。

安装

要继续安装,将执行上面注释的命令:

1.上传ISO文件到PVC:

$ virtctl image-upload \
--image-path=/root/9600.17050.WINBLUE_REFRESH.140317-1640_X64FRE_SERVER_EVAL_EN-US-IR3_SSS_X64FREE_EN-US_DV9.ISO \
--pvc-name=iso-win2k12 \
--access-mode=ReadOnlyMany \
--pvc-size=5G \
--uploadproxy-url=https://10.96.164.35:443 \
--insecure \
--wait-secs=240

DataVolume default/iso-win2k12 created
Waiting for PVC iso-win2k12 upload pod to be ready...
Pod now ready
Uploading data to https://10.96.164.35:443

4.23 GiB / 4.23 GiB [=======================================================================================================================================================================] 100.00% 1m21s

Uploading /root/9600.17050.WINBLUE_REFRESH.140317-1640_X64FRE_SERVER_EVAL_EN-US-IR3_SSS_X64FREE_EN-US_DV9.ISO completed successfully

2.将virtio容器映像拖动到本地:

$ docker pull kubevirt/virtio-container-disk
Using default tag: latest
Trying to pull repository docker.io/kubevirt/virtio-container-disk ...
latest: Pulling from docker.io/kubevirt/virtio-container-disk
Digest: sha256:7e5449cb6a4a9586a3cd79433eeaafd980cb516119c03e499492e1e37965fe82
Status: Image is up to date for docker.io/kubevirt/virtio-container-disk:latest
  1. 创建PVC和虚拟机定义:
$ kubectl create -f win2k12.yml
virtualmachine.kubevirt.io/win2k12-iso configured
persistentvolumeclaim/winhd created
  1. 启动虚拟机实例:
    ```shell
    $ virtctl start win2k12-iso
    VM win2k12-iso was scheduled to start

$ kubectl get vmi
NAME AGE PHASE IP NODENAME
win2k12-iso 82s Running 10.244.0.53 master-00.kubevirt-io


5.一旦VMI的状态为RUNNING,就该使用VNC连接了:

```shell
virtctl vnc win2k12-iso

screenshot

注意
使用VNC需要安装界面程序,并且需要在物理中使用打开VNC。

这里很重要的一点是,为了能够通过VNC使用virtctl连接,有必要到达Kubernetes API。

一旦创建了虚拟机,就可以将带有ISO和virtio驱动程序的PVC从虚拟机中分离出来。

参考文献
https://kubevirt.io/2020/KubeVirt-installing_Microsoft_Windows_from_an_iso.html

驱动安装:https://kubevirt.io/user-guide/virtual_machines/windows_virtio_drivers/

更新于 2022-10-25

查看KubeVirt更多相关的文章或提一个关于KubeVirt的问题,也可以与我们一起分享文章