KubeVirt实战:5分钟在K8s集群中跑起你的第一个虚拟机(附避坑指南)

如果你已经熟悉Kubernetes的基本操作,但还没尝试过在K8s集群中运行虚拟机,那么KubeVirt绝对值得一试。作为Red Hat开源的项目,KubeVirt让传统虚拟机与容器在K8s平台上和谐共存,为混合工作负载提供了统一管理界面。本文将带你快速上手,避开常见陷阱,在现有集群中部署你的第一个虚拟机。

1. 环境准备与版本选择

在开始前,确保你的Kubernetes集群满足以下条件:

  • Kubernetes版本在v1.19到v1.21之间(与KubeVirt v0.48.1最佳兼容)
  • 每个节点至少2核CPU和4GB内存
  • 已启用--allow-privileged=true参数

注意:生产环境建议使用OpenShift 4.8+,其对KubeVirt有更好的支持

硬件虚拟化检查命令:

# 检查CPU是否支持硬件虚拟化
grep -E '(vmx|svm)' /proc/cpuinfo

# 如果不支持,需要启用软件模拟
kubectl create configmap -n kubevirt kubevirt-config \
  --from-literal debug.useEmulation=true

常见版本冲突问题解决方案:

问题现象 可能原因 解决方法
Pod一直Pending 节点资源不足 检查节点资源分配
VMI状态为CrashLoopBackOff 镜像不兼容 更换为官方测试镜像
网络无法连通 CNI插件冲突 使用Multus或默认CNI

2. 快速安装KubeVirt核心组件

使用以下命令一键部署KubeVirt v0.48.1:

# 创建专属命名空间
kubectl create namespace kubevirt

# 部署Operator
export VERSION=v0.48.1
kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/kubevirt-operator.yaml

# 部署CRD资源
kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/kubevirt-cr.yaml

# 验证安装
kubectl get pods -n kubevirt -w

安装完成后,你会看到以下关键组件:

  • virt-api-*: 虚拟化API服务端点
  • virt-controller-*: 虚拟机控制器
  • virt-handler-*: 节点级守护进程
  • virt-operator-*: 核心操作器

3. 部署你的第一个虚拟机

我们使用官方提供的Cirros测试镜像来快速验证。首先下载虚拟机定义文件:

wget https://kubevirt.io/labs/manifests/vm.yaml --no-check-certificate

关键配置解析:

apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  name: testvm
spec:
  running: false  # 需要手动启动
  template:
    spec:
      domain:
        devices:
          disks:
          - name: containerdisk
            disk: { bus: virtio }
          interfaces:
          - name: default 
            masquerade: {}  # 使用NAT网络
      networks:
      - name: default
        pod: {}  # 使用Pod网络
      volumes:
      - name: containerdisk
        containerDisk:
          image: quay.io/kubevirt/cirros-container-disk-demo

创建并启动虚拟机:

# 应用配置
kubectl apply -f vm.yaml

# 查看VM状态(此时应为Stopped)
kubectl get vm

# 启动虚拟机
virtctl start testvm

# 查看运行中的VMI
kubectl get vmi

4. 虚拟机操作与网络访问

安装virtctl客户端工具(版本需与服务器一致):

wget https://github.com/kubevirt/kubevirt/releases/download/v0.48.1/virtctl-v0.48.1-linux-amd64
mv virtctl-v0.48.1-linux-amd64 /usr/local/bin/virtctl
chmod +x /usr/local/bin/virtctl

常用操作命令:

  • 连接控制台

    virtctl console testvm
    # 使用Ctrl+]退出
    
  • SSH访问(需配置公网IP):

    # 暴露服务
    virtctl expose vmi testvm --name=testvm-ssh --port=22 --type=NodePort
    
    # 获取访问端口
    kubectl get svc testvm-ssh
    
  • 文件传输

    virtctl scp ./local_file.txt testvm:/remote/path
    
  • 快照管理

    # 创建快照
    virtctl snapshot create testvm --name=snapshot-1
    
    # 恢复快照
    virtctl restore --vm testvm snapshot-1
    

5. 性能监控与优化技巧

KubeVirt集成了Prometheus监控指标,关键指标包括:

  • kubevirt_vmi_memory_used_bytes: 内存使用量
  • kubevirt_vmi_cpu_usage_seconds: CPU累计使用时间
  • kubevirt_vmi_network_traffic_bytes_total: 网络流量

资源优化建议:

  1. CPU分配

    resources:
      limits:
        cpu: "2"
        memory: "2Gi"
      requests:
        cpu: "1" 
        memory: "1Gi"
    
  2. 磁盘缓存策略

    devices:
      disks:
      - name: disk1
        disk:
          bus: virtio
          cache: writeback  # 提升IO性能
    
  3. 网络优化

    interfaces:
    - name: default
      bridge: {}  # 替代masquerade获得更好性能
    

6. 常见问题排查指南

问题1:虚拟机启动失败

检查步骤:

# 查看VMI事件
kubectl describe vmi testvm

# 检查virt-launcher日志
kubectl logs -f virt-launcher-testvm-xxxxx -c compute

问题2:控制台连接超时

解决方案:

# 检查KubeVirt API服务
kubectl get svc -n kubevirt virt-api

# 临时端口转发
kubectl port-forward -n kubevirt svc/virt-api 8184:443

问题3:镜像导入缓慢

加速方案:

# 使用CDI加速器
kubectl apply -f https://github.com/kubevirt/containerized-data-importer/releases/download/v1.47.1/cdi-operator.yaml
kubectl apply -f https://github.com/kubevirt/containerized-data-importer/releases/download/v1.47.1/cdi-cr.yaml

实际使用中发现,当虚拟机负载突然增高时,virt-launcher的CPU占用会显著上升。这时适当增加virt-launcher的resource limits可以避免进程被OOMKilled。

更多推荐