KubeVirt 03:部署一个简单的 VM

部署完 KubeVirt 后,可以通过创建一个测试虚拟机来验证 KubeVirt 是否正常工作。

部署虚拟机

VM 是命名空间中的资源,可以创建一个命名空间:

vagrant@master01:~$ kubectl create ns testvm
namespace/testvm created

KubeVirt 官网提供了一个简单的 vm 资源定义:

apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  name: testvm
spec:
  running: false
  template:
    metadata:
      labels:
        kubevirt.io/size: small
        kubevirt.io/domain: testvm
    spec:
      domain:
        devices:
          disks:
            - name: containerdisk
              disk:
                bus: virtio
            - name: cloudinitdisk
              disk:
                bus: virtio
          interfaces:
          - name: default
            masquerade: {}
        resources:
          requests:
            memory: 64M
      networks:
      - name: default
        pod: {}
      volumes:
        - name: containerdisk
          containerDisk:
            image: quay.io/kubevirt/cirros-container-disk-demo
        - name: cloudinitdisk
          cloudInitNoCloud:
            userDataBase64: SGkuXG4=

这个文件来自于 https://kubevirt.io/labs/manifests/vm.yaml

部署 vm:

vagrant@master01:~$ kubectl -n testvm apply -f https://kubevirt.io/labs/manifests/vm.yaml

virtualmachine.kubevirt.io/testvm created

查看状态:

vagrant@master01:~$ kubectl get vm -n testvm
NAME     AGE   STATUS    READY
testvm   34s   Stopped   False

testvm 处于 Stopped 的状态,是因为在资源定义中,设置了 running: false,所以需要手动启动。
同时可以看到在 VM 没有启动的时候是不存在 virt-launcher Pod 和 VMI 资源的。

vagrant@master01:~$ kubectl get vmi -n testvm
No resources found in testvm namespace.
vagrant@master01:~$ kubectl get pod -n testvm
No resources found in testvm namespace.

使用 virtctl 进行启动 VM:

vagrant@master01:~$ virtctl -n testvm start testvm
VM testvm was scheduled to start

启动后,查看资源状态:

vagrant@master01:~$ kubectl -n testvm get vm,vmi,pod
NAME                                AGE     STATUS    READY
virtualmachine.kubevirt.io/testvm   3m44s   Running   True

NAME                                        AGE   PHASE     IP              NODENAME   READY
virtualmachineinstance.kubevirt.io/testvm   30s   Running   10.244.241.89   master01   True

NAME                             READY   STATUS    RESTARTS   AGE
pod/virt-launcher-testvm-nlwd4   3/3     Running   0          30s

访问虚拟机

借助 virtctl 可以通过 console vnc 或 ssh 访问虚拟机。

serial console

通过 virtctl console 连接到虚拟机:

vagrant@master01:~$ virtctl -n testvm console testvm
Successfully connected to testvm console. The escape sequence is ^]

login as 'cirros' user. default password: 'gocubsgo'. use 'sudo' for root.
testvm login: cirros
Password: 
$ uname -a
Linux testvm 4.4.0-28-generic #47-Ubuntu SMP Fri Jun 24 10:09:13 UTC 2016 x86_64 GNU/Linux
$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda     253:0    0  44M  0 disk 
|-vda1  253:1    0  35M  0 part /
`-vda15 253:15   0   8M  0 part 
vdb     253:16   0   1M  0 disk 

通过 ctrl + ] 退出。

ssh

借助 virtctl ssh 可以通过 SSH 连接到虚拟机:

vagrant@master01:~$ virtctl ssh cirros@testvm.testvm
The authenticity of host 'vmi/testvm.testvm:22 (192.168.121.1:7890)' can't be established.
ECDSA key fingerprint is SHA256:DlsqNiPTxNrBsy+VldgVLJT7qKbyynH+Dxqj2s4Q7oU.
Are you sure you want to continue connecting (yes/no)? yes
cirros@vmi/testvm.testvm's password: 
$ lsblk 
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda     253:0    0  44M  0 disk 
|-vda1  253:1    0  35M  0 part /
`-vda15 253:15   0   8M  0 part 
vdb     253:16   0   1M  0 disk

cirros@testvm.testvmcirros@testvm 代表使用 cirros 用户登陆到 testvm 虚拟机中,.testvm 代表虚拟机位于 testvm 命名空间中,也可以通过 -n 来指定。

vnc

使用 virtctl vnc testvm -n testvm 可以打开 vnc 控制台,这个依赖于图形化环境和 remote-viewer 软件包,目前我节点没有图形化,这个不演示了。

关闭和删除虚拟机

关闭虚拟机可以使用 virtctl stop 命令:

vagrant@master01:~$ virtctl stop testvm -n testvm
VM testvm was scheduled to stop
vagrant@master01:~$ kubectl get vm,vmi -n testvm
NAME                                AGE   STATUS    READY
virtualmachine.kubevirt.io/testvm   11m   Stopped   False

要删除虚拟机,需要删除 VM 资源,如果不删除 VM 资源,仅删除 VMI 资源,会导致 VMI 重新构建。

只删除 VMI

为了更好的演示删除 VMI 会自动创建 VMI,首选需要将 VM 中的 running: false 修改为 true

vagrant@master01:~$ kubectl -n testvm patch vm testvm --type=merge --patch '{"spec":{"running": true}}'
virtualmachine.kubevirt.io/testvm patched

删除 VMI :

vagrant@master01:~$ kubectl  -n testvm get vmi
NAME     AGE   PHASE     IP              NODENAME   READY
testvm   31s   Running   10.244.241.90   master01   True
vagrant@master01:~$ kubectl -n testvm delete vmi testvm
virtualmachineinstance.kubevirt.io "testvm" deleted
vagrant@master01:~$ kubectl  -n testvm get vmi
NAME     AGE   PHASE     IP              NODENAME   READY
testvm   18s   Running   10.244.241.91   master01   True

可以看到删除 VMI 后,又重新构建了 VMI,IP 是不一样的。

删除 VM

正确的流程应该是先手动停止 VMI,然后将 VM 删除:

vagrant@master01:~$ virtctl -n testvm stop testvm
VM testvm was scheduled to stop
vagrant@master01:~$ kubectl get vmi -n testvm
No resources found in testvm namespace.
vagrant@master01:~$ kubectl delete vm testvm -n testvm
virtualmachine.kubevirt.io "testvm" deleted
vagrant@master01:~$ kubectl get vm,vmi -n testvm
No resources found in testvm namespace.

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部