Kubernetes Kubevirt |使用Kubevirt创建虚拟机
*Kubevirt是Kubernetes的一个插件**,为Kubernetes提供了在与容器相同的基础结构上提供、**管理和控制 Kvm 虚拟机** 的能力。解决k8s不能调度虚拟机的问题,在之前k8s只能调度底层container。使用Kubevirt可以创建虚拟机启动虚拟机停止虚拟机删除虚拟机在Kubernetes集群上调度虚拟机虚拟机运行在Kubernetes Pod中,利用标准的K8s网络
一、什么是Kubevirt
Kubevirt是Kubernetes的一个插件,为Kubernetes提供了在与容器相同的基础结构上提供、管理和控制 Kvm 虚拟机 的能力。解决k8s不能调度虚拟机的问题,在之前k8s只能调度底层container。
使用Kubevirt可以:
创建虚拟机
启动虚拟机
停止虚拟机
删除虚拟机
在Kubernetes集群上调度虚拟机
虚拟机运行在Kubernetes Pod中,利用标准的K8s网络和存储。
关键组件:
- virt-api:
- 为 Kubevirt 提供 API 服务能力,比如许多自定义的 API 请求,如开机、关机、重启等操作,通过 APIService 作为 Kubernetes Apiserver 的插件,业务可以通过 Kubernetes Apiserver 直接请求到 virt-api;
- virt-controller:
- Kubevirt 的控制器,功能类似于 Kubernetes 的 controller-manager,管理和监控 VMI 对象及其关联的 Pod,对其状态进行更新;
- virt-handler:
-
以 Daemonset 形式部署,功能类似于 Kubelet,通过 Watch 本机 VMI 和实例资源,管理 本宿主机上所有虚机实例;
主要执行动作如下: -
使 VMI 中定义的 Spec 与相应的 libvirt (本地 socket 通信)保持同步;
-
汇报及控制更新虚拟机状态;
-
调用相关插件初始化节点上网络和存储资源;
-
热迁移相关操作;
-
- virt-launcher:
- Kubevirt 会为每一个 VMI 对象创建一个 Pod,该 Pod 的主进程为 virt-launcher,virt-launcher 的 Pod 提供了 cgroups 和 namespaces 的隔离,virt-launcher 为虚拟机实例的主进程。
- virt-handler 通过将 VMI 的 CRD 对象传递给 virt-launcher 来通知 virt-launcher 启动 VMI。然后,virt-launcher 在其容器中使用本地 libvirtd 实例来启动 VMI。virt-launcher 托管 VMI 进程,并在 VMI 退出后终止。
- 如果 Kubernetes 运行时在 VMI 退出之前尝试关闭 virt-launcher 容器,virt-launcher 会将信号从Kubernetes 转发到 VMI 进程,并尝试推迟容器的终止,直到 VMI 成功关闭
- libvirtd:
- 每个VMI对应的Pod都有一个libvirtd实例。
- virt-launcher借助于libvirtd管理VMI实例生命周期
二 、KubeVirt部署
项目参考https://github.com/kubevirt/kubevirt
节点安装libvirt、qemu
# Ubuntu
$ apt install -y qemu-kvm libvirt-bin bridge-utils virt-manager
# CentOS
$ yum install -y qemu-kvm libvirt virt-install bridge-utils
检查节点是否支持虚拟化
virt-host-validate qemu
如果硬件不支持虚拟化,可以通过以下方法开启软件仿真:
编辑kubevirt配置
$ kubectl edit -n kubevirt kubevirt kubevirt
#添加以下内容:
spec:
...
configuration:
developerConfiguration:
useEmulation: true
安装kubevirt
$ export VERSION=$(curl -s https://api.github.com/repos/kubevirt/kubevirt/releases | grep tag_name | grep -v -- '-rc' | head -1 | awk -F': ' '{print $2}' | sed 's/,//' | xargs)
$ kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/kubevirt-operator.yaml
$ kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/kubevirt-cr.yaml
安装CDI
$ export VERSION=$(curl -s https://github.com/kubevirt/containerized-data-importer/releases/latest | grep -o "v[0-9]\.[0-9]*\.[0-9]*")
$ kubectl create -f https://github.com/kubevirt/containerized-data-importer/releases/download/$VERSION/cdi-operator.yaml
$ kubectl create -f https://github.com/kubevirt/containerized-data-importer/releases/download/$VERSION/cdi-cr.yaml
安装HostPath
# hostpath provisioner operator 依赖于 cert manager 提供鉴权能力
$ kubectl create -f https://github.com/cert-manager/cert-manager/releases/download/v1.7.1/cert-manager.yaml
#创建 hostpah-provisioner namespace
$ kubectl create -f https://raw.githubusercontent.com/kubevirt/hostpath-provisioner-operator/main/deploy/namespace.yaml
#部署 operator
$ kubectl create -f https://raw.githubusercontent.com/kubevirt/hostpath-provisioner-operator/main/deploy/operator.yaml -n hostpath-provisioner
$ kubectl create -f https://raw.githubusercontent.com/kubevirt/hostpath-provisioner-operator/main/deploy/webhook.yaml
查看部署情况
kubectl get ns
kubectl get pods -n XXX
三、 创建虚拟机
制作镜像
centos qcow2下载地址:https://cloud.centos.org/centos/7/images
修改镜像默认密码教程
vi Dockerfile
Dockerfile
FROM kubevirt/registry-disk-v1alpha
COPY CentOS-7-x86_64-GenericCloud-1805.qcow2 /disk/centos.img
docker build -t centos:1805 .
创建VM
apiVersion: kubevirt.io/v1
kind: VirtualMachineInstance
metadata:
name: myvmi
spec:
domain:
cpu:
cores: 2
resources:
requests:
memory: 2G
devices:
disks:
- name: containerdisk
disk:
bus: virtio
volumes:
- name: containerdisk
containerDisk:
image: centos:1805
kubectl apply -f vm-container.yml
安装virtctl客户端工具
export VERSION=v0.41.0
wget https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/virtctl-${VERSION}-linux-amd64
cp virtctl-v0.41.0-linux-amd64 /usr/local/bin/virtctl
chmod +x /usr/local/bin/virtctl ; ll /usr/local/bin/
virtctl version #有报错不着急,试试能不能console
启动虚拟机
[root@vm]# kubectl get vmi
NAME AGE PHASE IP NODENAME READY
centos-container 3h21m Running 10.20.0.114 192.168.10.153 True
[root@vm]# kubectl get pods
NAME READY STATUS RESTARTS AGE
virt-launcher-centos-container-wdzd8 2/2 Running 0 3h22m
virtctl console centos-container # 进入虚拟机
按 ctrl+] 可退出虚拟机
virtctl start vm 启动
virtctl stop vm 暂停
vm作为服务公开
···
[root@master kubevirt]# virtctl expose virtualmachine vm-cirros --name vmiservice-node --target-port 22 --port 24 --type NodePort
[root@master kubevirt]# kubectl get svc
···
更多推荐
所有评论(0)