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 '
会不断增加,因为它没有被'重新创建'
。
这部分的示例就到此结束了。