KubeVirt的使用

1. 安装kubevirt

1.1. 修改镜像仓库

针对私有环境,需要将所需镜像上传到自己的镜像仓库中。

涉及的镜像组件有

virt-operator
virt-api
virt-controller
virt-launcher

重命名镜像脚本如下:

#!/bin/bash

# kubevirt组件版本
version=$1

# 私有镜像仓库
registry=$2

# 私有镜像仓库的namespace
namespace=$3

kubevirtRegistry="quay.io/kubevirt"

readonly APPLIST=(
    virt-operator
    virt-api
    virt-controller
    virt-launcher
)

for app in "${APPLIST[@]}"; do
    # 拉取镜像
    docker pull ${kubevirtRegistry}/${app}:${version}
    # 重命名
    docker tag ${kubevirtRegistry}/${app}:${version} ${registry}/${namespace}/${app}:${version}
    # 推送镜像
    docker push ${registry}/${namespace}/${app}:${version}
done

echo "重新命名成功"

1.2. 部署virt-operator

通过kubevirt operator安装kubevirt相关组件,选择指定版本,下载kubevirt-operator.yamlkubevirt-cr.yaml文件,并创建k8s相关对象。

如果是私有镜像仓库,则需要将kubevirt-operator.yaml文件中镜像的名字替换为私有镜像仓库的地址,并提前按步骤1推送所需镜像到私有镜像仓库。

# Pick an upstream version of KubeVirt to install
$ export RELEASE=v0.52.0
# Deploy the KubeVirt operator
$ kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/kubevirt-operator.yaml
# Create the KubeVirt CR (instance deployment request) which triggers the actual installation
$ kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/kubevirt-cr.yaml
# wait until all KubeVirt components are up
$ kubectl -n kubevirt wait kv kubevirt --for condition=Available

1.3. 部署virtctl

virtctl用来启动和关闭虚拟机。

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

2. kubevirt部署产物

通过手动部署virt-operator,会自动部署以下组件

组件 部署方式 副本数
virt-api deployment 2
virt-controller deployment 2
virt-handler daemonset -

具体参考:

#kg all -n kubevirt
NAME                                   READY   STATUS    RESTARTS   AGE
pod/virt-api-5fb5cffb7f-hgjjh          1/1     Running   0          23h
pod/virt-api-5fb5cffb7f-jcp7x          1/1     Running   0          23h
pod/virt-controller-844cd4f58c-h8vsx   1/1     Running   0          23h
pod/virt-controller-844cd4f58c-vlxqs   1/1     Running   0          23h
pod/virt-handler-lb5ft                 1/1     Running   0          23h
pod/virt-handler-mtr4d                 1/1     Running   0          22h
pod/virt-handler-sxd2t                 1/1     Running   0          23h
pod/virt-operator-8595f577cd-b9txg     1/1     Running   0          23h
pod/virt-operator-8595f577cd-p2f69     1/1     Running   0          23h

NAME                                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
service/kubevirt-operator-webhook     ClusterIP   10.254.159.81    <none>        443/TCP   23h
service/kubevirt-prometheus-metrics   ClusterIP   10.254.7.231     <none>        443/TCP   23h
service/virt-api                      ClusterIP   10.254.244.139   <none>        443/TCP   23h

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

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

NAME                                         DESIRED   CURRENT   READY   AGE
replicaset.apps/virt-api-5fb5cffb7f          2         2         2       23h
replicaset.apps/virt-controller-844cd4f58c   2         2         2       23h
replicaset.apps/virt-operator-8595f577cd     2         2         2       23h

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

3. 创建虚拟机

通过vm.yaml创建虚拟机

# 下载vm.yaml
wget https://kubevirt.io/labs/manifests/vm.yaml
# 创建虚拟机
kubectl apply -f https://kubevirt.io/labs/manifests/vm.yaml

vm.yaml文件

apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  name: testvm
spec:
  running: false
  template:
    metadata:
      labels:
        kubevirt.io/size: small
        kubevirt.io/domain: testvm
    spec:
      domain:
        devices:
          disks:
            - name: containerdisk
              disk:
                bus: virtio
            - name: cloudinitdisk
              disk:
                bus: virtio
          interfaces:
          - name: default
            masquerade: {}
        resources:
          requests:
            memory: 64M
      networks:
      - name: default
        pod: {}
      volumes:
        - name: containerdisk
          containerDisk:
            image: quay.io/kubevirt/cirros-container-disk-demo
        - name: cloudinitdisk
          cloudInitNoCloud:
            userDataBase64: SGkuXG4=

查看虚拟机

kubectl get vms
kubectl get vms -o yaml testvm

启动或暂停虚拟机

# 启动虚拟机
virtctl start testvm
# 关闭虚拟机
virtctl stop testvm
# 进入虚拟机
virtctl console testvm

删除虚拟机

kubectl delete vm testvm

参考:


最后修改 December 25, 2022: deploy by blog source (a162b04)