一、前言
1.1 Kubevirt概述
Kubevirt是k8s中的虚拟机管理插件,目的是为了满足企业从虚拟化转型到用kubernetes来管理一切虚拟化运行时,包含裸金属、VM、容器等。
1.2 Kubevirt如何应用在Kubernetes中
Kubevirt是通过Kubernetes的自定义资源来定义api资源来扩展的。主要添加了额外的虚拟化资源类型,比如VM类型的api资源。然后可以通过kubectl工具去管理这些api资源。本身扩展这些资源需要运行额外的控制器和代理,这些控制器和代理都是由Kubevrit来提供
1.3 Kubevrit组件介绍
kubevrit存在多个组件,每个组件负责的功能都不相同,不同点是资源调度策略都是由k8s去管理,其中,主要包含的组件有:
- virt-api
作为kubevirt的主要入口点,与k8s api-server进行交互验证并完成vmi、vm等资源类型的创建 - virt-controller
主要用于管理集群中VM的生命周期 - virt-handler
守护程序,运行在每一个节点,主要负责监视VM的状态,与virt-launcher进行通信,用于管理virt-launcher容器内qemu进程的命周期管理 - virt-launcher
每一个运行的VM都运行一个该组件,主要在VM的pod中管理qemu进程的生命周期
二、Kubervirt部署
2.1 kubernetes环境
2.2 前期准备工作
检测节点是否支持虚拟化功能
[root@master ~]# yum -y install qemu-kvm libvirt virt-install bridge-utils
支持虚拟化会是如下显示
2.3 安装Kubevirt
官方网址:https://kubevirt.io/
项目地址:https://github.com/kubevirt/kubevirt
使用以下命令进行部署操作
[root@master ~]# export RELEASE=v0.50.0
[root@master ~]# kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/kubevirt-operator.yaml
[root@master ~]# kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/kubevirt-cr.yaml
查看各组件状态是否正常
[root@master ~]# kubectl get pods -n kubevirt
NAME READY STATUS RESTARTS AGE
virt-api-866b4ffbb-dd9vc 1/1 Running 0 7m13s
virt-api-866b4ffbb-mdtnr 1/1 Running 0 7m13s
virt-controller-75fbb798c-dkprg 1/1 Running 0 6m18s
virt-controller-75fbb798c-m29cx 1/1 Running 0 6m18s
virt-handler-zk57m 1/1 Running 0 6m18s
virt-operator-5c9bccf876-mcb69 1/1 Running 0 8m51s
virt-operator-5c9bccf876-x5q6c 1/1 Running 0 8m51s
2.4 virtctl客户端工具安装
方法一
[root@master ~]# export VERSION=v0.50.0
[root@master ~]# wget https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/virtctl-${VERSION}-linux-amd64
[root@master ~]# cp virtctl-v0.50.0-linux-amd64 /usr/local/bin/virtctl
[root@master ~]# chmod a+x /usr/local/bin/virtctl
[root@master ~]# virtctl version
Client Version: version.Info{
GitVersion:"v0.50.0", GitCommit:"7e034450c10ad2a879db960b9912be2dff7ed9ce", GitTreeState:"clean", BuildDate:"2022-02-10T13:39:37Z", GoVersion:"go1.17.5", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{
GitVersion:"v0.50.0", GitCommit:"7e034450c10ad2a879db960b9912be2dff7ed9ce", GitTreeState:"clean", BuildDate:"2022-02-10T13:39:37Z", GoVersion:"go1.17.5", Compiler:"gc", Platform:"linux/amd64"}
方法二
使用kubenetes的插件管理工具krew
Krew项目地址
https://github.com/kubernetes-sigs/krew/
安装参考文档
https://krew.sigs.k8s.io/docs/user-guide/setup/install/
安装方法如下:
自行去官网下载对应的源码包
[root@master ~]# tar -xf krew-linux_amd64.tar.gz
[root@master ~]# ./krew-linux_amd64 install krew
export PATH="${PATH}:${HOME}/.krew/bin"
[root@master ~]# kubectl krew install virt 安装插件
2.5 启动虚拟机实例测试
VirtualMachine:类似与k8s里面的deployment这些
VirtualMachineInstance:类型与k8s里面的pod
例子如下:
[root@master]# vm.yaml
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
name: testvm
labels:
app: vm
spec:
running: false #设置状态
template:
metadata:
name: testvm
labels:
app: vm
spec:
domain:
devices:
disks:
- name: containerdisk #这里定义一个用于启动虚拟机的镜像启动盘
disk:
bus: virtio
- name: emptydisk #这里定义一个空盘,用于存储其他数据用
disk:
bus: virtio
resources: #内存和cpu请求
requests:
memory: 512M
cpu: 1
volumes: #定义虚拟磁盘的来源以及类型
- name: containerdisk #这里名称需要和device下的一致
containerDisk: #指定一个包含qcow2,raw,img的dockers镜像,一般从网络上进行拉取
image: kubevirt/cirros-registry-disk-demo
- name: emptydisk
emptyDisk: #定义空卷,并设置大小
capacity: 1Gi
注意事项:
1.running和runStrategy(启动策略)两个不可以同时存在
2.devices下都是定义磁盘,一般第一个定义为启动盘,定义启动盘分为很多种的类型,根据自己需求来设置。
3.resources 是定义内存和cpu的
4.volumes下都是定义卷的类型这些,和device下的磁盘进行关联
启动测试
[root@master ~]# kubectl apply -f vm.yaml
[root@master ~]# kubectl get vm
NAME AGE STATUS READY
testvm 8m6s Stopped False
启动虚拟机实例
[root@master ~]# virtctl start testvm
VM testvm was scheduled to start
查看运行的pod以及虚拟机实例状态
[root@master ~]# kubectl get vmi,pods
NAME AGE PHASE IP NODENAME READY
virtualmachineinstance.kubevirt.io/testvm 41s Running 10.244.219.95 master True
NAME READY STATUS RESTARTS AGE
pod/virt-launcher-testvm-nrkfh 2/2 Running 0 41s
通过virtctl的方式进入虚拟机
[root@master ~]# virtctl console testvm
退出虚拟机按ctrl + ]
通过ssh的方式进入虚拟机
[root@master ~]# ssh cirros@10.244.219.95
输入用户名和密码即可进入
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1480 qdisc pfifo_fast qlen 1000
link/ether 66:17:22:4e:7f:c4 brd ff:ff:ff:ff:ff:ff
inet 10.244.219.95/32 brd 10.255.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::6417:22ff:fe4e:7fc4/64 scope link
valid_lft forever preferred_lft forever
进入pod查看服务运行情况
[root@master ~]# kubectl exec -it virt-launcher-testvm-nrkfh /bin/bash
bash-<