技校门,在Kubernetes中使用 kubevirt 以容器方法运转虚拟机,拉布拉多

  • 1.虚拟机 & 容器
  • 2.什么是kubevirt
  • 2.1 kubevirt架构
  • 2.2 虚拟机创立流程
  • 2.3 虚拟机存储
  • 2.4 虚拟机网络
  • 3. kubevirt布置
  • 4. 创立虚拟机

1.容器 VS 虚拟机

跟着Docker和Kubernetes生态圈的开展,云核算范畴对容器的爱好到达了疯狂的程度。 容器技能为运用程序供给了阻隔的作业空间,每个容器内都包括一个独享的完好用户环境空间, 容器内的变化不会影响其他容器的作业环曾之乔整容境。由于容器之间同享同一个体系内核,当同一个库被多个容器运用时, 内存的运用功率会得到进步。依据物理主机操作体系内核的,那就意味着关于前夫我拒婚不同内核或许操作体系需求的运用是不可能布置在一起的。

虚拟化技能则是供给了一个完好的虚拟机,为用户供给了不依赖于宿主机内核的作业环境。 关于从物理效劳器过渡到虚拟效劳器是一个很天然的进程,从用户运用上并没有什么差异。 容器与虚拟机当时看来并不是一个非此即彼的联系,至于选用那种办法去作业运用需求依据详细需求去决议。 在这里笔者并不评论这个问题,且笔者仅是容器效劳的入门玩家,内容若有不精确之处还望指正。

kubernetes供给了较灵敏的容器调度和办理能力,那么虚拟机能否像容器相同被k8s办理调度, 充分运用k8s的毛病发现,翻滚晋级等办理机制呢。 在Linux操作体系中虚拟机本质上便是一个操作体系进程应该是能够作业在容器内部的。

现在Redhat开源的kubevirt和Mirantis开源的virtlet都供给了以容器办法作业虚拟机的计划, 至于两者之间的差异,能够看下这篇Mirantis的 blog(https://www.mirantis.com/blog/kubevirt-vs-virtlet-comparison-better/)。

本文将详细介绍kubevirt项目怎么实技校门,在Kubernetes中运用 kubevirt 以容器办法作业虚拟机,拉布拉多现和作业容器化的虚拟机。

2. 什么是 kubevirt

kubevirt 是 Redhat 开源的以容器办法作业虚拟机的项目,以 k8s add-on办法,运用 k8s CRD 为添加资源类型VirtualMachineInstance(VMI), 运用容器的image registry去创立虚拟机并供给VM生命周期办理。 CRD的办法是的kubevirt对虚拟机的办理牟晓良不必局限于pod办理接口,可是也无法运用pod的RS DS Deployment等办理能力,也意味着 kubevirt假如想平松惠理香要运用pod办理能力,要自主去完结,现在kubevirt完结了相似RS的功用。 kubevirt现在支撑的runtime是docker和runv,本文中实践运用的是docker。

2.1 kubevirt 架构

从kubevirt架构技校门,在Kubernetes中运用 kubevirt 以容器办法作业虚拟机,拉布拉多看怎么创立虚拟机,Kubevirt架构如图所示,由4部分组件组成。从架构图看出kubevirt创立虚拟机的中心便是创立了一个特别的pod virt-launcher ,其间的子进程包括libvirt和qemu。

做过openstack nova 项目的朋友应该比较习惯于一台宿主机中作业一个libvirtd后台进程,kubevirt中选用每个pod中一个libvirt进程是去中心化的办法,来防止由于 libvirtd 效劳反常导致一切的虚拟机无法办理。



  • virt-api
  • kubevirt API效劳,kubevirt是以CRD的办法作业的,virt-api供给了自界说的api恳求处理,如vnc console start vm stop vm等。

  • virt-controller
  • 与k8s api-server通讯监控VMI资源创立删去等状况
  • 依据VMI界说创立virt-launcherpod,该pod中将会作业虚拟机
  • 监控pod状况,并随之更新VMI状况
  • 监控符号为”kubevirt.io/schedulable” node heartbeat
  • virt-handler
  • 作业在kubelet的node上定时更新heartbeat,并符号”kub塔卡沙是哪国的牌子evirt.io/schedulable”
  • 监听在k8s apiserver当发现VMI被符号得nodeName与本身node匹配时,担任虚拟机的生命周期办理
  • virt-launcher
  • 以pod办法作业
  • 依据VMI界说生成虚拟机模板,经过libvirt API创立虚拟机
  • 每个虚拟时机对应敌对的libvirtd
  • 与libvirt通讯供给虚拟机生命周期办理

2.2 虚拟机创立流程

  1. client 发送创立VMI指令到达 k8s API server.
  2. K8S API 创立VMI 目标
  3. virt-controller监听到VMI创立时,依据VMI spec生成pod spec文件,创立pods
  4. k8s调度创立pods
  5. virt-controller监听到pods创立后,依据pods的调度node,更新VMI 的nodeName
  6. virt-handler监听到VMI nodeName与本身节点匹配后,与pod内的virt-launcher通讯,virt-laucher创立虚拟机,并担任虚拟机生命周期办理
Client K8s API V重生豪门盛妍MI CRD Virt Controller VMI Handler
-------------------------- ----------- ------- ----------------------- ----------
listen <----------- watch > listen <----------------------------------- watch > | |
POST /virtualmachines ---> 爱之奇观validate | |
create ---> VMI ---> observe --------------> observe
| | v v
validate <--------- post > create | | |
| | | |
schedPod 核组词---------> observe |
| | v |
validate <--------- put > update ---> VMI ---------------------------技校门,在Kubernetes中运用 kubevirt 以容器办法作业虚拟机,拉布拉多> observe
| | | launchVMI
| | | |
: : : :
| | | |
DELETE /virtualmachines -> validate | | |
delete ----> * ---------------------------> observe
| | shutdownVMI
| | |
: : :

2.3 虚拟机存储

kubevirt现在供给了多种办法的虚拟机的磁盘:

  • registryDisk 可界说image来创立作为虚拟机的root disk。 virt-controller会在pod界说中创立registryVolume的container,container中的entry效劳担任 将spec.volumes.registryDisk.image转化为qcow2格局,途径为pod根目录
  • cloudInitNoCloud
  • 对虚拟机运用cloudinit做初始化,相似与nova中的configdrive,会依据spec.volumes.cloudInitNoCloud 创立包括iso文件,包括 meta-data 和 user-data。
  • emptyDisk
  • 创立空的qcow2格局image挂载给虚拟机
  • PVC
  • 上述几种disk都对错耐久化的,随之pod的生命周期消亡,PVC是k8s供给的耐久化存储。现在kubevirt运用pvc挂载办法都是文件体系办法挂载, PVC首要被挂载在virt-laucher pod中, 且需求存在名称为/disk/*.img的文件,才挂载给虚拟机。 file办法虚拟化办法对虚拟机磁盘存储功能有很大的影响。
  • 了解openstack的朋友应该也了解nova-compute中怎么运用ceph rbd i鼓励英文mage的,本质上是libvirt运用librbd以network办法 将rbd image长途改在给虚拟机。而kubevirt中将POD ip移交给了虚拟机,那将意味着pod内的libvirt效劳其实是无法直接运用network disk的。 要么添加网络署理转发即经过host来与网络设备通讯,要么便是选用k8s volumeMount:block feature来完结。
  • kubevirt社区有PR现已完结了以Block的办法去运用是rbd image, 笔者手动merge并测验经过。 本质是运用了ke技校门,在Kubernetes中运用 kubevirt 以容器办法作业虚拟机,拉布拉多rnel rbd.ko,首要将rbd image map到host,block的mount办法将不再以文件体系办法去挂载/dev/rbdx,而是为作为原始设备给pod,而pod内的libvirt就能够block办法将rbd image作为 磁盘挂载给虚拟机。
  • 相较于PVC先格局化为文件体系并有必要创立disk.img文件的运用办法,明显rbd image 以block device直接作为块设备给虚拟机少了本地文件体系层 单从存储功率讲都能进步不少。至于librbd和rbd.ko的功能本文没有比照测验,有时间再弥补。技校门,在Kubernetes中运用 kubevirt 以容器办法作业虚拟机,拉布拉多
  • k8s PVC后续版别应该也能够供给block mode办法的mount。
  • dataVolume
  • dataVolume是kubevirt下的一个子项目containerized-data-importer(CDI), 也是以CDR的办法添加DataVolumeresource。 能够看成是从PVC和registryDisk衍生出来的,上面提过PVC运用是比较费事的,不只需求PVC还需求创立disk.img, dataVolume其实将这个进程简化了,主动化的将disk.img创立在PVC中。 创立DataVolume是能够界说source即image/data来历能够是http或许s3的URL,CDI controller会将 主动将image转化并复制到PVC文件体系/disk/

2.4 虚拟机网络

kubevirt虚拟机网络运用的是pod网络也便是说,虚拟网络原生与pod之间是打通的。虚拟机详细的网络如图所示, virt-launcher pod网络的网卡不再挂有pod ip,而车上路上是作为虚拟机的虚拟网卡的与外部网络通讯的交代物理网卡。 那么虚拟机是怎么拿到pod的ip的呢,virt-技校门,在Kubernetes中运用 kubevirt 以容器办法作业虚拟机,拉布拉多launcher完结了简略的单ip dhcp server,便是需求虚拟机中发动dhclient,virt-launcher 效劳会分配给虚拟机。


运用指令kubectl exec $virt-launch-pod -c compute -- brctl show能够看到bridge信息。 其间eth0便是pod与host网络通讯的veth peer网卡。也能够经过virsh dumpxml指令检查虚拟机的xml界说文件。

3.布置 kubevirt

3.1 在 kubernets 中布置 k韩国瑜伽妹ubevirt

首要需求k8s环境,本文中运用的是v1.10.5版别,kubevirt挑选v0.8.0,调用如下指令布置kubevirt:

$ export VERSION=v0.8.0
$ kubectl create \
-f https://github.com/kubevirt/kubevirt/releases/download/$VERSION/kubevirt.yaml

kubevirt.yaml 中界说了 RBAC 相关认证,默许办理效劳都创立再 kube-system namespace中,能够经过以下指令检查资源,以及效劳布置状况。当看到pods 悉数创立成功后,经过kubectl get vmis来检测效劳是否可用。

 kubectl get all -n kube-system -l kubevirt.io
NAME READY STATUS RESTARTS AGE
pod/virt-api-54cc86ff87-9xt8s 1/1 Running 0 14d
pod/virt-api-54cc86ff87-xvjg4 1/1 Running 0 14d
pod/virt-controller-769db5f6bf-2wg欢爱r4 1/1 Running 0 13d
pod/virt-controller-769db5f6bf-xwgks 1/1 Running 0 13d
pod/virt-handler-gpn6b 1/1 Running 0 2h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/virt-api ClusterIP 172.30.7.81 443/TCP 16d
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/virt-handler 1 1 1 1 1 16d
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deployment.apps/virt-api 2 2 2 2 16d
deployment.apps/virt-controller 2 2 2 2 16d
NAME D公交hESIRED CURRENT READY AGE
replicaset.apps/virt-api-54cc86ff87 2 2 2 14d
replicaset.apps/virt-肛试样品api-645f74c7fc 0 0 0 16d
replicaset.apps/virt-controller-658bf69f57 0 0 0 16d
replicaset.apps/virt-controller-769db5f6bf 2 2 2 14d

3.2 在 OpenShift 中布置 kubevirt

Kubevirt 在 openshift 的布置是相似的,仅有不同的是需求为 kubevirt service account 添加 openshift 权限。在需求运用 block volumemount 时,openshift需求修正 origin-node 的配置文件添加 feature-gates “BlockVolume=true”

oc adm潋滟紫 policy add-scc-to-user privileged system:serviceaccount:kube-system:kubevirt-privileged
oc adm policy add-scc-to-user privileged system:serviceaccount:kube-system:kubevirt-controller
oc a陈林菠dm policy ad技校门,在Kubernetes中运用 kubevirt 以容器办法作业虚拟机,拉布拉多d-scc-to-user privileged system:serviceaccount:kube-system:kubevirt-infra
oc adm policy add-scc-to-user privileged system:serviceaccount:kube-system:kubevirt-apiserver

4. 运用 kubevirt 创立虚拟机

4.1 预备虚拟机根磁盘

在kubevirt存储一节中介绍了kubevirt支撑的存储类型,其间registryDisk和PVC办法能够为作为预装操作体系的虚拟机root disk。

(1)registryDisk 办法

kubevirt供给了registryDisk的base docker image registry-disk-v1alpha

1 . 预备raw或许qcow2格局的虚拟机镜像,例如Windows---server-2012-datacenter-64bit-cn-syspre我是秦二世txt下载ped---2018-01-15.qcow2

2 . 创立Dockerfile

FROM kubevirt/registry-disk-v1alpha
MAINTAINER "MinMin"
# Add alpine image
COPY Windows---server-2012-datacenter-64bit-cn-syspreped---2018-01-15.qcow2 /disk/windows2012dc.img

3 . 创立image

docker build -t windows2012dc:latest ./
docker push windows2012dc:latest

4 . 更新vmi yaml文件中image

将vmi文件中的image更新为新创立的image

kind: VirtualMachineInstance
...
spec:
domain:
devices:
disks:
- disk:
bus: virtio
name: registrydisk
volumeName: registryvolume
...
- name: registryvolume
registryDisk:
image: windows2012dc:latest

(2)PVC办法

PVC是k8s供给的耐久化存储办法,当需求对虚拟机改变耐久化存储时有必要要选用这种办法。笔者在写本文时,kubevirt还未支撑blockmode PVC,此章节 仅介绍file办法的。kubevirt中创立虚拟机是以pod空间中的/disk/目录下,那么意味着需求将PVC完结进行文件体系格局化,并创立disk/目录将 虚拟机root disk image复制至disk目土偶兽录中。 这个进程能够手动完结比较冗杂,kubevirt供给了新的项目kubevirt/containerized-data-importer主动化这个进程,可参阅示例 vm-alpine-datavolume.yaml)经过DataVolume.spec.source界说虚拟操作体系的image途径。

4.2 创立 vmi 目标

自己创立vmi的yaml文件,或许从github.com/kubevirt/kubevirt 项目中的cluster/examples 下的 vmi-flavor-small.yaml 文件去创立虚拟机,创立完结后能够 运用ssh登陆检查虚拟机或许运用virtctl console 和 virtctl vnc来登陆虚拟机。

# kubectl create -f vmi-flavor-small.yaml
# ku石豇豆bectl get vmis
NAME AGE
vmi-flavor-small 15h
vmi_pvc-windows 14h
# kubectl get pods
virt-launcher-vmi-flavor-small-7m2cj 2/2 Running 0 2h
virt-launcher-vmi-pvc-windows-wvg5c 1/1 Running 0 14d


点击展开全文

上一篇:

下一篇:

相关推荐