关于使用kubevirt 的 api 创建的虚拟机

首先需要登录跳板机,并使用 qssh root@(你的测试机)来登录要操作的机器

k get vm -A -o wide 使用指令查看当前正在运行的虚拟机

选择一个工作目录,编写 VirtualMachine YAML 配置文件(包含 CPU、内存、存储卷配置)(如果要部署其他虚拟机,将此文件中的全部 01 换成 02,03 即可)例如:vim vm-01-fix.yml

yaml 复制代码
# j2 每个节点一个 vm 哨兵
​
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  namespace: must-alive
  name: tyk-vm01
spec:
  runStrategy: Always
  dataVolumeTemplates:
    spec:
      storage:
        accessModes:
          requests:
            storage: 50Gi
      source:
        blank: {}
  template:
    metadata:
      labels:
        kubevirt.io/size: large
        kubevirt.io/domain: tyk-vm01
        name: tyk-vm01
    spec:
      domain:
        cpu:
          model: host-passthrough
          cores: 8
        devices:
          disks:
            - name: containerdisk
              disk:
                bus: virtio
            - name: harddisk
              disk:
                bus: virtio
            - name: cloudinitdisk
              disk:
                bus: virtio
          interfaces:
          - name: default
            bridge: {}
        resources:
          requests:
            memory: 16384Mi
      networks:
      - name: default
        pod: {}
      volumes:
      - containerDisk:
          image: tedezed/ubuntu-container-disk:24.04
        name: containerdisk
      - dataVolume:
          name: tyk-vm01-disk
        name: harddisk
      - cloudInitNoCloud:
          userData: |
            #cloud-config
            password: ubuntu
            chpasswd: { expire: False }
            runcmd:
              - sudo apt update
              - sudo apt install nginx -y
              - echo "IyEvYmluL2Jhc2gKCiMgR2VuZXJhdGUgdGhlIFNlY3JldCBQYWdlCmVjaG8gIjxoMT5TZWNyZXQgUGFnZTwvaDE+PHAgc2VjcmV0IHBhZ2U8L3A+IiA+IC92YXIvd3d3L2h0bWwvc2VjcmV0Lmh0bWwKCkdlbmVyYXRlIFZNIERldGFpbHMgUGFnZSB3aXRoIEhvc3RuYW1lIGFuZCBJUAplY2hvICJcbjxoMT5WTURldGFpbHM8L2gxPjxwPk5hbWU6ICQoaG9zdG5hbWUpPC9wPjxwPklQOiAkKGhvc3RuYW1lIC1JKTwvcD48cD5Mb2NhbGU6ICQobG9jYWxlKTwvcD4iID4gL3Zhci93d3cvaHRtbC9kZXRhaWxzLmh0bWwK" | base64 --decode | sudo bash
              - sudo sed -i 's|try_files $uri $uri/ =404;|try_files $uri $uri/ $uri.html =404;|' /etc/nginx/sites-available/default
              - sudo systemctl restart nginx
        name: cloudinitdisk
---
apiVersion: v1
kind: Service
metadata:
  name: tyk-vm01
  namespace: must-alive
spec:
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
  selector:
    kubevirt.io/domain: tyk-vm01

以下是参数重点,可简单做了解:

yaml 复制代码
KubeVirt VirtualMachine YAML 重点参数讲解:
​
  1. 基础元数据
​
  metadata:
    namespace: must-alive    # 命名空间
    name: tyk-vm01          # 虚拟机名称
​
  2. 运行策略
​
  spec:
    runStrategy: Always     # 自动启动并保持运行(还有 Manual、RerunOnFailure、Halted)
​
  3. 存储配置(重点)
​
  dataVolumeTemplates:      # 定义持久化存储
    - metadata:
        name: tyk-vm01-disk  # 数据卷名称
      spec:
        storage:
          accessModes:
          - ReadWriteOnce    # 单节点读写(必须)
          resources:
            requests:
              storage: 50Gi  # 磁盘大小
        source:
          blank: {}          # 空白磁盘(还可用 pvc、http、registry)
​
  4. 虚拟机硬件
​
  domain:
    cpu:
      model: host-passthrough  # CPU 透传模式(性能最好)
      cores: 8                 # 8 核 CPU
    resources:
      requests:
        memory: 16384Mi        # 16GB 内存
​
  5. 磁盘挂载(重点)
​
  devices:
    disks:
      - name: containerdisk   # 系统盘(只读镜像)
        disk:
          bus

配置完文件后,就可以使用指令部署虚拟机:kubectl apply -f vm-01-fix.yml

(注意)当前我为了演示先把原虚拟机删掉:kubectl delete vm tyk-vm01 -n must-alive

部署完成:

进入虚拟机:virtctl console tyk-vm01 -n must-alive

账号密码都输入 ubuntu 即可

进入虚拟机后输入 sudo -i 转为root用户即可

退出虚拟机使用 ctrl + ] ,建议后续配置好ssh登录,因为这种方式登录有bug

如果创建过程中发现准备时间很长,通常是大于三分钟,那就可能是有bug,此时可能是yaml文件编写的问题,以下三个指令可以查看相关报错信息:

查看数据卷的详细描述:k describe dv -n must-alive tyk-vm01-disk

yaml 复制代码
root@xs4772:~/tyk# k describe dv -n must-alive   tyk-vm01-disk
Name:         tyk-vm01-disk
Namespace:    must-alive
Labels:       kubevirt.io/created-by=75acef72-0bd6-41a0-a7ee-3e6aea85455a
Annotations:  cdi.kubevirt.io/allowClaimAdoption: true
              cdi.kubevirt.io/storage.usePopulator: false
API Version:  cdi.kubevirt.io/v1beta1
Kind:         DataVolume
Metadata:
  Creation Timestamp:  2026-03-10T02:35:53Z
  Generation:          1
  Owner References:
    API Version:           kubevirt.io/v1
    Block Owner Deletion:  true
    Controller:            true
    Kind:                  VirtualMachine
    Name:                  tyk-vm01
    UID:                   75acef72-0bd6-41a0-a7ee-3e6aea85455a
  Resource Version:        59077321
  UID:                     ccaaaac6-49c2-4dd4-9da8-b93b75d257c2
Spec:
  Source:
    Blank:
  Storage:
    Access Modes:
      ReadWriteOnce
    Resources:
      Requests:
        Storage:  50Gi
Status:
  Claim Name:  tyk-vm01-disk
  Conditions:
    Last Heartbeat Time:   2026-03-10T02:36:10Z
    Last Transition Time:  2026-03-10T02:36:10Z
    Message:               PVC tyk-vm01-disk Bound
    Reason:                Bound
    Status:                True
    Type:                  Bound
    Last Heartbeat Time:   2026-03-10T02:36:21Z
    Last Transition Time:  2026-03-10T02:36:21Z
    Status:                True
    Type:                  Ready
    Last Heartbeat Time:   2026-03-10T02:36:19Z
    Last Transition Time:  2026-03-10T02:36:19Z
    Message:               Import Complete
    Reason:                Completed
    Status:                False
    Type:                  Running
  Phase:                   Succeeded
  Progress:                100.0%
Events:
  Type    Reason   Age                 From                          Message
  ----    ------   ----                ----                          -------
  Normal  Pending  44s (x2 over 44s)   datavolume-import-controller  target PVC tyk-vm01-disk Pending and waiting for first consumer to be created before binding
  Normal  Pending  43s (x5 over 44s)   datavolume-import-controller  target PVC tyk-vm01-disk Pending and waiting for pod importer-tyk-vm01-disk to be scheduled
  Normal  Pending  41s (x13 over 45s)  datavolume-import-controller  PVC tyk-vm01-disk Pending
  Normal  Pending  41s (x5 over 42s)   datavolume-import-controller  target PVC tyk-vm01-disk Pending and Waiting for a volume to be created either by the external provisioner 'rancher.io/local-path' or manually by the system administrator. If volume creation is delayed, please verify that the provisioner is running and correctly registered.

获取数据卷的完整 YAML 配置:k get dv -n must-alive tyk-vm01-disk -o yaml

yaml 复制代码
root@xs4772:~/tyk# k get dv -n must-alive tyk-vm01-disk -o yaml
apiVersion: cdi.kubevirt.io/v1beta1
kind: DataVolume
metadata:
  annotations:
    cdi.kubevirt.io/allowClaimAdoption: "true"
    cdi.kubevirt.io/storage.usePopulator: "false"
  creationTimestamp: "2026-03-10T02:35:53Z"
  generation: 1
  labels:
    kubevirt.io/created-by: 75acef72-0bd6-41a0-a7ee-3e6aea85455a
  name: tyk-vm01-disk
  namespace: must-alive
  ownerReferences:
  - apiVersion: kubevirt.io/v1
    blockOwnerDeletion: true
    controller: true
    kind: VirtualMachine
    name: tyk-vm01
    uid: 75acef72-0bd6-41a0-a7ee-3e6aea85455a
  resourceVersion: "59077321"
  uid: ccaaaac6-49c2-4dd4-9da8-b93b75d257c2
spec:
  source:
    blank: {}
  storage:
    accessModes:
    - ReadWriteOnce
    resources:
      requests:
        storage: 50Gi
status:
  claimName: tyk-vm01-disk
  conditions:
  - lastHeartbeatTime: "2026-03-10T02:36:10Z"
    lastTransitionTime: "2026-03-10T02:36:10Z"
    message: PVC tyk-vm01-disk Bound
    reason: Bound
    status: "True"
    type: Bound
  - lastHeartbeatTime: "2026-03-10T02:36:21Z"
    lastTransitionTime: "2026-03-10T02:36:21Z"
    status: "True"
    type: Ready
  - lastHeartbeatTime: "2026-03-10T02:36:19Z"
    lastTransitionTime: "2026-03-10T02:36:19Z"
    message: Import Complete
    reason: Completed
    status: "False"
    type: Running
  phase: Succeeded
  progress: 100.0%

查看存储类的配置:k get sc local-path -o yaml

lua 复制代码
root@xs4772:~/tyk# k get sc local-path -o yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{},"name":"local-path"},"provisioner":"rancher.io/local-path","reclaimPolicy":"Delete","volumeBindingMode":"WaitForFirstConsumer"}
    storageclass.kubernetes.io/is-default-class: "true"
  creationTimestamp: "2026-01-07T03:52:36Z"
  name: local-path
  resourceVersion: "15180097"
  uid: 73f99732-35a5-4877-9f88-0f0a06bdca57
provisioner: rancher.io/local-path
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer

命令详解:

三个命令简单讲解:

  1. k describe dv -n must-alive tyk-vm01-disk

查看数据卷的详细描述(人类可读)

  • describe = 显示详细信息
  • dv = DataVolume(数据卷)
  • 重点看 Events 部分,能看到错误信息

用途: 排查问题首选,能看到创建过程中的报错


  1. k get dv -n must-alive tyk-vm01-disk -o yaml

获取数据卷的完整 YAML 配置

  • get -o yaml = 以 YAML 格式输出
  • 显示所有字段(配置 + 状态)

用途: 查看完整配置、复制配置、深入分析


  1. k get sc local-path -o yaml

查看存储类的配置

  • sc = StorageClass(存储类)
  • local-path = 存储类名称
  • 存储类是集群级别资源,定义如何创建存储

用途: 了解集群有哪些存储、存储规则


三者关系: StorageClass ← 定义存储规则(集群级) ↓ DataVolume ← 申请 50G 存储(根据 StorageClass 创建) ↓ 挂载到 VM ← 虚拟机使用这个磁盘

快速记忆:

  • describe = 看问题(有日志)
  • get -o yaml = 看完整配置
  • StorageClass = 存储规则模板
相关推荐
Java编程爱好者1 小时前
请收藏好:Doug Lea写的理解 Java NIO 与 Reactor 模式最权威的资料
后端
golang学习记1 小时前
Go 1.26 go fix 实战:一键现代化你的Go代码
后端·go
Java编程爱好者1 小时前
突破Netty极限:基于Java 21 FFM API手写高性能网络通信框架
后端
Qinana1 小时前
第一次用向量数据库!手搓《天龙八部》RAG助手,让AI真正“懂”你
前端·数据库·后端
苏三说技术1 小时前
阿里又开源了一个顶级Java项目!
后端
ch8562 小时前
我在某电商大促场景踩了Full GC的坑,排查了6小时,终于搞定OOM频繁重启问题
后端
nelsontang2 小时前
Prometheus High Cardinality(高基数)问题完全指南
后端
IT_陈寒2 小时前
Vite凭什么比Webpack快10倍?5个核心优化原理大揭秘
前端·人工智能·后端
怕浪猫3 小时前
第22章:项目实战与进阶优化——从开发到部署的完整旅程
后端·go·编程语言