KubeVirt部署¶
KubeVirt介绍¶
KubeVirt是一个开源项目,支持在Kubernetes集群中运行和管理虚拟机,就像管理容器一样,为传统的虚拟机工作负载提供现代化的容器编排平台。在Kubernetes中使用自定义资源定义(CRD)来表示虚拟机。
项目地址: https://github.com/kubevirt/kubevirt
基础环境准备¶
- 1.安装依赖的软件包
$ apt install -y libvirt-clients virt-manager bridge-utils
- 2.检查节点是否支持虚拟化
生产环境建议使用物理主机,如果是实验环境,不支持硬件虚拟化,需要启用软件虚拟化进行模拟。
$ virt-host-validate qemu
QEMU: Checking for hardware virtualization : PASS
QEMU: Checking if device /dev/vhost-net exists : PASS
QEMU: Checking if device /dev/net/tun exists : PASS
QEMU: Checking for cgroup 'cpu' controller support : PASS
QEMU: Checking for cgroup 'cpuacct' controller support : PASS
QEMU: Checking for cgroup 'cpuset' controller support : PASS
QEMU: Checking for cgroup 'memory' controller support : PASS
QEMU: Checking for cgroup 'devices' controller support : PASS
QEMU: Checking for cgroup 'blkio' controller support : PASS
QEMU: Checking for device assignment IOMMU support : WARN (Unknown if this platform has IOMMU support)
QEMU: Checking for secure guest support : WARN (Unknown if this platform has Secure Guest support)
安装Kubevirt¶
- 1.安装Kubevirt
# 获取最新的版本
$ export RELEASE=$(curl https://storage.googleapis.com/kubevirt-prow/release/kubevirt/kubevirt/stable.txt)
# 部署KubeVirt operator
$ wget https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/kubevirt-operator.yaml
$ kubectl apply -f kubevirt-operator.yaml
# Create the KubeVirt CR (instance deployment request) which triggers the actual installation
$ wget https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/kubevirt-cr.yaml
# 如果不支持硬件虚拟化,需要修改启用软件模拟,增加useEmulation: true
$ vim kubevirt-cr.yaml
---
apiVersion: kubevirt.io/v1
kind: KubeVirt
metadata:
name: kubevirt
namespace: kubevirt
spec:
certificateRotateStrategy: {}
configuration:
developerConfiguration:
useEmulation: true
featureGates: []
customizeComponents: {}
imagePullPolicy: IfNotPresent
workloadUpdateStrategy: {}
$ kubectl apply -f kubevirt-cr.yaml
# wait until all KubeVirt components are up
$ kubectl -n kubevirt wait kv kubevirt --for condition=Available
- 2.检查Pod状态
root@kube-node1:~# kubectl get pods -n kubevirt
NAME READY STATUS RESTARTS AGE
virt-api-fdbc87c9-rw4m8 1/1 Running 0 9m34s
virt-api-fdbc87c9-tsfvx 1/1 Running 0 9m34s
virt-controller-844699784f-72psc 1/1 Running 0 8m57s
virt-controller-844699784f-zpg44 1/1 Running 0 8m57s
virt-handler-clw89 1/1 Running 0 8m57s
virt-handler-drbsn 1/1 Running 0 8m57s
virt-operator-74bdf99686-nlxkk 1/1 Running 0 10m
virt-operator-74bdf99686-wxt5j 1/1 Running 0 10m
- 3.部署virtctl
后续虚拟机的管理同时支持virtctl和kubectl两种方式进行虚拟机的管理。
$ cd /usr/local/src
$ wget https://github.com/kubevirt/kubevirt/releases/download/v1.3.1/virtctl-v1.3.1-linux-amd64
$ mv virtctl-v1.3.1-linux-amd64 /usr/local/bin/virtctl
$ chmod +x /usr/local/bin/virtctl
$ virtctl version
Client Version: version.Info{GitVersion:"v1.3.1", GitCommit:"ed1e7ae8548d319fa7aacf315ad198f7241287c5", GitTreeState:"clean", BuildDate:"2024-08-22T08:52:25Z", GoVersion:"go1.22.2 X:nocoverageredesign", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{GitVersion:"v1.3.1", GitCommit:"ed1e7ae8548d319fa7aacf315ad198f7241287c5", GitTreeState:"clean", BuildDate:"2024-08-22T10:09:02Z", GoVersion:"go1.22.2 X:nocoverageredesign", Compiler:"gc", Platform:"linux/amd64"}
创建虚拟机¶
# 下面是虚拟机编排文件案例
$ vim vm.yaml
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
labels:
kubevirt.io/vm: vm-cirros
name: vm-cirros
spec:
running: false
template:
metadata:
labels:
kubevirt.io/vm: vm-cirros
spec:
domain:
devices:
disks:
- disk:
bus: virtio
name: containerdisk
- disk:
bus: virtio
name: cloudinitdisk
machine:
type: ""
resources:
requests:
memory: 64M
terminationGracePeriodSeconds: 0
volumes:
- name: containerdisk
containerDisk:
image: quay.io/kubevirt/cirros-container-disk-demo:latest
- cloudInitNoCloud:
userDataBase64: IyEvYmluL3NoCgplY2hvICdwcmludGVkIGZyb20gY2xvdWQtaW5pdCB1c2VyZGF0YScK
name: cloudinitdisk
# 创建虚拟机
$ kubectl apply -f vm.yaml
# 查看虚拟机状态
$ kubectl get vm,vmi,pod
# 使用kubectl启动虚拟机
$ kubectl patch virtualmachine vm-cirros --type merge -p '{"spec":{"running":true}}'
虚拟机管理¶
连接虚拟机¶
- 使用virtctl console连接虚拟机
root@kube-node1:~# virtctl console vm-cirros
Successfully connected to vm-cirros console. The escape sequence is ^]
login as 'cirros' user. default password: 'gocubsgo'. use 'sudo' for root.
vm-cirros login: cirros
Password:
$ uptime
03:58:23 up 11:56, 1 users, load average: 0.00, 0.00, 0.00
- 使用virtctl ssh连接虚拟机
cirros镜像的用户名为:cirros 默认密码: gocubsgo
root@kube-node1:~# virtctl ssh cirros@vm-cirros
cirros@vmi/vm-cirros.default's password:
$ ifconfig
eth0 Link encap:Ethernet HWaddr BE:83:10:2A:15:F9
inet addr:10.2.1.5 Bcast:10.2.1.255 Mask:255.255.255.0
inet6 addr: fe80::bc83:10ff:fe2a:15f9/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1402 Metric:1
RX packets:121 errors:0 dropped:0 overruns:0 frame:0
TX packets:77 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:16439 (16.0 KiB) TX bytes:8842 (8.6 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
- 使用SSH连接虚拟机
每个虚拟机和Pod一样,会获取一个Pod CIDR的IP地址。
root@kube-node1:~# ssh cirros@10.2.1.5
cirros@10.2.1.5's password:
$ uptime
04:04:42 up 12:02, 1 users, load average: 0.00, 0.00, 0.00
- 停止虚拟机
停止虚拟机会自动删除VMI,所以要删除虚拟机正确的流程是先停止虚拟机,然后再删除虚拟机。
$ virtctl stop vm-cirros
VM vm-cirros was scheduled to stop
虚拟机状态¶
- Stopped(已停止):虚拟机当前已停止,并且预计不会启动。
- Provisioning(正在配置):正在配置和准备与虚拟机相关的集群资源(例如,数据卷)。
- Starting(正在启动):正在准备运行虚拟机。
- Running(运行中):虚拟机正在运行。
- Paused(已暂停):虚拟机已暂停。
- Migrating(正在迁移):虚拟机正在被迁移到另一个主机。
- Stopping(正在停止):虚拟机正在停止过程中。
- Terminating(正在终止):虚拟机正在删除过程中,包括其相关资源(虚拟机实例、数据卷等)。
- Unknown(未知):无法获取虚拟机的状态,通常是由于与运行它的主机通信出现错误。