本教程介绍了如何在 GDC 上新安装的虚拟机运行时上创建和管理 Linux 虚拟机 (VM)。您将了解创建和定义基本依赖项(如 StorageClass
和虚拟网络)的过程,然后创建使用这些资源的虚拟机。然后,您将了解如何修改虚拟机,例如添加新磁盘。
目标
- 配置基本依赖项
- 为 GDC 上的虚拟机运行时创建
StorageClass
- 创建供虚拟机使用的虚拟网络
- 为 GDC 上的虚拟机运行时创建
- 创建虚拟机启动磁盘
- 创建虚拟机
- 修改虚拟机以添加新的虚拟磁盘
准备工作
要完成本教程中的任务,您需要能够使用以下资源和工具:
- GKE on Bare Metal 1.12.0 版 (
anthosBareMetalVersion: 1.12.0
) 或更高版本集群的访问权限。您可以使用任何能够运行工作负载的集群类型。如果需要,请在 Compute Engine 上试用适用于 Bare Metal 的 GDCV 或参阅集群创建概览。 - 作为
kubectl
的插件安装的virtctl
客户端工具。如果需要,请安装 virtctl 客户端工具。
创建 StorageClass
您可以使用 StorageClass
来定义虚拟机可用的存储类型。不同的存储类别可能会映射到不同类型的存储硬件、文件系统或性能。
本教程不会提供每个 StorageClass
和存储合作伙伴的具体说明。
Anthos Ready 存储合作伙伴提供合格的 Container Storage Interface (CSI) 驱动程序,用于安装和配置存储所需的自定义资源。如需在集群中安装 CSI 驱动程序,请查看受支持的存储合作伙伴列表并按照其说明操作。
为存储平台安装 CSI 驱动程序后,集群中会有一个或多个可用的存储类别。在本教程中,您将使用这些存储类别之一创建虚拟硬盘。
以下基本示例 NFS StorageClass
使用 NFS CSI 驱动程序。您可以定义要在 StorageClass
中使用的 NFS 服务器地址和路径。然后,集群中的所有节点都可以连接到并使用此 NFS 存储:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: example-nfs
provisioner: nfs.csi.k8s.io
parameters:
server: nfs-server.example.com
path: /vm-share
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
- nconnect=8
- nfsvers=4.1
在本教程中,请使用您自己的集群中的 StorageClass
名称。
GDC 上的 VM Runtime 会自动为集群中的每个 StorageClass
生成一个存储配置文件。存储配置文件的名称与关联的 StorageClass
相同。存储配置文件提供与每个 StorageClass
关联的额外配置选项。如需详细了解存储配置文件(包括配置说明),请参阅配置存储配置文件。
创建虚拟网络
虚拟机使用虚拟网络接口连接到虚拟网络。通过虚拟网络,虚拟机可以与集群中的其他虚拟机通信,也可以与集群外部的资源通信。
在本教程中,您将创建一个基本第 2 层 (L2
) 虚拟网络,该虚拟网络可使用外部 DHCP 服务器。启用外部 DHCP 服务器的使用时,如果 DNS 和网关设置由 DHCP 提供,则您可以跳过它们的设置。
如需创建使用外部 DHCP 服务器的网络,请完成以下步骤:
在您选择的编辑器中创建
Network
清单,例如dhcp-network.yaml
:nano dhcp-network.yaml
复制并粘贴以下 YAML 清单:
apiVersion: networking.gke.io/v1 kind: Network metadata: name: NETWORK_NAME spec: type: L2 nodeInterfaceMatcher: interfaceName: INTERFACE_NAME externalDHCP4: true
替换以下值:
NETWORK_NAME
:您的网络的名称。INTERFACE_NAME
:要将网络连接到的 GKE on Bare Metal 节点上的接口名称。所有节点都应具有相同的接口名称。
在此
Network
清单中,设置了以下值:- 工作负载只能具有此网络的
L2
连接。这是您可以在 GDC 上的虚拟机运行时内创建的唯一网络type
。 - 网络启用了外部 DHCP。外部 DHCP 服务器负责连接到此网络的工作负载的 IPv4 地址分配、路由、网关和 DNS 配置。
在编辑器中保存并关闭
Network
清单。使用
kubectl
创建网络:kubectl apply -f use-dhcp-network.yaml
创建虚拟机启动磁盘
虚拟机可以使用预先创建的磁盘映像,或从 ISO 映像启动以手动安装操作系统。这些磁盘映像可以使用 HTTP 进行存储和访问,或者存储在 Cloud Storage 中并使用 Secret
进行访问。
在本教程中,您将使用 HTTP 通过公共 Ubuntu Server 20.04 云映像创建启动磁盘。
如需通过映像创建磁盘,请完成以下步骤。
在您选择的编辑器中创建
VirtualMachineDisk
清单,例如my-disk.yaml
:nano my-disk.yaml
复制并粘贴以下 YAML 定义:
apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachineDisk metadata: name: DISK_NAME spec: size: 20Gi storageClassName: STORAGE_CLASS_NAME source: http: url: https://cloud-images.ubuntu.com/releases/focal/release/ubuntu-20.04-server-cloudimg-amd64.img
替换以下值:
DISK_NAME
:您要用于磁盘的名称。此示例使用公共 Ubuntu Server 20.04 映像创建名为DISK_NAME
的20Gi
(20 吉比字节)磁盘。STORAGE_CLASS_NAME
:您要用于VirtualMachineDisk
的StorageClass
。- 使用
kubectl get storageclass
列出集群中可用的存储类别。
- 使用
在编辑器中保存并关闭
VirtualMachineDisk
清单。使用
kubectl
创建磁盘:kubectl apply -f my-disk.yaml
创建虚拟机
在前面部分中创建了虚拟网络和启动磁盘后,现在可以创建虚拟机。虚拟机连接到虚拟网络,并从虚拟磁盘启动。以下说明通过使用 kubectl
CLI 直接应用 VirtualMachine
YAML 清单文件来创建虚拟机。
在您选择的编辑器中创建定义
VirtualMachine
的清单(例如my-vm.yaml
):nano my-vm.yaml
复制并粘贴以下 YAML 定义:
apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachine metadata: name: VM_NAME spec: osType: linux compute: cpu: vcpus: VCPU_NUMBER memory: capacity: MEMORY_SIZE interfaces: - name: eth0 networkName: NETWORK_NAME default: true disks: - boot: true virtualMachineDiskName: DISK_NAME
替换以下值:
VM_NAME
:您的虚拟机的名称。VCPU_NUMBER
:要分配给虚拟机的可选 vCPU 数量。如果没有此设置,则默认分配 2 个 vCPU。- 您可以为虚拟机分配 1 到 96 个 vCPU。
MEMORY_SIZE
:要分配给虚拟机的可选内存量。如果没有此设置,则默认分配 4 GiB 内存。- 您可以为虚拟机分配 1M 到 1T 的内存。如需了解详情,请参阅内存资源单元。
NETWORK_NAME
:在上一部分中创建的网络的名称。DISK_NAME
:在上一部分中创建的启动磁盘的名称。此磁盘设置为boot: true
。
在编辑器中保存并关闭清单。
使用
kubectl
创建虚拟机和磁盘:kubectl apply -f my-vm.yaml
该虚拟机可能需要几分钟才能创建完成。使用 kubectl 命令检查虚拟机的状态:
kubectl get gvm VM_NAME
以下示例输出显示了处于
Running
状态的虚拟机:NAME STATUS AGE IP MY_VM Running 64s 192.168.2.124
连接到虚拟机
虚拟机运行时,连接到虚拟机的控制台。通过此控制台连接,您可以执行基本任务,例如进一步配置虚拟机或安装应用。
如需通过控制台访问虚拟机,请使用
kubectl
:kubectl virt ssh VM_NAME
成功连接到虚拟机的控制台后,退出虚拟机会话和控制台:
Ctrl + ]
修改虚拟机
在虚拟机的生命周期中,您可能会需要修改虚拟机。例如,您可能希望添加存储空间以便在专用磁盘上安装应用,或者为应用使用额外的存储空间。
在本教程中,创建一个空白磁盘并将其挂接到虚拟机。在此场景中,您可以创建数据磁盘来存储应用数据。
在您选择的编辑器中创建
VirtualMachineDisk
清单,例如my-data-disk.yaml
:nano my-data-disk.yaml
复制并粘贴以下 YAML 定义:
apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachineDisk metadata: name: DATA_DISK_NAME spec: size: 10Gi storageClassName: STORAGE_CLASS_NAME
替换以下值:
DATA_DISK_NAME
:您要用于数据磁盘的名称。本示例将创建一个10Gi
(10 吉比字节)磁盘。STORAGE_CLASS_NAME
:您要用于VirtualMachineDisk
的StorageClass
。- 使用
kubectl get storageclass
列出集群中可用的存储类别。
- 使用
在编辑器中保存并关闭磁盘清单。
使用
kubectl
创建磁盘:kubectl apply -f my-data-disk.yaml
在挂接新虚拟磁盘之前,使用
kubectl
停止虚拟机:kubectl virt stop VM_NAME
修改虚拟机资源:
kubectl edit gvm VM_NAME
更新
VirtualMachine
YAML 清单以在虚拟机的spec.disks
部分末尾挂接磁盘:apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachine metadata: name: VM_NAME spec: ... disks: - boot: true virtualMachineDiskName: DISK_NAME - virtualMachineDiskName: DATA_DISK_NAME
将
DATA_DISK_NAME
替换为上一步中创建的磁盘的名称。在编辑器中保存并关闭更新后的虚拟机清单。
使用
kubectl
启动虚拟机:kubectl virt start VM_NAME
清理
如需删除在本教程中创建的资源,请完成以下步骤:
删除您的虚拟机:
kubectl delete -f my-vm.yaml
删除您的
VirtualMachineDisk
资源:kubectl delete -f my-data-disk.yaml kubectl delete -f my-disk.yaml
如果您不想将基本依赖项保留在集群中,请完成以下步骤:
删除您的虚拟网络:
kubectl delete -f use-dhcp-network.yaml
要从集群中移除 CSI 驱动程序,请按照您的存储合作伙伴的说明操作。