跳转至

dataVolume

基于 DataVolume 创建虚拟机

参考:https://access.redhat.com/documentation/zh-cn/openshift_container_platform/4.2/html/container-native_virtualization/cnv-cloning-vm-disk-into-new-datavolume * 用户先将镜像上传到minio中(不一定是minio) * 镜像上传成功后,点击创建镜像时,触发创建dv,从而将镜像从minio同步到ceph中,源指向minio镜像地址 * 为实例申请一个可启动pvc,dataSource指向上面创建的dv,实为pvc克隆 * 创建实例,启动盘指上上面创建的pvc

方法(一):创建dv,source为http方式,用户可将镜像上传到能够通过http访问到的位置,方式可以是minio、s3、nginx、httpd等,触发创建dv,将源(source)指定到镜像所在的http地址,yaml 如下:

apiVersion: cdi.kubevirt.io/v1beta1
kind: DataVolume
metadata:
  name: img-cirros
  namespace: default
spec:
  source:
    http:
      url: http://images.demo.com:9000/images/cirros-0.4.0-x86_64-disk.img
  pvc:
    storageClassName: "ceph-hdd-block"
    accessModes:
      - ReadWriteMany
    resources:
      requests:
        storage: 1Gi
    volumeMode: Block
上述yaml在执行后,会创建一个dv资源,该dv资源关联了一个同名的(img-cirros)的pvc
# kubectl get dv
NAME         PHASE       PROGRESS   RESTARTS   AGE
img-cirros   Succeeded   100.0%     5          9m23s

# kubectl describe dv img-cirros 
Name:         img-cirros
Namespace:    default
Labels:       <none>
Annotations:  cdi.kubevirt.io/storage.usePopulator: true
API Version:  cdi.kubevirt.io/v1beta1
Kind:         DataVolume
Metadata:
  Creation Timestamp:  2023-10-14T06:19:47Z
  Generation:          1
  Resource Version:    1448577
  UID:                 8c6320c8-b994-41d3-962e-9638e008e632
Spec:
  Pvc:
    Access Modes:
      ReadWriteMany
    Resources:
      Requests:
        Storage:         1Gi
    Storage Class Name:  ceph-hdd-block
    Volume Mode:         Block
  Source:
    Http:
      URL:  http://images.demo.com:9000/images/cirros-0.4.0-x86_64-disk.img
Status:
  Claim Name:  img-cirros
  Conditions:
    Last Heartbeat Time:   2023-10-14T06:25:55Z
    Last Transition Time:  2023-10-14T06:25:55Z
    Message:               PVC img-cirros Bound
    Reason:                Bound
    Status:                True
    Type:                  Bound
    Last Heartbeat Time:   2023-10-14T06:25:55Z
    Last Transition Time:  2023-10-14T06:25:55Z
    Status:                True
    Type:                  Ready
    Last Heartbeat Time:   2023-10-14T06:25:54Z
    Last Transition Time:  2023-10-14T06:25:54Z
    Message:               Import Complete
    Reason:                Completed
    Status:                False
    Type:                  Running
  Phase:                   Succeeded
  Progress:                100.0%
  Restart Count:           5
Events:
  Type     Reason            Age                   From                          Message
  ----     ------            ----                  ----                          -------
  Normal   Pending           11m                   datavolume-import-controller  PVC img-cirros Pending
  Warning  Error             8m34s (x2 over 11m)   datavolume-import-controller  Unable to connect to http data source: HTTP request errored: Get "http://images.demo.com:9000/images/cirros-0.4.0-x86_64-disk.img": dial tcp: lookup images.demo.com on 12.96.0.10:53: no such host
  Warning  ImportFailed      5m56s (x2 over 6m1s)  datavolume-import-controller  Failed to import into PVC img-cirros
  Normal   ImportInProgress  5m45s (x3 over 11m)   datavolume-import-controller  Import into img-cirros in progress
  Warning  Completed         5m44s                 datavolume-import-controller  Import Complete
  Normal   Bound             5m43s                 datavolume-import-controller  PVC img-cirros Bound
  Normal   ImportSucceeded   5m43s                 datavolume-import-controller  Successfully imported into PVC img-cirros


# kubectl get pvc
NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS     AGE
img-cirros   Bound    pvc-be3aefaa-b02e-4c24-9c7e-c1943b765226   1Gi        RWX            ceph-hdd-block   9m38s

方法(二),直接通过virtctl image-upload 命令上传,该方式只会创建pvc 例如:

# kubectl get svc -n cdi |grep upload
cdi-uploadproxy          ClusterIP   12.105.37.69     <none>        443/TCP    45m


virtctl image-upload --uploadproxy-url=https://12.105.37.69 \
--insecure \
--pvc-name=img2-cirros \
--pvc-size=1G \
--storage-class=ceph-hdd-block \
--access-mode=ReadWriteOnce \
--block-volume \
--image-path=./cirros-0.4.0-x86_64-disk.img
注意 新的版本中 --block-volume 已经废弃, 使用 --access-mode=block来指定 创建dv的yaml(如果不考虑跨名称空间创建vm,可以不创建dv)
# 该方式是通过cdi-clone方式
apiVersion: cdi.kubevirt.io/v1beta1
kind: DataVolume
metadata:
  name: dv-img-cirros  # 因为创建dv会生成一个与该dv同名称的pvc,所以不能和virtctl image-upload中的pvc名称相同,除非名称空间不同
  namespace: default  # 注意可以指定名称空间
spec:
  source:
    pvc:
      namespace: default
      name: img2-cirros  # 用户通过virtctl image-upload命令上传,指定的--pvc-name为 img2-cirros
  pvc:
    storageClassName: "ceph-hdd-block"
    accessModes:
      - ReadWriteMany
    resources:
      requests:
        storage: 1Gi
    volumeMode: Block
说明:用户通过 virtctl image-upload上传镜像只会创建pvc,不会创建dv,我们可以基于该pvc创建vm,但在跨名称空间场景,就不能使用该pvc来创建vm了。 即dv是解决跨名称空间克隆pvc(cdi-clone),可以将任意名称空间的pvc克隆到指定名称空间

为实例申请pvc,dataSource指向上面创建的dv,即pvc克隆 说明:如果是通过 virtctl image-upload命令上传的镜像,不创建上面的dv,dataSource直接指向virtctl image-upload命令上传--pvc-name也可以

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-cirros01-bootdisk
  namespace: default
spec:
  storageClassName: "ceph-hdd-block"
  volumeMode: Block
  accessModes:
    - ReadWriteMany
  dataSource:
    kind: PersistentVolumeClaim
    name: dv-cirros  #dv对应的pvc名,创建dv同时会创建与该dv名字相同的pvc,注意:名称空间一致,否则无法创建。
  resources:
    requests:
      storage: 2Gi

创建实例,将卷指向上面创建的pvc

apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  name: vm-cirros01
spec:
  running: true
  template:
    metadata:
      labels:
        kubevirt.io/size: small
        kubevirt.io/domain: vm-cirros01
    spec:
      domain:
        devices:
          disks:
            - name: root-disk
              disk:
                bus: virtio
          interfaces:
          - name: default
            masquerade: {}
        resources:
          requests:
            memory: 64M
      networks:
      - name: default
        pod: {}
      volumes:
      - name: root-disk
        persistentVolumeClaim:
          claimName: pvc-cirros01-bootdisk