Kubevirt更新升级

Lance.Wu 发表于: 2022-10-10   最后更新时间: 2022-10-10 17:57:47  
{{totalSubscript}} 订阅, 869 游览

KubeVirt的更新

部署KubeVirt

注意:为了升级到最新的KubeVirt版本,首先我们将安装一个特定的老版本的操作,如果你已经在使用最新的,请从一个老版本的KubeVirt开始,并遵循Lab1来部署KubeVirt,但使用v0.20.1版本代替。

如果您已经了解了这方面的内容,请跳过这一节。

让我们继续使用v0.20.1版本:

export KUBEVIRT_VERSION=v0.20.1

让我们运行以下命令来部署KubeVirt操作:

$ kubectl create -f https://github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/kubevirt-operator.yaml
namespace/kubevirt created
...
deployment.apps/virt-operator created

操作之前的准备:

$ kubectl wait --for condition=ready pod -l kubevirt.io=virt-operator -n kubevirt --timeout=100s
pod/virt-operator-5ddb4674b9-6fbrv condition met

如果您在虚拟化环境中运行,为了能够在这里运行vm,我们需要预先配置KubeVirt,以便它使用软件模拟虚拟化,而不是尝试使用真正的硬件虚拟化。

$ kubectl -n kubevirt patch kubevirt kubevirt --type=merge --patch '{"spec":{"configuration":{"developerConfiguration":{"useEmulation":true}}}}'
configmap/kubevirt-config created

现在让我们通过创建一个自定义资源来部署KubeVirt,它将触发'操作'并执行部署:

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

让我们检查一下部署:

$ kubectl get pods -n kubevirt

一旦它准备好了,它将显示类似于下面的信息:

$ kubectl get pods -n kubevirt
NAME                               READY     STATUS    RESTARTS   AGE
virt-api-7fc57db6dd-g4s4w          1/1       Running   0          3m
virt-api-7fc57db6dd-zd95q          1/1       Running   0          3m
virt-controller-6849d45bcc-88zd4   1/1       Running   0          3m
virt-controller-6849d45bcc-cmfzk   1/1       Running   0          3m
virt-handler-fvsqw                 1/1       Running   0          3m
virt-operator-5649f67475-gmphg     1/1       Running   0          4m
virt-operator-5649f67475-sw78k     1/1       Running   0          4m

部署一个虚拟机

一旦所有容器的状态都为“Running”,就可以执行以下命令,将虚拟机的YAML定义应用到当前的Kubernetes环境中:

首先,让我们等待所有的豆荚准备好,就像前面提供的例子:

$ kubectl wait --for condition=ready pod -l kubevirt.io=virt-api -n kubevirt --timeout=100s
pod/virt-api-5ddb4674b9-6fbrv condition met
$ kubectl wait --for condition=ready pod -l kubevirt.io=virt-controller -n kubevirt --timeout=100s
pod/virt-controller-p3d4o-1fvfz condition met
$ kubectl wait --for condition=ready pod -l kubevirt.io=virt-handler -n kubevirt --timeout=100s
pod/virt-handler-1b4n3z4674b9-sf1rl condition met

然后继续创建虚拟机:

$ kubectl apply -f https://kubevirt.io/labs/manifests/vm.yaml
virtualmachine.kubevirt.io/testvm created

使用以下命令检查虚拟机是否已定义:

$ kubectl get vms
NAME    AGE RUNNING VOLUME
testvm  22s false

从输出中注意到VM还没有运行。

要启动VM,应该使用virtctl~~~:

$ virtctl start testvm
VM testvm was scheduled to start

现在可以再次查看虚拟机状态:

$ kubectl get vms
NAME     AGE   RUNNING   VOLUME
testvm   0s    false

一旦虚拟机开始运行,你可以检查它的状态:

kubectl get vmis
$ kubectl get vmis
NAME     AGE   PHASE        IP    NODENAME
testvm   10s   Scheduling

一旦它准备好了,上面的命令将打印如下内容:

$ kubectl get vmis
NAME      AGE       PHASE     IP           NODENAME
testvm    1m        Running   10.32.0.11   master

PHASE仍然处于Scheduling状态时,你可以再次运行相同的命令进行检查:

$ kubectl get vmis

一旦PHASE变为Running,我们就可以升级KubeVirt了。

定义要升级到的下一个版本
v0.17.0开始,KubeVirt允许一次升级一个版本,通过使用用户指南中定义的两种方法:

KubeVirt CR规范中修补imageTag
如果没有定义imageTag,则更新操作符(默认为升级以匹配操作符版本)
警告:在这两种情况下,支持的场景都是从N-1更新到N

注意:从版本v0.17.0开始,支持零停机滚动更新。不支持从KubeVirt v0.17.0版本之前的任何版本进行更新。

执行升级

如果没有设置imageTag值,则更新KubeVirt操作符
KubeVirt CR中没有设置imageTag值时,系统认为KubeVirt版本被锁定为操作符的版本。这意味着更新操作符将导致底层的KubeVirt安装也被更新。

让我们升级到新版本后安装(0.20.1 -> 0.21.0):

$ export KUBEVIRT_VERSION=v0.21.0
$ kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/kubevirt-operator.yaml
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
...
deployment.apps/virt-operator configured

注意:与实验的第一步相比,现在我们使用apply而不是create来部署新版本,因为操作符已经存在。

在任何情况下,我们都可以检查VM是否仍然在运行

$ kubectl get vmis
NAME      AGE       PHASE     IP           NODENAME
testvm    1m        Running   10.32.0.11   master

最后的升级

你可以在这个实验室中继续测试“一次更新一个版本”,直到达到KUBEVIRT_LATEST_VERSION的值:

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

比较两者之间的值,并通过以下方法继续“一次升级一个版本”:

选择目标版本:

$ export KUBEVIRT_VERSION=vX.XX.X

将操作更新到该版本:

$ kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/kubevirt-operator.yaml
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
...
deployment.apps/virt-operator configured

注意:从0.20.1版本开始,应该使用以下命令检查操作符版本:

$ echo $(kubectl get deployment.apps virt-operator -n kubevirt -o jsonpath='{.spec.template.spec.containers[0].env[?(@.name=="KUBEVIRT_VERSION")].value}')

总结

通过使用virtctl或编辑虚拟机来关闭虚拟机。

$ virtctl stop testvm
VM testvm was scheduled to stop

最后,可以使用以下方法删除虚拟机:

$ kubectl delete vms testvm
virtualmachine.kubevirt.io "testvm" deleted

当使用操作更新时,我们可以看到容器之间的' AGE '是相似的,但当只更新kubevirt版本时,操作符' AGE '会不断增加,因为它没有被'重新创建'

这部分的示例就到此结束了。

更新于 2022-10-10

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