通过ISO安装Windows
在这篇博文中,我们将解释如何准备虚拟机的ISO文件和所需的驱动程序,以继续安装微软Windows。
现在,每个操作系统供应商都有自己的云映像可供下载,可以在KubeVirt的Kubernetes中导入和部署新的虚拟机(VM),但是如果您想按照传统方式使用作为CD-ROM附带的现有iso安装虚拟机,该怎么办呢?
前置准备
- 一个Kubernetes集群已经启动并运行
- KubeVirt和CDI已经安装
- 集群中有足够的空闲CPU、内存和磁盘空间来部署Microsoft Windows虚拟机,本例中使用2012 R2版本的虚拟机
准备
为了继续安装步骤,列出了涉及的不同元素:
注意
在安装部分之前,不需要执行任何命令。
- 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:
...
在上传文件时,将使用virtctl命令自动创建一个带有Microsoft Windows ISO文件作为CD-ROM挂载到虚拟机的PVC.
首先要下载的是微软Windows的ISO文件,因为微软评估中心提供ISO文件供下载用于评估:
为了能够开始评估,必须填写一些个人数据。之后,要检查的架构为“64位”,语言选择如下图所示:
一旦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
- 创建PVC和虚拟机定义:
$ kubectl create -f win2k12.yml
virtualmachine.kubevirt.io/win2k12-iso configured
persistentvolumeclaim/winhd created
- 启动虚拟机实例:
```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
注意
使用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/