三、KubeVirt基本命令
3.1查看virtctl版本,说明安装成功
[root@k8s-master ~]# virtctl version |
3.2创建和管理虚拟机
列出所有可用的虚拟机实例
[root@master ~]# kubectl get vmi -n <namespace> |
参数-n用于指定命名空间
查看特定虚拟机实例的详细信息
[root@master ~]# kubectl describe vmi <vmi-name> -n <namespace> |
删除虚拟机实例
[root@master ~]# kubectl delete vmi <vmi-name> -n <namespace> |
3.3创建和管理虚拟机定义
KubeVirt中的虚拟机定义(VirtualMachine)与虚拟机实例(VirtualMachinInstance,VM)不同。虚拟机定义是一个模版,可以用来启动多个虚拟机实例
创建一个新的虚拟机定义
[root@master ~]# kubectl create -f <file>.yaml |
启动由虚拟机定义创建的虚拟机实例
[root@master ~]# kubectl patch vm <vm-name> -p '{"spec":{"running":true}}' --type=merge -n <namespace> |
停止虚拟机实例
[root@master ~]# kubectl patch vm <vm-name> -p '{"spec":{"running":false}}' --type=merge -n <namespace> |
查看KubeVirt组件的状态
[root@master ~]# kubectl -n kubevirt get all |
连接到虚拟机控制台
[root@master ~]# kubectl virt console <vmi-name> -n <namespace> |
四、KubeVirt运行策略
KubeVirt对象遵循kubernetes惯例,它们通常有Spec(规范)和Status(状态)节。该规范是用户可配置的,允许用户以声明的方式指示集群所需的状态。同时,状态部分不是用户可配置的,它反映了集群中食物的实际状态。简而言之,用户编辑规范,控制器编辑状态
Running
Running字段在VM的规范中,换句话说,运行(Running)VM是用户的意图。它不能反映虚拟机的实际运行(Running)状态
RunStrategy
通过使用“RunStrategy”这个名称,最终用户清楚地知道他们在请求状态,这当然是完全独立于系统实际提供的状态的。RunStrategy有助于解决命名术语的混淆,但它碰巧也是一个枚举值。因为Running是一个布尔值,只能为真或假。我们现在能够创建更有意义的状态来适应不同的案例
目前存在四种运行策略:
◎Always:如果一个VM由于任何原因被停止,一个新的实例将被派生
◎RerunOnFailure:如果VM在错误状态下结束执行,将会产生一个新的实例。这样就解决了上面所列的第二个问题。如果用户手动停止VM,则不会生成新的实例
◎Manual:KubeVirt不会尝试启动或者停止VM。为了改变状态,用户必须从API调用start/stop/restart。在virtctl命令行客户端中也有方便的函数
◎Halted:如果VM正在运行,它将被停止,并且将保持关闭状态
高可用性
如果不提到高可用性,对运行策略的讨论就不完整。毕竟,在RerunOnFailure和Always运行策略背后的含义是:VM应该始终可用。在大多数情况下,这是完全正确的,但有一个重要的场景需要注意:如果一个节点完全失败,例如网络或者电源丢失。如果没有自动检测节点不再活动的方法,KubeVirt将不知道VM已经失败。在使用中启用了MachineHealthCheck(MHC)的IPI安装的OpenShift集群上,可以检测失败节点并重新安排运行在那里的工作负载
例:创建一个 Always运行策略的 VM
[root@k8s-master ~]# cat vm-f.yaml apiVersion: kubevirt.io/v1 kind: VirtualMachine metadata: labels: kubevirt.io/vm: vm-fedora name: vm-fedora spec: runStrategy: Always template: metadata: labels: kubevirt.io/vm: vm-fedora spec: domain: resources: requests: memory: 1Gi devices: disks: - name: containerdisk disk: bus: virtio volumes: - name: containerdisk containerDisk: image: kubevirt/fedora-cloud-container-disk-demo:latest - name: cloudinitdisk cloudInitNoCloud: userDataBase64: SGkuXG4= |
创建、查看VM
[root@k8s-master~]# kubectl delete -f vm-fedora.yaml [root@k8s-master ~]# kubectl get vm [root@k8s-master ~]# kubectl get vmi |
4.1容器与虚拟机的统一管理
KubeVirt 是一个基于 Kubernetes 的扩展项目,旨在实现对虚拟机(VM)和容器的统一管理。通过将虚拟机作为 Kubernetes 中的原生资源(Custom Resources),KubeVirt 使得虚拟机可以像容器一样进行管理,允许用户在同一平台上运行容器化应用和传统虚拟化工作负载。
传统的虚拟化技术(如 KVM)和容器技术(如 Docker)在管理、调度和操作方式上存在很大差异。KubeVirt 通过 Kubernetes 提供的资源调度、自动化扩展、集群管理等能力,解决了这些差异,并提供了跨虚拟机与容器的统一平台。
4.2Kubernetes 与虚拟化的结合
Kubernetes 是一个开源的容器编排平台,主要用于管理容器化应用的部署、扩展、负载均衡等。它通过一组统一的 API 让开发者和运维人员能够以声明式的方式管理应用。
虚拟化技术(如 QEMU/KVM)则提供了独立的操作系统实例,通常用于运行传统的非容器化应用。虚拟化技术与 Kubernetes 结合时,KubeVirt 充当桥梁,实现容器与虚拟机资源的统一调度。
通过在 Kubernetes 中引入虚拟机,用户能够将现有的虚拟机基础设施与新兴的容器化工作负载无缝集成,从而简化集群管理,提高资源利用率
使用 KubeVirt 管理虚拟机与容器,提供对容器化和虚拟化工作负载的统一管理
我们可以动手感受一下,先创建一个虚拟机以及一个容器
[root@k8s-master ~]# cat vm.gl.yaml apiVersion: kubevirt.io/v1 kind: VirtualMachine metadata: name: test-vm namespace: default spec: running: false # 保持为 false,允许手动启动 template: metadata: labels: kubevirt.io/vm: test-vm spec: domain: cpu: cores: 2 memory: guest: 2Gi # 设置虚拟机的内存为 2Gi devices: disks: - disk: bus: virtio name: disk0 volumes: - name: disk0 containerDisk: image: quay.io/kubevirt/cirros-registry-disk-demo [root@k8s-master ~]# kubectl create -f vm.gl.yaml |
查看虚拟机的状态(这里我们可以想想为什么可以用kubectl直接来查看虚拟机)
[root@k8s-master ~]# kubectl get virtualmachines -n default |
访问虚拟机控制台
[root@k8s-master ~]# virtctl console test-vm |
创建容器应用
[root@k8s-master ~]# cat app-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx namespace: default spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 [root@k8s-master ~]# kubectl create -f app-deployment.yaml |
查看容器的运行状态
[root@k8s-master ~]# kubectl get pods -n default |
通过上面的示例,我们可以发现,通过 KubeVirt,你可以使用 kubectl 来管理虚拟机和容器资源。虽然 Kubernetes 本身并不支持原生的虚拟机管理,但是 KubeVirt 扩展了 Kubernetes,使其能够像管理容器一样管理虚拟机。
那如果我们没有安装KubeVirt,去查看集群内是否有虚拟机会出现什么
[root@k8s-master ~]# kubectl get virtualmachines -A |
系统会提示你,Kubernetes API 服务器没有找到 virtualmachines 资源类型,这就要我们安装KubeVirt服务了