文章目录

  • 准备条件
  • 选项
  • 多节点 Minikube
  • 容器网络接口
  • 更新 minikube 启动命令
  • 部署 KubeVirt
  • 一键安装
  • yaml 安装
  • 验证组件
  • Virtctl


准备条件

  • Ubuntu 18.04 通过 Minikube 安装 Kubernetes v1.20
minikube start --cni=flannel

添加 alias

alias kubectl='minikube kubectl --'

安装 kubectl

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
VERSION=$(minikube kubectl version | head -1 | awk -F', ' {'print $3'} | awk -F':' {'print $2'} | sed s/\"//g)
sudo install ${HOME}/.minikube/cache/linux/${VERSION}/kubectl /usr/local/bin

选项

多节点 Minikube

Minikube 支持向集群添加额外节点。这对于在 minikube 上试验 KubeVirt 很有帮助,因为节点关联或实时迁移等一些操作需要多个集群节点来演示。

容器网络接口

默认情况下,minikube 使用虚拟机设备或容器设置 kubernetes 集群。对于单节点设置,本地网络连接就足够了。在涉及多个节点的情况下,即使在同一主机上使用容器或虚拟机,kubernetes 也需要定义一个共享网络,以允许一台主机上的 pod 与另一台主机上的 pod 进行通信。为此,minikube 支持许多容器网络接口(CNI)插件, 其中最简单的是flannel。

更新 minikube 启动命令

要让 minikube 在两个节点上使用 flannel CNI 插件启动,请更改 minikube 启动命令:

minikube start --nodes=2 --cni=flannel

核心 DNS 竞争条件
据报告 ,多节点 minikube 中的pod coredns提供了错误的 IP 地址。如果发生这种情况,kubevirt 将无法正确安装。要解决此问题,请coredns从 kube-system 命名空间中删除 pod,并在 minikube 中禁用/启用 kubevirt 插件。

部署 KubeVirt

一键安装

minikube addons enable kubevirt

yaml 安装

export VERSION=$(curl -s https://api.github.com/repos/kubevirt/kubevirt/releases | grep tag_name | grep -v -- '-rc' | sort -r | head -1 | awk -F': ' '{print $2}' | sed 's/,//' | xargs)
echo $VERSION
kubectl create -f https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/kubevirt-operator.yaml

嵌套虚拟化
如果 minikube 集群在虚拟机上运行,请考虑启用嵌套虚拟化。请按照此处描述的说明进行操作。如果由于任何原因无法启用嵌套虚拟化,请按如下方式启用 KubeVirt 模拟:

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

再次用于kubectl部署 KubeVirt 自定义资源定义:

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

验证组件

默认情况下,KubeVirt 将部署 7 个 Pod、3 个服务、1 个守护进程集、3 个部署应用程序、3 个副本集。

检查部署情况:

kubectl get kubevirt.kubevirt.io/kubevirt -n kubevirt -o=jsonpath="{.status.phase}"

检查组件:

$ kubectl get all -n kubevirt
Warning: kubevirt.io/v1 VirtualMachineInstancePresets is now deprecated and will be removed in v2.
NAME                                  READY   STATUS    RESTARTS      AGE
pod/virt-api-dc9c659d5-wt6zt          1/1     Running   0             46h
pod/virt-controller-c97c96576-q55cg   1/1     Running   0             46h
pod/virt-controller-c97c96576-rglgv   1/1     Running   1 (45h ago)   46h
pod/virt-handler-rwqtp                1/1     Running   0             46h
pod/virt-operator-74bfd88c66-sndk5    1/1     Running   1 (45h ago)   46h
pod/virt-operator-74bfd88c66-zzkw8    1/1     Running   0             46h

NAME                                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/kubevirt-operator-webhook     ClusterIP   10.103.206.79   <none>        443/TCP   46h
service/kubevirt-prometheus-metrics   ClusterIP   None            <none>        443/TCP   46h
service/virt-api                      ClusterIP   10.110.53.201   <none>        443/TCP   46h
service/virt-exportproxy              ClusterIP   10.109.84.174   <none>        443/TCP   46h

NAME                          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/virt-handler   1         1         1       1            1           kubernetes.io/os=linux   46h

NAME                              READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/virt-api          1/1     1            1           46h
deployment.apps/virt-controller   2/2     2            2           46h
deployment.apps/virt-operator     2/2     2            2           46h

NAME                                        DESIRED   CURRENT   READY   AGE
replicaset.apps/virt-api-dc9c659d5          1         1         1       46h
replicaset.apps/virt-controller-c97c96576   2         2         2       46h
replicaset.apps/virt-operator-74bfd88c66    2         2         2       46h

NAME                            AGE   PHASE
kubevirt.kubevirt.io/kubevirt   46h   Deployed

$ kubectl get crd |grep kubevirt
kubevirts.kubevirt.io                                         2023-09-17T15:55:59Z
migrationpolicies.migrations.kubevirt.io                      2023-09-17T15:57:26Z
virtualmachineclones.clone.kubevirt.io                        2023-09-17T15:57:27Z
virtualmachineclusterinstancetypes.instancetype.kubevirt.io   2023-09-17T15:57:26Z
virtualmachineclusterpreferences.instancetype.kubevirt.io     2023-09-17T15:57:27Z
virtualmachineexports.export.kubevirt.io                      2023-09-17T15:57:27Z
virtualmachineinstancemigrations.kubevirt.io                  2023-09-17T15:57:24Z
virtualmachineinstancepresets.kubevirt.io                     2023-09-17T15:57:23Z
virtualmachineinstancereplicasets.kubevirt.io                 2023-09-17T15:57:24Z
virtualmachineinstances.kubevirt.io                           2023-09-17T15:57:23Z
virtualmachineinstancetypes.instancetype.kubevirt.io          2023-09-17T15:57:26Z
virtualmachinepools.pool.kubevirt.io                          2023-09-17T15:57:26Z
virtualmachinepreferences.instancetype.kubevirt.io            2023-09-17T15:57:26Z
virtualmachinerestores.snapshot.kubevirt.io                   2023-09-17T15:57:25Z
virtualmachines.kubevirt.io                                   2023-09-17T15:57:24Z
virtualmachinesnapshotcontents.snapshot.kubevirt.io           2023-09-17T15:57:25Z
virtualmachinesnapshots.snapshot.kubevirt.io                  2023-09-17T15:57:25Z

镜像列表:

$ kubectl get pod -n kubevirt -oyaml |grep image: | awk '{print $NF}' | sort -r | uniq
quay.io/kubevirt/virt-operator:v1.0.0
quay.io/kubevirt/virt-launcher:v1.0.0
quay.io/kubevirt/virt-handler:v1.0.0
quay.io/kubevirt/virt-controller:v1.0.0
quay.io/kubevirt/virt-api:v1.0.0

使用 minikube KubeVirt 插件时,检查 kubevirt-install-manager pod 的日志:

kubectl logs pod/kubevirt-install-manager -n kube-system

Virtctl

KubeVirt 提供了一个名为virtctl的附加二进制文件,用于快速访问虚拟机的串行和图形端口,并处理启动/停止操作。
virtctl可以从 KubeVirt github 页面的发布页面检索。

运行以下命令:

VERSION=$(kubectl get kubevirt.kubevirt.io/kubevirt -n kubevirt -o=jsonpath="{.status.observedKubeVirtVersion}")
ARCH=$(uname -s | tr A-Z a-z)-$(uname -m | sed 's/x86_64/amd64/') || windows-amd64.exe
echo ${ARCH}
curl -L -o virtctl https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/virtctl-${VERSION}-${ARCH}
chmod +x virtctl
sudo install virtctl /usr/local/bin