KubeVirt实战:5分钟在K8s集群中跑起你的第一个虚拟机(附避坑指南)
·
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: 网络流量
资源优化建议:
-
CPU分配:
resources: limits: cpu: "2" memory: "2Gi" requests: cpu: "1" memory: "1Gi" -
磁盘缓存策略:
devices: disks: - name: disk1 disk: bus: virtio cache: writeback # 提升IO性能 -
网络优化:
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。
更多推荐
所有评论(0)