通过Minikube集群安装KubeVirt

Lance.Wu 发表于: 2022-09-29   最后更新时间: 2022-10-09 14:24:00  
{{totalSubscript}} 订阅, 1,219 游览

Minikube安装

Minikube(安装)在macOS、Linux和Windows上快速设置本地Kubernetes集群,允许软件开发人员快速开始使用Kubernetes。

minikube Kubernetes环境准备

  • kubectl客户端是运行Kubernetes集群所必需的。安装与kubectl客户端版本相匹配的kubectl客户端版本是很重要的,以避免与有关的版本冲突问题。

    要安装kubectl客户端,请按照您系统的官方文档中的说明进行安装

Minikube提供了一个与kubernetes版本匹配的kubectl客户端版本,以避免版本冲突问题。要使用minikube自带的客户端,请执行以下操作之一:

  • 所有正常的kubectl命令都应该以minikube kubectl的方式执行。

  • 它可以通过运行以下命令添加到别名中:

alias kubectl='minikube 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 start

# 出现如下错误

...

X Exiting due to DRV_AS_ROOT: The "docker" driver should not be used with root privileges.

# 使用命令
minikube start --force --driver=docker

# 解决错误下载慢问题,使用下列启动命令
minikube start  --image-mirror-country='cn' --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers' --base-image='registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.35'

# 现出如下错误
failed to set bridge addr: could not add IP address to \"cni0\": permission denied"

# 解决办法
sysctl -w net.ipv6.conf.all.disable_ipv6=0
sysctl -w net.ipv6.conf.default.disable_ipv6=0
sysctl -w net.ipv6.conf.tun0.disable_ipv6=0
sysctl -p

请参阅minikube手册,了解如何操作MiniKube的高级启动选项和说明。

多节点 Minikube

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

容器网络接口

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

更新minikube start命令

要在两个节点上使用flannelCNI插件启动minikube,修改minikube start命令:

$ minikube start --nodes=2 --cni=flannel --enable-default-cni --network-plugin=cni

或者

$  minikube start --nodes=2 --cni=flannel --enable-default-cni --network-plugin=cni --image-mirror-country='cn' --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers' --base-image='registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.35' --force --driver=docker

核心DNS竞态条件

据报道,多节点minikube中的coredns pod出现了错误的IP地址。如果发生这种情况,kubevirt将无法正确安装。为了解决这个问题,从kube-system命名空间中删除coredns pod,并在minikube中禁用/启用kubevirt插件。

docker ps 查看minikube 进入容器查看日志

### 由于k8s.gcr.io 需要连外网才可以拉取到,导致 k8s 的基础容器 pause 经常无法获取。k8s docker 可使用代理服拉取,再利用 docker tag 解决问题
$ docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6
$ docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6 k8s.gcr.io/pause:3.6

部署 KubeVirt

以使用KubeVirt操作符来安装KubeVirt,该操作符管理所有KubeVirt核心组件的生命周期。

下面是如何使用最新版本安装KubeVirt的两个示例。

简单方法

安装KubeVirt可以像以下命令一样简单:

$ minikube addons enable kubevirt

! kubevirt is a 3rd party addon and not maintained or verified by minikube maintainers, enable at your own risk.
  - Using image docker.io/bitnami/kubectl:1.17
* The 'kubevirt' addon is enabled

深入的方式

  • 使用kubectl来部署KubeVirt操作:
$ 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

namespace/kubevirt created
customresourcedefinition.apiextensions.k8s.io/kubevirts.kubevirt.io created
priorityclass.scheduling.k8s.io/kubevirt-cluster-critical created
clusterrole.rbac.authorization.k8s.io/kubevirt.io:operator created
serviceaccount/kubevirt-operator created
role.rbac.authorization.k8s.io/kubevirt-operator created
rolebinding.rbac.authorization.k8s.io/kubevirt-operator-rolebinding created
clusterrole.rbac.authorization.k8s.io/kubevirt-operator created
clusterrolebinding.rbac.authorization.k8s.io/kubevirt-operator created
deployment.apps/virt-operator created

嵌套的虚拟化

如果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个daemonset, 3个部署应用程序,3个副本集。

  • 验证deployment:
$ kubectl get kubevirt.kubevirt.io/kubevirt -n kubevirt -o=jsonpath="{.status.phase}"

Deployed
  • 验证components:
$ kubectl get all -n kubevirt

NAME                                   READY   STATUS    RESTARTS   AGE
pod/virt-api-554c867d7c-8tc4n          1/1     Running   0          112m
pod/virt-controller-6778df95f8-tlm5z   1/1     Running   0          111m
pod/virt-controller-6778df95f8-xxmwj   1/1     Running   0          111m
pod/virt-handler-pwcrr                 1/1     Running   0          111m
pod/virt-operator-64675bb658-7lnws     1/1     Running   0          114m
pod/virt-operator-64675bb658-qcs6g     1/1     Running   0          114m

NAME                                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
service/kubevirt-operator-webhook     ClusterIP   10.111.100.97    <none>        443/TCP   112m
service/kubevirt-prometheus-metrics   ClusterIP   10.96.123.77     <none>        443/TCP   112m
service/virt-api                      ClusterIP   10.109.116.15    <none>        443/TCP   112m
service/virt-exportproxy              ClusterIP   10.109.216.206   <none>        443/TCP   112m

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

NAME                              READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/virt-api          1/1     1            1           112m
deployment.apps/virt-controller   2/2     2            2           111m
deployment.apps/virt-operator     2/2     2            2           114m

NAME                                         DESIRED   CURRENT   READY   AGE
replicaset.apps/virt-api-554c867d7c          1         1         1       112m
replicaset.apps/virt-controller-6778df95f8   2         2         2       111m
replicaset.apps/virt-operator-64675bb658     2         2         2       114m

NAME                            AGE    PHASE
kubevirt.kubevirt.io/kubevirt   114m   Deployed
  • 当使用KubeVirt -install-manager的minikube KubeVirt插件检查日志时:
$ kubectl logs pod/kubevirt-install-manager -n kube-system

Installing KubeVirt version: v0.57.1
namespace/kubevirt created
customresourcedefinition.apiextensions.k8s.io/kubevirts.kubevirt.io created
priorityclass.scheduling.k8s.io/kubevirt-cluster-critical created
clusterrole.rbac.authorization.k8s.io/kubevirt.io:operator created
serviceaccount/kubevirt-operator created
role.rbac.authorization.k8s.io/kubevirt-operator created
rolebinding.rbac.authorization.k8s.io/kubevirt-operator-rolebinding created
clusterrole.rbac.authorization.k8s.io/kubevirt-operator created
clusterrolebinding.rbac.authorization.k8s.io/kubevirt-operator created
deployment.apps/virt-operator created
Using software emulation
kubevirt.kubevirt.io/kubevirt created

Virtctl客户端

KubeVirt提供了一个附加的二进制文件,称为virtctl,用于快速访问VM的串行端口和图形端口,并处理启动/停止操作。

安装

virtctl can be retrieved from the release page of the KubeVirt github page.

  • 运行以下:
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

安装为Krew插件

Virtctl可以通过krew插件管理器作为插件安装。virtctl <命令>…可以理解为kubectl virt ....

  • 运行以下命令进行安装:
$ kubectl krew install virt

接下来什么?

在部署了KubeVirt之后,您可以通过实验室来帮助您熟悉KubeVirt,以及如何使用它创建和部署具有Kubernetes的vm。

第一个实验室是“使用KubeVirt”。本实验室介绍了在Kubernetes上创建虚拟机实例(VMI),以及如何使用virtctl与它的控制台交互。

第二个实验室是“CDI实验”。本实验演示了如何使用容器数据导入器(CDI)将VM映像导入到持久卷索赔(PVC)中,然后如何将PVC作为块设备附加到VM上。

第三个实验室是“KubeVirt升级”。这个实验展示了升级KubeVirt安装是多么容易和安全,并且没有停机时间。

更新于 2022-10-09

查看KubeVirt更多相关的文章或提一个关于KubeVirt的问题,也可以与我们一起分享文章