KubeVirt介绍:

基于k8s添加了vm的crd插件,像k8s管理pod一样,管理虚拟机vm。

解决采用Kubernetes但拥有现有基于虚拟机的工作负载的开发团队的需求,这些工作负载不容易被容器化。更具体地说,该技术提供了一个统一的开发平台,开发人员可以在该平台上构建、修改和部署驻留在两个应用程序容器中的应用程序,以及公共共享环境中的虚拟机。

官网:​​​​​​https://kubevirt.io/

架构图:

下面带大家一起体验一下kubevirt

前置条件:

已经部署好了K8S集群,无论是单机还是集群,都可以。

1、查看最新版的kubevirt版本

export KUBEVIRT_VERSION=$(curl -s https://api.github.com/repos/kubevirt/kubevirt/releases/latest | jq -r .tag_name)
echo $KUBEVIRT_VERSION


2、在k8s上添加kubevirt相关的资源对象

kubectl create -f https://github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/kubevirt-operator.yaml
kubectl create -f https://github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/kubevirt-cr.yaml

3、重要:启用仿真模拟,虽然会影响VM的性能 。

如果不启用,后边可能vm会启动不起来,但是开启后只能在本机访问,不能通过nodePort远程访问,此处建议执行,运行成功后可以尝试修改为false,然后再删除vm,重新创建vm。

kubectl -n kubevirt patch kubevirt kubevirt --type=merge --patch '{"spec":{"configuration":{"developerConfiguration":{"useEmulation":true}}}}'

4、查看当前创建资源,可以看到如下列表的pod,如果只看到operater的话是有问题的。

# kubectl get pods -n kubevirt
NAME                               READY   STATUS    RESTARTS   AGE
virt-api-6677fb87c6-2mphk          1/1     Running   0          93m
virt-api-6677fb87c6-62mc2          1/1     Running   0          93m
virt-controller-5dd87c95c4-c4s2v   1/1     Running   0          92m
virt-controller-5dd87c95c4-wglhh   1/1     Running   0          92m
virt-handler-7rtdq                 1/1     Running   0          92m
virt-operator-85b8997768-sldpt     1/1     Running   0          94m
virt-operator-85b8997768-zx7m6     1/1     Running   0          94m

5、安装virtctl

wget -O virtctl https://github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/virtctl-${KUBEVIRT_VERSION}-linux-amd64
chmod +x virtctl
cp virtctl /usr/local/bin/virtctl


6、 查看virtctl 版本,说明安装成功

# virtctl version
Client Version: version.Info{GitVersion:"v0.52.0", GitCommit:"836afc8c556206fc7715615ddb6516d76f4240db", GitTreeState:"clean", BuildDate:"2022-04-08T16:25:37Z", GoVersion:"go1.17.5", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{GitVersion:"v0.52.0", GitCommit:"836afc8c556206fc7715615ddb6516d76f4240db", GitTreeState:"clean", BuildDate:"2022-04-08T16:25:37Z", GoVersion:"go1.17.5", Compiler:"gc", Platform:"linux/amd64"}


7、 根据官方给的例子,创建一个vm

kubectl apply -f https://kubevirt.io/labs/manifests/vm.yaml


8、 查看创建的vm,此时状态是Stopped

kubectl get vms
kubectl get vmis


9、启动vm,再查看状态已经是Running,这里如果显示UnSchedule,请按照第3步的设置。

# virtctl start testvm
VM testvm was scheduled to start


 10、进入vm

# virtctl 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: 
$ sudo su -
# pwd
/root
#


11、通过暴露服务,供外部程序访问

 target-port:容器内的端口

 port:集群内通过ClusterIp访问的端口

virtctl expose virtualmachine  testvm --name vmiservice  --target-port 22  --port 8022 --type NodePort
# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
vmiservice   NodePort    10.233.28.141   <none>        8022:31536/TCP   40m


 恭喜,通过kube-virt成功创建vm,有问题一起留言讨论。

 欢迎关注+收藏,一起学习更多精彩内容。
————————————————

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐